2012-01-30 18 views
8

मैं आर में एक मनमाना एन एक्स जे मैट्रिक्स S के एक प्रक्षेपण मैट्रिक्स P गणना करने के लिए कोशिश कर रहा हूँ के माध्यम से मैट्रिक्स निम्नलिखित समारोह के साथ इस प्रदर्शन करने के लिए कोशिश कर रहा:कंप्यूट प्रक्षेपण/टोपी क्यूआर गुणन, SVD (? और Cholesky गुणन)

P <- function(S){ 
    output <- S %*% solve(t(S) %*% S) %*% t(S) 
    return(output) 
} 

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

# Error in solve.default(t(S) %*% S, t(S), tol = 1e-07) : 
# system is computationally singular: reciprocal condition number = 2.26005e-28 

मुझे लगता है कि यह संख्यात्मक अंडरफ्लो और/या अस्थिरता का परिणाम है जैसा कि r-help और here जैसी कई जगहों पर चर्चा की गई है, लेकिन मुझे समस्या को ठीक करने के लिए एसवीडी या क्यूआर अपघटन का उपयोग करके पर्याप्त अनुभव नहीं हुआ है, या फिर यह मौजूदा कोड डालें कार्रवाई में। मैंने सुझाए गए कोड का भी प्रयास किया है, जो सिस्टम के रूप में हल करना है:

output <- S %*% solve (t(S) %*% S, t(S), tol=1e-7) 

लेकिन फिर भी यह काम नहीं करता है। किसी भी सुझाव की सराहना की जाएगी।

मुझे पूरा यकीन है कि मेरा मैट्रिक्स उलटा होना चाहिए और इसमें कोई सह-रैखिकता नहीं है, अगर केवल इसलिए कि मैंने ऑर्थोगोनल डमी चर के मैट्रिक्स के साथ इसका परीक्षण करने का प्रयास किया है, और यह अभी भी काम नहीं करता है।

इसके अलावा, मैं इसे काफी बड़े matrices पर लागू करना चाहता हूं, इसलिए मैं एक साफ सामान्य समाधान की तलाश में हूं।

+1

क्या कोई कारण है कि आप प्रिंसकंप या प्रकोप का उपयोग नहीं करना चाहते हैं? प्रमुख घटकों की गणना हाथ से करने की आवश्यकता नहीं है। –

+0

डर है कि कोई सामान्य समाधान नहीं है, अगर यह स्थिति संख्या है तो आपको कोई समस्या है। –

+0

हाय, मैं पीसीए को जितना अनुमान लगाता हूं उतना ही लागू करने की कोशिश नहीं कर रहा हूं। मुझे यह अजीब लगता है कि मैं इसे डमी उपकरणों के एक साधारण मैट्रिक्स के लिए भी काम नहीं कर सकता, जब ऐसा लगता है कि कॉललाइनर नहीं है। – bikeclub

उत्तर

-1

chol से S'S पर लागू करने के बारे में, तो chol2inv। अधिक स्थिर होना चाहिए:

chol2inv(chol(crossprod(S))) 
7

हालांकि ओ पी एक वर्ष से अधिक के लिए सक्रिय नहीं किया गया है, मैं अभी भी एक जवाब पोस्ट करने के लिए निर्णय लेते हैं। मैं S के बजाय X का प्रयोग करेंगे, सांख्यिकी में के रूप में, हम अक्सर रेखीय प्रतीपगमन संदर्भ में, जहां X मॉडल मैट्रिक्स है में प्रक्षेपण मैट्रिक्स चाहते हैं, y प्रतिक्रिया वेक्टर है, जबकि H = X(X'X)^{-1}X' टोपी/प्रक्षेपण मैट्रिक्स है ताकि Hy भविष्य कहनेवाला मूल्यों देता है।

यह उत्तर साधारण कम से कम वर्गों के संदर्भ को मानता है। भारित कम से कम वर्गों के लिए, Get hat matrix from QR decomposition for weighted least square regression देखें।


अवलोकन

solve एक सामान्य वर्ग मैट्रिक्स की LU गुणन पर आधारित है। X'X के लिए (crossprod(X) द्वारा t(X) %*% X के बजाय आर में ?crossprod के लिए गणना की जानी चाहिए), जो सममित है, हम chol2inv का उपयोग कर सकते हैं जो Choleksy कारककरण पर आधारित है।

हालांकि, त्रिभुज कारक QR कारककरण से कम स्थिर है। यह समझना मुश्किल नहीं है। यदि X में सशर्त संख्या kappa है, X'X में सशर्त संख्या kappa^2 होगी। यह बड़ी संख्यात्मक कठिनाई का कारण बन सकता है। आपको प्राप्त त्रुटि संदेश:

# system is computationally singular: reciprocal condition number = 2.26005e-28 

बस यह कह रहा है।kappa^2 लगभग e-28 है, जो लगभग e-16 पर मशीन परिशुद्धता से बहुत छोटा है। सहनशीलता tol = .Machine$double.eps, X'X रैंक की कमी के रूप में देखा जाएगा, इस प्रकार LU और Cholesky कारक टूट जाएगा।

आम तौर पर, हम इस स्थिति में एसवीडी या क्यूआर पर स्विच करते हैं, लेकिन पिवोट चोलस्की कारककरण एक और विकल्प है।

  • एसवीडी सबसे स्थिर विधि है, लेकिन बहुत महंगा है;
  • क्यूआर मध्यम कम्प्यूटेशनल लागत पर संतोषजनक रूप से स्थिर है, और आमतौर पर अभ्यास में उपयोग किया जाता है;
  • स्वीकार्य स्थिरता के साथ पिवोटेड चॉस्की तेजी से है। बड़े मैट्रिक्स के लिए इसे प्राथमिकता दी जाती है।

निम्नलिखित में, मैं सभी तीन विधियों को समझाऊंगा।


क्यूआर गुणन का उपयोग

QR factorization

ध्यान दें कि प्रक्षेपण मैट्रिक्स क्रमचय स्वतंत्र है, जैसे कि, यह कोई बात नहीं हम साथ या पिवट बिना क्यूआर गुणन प्रदर्शन या नहीं।

आर में, qr.default क्यूआर गुणन पिवट किए Linpack दिनचर्या DQRDC गैर पिवट किए क्यूआर गुणन के लिए, और LAPACK दिनचर्या DGEQP3 ब्लॉक के लिए कॉल कर सकते हैं। के एक खिलौना मैट्रिक्स दोनों विकल्प पैदा करते हैं और जांचते हैं:

set.seed(0); X <- matrix(rnorm(50), 10, 5) 
qr_linpack <- qr.default(X) 
qr_lapack <- qr.default(X, LAPACK = TRUE) 

str(qr_linpack) 
# List of 4 
# $ qr : num [1:10, 1:5] -3.79 -0.0861 0.3509 0.3357 0.1094 ... 
# $ rank : int 5 
# $ qraux: num [1:5] 1.33 1.37 1.03 1.01 1.15 
# $ pivot: int [1:5] 1 2 3 4 5 
# - attr(*, "class")= chr "qr" 

str(qr_lapack) 
# List of 4 
# $ qr : num [1:10, 1:5] -3.79 -0.0646 0.2632 0.2518 0.0821 ... 
# $ rank : int 5 
# $ qraux: num [1:5] 1.33 1.21 1.56 1.36 1.09 
# $ pivot: int [1:5] 1 5 2 4 3 
# - attr(*, "useLAPACK")= logi TRUE 
# - attr(*, "class")= chr "qr" 

नोट $pivot दो वस्तुओं के लिए अलग है।

अब, हम गणना करने के लिए QQ' एक आवरण समारोह को परिभाषित:

H1 <- f(qr_linpack) 
H2 <- f(qr_lapack) 

mean(abs(H1 - H2)) 
# [1] 9.530571e-17 

विलक्षण मूल्य अपघटन का उपयोग करना:

f <- function (QR) { 
    ## thin Q-factor 
    Q <- qr.qy(QR, diag(1, nrow = nrow(QR$qr), ncol = QR$rank)) 
    ## QQ' 
    tcrossprod(Q) 
    } 

हम उस qr_linpack और qr_lapack एक ही प्रक्षेपण मैट्रिक्स दे देखेंगे

SVD

आर में, svd एकवचन मूल्य अपघटन की गणना करता है। फिर

SVD <- svd(X) 

str(SVD) 
# List of 3 
# $ d: num [1:5] 4.321 3.667 2.158 1.904 0.876 
# $ u: num [1:10, 1:5] -0.4108 -0.0646 -0.2643 -0.1734 0.1007 ... 
# $ v: num [1:5, 1:5] -0.766 0.164 0.176 0.383 -0.457 ... 

H3 <- tcrossprod(SVD$u) 

mean(abs(H1 - H3)) 
# [1] 1.311668e-16 

, हम एक ही प्रक्षेपण मैट्रिक्स मिलती है: हम अभी भी ऊपर के उदाहरण मैट्रिक्स X का उपयोग करें।


पाइवट किया गया Cholesky गुणन

Pivoted Cholesky factorization

का उपयोग करते हुए प्रदर्शन के लिए, हम अभी भी ऊपर के उदाहरण X का उपयोग करें।

## pivoted Chol for `X'X`; we want lower triangular factor `L = R'`: 
## we also suppress possible rank-deficient warnings (no harm at all!) 
L <- t(suppressWarnings(chol(crossprod(X), pivot = TRUE))) 

str(L) 
# num [1:5, 1:5] 3.79 0.552 -0.82 -1.179 -0.182 ... 
# - attr(*, "pivot")= int [1:5] 1 5 2 4 3 
# - attr(*, "rank")= int 5 

## compute `Q'` 
r <- attr(L, "rank") 
piv <- attr(L, "pivot") 
Qt <- forwardsolve(L, t(X[, piv]), r) 

## P = QQ' 
H4 <- crossprod(Qt) 

## compare 
mean(abs(H1 - H4)) 
# [1] 6.983997e-17 

फिर, हमें एक ही प्रक्षेपण मैट्रिक्स मिलता है।

+2

बहुत स्पष्टीकरण, विशेष रूप से विभिन्न दृष्टिकोणों को ध्यान में रखते हुए। –

संबंधित मुद्दे