मैं लिंडसे I स्मिथ द्वारा एक उत्कृष्ट पीसीए ट्यूटोरियल के माध्यम से आर में काम कर रहा हूं और अंतिम चरण में फंस रहा हूं । नीचे दी गई आर स्क्रिप्ट हमें स्टेज पर ले जाती है (पी .१ ९ पर) जहां मूल डेटा (इस मामले में एकवचन) से प्रिंसिपल कंपोनेंट का पुनर्निर्माण किया जा रहा है, जिसे पीसीए १ अक्ष के साथ एक सीधी रेखा प्लॉट मिलनी चाहिए (यह देखते हुए कि डेटा केवल 2 आयाम हैं, जिनमें से दूसरा जानबूझकर गिराया जा रहा है)।
d = data.frame(x=c(2.5,0.5,2.2,1.9,3.1,2.3,2.0,1.0,1.5,1.1),
y=c(2.4,0.7,2.9,2.2,3.0,2.7,1.6,1.1,1.6,0.9))
# mean-adjusted values
d$x_adj = d$x - mean(d$x)
d$y_adj = d$y - mean(d$y)
# calculate covariance matrix and eigenvectors/values
(cm = cov(d[,1:2]))
#### outputs #############
# x y
# x 0.6165556 0.6154444
# y 0.6154444 0.7165556
##########################
(e = eigen(cm))
##### outputs ##############
# $values
# [1] 1.2840277 0.0490834
#
# $vectors
# [,1] [,2]
# [1,] 0.6778734 -0.7351787
# [2,] 0.7351787 0.6778734
###########################
# principal component vector slopes
s1 = e$vectors[1,1] / e$vectors[2,1] # PC1
s2 = e$vectors[1,2] / e$vectors[2,2] # PC2
plot(d$x_adj, d$y_adj, asp=T, pch=16, xlab='x', ylab='y')
abline(a=0, b=s1, col='red')
abline(a=0, b=s2)
# PCA data = rowFeatureVector (transposed eigenvectors) * RowDataAdjust (mean adjusted, also transposed)
feat_vec = t(e$vectors)
row_data_adj = t(d[,3:4])
final_data = data.frame(t(feat_vec %*% row_data_adj)) # ?matmult for details
names(final_data) = c('x','y')
#### outputs ###############
# final_data
# x y
# 1 0.82797019 -0.17511531
# 2 -1.77758033 0.14285723
# 3 0.99219749 0.38437499
# 4 0.27421042 0.13041721
# 5 1.67580142 -0.20949846
# 6 0.91294910 0.17528244
# 7 -0.09910944 -0.34982470
# 8 -1.14457216 0.04641726
# 9 -0.43804614 0.01776463
# 10 -1.22382056 -0.16267529
############################
# final_data[[1]] = -final_data[[1]] # for some reason the x-axis data is negative the tutorial's result
plot(final_data, asp=T, xlab='PCA 1', ylab='PCA 2', pch=16)
जहाँ तक मुझे मिला है, और अब तक सब ठीक है। लेकिन मैं यह पता नहीं लगा सकता कि डेटा अंतिम प्लॉट के लिए कैसे प्राप्त किया जाता है - पीसीए 1 के लिए भिन्नता - जो स्मिथ के रूप में है:
यही मैंने कोशिश की है (जो मूल साधनों को जोड़ने की उपेक्षा करता है):
trans_data = final_data
trans_data[,2] = 0
row_orig_data = t(t(feat_vec[1,]) %*% t(trans_data))
plot(row_orig_data, asp=T, pch=16)
.. और एक भयावह मिला:
.. क्योंकि मैंने मैट्रिक्स गुणन में किसी तरह डेटा आयाम खो दिया है। मैं एक विचार के लिए बहुत आभारी रहूंगा कि यहां क्या गलत हो रहा है।
* संपादित करें *
मुझे आश्चर्य है कि अगर यह सही सूत्र है:
row_orig_data = t(t(feat_vec) %*% t(trans_data))
plot(row_orig_data, asp=T, pch=16, cex=.5)
abline(a=0, b=s1, col='red')
लेकिन मैं थोड़ा उलझन में हूँ अगर ऐसा है तो (क्योंकि) मैं rowVectorFeature
वांछित गतिशीलता (PCA1 के लिए eigenvector) को कम करने की ज़रूरतों को समझता हूं , और (b) यह PCA1 एबलाइन के साथ लाइन नहीं करता है:
किसी भी विचार बहुत सराहना की।
s1
ढलान एक गलती के साथ गणना की गई थी ( होना चाहिए , नहीं होना चाहिए ), यही कारण है कि लाल रेखा नहीं है पहले आंकड़े पर डेटा और पिछले एक पर पुनर्निर्माण के साथ पूरी तरह से संरेखित।