2012-10-26 86 views
8

मेरे पास एक बड़ा एमएक्सएन मैट्रिक्स है, और मैंने रैखिक रूप से निर्भर कॉलम की पहचान की है। हालांकि, मैं जानना चाहता हूं कि रैखिक रूप से स्वतंत्र लोगों के संदर्भ में रैखिक रूप से निर्भर कॉलम लिखने के लिए आर में कोई तरीका है या नहीं। चूंकि यह एक बड़ा मैट्रिक्स है, निरीक्षण के आधार पर ऐसा करना संभव नहीं है।रैखिक रूप से स्वतंत्र कॉलम के संदर्भ में मैट्रिक्स में रैखिक रूप से निर्भर कॉलम कैसे लिखें?

मेरे पास मैट्रिक्स के प्रकार का एक खिलौना उदाहरण है।

> mat <- matrix(c(1,1,0,1,0,1,1,0,0,1,1,0,1,1,0,1,0,1,0,1), byrow=TRUE, ncol=5, nrow=4) 
> mat 
     [,1] [,2] [,3] [,4] [,5] 
[1,] 1 1 0 1 0 
[2,] 1 1 0 0 1 
[3,] 1 0 1 1 0 
[4,] 1 0 1 0 1 

यहां यह स्पष्ट है कि x3 = x1-x2, x5 = x1-x4। मैं जानना चाहता हूं कि एक बड़े मैट्रिक्स के लिए इसे पाने का एक स्वचालित तरीका है या नहीं।

धन्यवाद!

+1

इस समारोह आप मदद कर सकते हैं देता है: http://www.inside-r.org/packages/cran/heplots/docs/gsorth –

+1

@BenBolker और वह कड़ी है के बाद से अब मृत बस 'gsorth' फ़ंक्शन के लिए यहां देखें: https://cran.r-project.org/web/packages/heplots/heplots.pdf – Dason

उत्तर

9

मुझे यकीन है कि एक बेहतर तरीका है लेकिन मुझे इसके साथ खेलना पसंद आया। मैं मूल रूप से शुरुआत में एक चेक करता हूं यह देखने के लिए कि इनपुट मैट्रिक्स पूर्ण कॉलम रैंक है या नहीं, यह पूर्ण रैंक होने पर अनावश्यक गणना से बचने के लिए है। इसके बाद मैं पहले दो कॉलम से शुरू करता हूं और जांचता हूं कि क्या वह सबमिट्रिक्स पूर्ण कॉलम रैंक का है, यदि यह है तो मैं पहले कॉलम को चेक करता हूं और इसी तरह। एक बार जब हम कुछ सबमिट्रिक्स पाते हैं जो पूर्ण कॉलम रैंक नहीं है, तो मैं पिछले एक पर उस सबमेट्रिक्स में अंतिम कॉलम को वापस भेजता हूं जो हमें बताता है कि अंतिम कॉलम प्राप्त करने के लिए पहले कॉलम के रैखिक संयोजन कैसे बनाएं।

मेरा फ़ंक्शन अभी बहुत साफ नहीं है और कुछ अतिरिक्त जांच कर सकता है लेकिन कम से कम यह एक शुरुआत है।

mat <- matrix(c(1,1,0,1,0,1,1,0,0,1,1,0,1,1,0,1,0,1,0,1), byrow=TRUE, ncol=5, nrow=4) 


linfinder <- function(mat){ 
    # If the matrix is full rank then we're done 
    if(qr(mat)$rank == ncol(mat)){ 
     print("Matrix is of full rank") 
     return(invisible(seq(ncol(mat)))) 
    } 
    m <- ncol(mat) 
    # cols keeps track of which columns are linearly independent 
    cols <- 1 
    for(i in seq(2, m)){ 
     ids <- c(cols, i) 
     mymat <- mat[, ids] 
     if(qr(mymat)$rank != length(ids)){ 
      # Regression the column of interest on the previous 
      # columns to figure out the relationship 
      o <- lm(mat[,i] ~ mat[,cols] + 0) 
      # Construct the output message 
      start <- paste0("Column_", i, " = ") 
      # Which coefs are nonzero 
      nz <- !(abs(coef(o)) <= .Machine$double.eps^0.5) 
      tmp <- paste("Column", cols[nz], sep = "_") 
      vals <- paste(coef(o)[nz], tmp, sep = "*", collapse = " + ") 
      message <- paste0(start, vals) 
      print(message) 
     }else{ 
      # If the matrix subset was of full rank 
      # then the newest column in linearly independent 
      # so add it to the cols list 
      cols <- ids 
     } 
    } 
    return(invisible(cols)) 
} 

linfinder(mat) 

जो

> linfinder(mat) 
[1] "Column_3 = 1*Column_1 + -1*Column_2" 
[1] "Column_5 = 1*Column_1 + -1*Column_4" 
+0

धन्यवाद !!! यह बहुत अच्छा काम करता है! –

+0

@Dason I मेरे प्रश्न के लिए शोध करते समय इस उत्तर में आया है (बहुत समान, केवल अतिरिक्त आवश्यकताओं के साथ) @ http://stackoverflow.com/questions/43596486/how-to-identify-columns-that-are-sums- की-अन्य-स्तंभों में एक-डाटासेट। आपको उस चर्चा में वज़न देने के लिए भी बहुत अच्छा लगेगा। – Aurimas