简单用代码实现了主成分分析(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)