/ संपादित करें: आगे का अनुसरण करें अब आप irlba :: prcomp_irlba का उपयोग कर सकते हैं
/ संपादित करें: मेरी अपनी पोस्ट पर चल रहा है। irlba
अब "केंद्र" और "पैमाने" तर्क हैं, जो आपको सिद्धांत घटकों की गणना करने के लिए इसका उपयोग करते हैं, उदाहरण के लिए:
pc <- M %*% irlba(M, nv=5, nu=0, center=colMeans(M), right_only=TRUE)$v
मेरे पास एक बड़ी सुविधा है, Matrix
जो मैं मशीन लर्निंग एल्गोरिदम में उपयोग करना चाहता हूँ:
library(Matrix)
set.seed(42)
rows <- 500000
cols <- 10000
i <- unlist(lapply(1:rows, function(i) rep(i, sample(1:5,1))))
j <- sample(1:cols, length(i), replace=TRUE)
M <- sparseMatrix(i, j)
क्योंकि इस मैट्रिक्स में कई कॉलम हैं, मैं इसकी आयामीता को कुछ अधिक प्रबंधनीय के रूप में कम करना चाहूंगा। मैं SVD करने के लिए उत्कृष्ट irlba पैकेज का उपयोग कर सकता हूं और पहले n प्रिंसिपल घटकों को वापस कर सकता हूं (5 यहां दिखाया गया है; मैं शायद अपने वास्तविक डेटासेट पर 100 या 500 का उपयोग करूंगा):
library(irlba)
pc <- irlba(M, nu=5)$u
हालाँकि, मैंने पढ़ा है कि PCA करने से पहले, मैट्रिक्स को केंद्र में रखना चाहिए (प्रत्येक स्तंभ से स्तंभ का मतलब घटाएं)। यह मेरे डेटासेट पर करना बहुत मुश्किल है, और इसके अलावा मैट्रिक्स की विरलता को नष्ट कर देगा।
अन-स्केल डेटा पर SVD का प्रदर्शन करना कितना "बुरा" है, और इसे सीधे मशीन लर्निंग एल्गोरिथम में फीड करना है? मैट्रिक्स के स्पार्सिटी को संरक्षित करते हुए क्या मैं इस डेटा को माप सकता हूं?
/ संपादित करें: B_miner द्वारा मेरे ध्यान में लाया गया, "पीसी" वास्तव में होना चाहिए:
pc <- M %*% irlba(M, nv=5, nu=0)$v
इसके अलावा, मुझे लगता है कि फुलर के उत्तर को crossprod
फ़ंक्शन के माध्यम से लागू करना बहुत आसान होना चाहिए , जो विरल मैट्रिस पर बहुत तेज़ है:
system.time(M_Mt <- crossprod(M)) # 0.463 seconds
system.time(means <- colMeans(M)) #0.003 seconds
अब मुझे पूरी तरह से यकीन नहीं है कि means
इससे घटाने से पहले वेक्टर को क्या करना है M_Mt
, लेकिन जैसे ही मैं इसका पता लगाऊंगा , पोस्ट कर दूंगा।
/ edit3: यहां प्रक्रिया के प्रत्येक चरण के लिए विरल मैट्रिक्स संचालन का उपयोग करते हुए, व्हीबर कोड का संशोधित संस्करण दिया गया है। यदि आप पूरे विरल मैट्रिक्स को मेमोरी में स्टोर कर सकते हैं, तो यह बहुत जल्दी काम करता है:
library('Matrix')
library('irlba')
set.seed(42)
m <- 500000
n <- 100
i <- unlist(lapply(1:m, function(i) rep(i, sample(25:50,1))))
j <- sample(1:n, length(i), replace=TRUE)
x <- sparseMatrix(i, j, x=runif(length(i)))
n_comp <- 50
system.time({
xt.x <- crossprod(x)
x.means <- colMeans(x)
xt.x <- (xt.x - m * tcrossprod(x.means)) / (m-1)
svd.0 <- irlba(xt.x, nu=0, nv=n_comp, tol=1e-10)
})
#user system elapsed
#0.148 0.030 2.923
system.time(pca <- prcomp(x, center=TRUE))
#user system elapsed
#32.178 2.702 12.322
max(abs(pca$center - x.means))
max(abs(xt.x - cov(as.matrix(x))))
max(abs(abs(svd.0$v / pca$rotation[,1:n_comp]) - 1))
यदि आप स्तंभों की संख्या 10,000 और मूल घटकों की संख्या 25 तक सेट करते हैं, तो- irlba
आधारित पीसीए को 50 अनुमानित प्रमुख घटकों की गणना करने में लगभग 17 मिनट लगते हैं और लगभग 6GB RAM की खपत होती है, जो बहुत बुरा नहीं है।
X %*% v %*% diag(d, ncol=length(d))
। SVD में वी मैट्रिक्स एक के तत्व "रोटेशन" के बराबर है prcomp
वस्तु, और X %*% v
या X %*% v %*% diag(d, ncol=length(d))
का प्रतिनिधित्व करता है x
एक के तत्व prcomp
वस्तु। देख लेना stats:::prcomp.default
।