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]]