Saya bekerja di R melalui tutorial PCA yang sangat baik oleh Lindsay I Smith dan saya terjebak di tahap terakhir. Script R di bawah ini membawa kita ke tahap (pada hal.19) di mana data asli sedang direkonstruksi dari Komponen Utama (tunggal dalam hal ini), yang akan menghasilkan plot garis lurus sepanjang sumbu PCA1 (mengingat bahwa data hanya memiliki 2 dimensi, yang kedua sedang sengaja dihapus).
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)
Sejauh ini yang saya miliki, dan semuanya baik-baik saja sejauh ini. Tapi saya tidak tahu bagaimana data diperoleh untuk plot terakhir - varian yang dikaitkan dengan PCA 1 - yang oleh Smith diplot sebagai:
Inilah yang saya coba (yang mengabaikan menambahkan cara asli):
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)
.. dan mendapat erron:
.. karena saya telah kehilangan dimensi data entah bagaimana dalam perkalian matriks. Saya akan sangat berterima kasih atas ide apa yang salah di sini.
* Edit *
Saya ingin tahu apakah ini formula yang tepat:
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')
Tapi saya agak bingung jika demikian karena (a) Saya mengerti rowVectorFeature
kebutuhan harus direduksi ke dimensi yang diinginkan (vektor eigen untuk PCA1), dan (b) tidak sejalan dengan PCA1 abline:
Setiap pandangan sangat dihargai.
s1
kemiringan Anda dihitung dengan kesalahan (harus , bukan ), itu sebabnya garis merah tidak sangat selaras dengan data pada gambar pertama dan dengan rekonstruksi pada yang terakhir.