统计分析与R软件-chapter2-5
生活随笔
收集整理的這篇文章主要介紹了
统计分析与R软件-chapter2-5
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2.5 多維數(shù)組和矩陣
2.5.1 生成數(shù)組或矩陣
數(shù)組有一個特征屬性叫做維數(shù)向量(dim屬性),維數(shù)向量是一個元素取正整數(shù)的向量,其長度是數(shù)組的維數(shù),比如維數(shù)向量有兩個元素時數(shù)組為2維數(shù)組(矩陣)。維數(shù)向量的每一個元素指定了該下標(biāo)的上界,下標(biāo)的下界總為1
1.將向量定義成數(shù)組
向量只有定義了維數(shù)向量(dim屬性)后才能被看作是數(shù)組
> 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 122.用array()函數(shù)構(gòu)造多維數(shù)組
R軟件可以用array()函數(shù)直接構(gòu)造數(shù)組,其構(gòu)造形式為
array(data=NA,dim=length(data),dimnames=NULL)
其中data是一個向量數(shù)據(jù),dim是數(shù)組各維的長度,缺省時是原向量的長度,dimnames是數(shù)組維的名字,缺省時為空
> 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 03.用matrix()函數(shù)構(gòu)造矩陣
函數(shù)matrix()是構(gòu)造矩陣的函數(shù),其構(gòu)造形式為
matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)
其中data是一個向量數(shù)據(jù),nrow是矩陣的行數(shù),ncol是矩陣的列數(shù)。當(dāng)byrow=TRUE時,生成矩陣的數(shù)據(jù)按行放置,缺省時相當(dāng)于byrow=FALSE,數(shù)據(jù)按列放置。dimnames是數(shù)組維數(shù)的名字,缺省時為空
> 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 152.5.2 數(shù)組下標(biāo)
1.數(shù)組下標(biāo)
> 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 102.不規(guī)則的數(shù)組下標(biāo)
在R語言中,甚至可以把數(shù)組中的任意位置的元素作為數(shù)組訪問,其方法是用一個二維數(shù)組作為數(shù)組的下標(biāo),二維數(shù)組的每一個行是一個元素的下標(biāo),列數(shù)為數(shù)組的維數(shù)。
例如,要把上面的形狀為234的數(shù)組a的第[1,1,1],[2,2,3],[1,3,4],[2,1,4]號共四個元素作為一個整體訪問,先定義一個包含這些下標(biāo)作為行的二維數(shù)組:
> 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 242.5.3 數(shù)組的四則運(yùn)算
> 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形狀不一致的向量(或數(shù)組)也可以進(jìn)行四則運(yùn)算,一般的規(guī)則是將向量(或數(shù)組)中的數(shù)據(jù)與對應(yīng)向量(或數(shù)組)中的數(shù)據(jù)進(jìn)行運(yùn)算,把短向量(或數(shù)組)的數(shù)據(jù)循環(huán)使用,從而可以與長向量(或數(shù)組)數(shù)據(jù)進(jìn)行匹配,并盡可能保留共同的數(shù)組屬性
> 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 : 長的對象長度不是短的對象長度的整倍數(shù)2.5.4 矩陣的運(yùn)算
1.轉(zhuǎn)置運(yùn)算
> 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.向量的內(nèi)積 > x<-1:5;y<-2*1:5 > x%*%y[,1] [1,] 110函數(shù)crossprod()是內(nèi)積運(yùn)算函數(shù)(表示交叉乘積),crossprod(x,y)計(jì)算向量x與y的內(nèi)積,即'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 5crossprod(x)表示x與x的內(nèi)積,即\(||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 254.向量的外積(叉積)
設(shè)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 50outer()是外積運(yùn)算函數(shù),outer(x,y)計(jì)算向量x與y的外積,它等價(jià)于 x %o% y
函數(shù)outer()的一般調(diào)用格式為
outer(X,Y,fun='*',...)
其中X,Y矩陣(或向量),fun是作外積運(yùn)算函數(shù),缺省值為乘法運(yùn)算,函數(shù)outer()在繪制三維曲面時非常有用,它可以生成一個X和Y的網(wǎng)格,
> 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 505.矩陣的乘法
如果矩陣A和B具有相同的維數(shù),則AB表示矩陣中對應(yīng)的元素的乘積,A %% B表示通常意義下的兩個矩陣的乘積(要求矩陣A的列數(shù)等于矩陣B的行數(shù))
> 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 30crossprod(A,B)表示的是t(A)%%B,函數(shù)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) : 非整合參數(shù) > tcrossprod(A,B) Error in tcrossprod(A, B) : 非整合參數(shù) > tcrossprod(A,t(B))[,1] [1,] 30 [2,] 36 [3,] 426.生成對角陣和矩陣取對角運(yùn)算
函數(shù)diag()依賴于它的變量,當(dāng)v是一個向量時,diag(v)表示以v的元素為對角線元素的對角陣。當(dāng)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 97.解線性方程組和求矩陣的逆矩陣
若求解線性方程組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+008.求矩陣的特征值與特征值向量
eigen(Sm)是求對稱矩陣Sm的特征值與特征向量,其命令形式為
ev<-eigen(Sm)
ev存放著對稱矩陣Sm特征值和特征向量,是由列表形式給出,其中ev\(values是Sm的特征值構(gòu)成的向量,ev\)vectors是Sm的特征向量構(gòu)成的矩陣
> 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.46585029.矩陣的奇異值分解
函數(shù)svd(A)是對稱A作奇異值分解,即A=UDV',其中U,V是正交陣,D為對角陣,也就是矩陣A的奇異值。svd(A)的返回值也是列表,svd(A)\(d表示矩陣A的奇異值,即矩陣D的對角線上的元素,svd(A)\)u對應(yīng)的是正交陣U,svd(A)$v對應(yīng)的是正交陣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) : 非整合參數(shù)10.求矩陣行列式的值
> det(A) [1] -311.最小擬合與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$qrIntercept 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-07attr(,"class") [1] "qr"\(coefficients是擬合系數(shù),\)residuals是擬合殘差
與lsfit()函數(shù)有密切關(guān)系的函數(shù)是ls.diag(),它給出擬合的進(jìn)一步統(tǒng)計(jì)信息
另一個最小二乘擬合有密切關(guān)系的函數(shù)是QR分解函數(shù)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 2attr(,"class") [1] "qr"QR分解函數(shù)qr()輸入的設(shè)計(jì)矩陣需要加以1為元素的列,其返回值是列表,其中\(zhòng)(qr矩陣的上三角陣是QR分解中得到的R矩陣,下三角陣是QR分解得到的正交陣Q的部分信息,\)qraux是Q的附加信息
可用QR分解得到的結(jié)果計(jì)算最小二乘的系數(shù)
> b<- qr.coef(Xplus,y);b [1] 1.02 4.00得到的系數(shù)與函數(shù)lsfit()得到的結(jié)果相同,但是為什么用這種方法計(jì)算呢?這是因?yàn)橛肣R分解在計(jì)算最小二乘擬合時,其計(jì)算誤差比一般方法要小
類似的,可以用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.022.5.5 與矩陣(數(shù)組)運(yùn)算相關(guān)的函數(shù)
1.取矩陣的維數(shù)
> 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] 32.矩陣的合并
函數(shù)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 43.矩陣的拉直
> 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 64.數(shù)組的維名字
> X<-matrix(1:6,ncol=2,dimnames = list(c("one","two","three"),c("First","Second")),byrow=T);XFirst 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.矩陣的廣義轉(zhuǎn)置
可以用aperm(A,perm)函數(shù)把數(shù)組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結(jié)果是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] : 下標(biāo)出界6.apply函數(shù)
對于向量,可以用sum,mean等函數(shù)對其進(jìn)行計(jì)算,對于數(shù)組(矩陣),如果想對其1維(或若干維)進(jìn)行某種計(jì)算,可用apply函數(shù),其一般形式為
apply(A,MARGIN,FUN,...)
其中A為一個數(shù)組,MARGIN是固定哪些維不變,FUN是用來計(jì)算的函數(shù)
> 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轉(zhuǎn)載于:https://www.cnblogs.com/SweetZxl/p/chapter2-5.html
總結(jié)
以上是生活随笔為你收集整理的统计分析与R软件-chapter2-5的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网高级面试题目
- 下一篇: 为何 Canvas 内元素动画总是在颤抖