主成分分析(PCA)简单代码实现(原理待补)

简单用代码实现了主成分分析(PCA)原理详解_李春春的专栏-CSDN博客_主成分分析中的PCA实例,只是简单实现了数理逻辑,通用性不高。

第一步:计算均值

avrg = np.mean(Data, axis=0)
x_avrg = avrg[0]
y_avrg = avrg[1]
print("Avrg:", x_avrg, y_avrg)
for i in range(10):
    DataAdjust[i, 0] = Data[i, 0] - x_avrg
    DataAdjust[i, 1] = Data[i, 1] - y_avrg
print("DataAdjust:", DataAdjust)

第二步:求特征方差矩阵

cov = np.cov(DataAdjust, rowvar = False) # or
print("Cov:", cov)

第三步:求协方差的特征值和特征向量 

eigenvectors = np.linalg.eig(cov)[1]
eigenvalues = np.linalg.eig(cov)[0]
print("Eig_Vectors:", eigenvectors)
print("Eig_Values:", eigenvalues)

 第四步:将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。

max_eigenvalues = np.argsort(-eigenvalues)
print("Max_Eig_Value:", max_eigenvalues)
tmp = max_eigenvalues[0]
for i in range(2):
    EigenVectors[i] = eigenvectors[i, tmp]
print("EigenVectors:",EigenVectors)

第五步: 将样本点投影到选取的特征向量上。

FinalData = np.matmul(DataAdjust, EigenVectors)
print("FinalData:", FinalData)

这次代码较为简单,过程比较顺利,大部分计算NumPy以及涵盖,这次学到了很多新功能。

如np.mean() np.cov() np.linalg.eig() np.matmul()等。

特别注意的是第五步的矩阵乘法:如果矩阵是二维的,那么 dot 和 matmul 函数的结果是相同的。

完整代码如下:

import numpy as np

Data = np.array([[2.5, 2.4],
                 [0.5, 0.7],
                 [2.2, 2.9],
                 [1.9, 2.2],
                 [3.1, 3.0],
                 [2.3, 2.7],
                 [2, 1.6],
                 [1, 1.1],
                 [1.5, 1.6],
                 [1.1, 0.9]])
DataAdjust = np.zeros((10, 2))
eigenvectors = np.zeros(2)
eigencvalues = np.zeros((2,2))
max_eigenvalues = np.zeros(2)
FinalData = np.zeros((10,1))
EigenVectors = np.zeros((1,2))

avrg = np.mean(Data, axis=0)
x_avrg = avrg[0]
y_avrg = avrg[1]
print("Avrg:", x_avrg, y_avrg)

for i in range(10):
    DataAdjust[i, 0] = Data[i, 0] - x_avrg
    DataAdjust[i, 1] = Data[i, 1] - y_avrg
print("DataAdjust:", DataAdjust)

cov = np.cov(DataAdjust, rowvar = False)
print("Cov:", cov)

eigenvectors = np.linalg.eig(cov)[1] 
print("Eig_Vectors:", eigenvectors)
eigenvalues = np.linalg.eig(cov)[0]
print("Eig_Values:", eigenvalues)

max_eigenvalues = np.argsort(-eigenvalues)
print("Max_Eig_Value:", max_eigenvalues)
tmp = max_eigenvalues[0]
for i in range(2):
    EigenVectors[i] = eigenvectors[i, tmp]
print("EigenVectors:",EigenVectors)

FinalData = np.matmul(DataAdjust, EigenVectors)
print("FinalData:", FinalData)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值