/ সম্পাদনা: আরও অনুসরণ করুন এখন আপনি 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)
কারণ এই ম্যাট্রিক্সের অনেকগুলি কলাম রয়েছে, তাই আমি এর মাত্রিকতা আরও কিছুটা পরিচালনাযোগ্য কিছুতে কমিয়ে দিতে চাই। আমি এসভিডি সম্পাদন করতে এবং প্রথম এন মূল উপাদানগুলি (5 এখানে দেখানো হয়েছে; আমি সম্ভবত আমার আসল ডেটাসেটে 100 বা 500 ব্যবহার করব) ফেরত দেওয়ার জন্য আমি চমৎকার irlba প্যাকেজটি ব্যবহার করতে পারি :
library(irlba)
pc <- irlba(M, nu=5)$u
তবে, আমি পড়েছি যে পিসিএ করার আগে, ম্যাট্রিক্সকে কেন্দ্র করে নেওয়া উচিত (প্রতিটি কলাম থেকে কলামটি বিয়োগ করতে হবে)। এটি আমার ডেটাসেটে করা খুব কঠিন, এবং আরও ম্যাট্রিক্সের স্পারসিটি নষ্ট করে দেবে।
আন-স্কেলড ডেটাতে এসভিডি সঞ্চালন করা এবং সরাসরি কোনও মেশিন লার্নিং অ্যালগরিদমে খাওয়ানো এটি কতটা খারাপ? ম্যাট্রিক্সের স্পারসিটি সংরক্ষণের সময় আমি কীভাবে এই ডেটা স্কেল করতে পারি তার কোনও কার্যকর উপায় আছে?
/ সম্পাদনা: বি_মিনিয়ারের দ্বারা আমার নজরে আসা একটি "পিসি" সত্যই হওয়া উচিত:
pc <- M %*% irlba(M, nv=5, nu=0)$v
এছাড়াও, আমি মনে করি whuber এর উত্তর কার্যকরভাবে কার্যকর করা উচিত crossprod
ফাংশনটির মাধ্যমে , যা খুব কমই ম্যাট্রিক্সে দ্রুত:
system.time(M_Mt <- crossprod(M)) # 0.463 seconds
system.time(means <- colMeans(M)) #0.003 seconds
এখন থেকে আমি সাবস্ক্র্যাক্ট করার means
আগে ভেক্টরকে কী করতে হবে তা আমি নিশ্চিত নই M_Mt
, তবে আমি এটি বের করার সাথে সাথে পোস্ট করব।
/ সম্পাদনা 3: প্রক্রিয়াটির প্রতিটি পদক্ষেপের জন্য স্পারস ম্যাট্রিক্স অপারেশন ব্যবহার করে এখানে whuber কোডের সংশোধিত সংস্করণ। আপনি যদি মেমরিতে পুরো স্পারস ম্যাট্রিক্স সঞ্চয় করতে পারেন তবে এটি খুব দ্রুত কাজ করে:
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 মিনিট সময় নেয় এবং প্রায় 6 গিগাবাইট র্যাম গ্রহণ করে, এটি খুব খারাপ নয়।
X %*% v %*% diag(d, ncol=length(d))
। এসভিডি-তে থাকা ভি ম্যাট্রিক্স কোনও prcomp
বস্তুর "ঘূর্ণন" উপাদানটির সমতুল্য , এবং X %*% v
বা X %*% v %*% diag(d, ncol=length(d))
কোনও x
উপাদানের উপাদানকে উপস্থাপন করে prcomp
। একবার দেখে একটি নিন stats:::prcomp.default
।