统计分析与R软件-chapter2-5
生活随笔
收集整理的這篇文章主要介紹了
统计分析与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 122.用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 03.用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 152.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 102.不規則的數組下標
在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 242.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 5crossprod(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 254.向量的外積(叉積)
設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()是外積運算函數,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 505.矩陣的乘法
如果矩陣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 30crossprod(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,] 426.生成對角陣和矩陣取對角運算
函數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 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的特征值構成的向量,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.46585029.矩陣的奇異值分解
函數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] -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是擬合系數,\)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 2attr(,"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.022.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] 32.矩陣的合并
函數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.數組的維名字
> 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.矩陣的廣義轉置
可以用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轉載于:https://www.cnblogs.com/SweetZxl/p/chapter2-5.html
總結
以上是生活随笔為你收集整理的统计分析与R软件-chapter2-5的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网高级面试题目
- 下一篇: 为何 Canvas 内元素动画总是在颤抖