码迷,mamicode.com
首页 > 编程语言 > 详细

[机器学习笔记]PCA简介以及python实现

时间:2016-03-03 22:45:12      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

  主成分分析(principal component analysis)是一种常见的数据降维方法,其目的是在“信息”损失较小的前提下,将高维的数据转换到低维,从而减小计算量。这里的“信息”指的是数据所包含的有用的信息。

主要思路:从原始特征中计算出一组按照“重要性”从大到小排列的新特征,它们是原始特征的线性组合(或者说它们是原始特征在某个方向的映射,线性组合是多个特征乘以一个系数,在某个方向的映射也相当于每个特征与该方向的内积,是一样的道理),并且相互之间互不相关。

  因此,关键点就在于:1.特征的“重要性”指的是什么?如何衡量?2.将原始数据降到多少维才能保证损失的“信息”较少?

 

1.数据“重要性”的衡量

数据的“重要性”指的是特征变换后样本的方差。方差越大,则样本在该特征上的差异就越大,因此该特征就越重要。以《机器学习实战》上的图说明。

技术分享技术分享

  图中共有3个类别的数据,很显然,方差越大,越容易分开不同类别的点。样本在X轴上的投影方差较大,在Y轴的投影方差较小。方差最大的方向应该是中间斜向上的方向。如果将样本按照中间斜向上的方向进行映射,则只要一维的数据就可以对其进行分类,相比原数据,就相当降了一维。

       在原始数据更多维的情况下,先得到一个数据变换后方差最大的方向,然后选择与第一个方向正交的方向,该方向是方差次大的方向,如此下去,直到变换出与原特征个数相同的新特征或者变换出前N个特征(在这前N个特征包含了数据的绝大部分信息),简而言之,PCA是一个降维的过程,将数据映射到新的特征,新特征是原始特征的线性组合。

2.计算过程(因为插入公式比较麻烦,就直接采用截图的方式

     技术分享

技术分享

技术分享

技术分享

技术分享

3.python实现

from numpy import *

‘‘‘通过方差的百分比来计算将数据降到多少维是比较合适的,
函数传入的参数是特征值和百分比percentage,返回需要降到的维度数num‘‘‘
def eigValPct(eigVals,percentage):
    #使用numpy中的sort()对特征值按照从小到大排序
    sortArray=sort(eigVals)
    #特征值从大到小排序
    sortArray=sortArray[-1::-1]
    #数据全部的方差arraySum
    arraySum=sum(sortArray)
    tempSum=0
    num=0
    for i in sortArray:
        tempSum+=i
        num+=i
        if tempsum>=arraySum*percentage:
            return num

‘‘‘pca函数有两个参数,其中dataMat是已经转换成矩阵matrix形式的数据集,列表示特征;
其中的percentage表示取前多少个特征需要达到的方差占比,默认为0.9‘‘‘
def pca(dataMat,percentage=0.9):
    #对每一列求平均值,因为协方差的计算中需要减去均值
    meanVals=mean(dataMat,axis=0)
    meanRemoved=dataMat-meanVals
    #cov()计算方差
    covMat=cov(meanRemoved,rowvar=0)
    #利用numpy中寻找特征值和特征向量的模块linalg中的eig()方法
    eigVals,eigVects=linalg.eig(mat(covMat))
    #要达到方差的百分比percentage,需要前k个向量
    k=eigValPct(eigVals,percentage)
    #对特征值eigVals从小到大排序
    eigValInd=argsort(eigVals)
    #从排好序的特征值,从后往前取k个,这样就实现了特征值的从大到小排列
    eigValInd=eigValInd[:-(k+1):-1]
    #返回排序后特征值对应的特征向量redEigVects(主成分)
    redEigVects=eigVects[:,eigValInd]
    #将原始数据投影到主成分上得到新的低维数据lowDDataMat
    lowDDataMat=meanRemoved*redEigVects
    #得到重构数据reconMat
    reconMat=(lowDDataMat*redEigVects.T)+meanVals
    return lowDDataMat,reconMat

 

[机器学习笔记]PCA简介以及python实现

标签:

原文地址:http://www.cnblogs.com/lzllovesyl/p/5235137.html

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