zoukankan      html  css  js  c++  java
  • sklearn pca降维

    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

  • 相关阅读:
    转:android WebView 文字 、图片分开加载
    js获取网页高度
    [转]URLPath匹配原则
    Java课程设计俄罗斯方块
    Three Little Habits to Find Focus
    ubuntu 12.04 无法联网的问题
    [转]时间去了哪里
    matlab 用plot在图像上面画图
    深入理解ES6临时死区(Temporal Dead Zone)
    sql 连接超时问题
  • 原文地址:https://www.cnblogs.com/little-horse/p/7376571.html
Copyright © 2011-2022 走看看