PCA降维过程
第1步、求所给数据(变量)矩阵的协方差矩阵
第2步、求协方差矩阵的特征值和特征向量(数据矩阵的主成分是其协方差矩阵的特征向量,按照对应的特征值大小排序。最大的特征值对应的向量就是第一主成分,以此类推)
第3步、所有数据(变量)减去对应的平均值
第4步、用第三步点乘特征向量(从二维降到一维,只要点乘特征向量中的第一主成分)
例子如下:
#n是给出的变量x1和x2的数据,第一列表示x1,第二列表示x2,即n是二维的
print('----求协方差矩阵----')
n = [[0.9,1],
[2.4,2.6],
[1.2,1.7],
[0.5,0.7],
[0.3,0.7],
[1.8,1.4],
[0.5,0.6],
[0.3,0.6],
[2.5,2.6],
[1.3,1.1]]
#a是将n转变成数组后并转置的结果
a = np.array(n).T
'''a= [[0.9 2.4 1.2 0.5 0.3 1.8 0.5 0.3 2.5 1.3]
[1. 2.6 1.7 0.7 0.7 1.4 0.6 0.6 2.6 1.1]]
转置后第一行为x1的数据,第二行为x2的数据'''
#c是计算得到的协方差矩阵
c = np.cov(a)
print('c=',c)
'''c= [[0.68677778 0.60666667]
[0.60666667 0.59777778]]'''
print('-----求特征值和特征向量-----')
#eig函数返回特征值和特征向量的元组
w,v = np.linalg.eig(c)
print('特征值:',w,'\n','特征向量:',v)
#print('特征值:{}\n特征向量:{}'.format(w,v))#format输出方式
'''特征值: [1.25057433 0.03398123]
特征向量: [[ 0.73251454 -0.68075138]
[ 0.68075138 0.73251454]]'''
print('------各数据样本减去对应的均值,x1样本的均值为1.17,x2样本的均值为1.3--------')
#x为减去均值后的样本数据值
x=[[-0.27,-0.3],
[1.23,1.3],
[0.03,0.4],
[-0.67,0.6],
[-0.87,0.6],
[0.63,0.1],
[-0.67,-0.7],
[-0.87,-0.7],
[1.33,1.3],
[0.13,-0.2]]
y = [[ 0.73251454], [0.68075138]]#y为最大特征值1.25057433 对应的特征向量,从上面特征向量要竖着读
print('-------将上面的结果点乘----------')
q=np.dot(x,y)#点乘得到降维后的结果
print(q)
运行结果:
D:\python36\python.exe "D:/PyCharm files/machine learning/pca.py"
----求协方差矩阵----
c= [[0.68677778 0.60666667]
[0.60666667 0.59777778]]
-----求特征值和特征向量-----
特征值: [1.25057433 0.03398123]
特征向量: [[ 0.73251454 -0.68075138]
[ 0.68075138 0.73251454]]
------各数据样本减去对应的均值,x1样本的均值为1.17,x2样本的均值为1.3--------
-------将上面的结果点乘----------
[[-0.40200434]
[ 1.78596968]
[ 0.29427599]
[-0.08233391]
[-0.22883682]
[ 0.5295593 ]
[-0.96731071]
[-1.11381362]
[ 1.85922113]
[-0.04092339]]