pca基础知识不了解的可以先看下一这篇博客:https://www.cnblogs.com/lliuye/p/9156763.html
具体算法实现如下:
1 import numpy as np 2 import matplotlib.pyplot as plt 3 # 载入数据 4 data = np.genfromtxt("data.csv", delimiter=",") 5 x_data = data[:,0] 6 y_data = data[:,1] 7 plt.scatter(x_data,y_data) 8 plt.show() 9 print(x_data.shape) 10 # 数据中心化 11 def zeroMean(dataMat): 12 # 按列求平均,即各个特征的平均 13 meanVal = np.mean(dataMat, axis=0) 14 newData = dataMat - meanVal 15 return newData, meanVal 16 newData,meanVal=zeroMean(data) 17 print(newData.shape) 18 # np.cov用于求协方差矩阵,参数rowvar=0说明数据一行代表一个样本,若非0,说明传入的数据一列代表一个样本。 19 covMat = np.cov(newData, rowvar=0)#因为是行作为样本,所以列作为特征,得到的协方差是2*2 20 # 协方差矩阵 21 print(covMat) 22 # np.linalg.eig求矩阵的特征值和特征向量 23 eigVals, eigVects = np.linalg.eig(np.mat(covMat)) 24 # 特征值 25 print(eigVals) 26 # 特征向量 27 print(eigVects.shape) 28 # 对特征值从小到大排序 29 eigValIndice = np.argsort(eigVals) 30 eigValIndice 31 top = 1 32 # 最大的n个特征值的下标 33 n_eigValIndice = eigValIndice[-1:-(top+1):-1] 34 print(n_eigValIndice) 35 # 最大的n个特征值对应的特征向量 36 n_eigVect = eigVects[:,n_eigValIndice] 37 print(n_eigVect.shape) 38 # 低维特征空间的数据 39 lowDDataMat = newData*n_eigVect#原始数据投射到选取的特征向量上 40 print(lowDDataMat.shape)#低纬数据 41 # 利用低纬度数据来重构数据 42 reconMat = (lowDDataMat*n_eigVect.T) + meanVal#降维的逆操作 43 reconMat 44 # 载入数据 45 data = np.genfromtxt("data.csv", delimiter=",") 46 x_data = data[:,0] 47 y_data = data[:,1] 48 plt.scatter(x_data,y_data) 49 50 # 重构的数据 51 x_data = np.array(reconMat)[:,0] 52 y_data = np.array(reconMat)[:,1] 53 plt.scatter(x_data,y_data,c=‘r‘) 54 plt.show() 55 56 plt.show()
关于np.cov的用法详细如下:
原文:https://www.cnblogs.com/henuliulei/p/11845992.html