码迷,mamicode.com
首页 > 其他好文 > 详细

sklearn pca降维

时间:2017-08-17 00:44:27      阅读:559      评论:0      收藏:0      [点我收藏+]

标签:高维数据   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

 

sklearn pca降维

标签:高维数据   href   res   子空间   坐标   fit   缺点   sel   圆点   

原文地址:http://www.cnblogs.com/little-horse/p/7376571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!