PCA:
可以对原数据进行简化,并且有效的找出数据中最“主要”的元素和结构,去除噪声和冗余,将原有的复杂数据降维。具有简单且无参数限制的优点,可以利用在各个场合
步骤:
1、读取绿萝的数据,将txt文件的内容转化成23073x6的矩阵形式保存在Data中。
2、对样本进行中心化操作
3、得到新的数据,求协方差矩阵:
4、计算协方差矩阵的特征值和特征向量
5、对特征值进行排序并保留需要的N个主元(特征向量)
6、计算Y=PX:将数据映射到上述选取的N个主元构建的新空间中
例题:
根据已知的PCA方法对给定数据进行处理,设计算法并编写程序,实验结果包括两个部分,第一部分是由第1、2主元形成的二维点分布图(MATLAB);第二部分是由第1、2、4主元形成的三维点分布图(MATLAB),并对两幅图进行多角度展示和截图。
代码:
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import style
#1、读取数据并转为矩阵模式
def loadData(fileName):
plants = open(fileName)
plantsArr = [line.strip().split() for line in plants.readlines()] #分割遍历
finalArr = [list(map(float,line)) for line in plantsArr]
print(mat(finalArr))
return mat(finalArr)
#print(loadData('PointsNormals绿萝.txt'))
#2、定义PCA
def pca(finalMat):
avgVals = mean(finalMat,axis=0) #求均值
argRemoved = finalMat - avgVals #去中心化
covMat = cov(argRemoved,rowvar=0) #协方差矩阵
eigVals,eigVects = linalg.eig(mat(covMat)) #特征值,特征向量
eigValind = argsort(eigVals) #排序,默认从小到大
#print(eigValind)
eigValind1 = eigValind[:-3 :-1] #取前两个特征值得索引值
#print(eigValind1)
eigValind2 = [eigValind[5],eigValind[4],eigValind[2]] #取1、2、4索引值
#print(eigValind2)
newEigVects1 = eigVects [:,eigValind1] #取1,2主元
newEigVects2 = eigVects[:,eigValind2] #取1、2、4主元
newDataMat1 = argRemoved*newEigVects1 #降维
newDataMat2 = argRemoved*newEigVects2 #降维
return newDataMat1,newDataMat2
#3、画图
#二维图像绘制
def panting_2D(newDataMat1):
newDataMat = array(newDataMat1)
print(newDataMat)
n1 = shape(newDataMat)[0] #获取样本的个数
x_cord1 = []
y_cord1 = []
for i in range(n1):
x_cord1.append(newDataMat[i][0])
y_cord1.append(newDataMat[i][1])
plt.scatter(x_cord1,y_cord1,s=0.1,c= 'blue',marker = '^')
plt.title('PCA_2D')
plt.show()
def panting_3D(newDataMat2):
style.use('ggplot')
fig = plt.figure()
ax1 = fig.add_subplot(111,projection = '3d') #添加3d子图
newDataMat2 = array(newDataMat2)
n2 = shape(newDataMat2)[0]
x_cord2 = []
y_cord2 = []
z_cord2 = []
for i in range (n2):
x_cord2.append(newDataMat2[i,0])
y_cord2.append(newDataMat2[i,1])
z_cord2.append(newDataMat2[i,2])
ax1.scatter(x_cord2,y_cord2,z_cord2,s=0.1,c='g',marker='o')
ax1.set_xlabel('x axis')
ax1.set_ylabel('y axis')
ax1.set_zlabel('z axis')
plt.title('PCA-3D')
plt.show()
t=loadData('PointsNormals绿萝.txt')
m,n = pca(t)
panting_2D(m)
panting_3D(n)
参考链接:https://wenku.baidu.com/view/a034b8343a3567ec102de2bd960590c69ec3d8b7.html?re=view