6

固有値アプローチを使用して行列が特異かどうかを確認しようとしています (つまり、固有値の 1 つがゼロの場合、行列は特異です)。コードは次のとおりです。

z <- matrix(c(-3,2,1,4,-9,6,3,12,5,5,9,4),nrow=4,ncol=3) 
eigen(t(z)%*%z)$values

固有値が降順でソートされていることは知っています。どの固有値が行列のどの列に関連付けられているかを調べる方法があるかどうか誰かに教えてもらえますか? 共線列を削除する必要があります。

上記の例で明らかかもしれませんが、これは、新しいマトリックスを作成する時間を節約することを目的とした単なる例です。

4

2 に答える 2

7

例:

z <- matrix(c(-3,2,1,4,-9,6,3,12,5,5,9,4),nrow=4,ncol=3)
m <- crossprod(z) ## slightly more efficient than t(z) %*% z

これは、3 番目の固有ベクトルが共線上の組み合わせに対応することを示しています。

ee <- eigen(m)
(evals <- zapsmall(ee$values))
## [1] 322.7585 124.2415   0.0000

次に、それぞれの固有値に対応する列としてリストされている、対応する固有ベクトルを調べます。

   (evecs <- zapsmall(ee$vectors))
   ## [1,] -0.2975496 -0.1070713  0.9486833
   ## [2,] -0.8926487 -0.3212138 -0.3162278
   ## [3,] -0.3385891  0.9409343  0.0000000

3 番目の固有値はゼロです。3 番目の固有ベクトル ( evecs[,3]) の最初の 2 つの要素は非ゼロです。これは、列 1 と 2 が同一線上にあることを示しています。

このテストを自動化する方法は次のとおりです。

   testcols <- function(ee) {
       ## split eigenvector matrix into a list, by columns
       evecs <- split(zapsmall(ee$vectors),col(ee$vectors))
       ## for non-zero eigenvalues, list non-zero evec components
       mapply(function(val,vec) {
           if (val!=0) NULL else which(vec!=0)
       },zapsmall(ee$values),evecs)
   }

testcols(ee)
##  [[1]]
## NULL
## [[2]]
## NULL
## [[3]]
## [1] 1 2
于 2012-09-06T17:13:29.357 に答える
2

tmp <- svd(z)svd を実行するために使用できます。tmp$d固有値は、固有値の対角行列として保存されます。これは、非正方行列でも機能します。

> diag(tmp$d)
         [,1]     [,2]         [,3]
[1,] 17.96548  0.00000 0.000000e+00
[2,]  0.00000 11.14637 0.000000e+00
[3,]  0.00000  0.00000 8.787239e-16
于 2012-09-06T17:57:01.743 に答える