主要是对西瓜书里面的一个思路的实现,并不涉及PCA原理和公式推导,用一句话总结PCA,在 R d R^{d} Rd中的m个点经过矩阵变换(压缩)映射到 R d ′ R^{d'} Rd′空间中,并且保证 d ′ < d d'<d d′<d,其中 d ′ d' d′是新维度。
用矩阵表示:
Z
d
′
∗
m
=
W
d
′
∗
d
T
∗
X
d
∗
m
Z_{d'*m}=W^{T}_{d'*d} * X_{d*m}
Zd′∗m=Wd′∗dT∗Xd∗m
其中下标是矩阵行列数,和现实里面刚好反过来;Z是样本转换后的矩阵,X是样本最初的矩阵,W是转换(投影)矩阵。
一、思路
周志华老师《机器学习》P231
二、代码实现
主要是通过sklearn实现,比较简单
def get_pca(X,threshold):
pca=PCA()
pca.fit(X)
variance_ratio=pca.explained_variance_ratio_
s=0
for i in range(len(variance_ratio)):
s=s+variance_ratio[i]
if s>=threshold:
break
new_dim=i+1
components=pca.components_
change_matrix=components[0:new_dim,:]
norm_X=X-np.mean(X,axis=0)
X_pca=np.matmul(norm_X,change_matrix.T)
return X_pca
后来我用PCA(n_components=new_dim).fit_transform(X)和这个函数的结果对比过,主要是数值的精度不同,结果都正确。
三、补充资料
原理可以去看看这篇博客主成分分析(PCA)原理详解
另外花书的第二章和西瓜书的第十章都有比较详细的原理讲解以及公式推导。