标签:高维数据 href res 子空间 坐标 fit 缺点 sel 圆点
PCA降维
一.原理
这篇文章总结的不错PCA的数学原理。
PCA主成分分析是将原始数据以线性形式映射到维度互不相关的子空间。主要就是寻找方差最大的不相关维度。数据的最大方差给出了数据的最重要信息。
二.优缺点
优:将高维数据映射到低维,降低数据的复杂性,识别最重要的多个特征
不足:不一定需要,且可能损失有用信息
适用数值型数据
三.步骤
1.原始数据X,对于每列属性,去平均值(也可以对数值进行标准分化)
2.计算样本点的协方差矩阵(列间两两计算相关性)
3.求出协方差矩阵的特征值和对应的特征向量
4.从大到小排序特征值,取得最前的k个特征向量P
5.将数据转换到k个特征向量构建的新空间中,Y=P^tX
四.python代码
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import numpy as np 5 from sklearn.decomposition import PCA 6 from matplotlib import pyplot as plt 7 8 class PCA_DimensionalityReduction: 9 10 def __init__(self): 11 # 随机产生数据沿y=2x分布, 12 self.x = np.arange(1, 101, 1).astype(float) 13 self.y = 2 * np.arange(1, 101, 1).astype(float) 14 15 def dataProduction(self): 16 #添加服从正太分布的噪音数据normal(均值,标准差,个数) 17 noise=np.random.normal(0,10,100) 18 self.y+=noise 19 #定义绘图 20 self.fig=plt.figure(figsize=(10,10)) 21 #红色的小圆点在坐标平面上画一个点 22 plt.plot(self.x,self.y,‘ro‘) 23 #坐标范围axis[xmin,xmax,ymin,ymax] 24 plt.axis([0,102,-20,220]) 25 #箭头 26 plt.quiver(60, 100, 10 - 0, 20 - 0, scale_units=‘xy‘, scale=1) 27 plt.arrow(60, 100, 10 - 0, 20 - 0, head_width=2.5, head_length=2.5, fc=‘k‘, ec=‘k‘) 28 #图中的任意位置添加文字 29 plt.text(70,110,r‘$v^1$‘,fontsize=20) 30 31 #保存 32 # 添加子图,返回Axes实例,参数:子图总行数,子图总列数,子图位置 33 ax=self.fig.add_subplot(111) 34 ax.axis([0,102,-20,220]) 35 ax.set_xlabel(‘x‘,fontsize=40) 36 ax.set_ylabel(‘y‘,fontsize=40) 37 self.fig.suptitle(‘2 dimensional‘,fontsize=40) 38 self.fig.savefig(‘pca_data.png‘) 39 40 ‘‘‘ 41 PCA算法 42 总结一下PCA的算法步骤: 43 设有m条n维数据。 44 1)将原始数据按列组成n行m列矩阵X 45 2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值 46 3)求出协方差矩阵C=(1/m)X(X)^T 47 4)求出协方差矩阵的特征值及对应的特征向量 48 5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P 49 6)Y=PX 50 即为降维到k维后的数据 51 ‘‘‘ 52 #使用np.linalg.eig计算特征值和特征向量 53 def dr_pca(self): 54 #每列属性的均值 55 mean_x=np.mean(self.x) 56 mean_y=np.mean(self.y) 57 #这里对数据标准分化 58 mean_vector=np.array([[mean_x],[mean_y]]) 59 self.u_x=(self.x-mean_x)/np.std(self.x)#除标准差 60 self.u_y=(self.y-mean_y)/np.std(self.y) 61 #协方差矩阵 62 sigma=np.cov([self.u_x,self.u_y]) 63 #从协方差矩阵中求出特征值和特征向量,选择特征值最大的对应的特征向量 64 eig_vals,eig_vecs=np.linalg.eig(sigma) 65 eig_pairs=[(np.abs(eig_vals[i]),eig_vecs[:,i]) for i in range(len(eig_vals))] 66 eig_pairs.sort() 67 eig_pairs.reverse() 68 v1=eig_pairs[0][1]#取出一个最大特征值对应的特征向量 69 print(‘v1,shape:‘,(v1,v1.shape)) 70 #映射到由k个特征向量组成的子空间特征向量(主成分) 71 X=np.array([self.u_x,self.u_y]) 72 #X=X.T 73 print(‘X shape:‘,X.shape) 74 main_vector=v1.T.dot(X) 75 print(‘main_vector:‘,main_vector.T) 76 77 #w=np.array(v1.reshape(2,1)) 78 #main_vector=w.T.dot(X) 79 #print(‘w:‘,w.shape) 80 #print("main_vector2:",main_vector) 81 82 #使用sklearn中的pca 83 def sklearn_pca(self): 84 X=np.array([self.u_x,self.u_y]) 85 X=X.T 86 pca=PCA(n_components=1) #指定主成分数量 87 88 #pca.fig(X)#训练pca模型 89 #v1 = pca.components_[0] # 得到特征向量 90 #print(‘v1:‘, v1) 91 92 main_vector=pca.fit_transform(X)#用X来训练PCA模型,同时返回降维后的结果数据。 93 print(‘sklearn:‘,main_vector) 94 95 if __name__==‘__main__‘: 96 pca=PCA_DimensionalityReduction() 97 pca.dataProduction() 98 pca.dr_pca() 99 pca.sklearn_pca()
参考:1.CRC.Machine.Learning.An.Algorithmic.Perspective.2nd.Edition.
2.machine learning for the web
3.machine learning in action
标签:高维数据 href res 子空间 坐标 fit 缺点 sel 圆点
原文地址:http://www.cnblogs.com/little-horse/p/7376571.html