统计分析与R软件-chapter2-5
2.5 多维数组和矩阵
2.5.1 生成数组或矩阵
数组有一个特征属性叫做维数向量(dim属性),维数向量是一个元素取正整数的向量,其长度是数组的维数,比如维数向量有两个元素时数组为2维数组(矩阵)。维数向量的每一个元素指定了该下标的上界,下标的下界总为1
1.将向量定义成数组
向量只有定义了维数向量(dim属性)后才能被看作是数组
> z<-1:12
> dim(z)<-c(3,4);z
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> dim(z)<-12;z
[1] 1 2 3 4 5 6 7 8 9 10 11 12
2.用array()函数构造多维数组
R软件可以用array()函数直接构造数组,其构造形式为
array(data=NA,dim=length(data),dimnames=NULL)
其中data是一个向量数据,dim是数组各维的长度,缺省时是原向量的长度,dimnames是数组维的名字,缺省时为空
> X<- array(1:20,dim=c(4,5));X
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
> Z<- array(0,dim=c(3,4,2));Z
, , 1
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 0 0 0
[3,] 0 0 0 0
, , 2
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 0 0 0
[3,] 0 0 0 0
3.用matrix()函数构造矩阵
函数matrix()是构造矩阵的函数,其构造形式为
matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)
其中data是一个向量数据,nrow是矩阵的行数,ncol是矩阵的列数。当byrow=TRUE时,生成矩阵的数据按行放置,缺省时相当于byrow=FALSE,数据按列放置。dimnames是数组维数的名字,缺省时为空
> A<- matrix(1:15,nrow=3,ncol=5,byrow = TRUE);A
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
> A<- matrix(1:15,nrow=3,byrow=TRUE);A
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
2.5.2 数组下标
1.数组下标
> a<-1:24
> dim(a)<-c(2,3,4)
> a[2,1,2]
[1] 8
> a[1,2:3,2:3]
[,1] [,2]
[1,] 9 15
[2,] 11 17
> a
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
, , 3
[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 16 18
, , 4
[,1] [,2] [,3]
[1,] 19 21 23
[2,] 20 22 24
> a[1,,]
[,1] [,2] [,3] [,4]
[1,] 1 7 13 19
[2,] 3 9 15 21
[3,] 5 11 17 23
> a[,2,]
[,1] [,2] [,3] [,4]
[1,] 3 9 15 21
[2,] 4 10 16 22
> a[1,1,]
[1] 1 7 13 19
> a[3:10]
[1] 3 4 5 6 7 8 9 10
2.不规则的数组下标
在R语言中,甚至可以把数组中的任意位置的元素作为数组访问,其方法是用一个二维数组作为数组的下标,二维数组的每一个行是一个元素的下标,列数为数组的维数。
例如,要把上面的形状为234的数组a的第[1,1,1],[2,2,3],[1,3,4],[2,1,4]号共四个元素作为一个整体访问,先定义一个包含这些下标作为行的二维数组:
> b<- matrix(c(1,1,1,2,2,3,1,3,4,2,1,4),ncol=3,byrow = TRUE);b
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 3
[3,] 1 3 4
[4,] 2 1 4
> a[b]
[1] 1 16 23 20
> a[b]<-c(101,102,103,104);a[b]
[1] 101 102 103 104
> a
, , 1
[,1] [,2] [,3]
[1,] 101 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
, , 3
[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 102 18
, , 4
[,1] [,2] [,3]
[1,] 19 21 103
[2,] 104 22 24
2.5.3 数组的四则运算
> A<- matrix(1:6,nrow = 2,byrow = TRUE);A
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> B<- matrix(1:6,nrow = 2);B
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> C<- matrix(c(1,2,2,3,3,4),nrow = 2);C
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 3 4
> D<- 2*C+A/B;D
[,1] [,2] [,3]
[1,] 3 4.666667 6.6
[2,] 6 7.250000 9.0
形状不一致的向量(或数组)也可以进行四则运算,一般的规则是将向量(或数组)中的数据与对应向量(或数组)中的数据进行运算,把短向量(或数组)的数据循环使用,从而可以与长向量(或数组)数据进行匹配,并尽可能保留共同的数组属性
> x1<-c(100,200)
> x2<-1:6
> x1+x2
[1] 101 202 103 204 105 206
> x3<- matrix(1:6,nrow = 3)
> x1+x3
[,1] [,2]
[1,] 101 204
[2,] 202 105
[3,] 103 206
> x2<- 1:5
> x1+x2
[1] 101 202 103 204 105
Warning message:
In x1 + x2 : 长的对象长度不是短的对象长度的整倍数
2.5.4 矩阵的运算
1.转置运算
> A<-matrix(1:6,nrow=2);A
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> t(A)
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
> ### 2.求方阵的行列式
> det(matrix(1:4,ncol=2))
[1] -2
> ### 3.向量的内积
> x<-1:5;y<-2*1:5
> x%*%y
[,1]
[1,] 110
函数crossprod()是内积运算函数(表示交叉乘积),crossprod(x,y)计算向量x与y的内积,即't(x) %*% y'
> crossprod(x,y)
[,1]
[1,] 110
> x;t(x)
[1] 1 2 3 4 5
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
crossprod(x)表示x与x的内积,即\(||x||^2_2\)
类似地,tcrossprod(x,y)表示'x%*% t(y)',即x与y的外积,也称为叉积。tcrossprod(x)表示x与x作外积
> tcrossprod(x,y)
[,1] [,2] [,3] [,4] [,5]
[1,] 2 4 6 8 10
[2,] 4 8 12 16 20
[3,] 6 12 18 24 30
[4,] 8 16 24 32 40
[5,] 10 20 30 40 50
> tcrossprod(x)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 2 4 6 8 10
[3,] 3 6 9 12 15
[4,] 4 8 12 16 20
[5,] 5 10 15 20 25
4.向量的外积(叉积)
设x,y是n维向量,则x %o% y表示x与y作外积
> x<-1:5;y<-2*1:5
> x %o% y
[,1] [,2] [,3] [,4] [,5]
[1,] 2 4 6 8 10
[2,] 4 8 12 16 20
[3,] 6 12 18 24 30
[4,] 8 16 24 32 40
[5,] 10 20 30 40 50
outer()是外积运算函数,outer(x,y)计算向量x与y的外积,它等价于 x %o% y
函数outer()的一般调用格式为
outer(X,Y,fun='*',...)
其中X,Y矩阵(或向量),fun是作外积运算函数,缺省值为乘法运算,函数outer()在绘制三维曲面时非常有用,它可以生成一个X和Y的网格,
> outer(x,y)
[,1] [,2] [,3] [,4] [,5]
[1,] 2 4 6 8 10
[2,] 4 8 12 16 20
[3,] 6 12 18 24 30
[4,] 8 16 24 32 40
[5,] 10 20 30 40 50
5.矩阵的乘法
如果矩阵A和B具有相同的维数,则AB表示矩阵中对应的元素的乘积,A %% B表示通常意义下的两个矩阵的乘积(要求矩阵A的列数等于矩阵B的行数)
> A<-array(1:9,dim=(c(3,3)))
> B<-array(9:1,dim=(c(3,3)))
> C<-A*B;C
[,1] [,2] [,3]
[1,] 9 24 21
[2,] 16 25 16
[3,] 21 24 9
> D<- A%*%B;D
[,1] [,2] [,3]
[1,] 90 54 18
[2,] 114 69 24
[3,] 138 84 30
crossprod(A,B)表示的是t(A)%%B,函数tcrossprod(A,B)表示的是A%%t(B)
> A
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> B<-c(1:3);B
[1] 1 2 3
> crossprod(B,A)
[,1] [,2] [,3]
[1,] 14 32 50
> t(B);crossprod(t(B),A)
[,1] [,2] [,3]
[1,] 1 2 3
Error in crossprod(t(B), A) : 非整合参数
> tcrossprod(A,B)
Error in tcrossprod(A, B) : 非整合参数
> tcrossprod(A,t(B))
[,1]
[1,] 30
[2,] 36
[3,] 42
6.生成对角阵和矩阵取对角运算
函数diag()依赖于它的变量,当v是一个向量时,diag(v)表示以v的元素为对角线元素的对角阵。当M是一个矩阵时,则diag(M)表示的是取M对角线上的元素的向量
> v<-c(1,4,5)
> diag(v)
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 4 0
[3,] 0 0 5
> M<-array(1:9,dim=c(3,3));M
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> diag(M)
[1] 1 5 9
7.解线性方程组和求矩阵的逆矩阵
若求解线性方程组Ax=b,其命令形式为solve(A,b),求矩阵A的逆,其命令形式为solve(A)
> A<-t(array(c(1:8,10),dim=c(3,3)))
> b<-c(1,1,1)
> x<-solve(A,b);x
[1] -1.000000e+00 1.000000e+00 3.330669e-16
> B<-solve(A);B
[,1] [,2] [,3]
[1,] -0.6666667 -1.333333 1
[2,] -0.6666667 3.666667 -2
[3,] 1.0000000 -2.000000 1
> A %*% B
[,1] [,2] [,3]
[1,] 1 8.881784e-16 -4.440892e-16
[2,] 0 1.000000e+00 -1.776357e-15
[3,] 0 0.000000e+00 1.000000e+00
8.求矩阵的特征值与特征值向量
eigen(Sm)是求对称矩阵Sm的特征值与特征向量,其命令形式为
ev<-eigen(Sm)
ev存放着对称矩阵Sm特征值和特征向量,是由列表形式给出,其中ev\(values是Sm的特征值构成的向量,ev\)vectors是Sm的特征向量构成的矩阵
> A
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 10
> Sm<-crossprod(A,A);Sm
[,1] [,2] [,3]
[1,] 66 78 97
[2,] 78 93 116
[3,] 97 116 145
> ev<-eigen(Sm);ev
eigen() decomposition
$values
[1] 303.19533618 0.76590739 0.03875643
$vectors
[,1] [,2] [,3]
[1,] -0.4646675 0.833286355 0.2995295
[2,] -0.5537546 -0.009499485 -0.8326258
[3,] -0.6909703 -0.552759994 0.4658502
9.矩阵的奇异值分解
函数svd(A)是对称A作奇异值分解,即A=UDV',其中U,V是正交阵,D为对角阵,也就是矩阵A的奇异值。svd(A)的返回值也是列表,svd(A)\(d表示矩阵A的奇异值,即矩阵D的对角线上的元素,svd(A)\)u对应的是正交阵U,svd(A)$v对应的是正交阵V
> svdA<-svd(A);svdA
$d
[1] 17.4125052 0.8751614 0.1968665
$u
[,1] [,2] [,3]
[1,] -0.2093373 0.96438514 0.1616762
[2,] -0.5038485 0.03532145 -0.8630696
[3,] -0.8380421 -0.26213299 0.4785099
$v
[,1] [,2] [,3]
[1,] -0.4646675 -0.833286355 0.2995295
[2,] -0.5537546 0.009499485 -0.8326258
[3,] -0.6909703 0.552759994 0.4658502
> attach(svdA)
The following object is masked _by_ .GlobalEnv:
v
> u %*% diag(d) %*% t(v)
Error in u %*% diag(d) %*% t(v) : 非整合参数
10.求矩阵行列式的值
> det(A)
[1] -3
11.最小拟合与QR分解
> x<-c(0.0,0.2,0.4,0.6,0.8)
> y<-c(0.9,1.9,2.8,3.3,4.2)
> lsfit.sol<-lsfit(x,y);lsfit.sol
$coefficients
Intercept X
1.02 4.00
$residuals
[1] -0.12 0.08 0.18 -0.12 -0.02
$intercept
[1] TRUE
$qr
$qt
[1] -5.85849810 2.52982213 0.23749843 -0.02946714 0.10356728
$qr
Intercept X
[1,] -2.2360680 -0.8944272
[2,] 0.4472136 0.6324555
[3,] 0.4472136 -0.1954395
[4,] 0.4472136 -0.5116673
[5,] 0.4472136 -0.8278950
$qraux
[1] 1.447214 1.120788
$rank
[1] 2
$pivot
[1] 1 2
$tol
[1] 1e-07
attr(,"class")
[1] "qr"
\(coefficients是拟合系数,\)residuals是拟合残差
与lsfit()函数有密切关系的函数是ls.diag(),它给出拟合的进一步统计信息
另一个最小二乘拟合有密切关系的函数是QR分解函数qr(),qe.coef(),qr.fitted()和qr.resid()
> X<-matrix(c(rep(1,5),x),ncol = 2);X
[,1] [,2]
[1,] 1 0.0
[2,] 1 0.2
[3,] 1 0.4
[4,] 1 0.6
[5,] 1 0.8
> Xplus<-qr(X);Xplus
$qr
[,1] [,2]
[1,] -2.2360680 -0.8944272
[2,] 0.4472136 0.6324555
[3,] 0.4472136 -0.1954395
[4,] 0.4472136 -0.5116673
[5,] 0.4472136 -0.8278950
$rank
[1] 2
$qraux
[1] 1.447214 1.120788
$pivot
[1] 1 2
attr(,"class")
[1] "qr"
QR分解函数qr()输入的设计矩阵需要加以1为元素的列,其返回值是列表,其中\(qr矩阵的上三角阵是QR分解中得到的R矩阵,下三角阵是QR分解得到的正交阵Q的部分信息,\)qraux是Q的附加信息
可用QR分解得到的结果计算最小二乘的系数
> b<- qr.coef(Xplus,y);b
[1] 1.02 4.00
得到的系数与函数lsfit()得到的结果相同,但是为什么用这种方法计算呢?这是因为用QR分解在计算最小二乘拟合时,其计算误差比一般方法要小
类似的,可以用QR分解得到最小二乘的拟合值和残差值
> fit<-qr.fitted(Xplus,y);fit
[1] 1.02 1.82 2.62 3.42 4.22
> res<-qr.resid(Xplus,y);res
[1] -0.12 0.08 0.18 -0.12 -0.02
2.5.5 与矩阵(数组)运算相关的函数
1.取矩阵的维数
> A<-matrix(1:6,nrow=2);A
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> dim(A)
[1] 2 3
> nrow(A)
[1] 2
> ncol(A)
[1] 3
2.矩阵的合并
函数cbind()把其自变量横向拼成一个大矩阵,rbind()把其自变量纵向拼成一个大矩阵
> x1<-rbind(c(1,2),c(3,4));x1
[,1] [,2]
[1,] 1 2
[2,] 3 4
> x2<-10+x1
> x3<-cbind(x1,x2);x3
[,1] [,2] [,3] [,4]
[1,] 1 2 11 12
[2,] 3 4 13 14
> x4<-rbind(x1,x2);x4
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 11 12
[4,] 13 14
> cbind(1,x1)
[,1] [,2] [,3]
[1,] 1 1 2
[2,] 1 3 4
3.矩阵的拉直
> A<-matrix(1:6,nrow=2);A
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> as.vector(A)
[1] 1 2 3 4 5 6
4.数组的维名字
> X<-matrix(1:6,ncol=2,dimnames = list(c("one","two","three"),c("First","Second")),byrow=T);X
First Second
one 1 2
two 3 4
three 5 6
> X<-matrix(1:6,ncol=2,byrow=T)
> dimnames(X)<-list(c("one","two","three"),c("First","Second"))
> colnames(X)
[1] "First" "Second"
> rownames(X)
[1] "one" "two" "three"
5.矩阵的广义转置
可以用aperm(A,perm)函数把数组A的各维按perm中指定的新次序重新排列
> A<-array(1:24,dim=c(2,3,4));A
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
, , 3
[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 16 18
, , 4
[,1] [,2] [,3]
[1,] 19 21 23
[2,] 20 22 24
> B<-aperm(A,c(2,3,1));B
, , 1
[,1] [,2] [,3] [,4]
[1,] 1 7 13 19
[2,] 3 9 15 21
[3,] 5 11 17 23
, , 2
[,1] [,2] [,3] [,4]
[1,] 2 8 14 20
[2,] 4 10 16 22
[3,] 6 12 18 24
结果是B把A的第2维移到了第1维,A的第3维移到了第2维,A的第1维移到了第3维,这时有B[i,j,k]=A[i,k,i]
> B[1,3,2];A[3,2,1]
[1] 14
Error in A[3, 2, 1] : 下标出界
6.apply函数
对于向量,可以用sum,mean等函数对其进行计算,对于数组(矩阵),如果想对其1维(或若干维)进行某种计算,可用apply函数,其一般形式为
apply(A,MARGIN,FUN,...)
其中A为一个数组,MARGIN是固定哪些维不变,FUN是用来计算的函数
> A<-matrix(1:6,nrow=2);A
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> apply(A, 1, sum)
[1] 9 12
> apply(A, 2, mean)
[1] 1.5 3.5 5.5
统计分析与R软件-chapter2-5的更多相关文章
- 统计分析与R软件-chapter2-6
2.6 列表与数据框 2.6.1 列表 1.列表的构造 列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可以是任意对象,不同元素不必是同一类型,元素本身允许是其他复杂数据类型, ...
- 统计分析与R软件-chapter2-3
2.3 对象和它的模式与属性 R是一种基于对象的语言,R的对象包含了若干个元素作为其数据,另外还可以有一些特殊数据称为属性,并规定了一些特定操作(如打印.绘图).比如,一个向量是一个对象,一个图形也是 ...
- 统计分析与R软件-chapter2-4
2.4 因子 统计中的变量有几中重要类别:区间变量.名义变量和有序变量.区间变量取连续的数值,可以进行求和.平均值等运算.名义变量和有序变量取离散值,可以用数值代表,也可以是字符型值,其具体数值没有加 ...
- 统计分析与R软件-chapter2-2
2.2 数字.字符与向量 2.2.1 向量 1.向量的赋值 x<-c(10.4,5.6,3.1,6.4,21.7) 2.向量的运算 x<-c(-1,0,2);y<-c(3,8,2) ...
- R软件导入数据_r语言怎么导入数据_R软件导入数据
R软件导入数据_r语言怎么导入数据_R软件导入数据 R软件导入数据 1.Rcmdr安装包导入数据: 1.安装Rcmdr包,输入: install.packages("Rcmdr") ...
- R统计建模与R软件
教材目录 第一章 概率统计的基本知识 第二章 R软件的使用 第三章 数据描述性分析 第四章 参数估计 第五章 假设检验 第六章 回归分析 第七章 方差分析 第八章 应用多元分析(I) 第九章 应用多元 ...
- R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲
这两天,由于要做一个文本分析的内容,所以搜索了一天R语言中的可以做文本分析的加载包,但是在安装包的过程,真是被虐千百遍,总是安装不成功.特此专门写一篇博文,把整个心塞史畅快的释放一下. ------- ...
- Fragstats:使用R软件读取frag78b.asc文件
Fragstats中,有一个用于熟悉Fragstats软件的demon,在tutorial中的1种,有reg78b.asc文件,其文件内容是包含了山歌图像的行数和列数以及分辨率大小等基本信息. 采用R ...
- R语言入门学习笔记 - 对R软件的认识
一.R软件 1.安装R:自行百度☺ 2.R控制台(R Console)和R程序脚本: 打开R软件,就会直接打开控制台,控制台可以显示程序运行的结果.错误提示等信息,也可以直接输入想要执行的操作并立即返 ...
随机推荐
- TensorFlow tensor张量拼接concat - split & stack - unstack
TensorFlow提供两种类型的拼接: tf.concat(values, axis, name='concat'):按照指定的已经存在的轴进行拼接 tf.stack(values, axis=0, ...
- ActiveMQ详细入门使用教程
ActiveMQ介绍 MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka.ActiveMQ是Apache下的开源项目,完全支持JM ...
- python第三次周末大作业
''' s18第三周周末⼤作业 模拟博客园系统: 1. 启动程序, 显⽰菜单列表 菜单: 1. 登录 2. 注册 3. ⽂章 4. ⽇记 5. 退出 2. ⽤户输入选项, ⽂章和⽇记必须在登录后才可以 ...
- tomcat 下配置ajax 跨域 tomcat font face 跨域 java跨域
tomcat ajax跨域和css字体 font face 跨域一样适用 CORS介绍 它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式 ...
- Openresty 学习笔记(四)lualocks包管理器安装使用
Luarocks是一个Lua包管理器,基于Lua语言开发,提供一个命令行的方式来管理Lua包依赖.安装第三方Lua包等,社区比较流行的包管理器之一,另还有一个LuaDist,Luarocks的包数量比 ...
- Subversion Edge部署
1.配置java的jdk vim /etc/profile 上面文件中加入export JAVA_HOME=/****/jdk*****,然后在path中加入$JAVA_HOME/bin: ,保存退 ...
- idea搭建Spring Boot+MyBatis
需要准备的环境: idea 2017.2 jdk1.8.0_144 Maven 3.5.0 请提前将idea与Maven.jdk配置好,本次项目用的都是比较新的. 步骤: 一.首先使用idea新建一个 ...
- [Android] Android 异步定时任务实现的三种方法(以SeekBar的进度自动实现为例)
[Android] Android 定时异步任务实现的三种方法(以SeekBar的进度自动实现为例) 一.采用Handler与线程的sleep(long)方法 二.采用Handler与timer及Ti ...
- AAndroid Studio的\drawable还是mipmap
图片应该放在drawable文件夹下,而mipmap文件夹只适合放app icons
- Retrofit GreenDao开发中遇到的坑
持续更新中1.使用@FormUrlEncoded的话,服务端需要使用Request.Form,如果不使用@FormUrlEncoded本地需要由 @FieldMap Map<String, Ob ...