pca算法实现

北城以北 提交于 2019-12-04 07:11:13

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()

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!