我正在尝试复制 Shalizi 在他的Advanced Data Analysis with an Elementary Point of View书中找到的 NY Times PCA 示例。我在这里找到了示例代码和数据
http://www.stat.cmu.edu/~cshalizi/490/pca/
我加载了 R 工作区 pca-examples.Rdata,并能够从中提取一个 CSV,并将其放入
https://github.com/burakbayramli/classnotes/blob/master/app-math-tr/pca/nytimes.csv
为了使用 SVD 进行 PCA,我做了
from pandas import *
import numpy.linalg as lin
nyt = read_csv ("nytimes.csv")
labels = nyt['class.labels']
nyt = nyt.drop(["class.labels"],axis=1)
nyt_demeaned = nyt - nyt.mean(0)
u,s,v = lin.svd(nyt_demeaned.T,full_matrices=False)
然后我尝试投影到由特征向量定义的空间上
nyt2 = np.dot(nyt_demeaned, u[:,0:2])
然后绘制
plot(nyt2[:,0],nyt2[:,1],'.')
和
arts = nyt2[labels == 'art']
music = nyt2[labels == 'music']
plot(arts[:,0],arts[:,1],'r.')
plot(music[:,0],music[:,1],'b.')
我明白了
这张图片与沙利子书中的图片不同(使用以下R代码)
load("pca-examples.Rdata")
nyt.pca = prcomp(nyt.frame[,-1])
nyt.latent.sem = nyt.pca$rotation
plot(nyt.pca$x[,1:2],type="n")
points(nyt.pca$x[nyt.frame[,"class.labels"]=="art",1:2],
pch="A",col="red")
points(nyt.pca$x[nyt.frame[,"class.labels"]=="music",1:2],
pch="M",col="blue")
也许有一个 90 度的错误,以一种或另一种方式翻转,等等。然后你可能会让两个图像有点接近,但即使这样分布也不完全正确,艺术的数据点也没有那么清楚地分开来自音乐数据点,因为它们在 Shalizi 的图片中。
有任何想法吗?