赞
踩
简单用代码实现了主成分分析(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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。