PCA算法介绍在《模式识别与智能计算》33页,亲自行查看哈,讲的还是很不错的
PCA算法过程: 输入:训练样本集 D=x(1),x(2),…,x(m) ,低维空间维数 d′ ; 过程:. 1:对所有样本进行中心化(去均值操作): x(i)j←x(i)j−1m∑mi=1x(i)j ; 2:计算样本的协方差矩阵 XXT ; 3:对协方差矩阵 XXT 做特征值分解 ; 4:取最大的 d′ 个特征值所对应的特征向量 w1,w2,…,wd′ 5:将原样本矩阵与投影矩阵相乘: X⋅W 即为降维后数据集 X′ 。其中 X 为 m×n 维, W=[w1,w2,…,wd′] 为 n×d′ 维。 5:输出:降维后的数据集 X′
import numpy as np
def PCA(x,K):
"""
:param X: 数据X m*n维 n表示特征个数,m表示数据个数
:param K: K表是要保留的维度
:return: 返回特征向量
"""
m,n = x.shape
mean = []
for i in range(n):
mean.append(np.mean(x[:,i]))
x_norm = x - mean
cov = np.dot(x_norm,x_norm.T)
eigval,eigvec = np.linalg.eig(cov)
index = np.argsort(-eigval)
eigvec_sort = eigvec[index]
eigval_sort = eigval[index]
return eigval_sort
if __name__ == '__main__':
#6个2维的数据样本
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
eigval_sort = PCA(X,1)
print(eigval_sort[0] / np.sum(eigval_sort), eigval_sort[1] / np.sum(eigval_sort))
实验结果
#这里使用的是sklearn包里数据集,看了一下跟sklearn里的结果一样的
0.9924428900898052 0.007557109910194738