2012-09-06 8 views
6

मैं यह जांचने की कोशिश कर रहा हूं कि मेरा मैट्रिक्स eigenvalues ​​दृष्टिकोण का उपयोग कर एकवचन है (यानी अगर eigenvalues ​​शून्य में से एक है तो मैट्रिक्स एकवचन है)। यहां कोड है:एकवचन के लिए परीक्षण करने के लिए eigenvalues ​​का उपयोग: कॉललाइनर कॉलम की पहचान

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

मुझे पता है कि eigenvalues ​​अवरोही क्रम में क्रमबद्ध हैं। कोई मुझे पता है कि eigenvalue मैट्रिक्स में क्या स्तंभ के लिए जुड़ा हुआ है पता लगाने के लिए एक तरह से वहाँ है यदि तो कृपया कर सकते हैं? मुझे कॉललाइन कॉलम को हटाने की जरूरत है।

यह ऊपर के उदाहरण में स्पष्ट हो सकता है, लेकिन यह सिर्फ एक उदाहरण एक नया मैट्रिक्स बनाने का समय बच करने का इरादा है।

+1

'eigen' एक गैर वर्ग मैट्रिक्स –

+0

लिए काम नहीं करता आप eigenvalues ​​गणना करने के लिए एक वर्ग मैट्रिक्स जरूरत है ... – James

+0

मुझे लगता है कि आप का मतलब है? 'Z <- मैट्रिक्स (ग (-3,2,1,4, -9,6,3,12,5,5,9,4), Nrow = 4, ncol = 4) eigen (z) $ मूल्यों ' –

उत्तर

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 

यह आपको बताता है कि तीसरे आइजन्वेक्टर समरेख संयोजनों से मेल खाती है:

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

अब इसी eigenvectors की जांच, जो कॉलम उनके संबंधित eigenvalues ​​के लिए इसी रूप में सूचीबद्ध हैं:

(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 

तीसरा eigenvalue शून्य है; तीसरे आइजन्वेक्टर (evecs[,3]) के पहले दो तत्वों गैर शून्य है, जो आपको बताता है कि कॉलम 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 
+0

@ बेनबॉल्कर तो ज़ेड में कौन से कॉलम कॉलिनर हैं? या evals = 0 –

+2

एक कॉलम में शून्य का एक eigenvalue नहीं है, परिभाषा के अनुसार: यह स्तंभों का एक * रैखिक संयोजन * है जो आपके उदाहरण में कॉललाइनर - कॉलम 1 और 2 है। –

+0

रुचि रखने वालों के लिए, यहां एक एसओ पोस्ट का एक लिंक है, जो अनिवार्य रूप से इस विधि को लागू करता है (विशेष रूप से रिग्रेशन विश्लेषण के संदर्भ के लिए) लेकिन जूलिया भाषा में, और थोड़ा और गणितीय पृष्ठभूमि प्रदान करता है: http: // stackoverflow। com/प्रश्न/39082724/सही या निकट multicollinearity में जूलिया/39082831 # 39082831 –

2

आप tmp <- svd(z) उपयोग कर सकते हैं एक SVD करना है:

यहाँ इस परीक्षण को स्वचालित करने के लिए एक तरीका है। eigenvalues ​​तो eigenvalues ​​के एक विकर्ण मैट्रिक्स के रूप में 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 
संबंधित मुद्दे