首页 > 技术文章 > 主成分分析(PCA)

qw12 2016-11-21 19:30 原文

主成分分析(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()

 

 

推荐阅读