主成分分析(PCA)
主成分分析(principal component analysis)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量。
PCA的本质就是找一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向是相互正交的。
使用拉格朗日方程来求解该最大化问题,则:
对U求导:
令导数为0,可知u就是Σ的特征向量。这个最大化问题的解就是矩阵的特征向量。
协方差矩阵最大的特征值对应的特征向量就是样本方差最大的方向。
进行PCA 算法之前,数据一般都需要预处理。预处理步骤如下:
1 #coding:utf8 2 import numpy as np 3 import matplotlib.pyplot as plt 4 5 def pca(data,dim=1,normalise=0): 6 u = np.mean(data) 7 data -= u # 预处理1,2 8 C = np.cov(data.T) 9 evals,evecs = np.linalg.eig(C) 10 indices = np.argsort(evals)[::-1] # 特征值序号,大小升序 11 indices=indices[:dim] 12 evecs = evecs[:,indices] 13 if normalise: # 归一化,处于同一尺度可忽略,预处理3,4 14 for i in range(np.shape(evecs)[1]): 15 evecs[:,i] / np.linalg.norm(evecs[:,i]) * np.sqrt(evals[i]) 16 x = np.dot(evecs.T,np.transpose(data)) 17 y=np.dot(evecs,x).T+u 18 return x,y,evals,evecs 19 20 x = np.random.normal(5,.5,1000) 21 y = np.random.normal(3,1,1000) 22 a = x*np.cos(np.pi/4) + y*np.sin(np.pi/4) 23 b = -x*np.sin(np.pi/4) + y*np.cos(np.pi/4) 24 plt.plot(a,b,'.') 25 plt.xlabel('x') 26 plt.ylabel('y') 27 plt.title('raw dataset') 28 data=np.mat(zip(a,b)) 29 x,y,evals,evecs = pca(data,1) 30 plt.figure() 31 plt.plot(y[:,0],y[:,1],'.') 32 plt.xlabel('x') 33 plt.ylabel('y') 34 plt.title('new dataset') 35 plt.show()