【机器学习算法实现】主成分分析(PCA)——基于python+numpy

@author:wepon
@blog:http://blog.csdn.net/u012162613/article/details/42177327

1、PCA算法介绍

主成分分析(Principal Components Analysis),简称PCA,是一种数据降维技术,用于数据预处理。一般我们获取的原始数据维度都很高,比如1000个特征,在这1000个特征中可能包含了很多无用的信息或者噪声,真正有用的特征才100个,那么我们可以运用PCA算法将1000个特征降到100个特征。这样不仅可以去除无用的噪声,还能减少很大的计算量。

PCA算法是如何实现的?

简单来说,就是将数据从原始的空间中转换到新的特征空间中,例如原始的空间是三维的(x,y,z),x、y、z分别是原始空间的三个基,我们可以通过某种方法,用新的坐标系(a,b,c)来表示原始的数据,那么a、b、c就是新的基,它们组成新的特征空间。在新的特征空间中,可能所有的数据在c上的投影都接近于0,即可以忽略,那么我们就可以直接用(a,b)来表示数据,这样数据就从三维的(x,y,z)降到了二维的(a,b)。

问题是如何求新的基(a,b,c)?

一般步骤是这样的:先对原始数据零均值化,然后求协方差矩阵,接着对协方差矩阵求特征向量和特征值,这些特征向量组成了新的特征空间。具体的细节,推荐Andrew Ng的网页教程:Ufldl 主成分分析 ,写得很详细。

2、PCA算法实现

语言:Python
函数库:Numpy
[python] view plaincopy
  1. >>> import numpy as np
根据上面提到的一般步骤来实现PCA算法

(1)零均值化

假如原始数据集为矩阵dataMat,dataMat中每一行代表一个样本,每一列代表同一个特征。零均值化就是求每一列的平均值,然后该列上的所有数都减去这个均值。也就是说,这里零均值化是对每一个特征而言的,零均值化都,每个特征的均值变成0。实现代码如下:
[python] view plaincopy
  1. def zeroMean(dataMat):
  2. meanVal=np.mean(dataMat,axis=0)     #按列求均值,即求各个特征的均值
  3. newData=dataMat-meanVal
  4. return newData,meanVal
函数中用numpy中的mean方法来求均值,axis=0表示按列求均值。

该函数返回两个变量,newData是零均值化后的数据,meanVal是每个特征的均值,是给后面重构数据用的。

(2)求协方差矩阵

[python] view plaincopy
  1. newData,meanVal=zeroMean(dataMat)
  2. covMat=np.cov(newData,rowvar=0)

numpy中的cov函数用于求协方差矩阵,参数rowvar很重要!若rowvar=0,说明传入的数据一行代表一个样本,若非0,说明传入的数据一列代表一个样本。因为newData每一行代表一个样本,所以将rowvar设置为0。

covMat即所求的协方差矩阵。

(3)求特征值、特征矩阵

调用numpy中的线性代数模块linalg中的eig函数,可以直接由covMat求得特征值和特征向量:
[python] view plaincopy
  1. eigVals,eigVects=np.linalg.eig(np.mat(covMat))

eigVals存放特征值,行向量。

eigVects存放特征向量,每一列带别一个特征向量。
特征值和特征向量是一一对应的

(4)保留主要的成分[即保留值比较大的前n个特征]

第三步得到了特征值向量eigVals,假设里面有m个特征值,我们可以对其排序,排在前面的n个特征值所对应的特征向量就是我们要保留的,它们组成了新的特征空间的一组基n_eigVect。将零均值化后的数据乘以n_eigVect就可以得到降维后的数据。代码如下:
[python] view plaincopy
  1. eigValIndice=np.argsort(eigVals)            #对特征值从小到大排序
  2. n_eigValIndice=eigValIndice[-1:-(n+1):-1]   #最大的n个特征值的下标
  3. n_eigVect=eigVects[:,n_eigValIndice]        #最大的n个特征值对应的特征向量
  4. lowDDataMat=newData*n_eigVect               #低维特征空间的数据
  5. reconMat=(lowDDataMat*n_eigVect.T)+meanVal  #重构数据
  6. return lowDDataMat,reconMat

代码中有几点要说明一下,首先argsort对特征值是从小到大排序的,那么最大的n个特征值就排在后面,所以eigValIndice[-1:-(n+1):-1]就取出这个n个特征值对应的下标。【python里面,list[a:b:c]代表从下标a开始到b,步长为c。】

reconMat是重构的数据,乘以n_eigVect的转置矩阵,再加上均值meanVal。
OK,这四步下来就可以从高维的数据dataMat得到低维的数据lowDDataMat,另外,程序也返回了重构数据reconMat,有些时候reconMat课便于数据分析。
贴一下总的代码:
[python] view plaincopy
  1. #零均值化
  2. def zeroMean(dataMat):
  3. meanVal=np.mean(dataMat,axis=0)     #按列求均值,即求各个特征的均值
  4. newData=dataMat-meanVal
  5. return newData,meanVal
  6. def pca(dataMat,n):
  7. newData,meanVal=zeroMean(dataMat)
  8. covMat=np.cov(newData,rowvar=0)    #求协方差矩阵,return ndarray;若rowvar非0,一列代表一个样本,为0,一行代表一个样本
  9. eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量
  10. eigValIndice=np.argsort(eigVals)            #对特征值从小到大排序
  11. n_eigValIndice=eigValIndice[-1:-(n+1):-1]   #最大的n个特征值的下标
  12. n_eigVect=eigVects[:,n_eigValIndice]        #最大的n个特征值对应的特征向量
  13. lowDDataMat=newData*n_eigVect               #低维特征空间的数据
  14. reconMat=(lowDDataMat*n_eigVect.T)+meanVal  #重构数据
  15. return lowDDataMat,reconMat

3、选择主成分个数

文章写到这里还没有完,应用PCA的时候,对于一个1000维的数据,我们怎么知道要降到几维的数据才是合理的?即n要取多少,才能保留最多信息同时去除最多的噪声?一般,我们是通过方差百分比来确定n的,这一点在Ufldl教程中说得很清楚,并且有一条简单的公式,下面是该公式的截图:
根据这条公式,可以写个函数,函数传入的参数是百分比percentage和特征值向量,然后根据percentage确定n,代码如下:
[python] view plaincopy
  1. def percentage2n(eigVals,percentage):
  2. sortArray=np.sort(eigVals)   #升序
  3. sortArray=sortArray[-1::-1]  #逆转,即降序
  4. arraySum=sum(sortArray)
  5. tmpSum=0
  6. num=0
  7. for i in sortArray:
  8. tmpSum+=i
  9. num+=1
  10. if tmpSum>=arraySum*percentage:
  11. return num
那么pca函数也可以重写成百分比版本,默认百分比99%。
[python] view plaincopy
  1. def pca(dataMat,percentage=0.99):
  2. newData,meanVal=zeroMean(dataMat)
  3. covMat=np.cov(newData,rowvar=0)    #求协方差矩阵,return ndarray;若rowvar非0,一列代表一个样本,为0,一行代表一个样本
  4. eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量
  5. n=percentage2n(eigVals,percentage)                 #要达到percent的方差百分比,需要前n个特征向量
  6. eigValIndice=np.argsort(eigVals)            #对特征值从小到大排序
  7. n_eigValIndice=eigValIndice[-1:-(n+1):-1]   #最大的n个特征值的下标
  8. n_eigVect=eigVects[:,n_eigValIndice]        #最大的n个特征值对应的特征向量
  9. lowDDataMat=newData*n_eigVect               #低维特征空间的数据
  10. reconMat=(lowDDataMat*n_eigVect.T)+meanVal  #重构数据
  11. return lowDDataMat,reconMat

【机器学习算法实现】主成分分析(PCA)——基于python+numpy相关推荐

  1. 10 种机器学习算法的要点(附 Python 和 R 代码)(转载)

    10 种机器学习算法的要点(附 Python 和 R 代码)(转载) from:https://zhuanlan.zhihu.com/p/25273698 前言 谷歌董事长施密特曾说过:虽然谷歌的无人 ...

  2. 机器学习算法(七): 基于LightGBM的分类预测(基于英雄联盟10分钟数据判断红蓝方胜负)

    机器学习算法(七)基于LightGBM的分类预测 1. 实验室介绍 1.1 LightGBM的介绍 LightGBM是2017年由微软推出的可扩展机器学习系统,是微软旗下DMKT的一个开源项目,由20 ...

  3. 机器学习算法(九): 基于线性判别LDA模型的分类(基于LDA手写数字分类实践)

    机器学习算法(九): 基于线性判别模型的分类 1.前言:LDA算法简介和应用 1.1.算法简介 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种监 ...

  4. ML机器学习算法(一): 基于逻辑回归的分类预测

    机器学习算法(一): 基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个 ...

  5. 【机器学习基础】数学推导+纯Python实现机器学习算法19:PCA降维

    Python机器学习算法实现 Author:louwill Machine Learning Lab 作为一种常见的多元统计分析方法,主成分分析法(Principal Component Analys ...

  6. [转载] 机器学习之主成分分析PCA(Python实现)

    参考链接: 使用Python进行主成分分析PCA 理解PCA:what? why? how? 当我们拿到一个数据集的时候,往往数据集中每一个样本的描述是多维的,多维的特征空间不便于我们或者计算机对其进 ...

  7. 机器学习-降维之主成分分析PCA算法原理及实战

    主成分分析 前言 近年来,随着互联网和信息行业的发展,数据已经渗透到各行各业,成为重要的生产因素如数据记录和属性规模的急剧增长.社会已经进入大数据时代,数据越多越好似乎已经成为公理.然而,数据量并不是 ...

  8. 10 种机器学习算法的要点(附 Python 和 R 代码)

    前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注,但是这家公司真正的未来在于机器学习,一种让计算机更聪明.更个性化的技术. 也许我们生活在人类历史上最关键的时期:从使用大 ...

  9. 机器学习算法的要点(附 Python 和 R 代码)

    前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注,但是这家公司真正的未来在于机器学习,一种让计算机更聪明.更个性化的技术. 也许我们生活在人类历史上最关键的时期:从使用大 ...

  10. 【机器学习sklearn】主成分分析PCA(Principal Component Analysis)

    主成分分析方法PCA 前言 一.PCA是什么? 二.代码实践 使用MNIST数据集实现sklearn库里的主成分分析方法 不同主成分个数对应的可解释方差分析(Explained Variance) 总 ...

最新文章

  1. CMOS图像传感器与DDI显示芯片
  2. poj2305-Basic remains(进制转换 + 大整数取模)
  3. exception ----- Functions
  4. 详述 hosts 文件的作用及修改 hosts 文件的方法
  5. php开发面试题---禁用cookie之后,如何使用session
  6. ADB通过WiFi连接手机调试Android应用
  7. “去QE”时代下,QE如何破茧重生?
  8. HDU2033 人见人爱A+B【进制】
  9. onclick 事件
  10. 干货 | 你是不是希望一月入门深度学习,三月中一篇顶会?-- 关于做科研的态度和方法的一点感想...
  11. 根据地理坐标查询地标 城市名称 街道名称 地标建筑
  12. 射影几何----帕普斯定理的证明
  13. 学计算机要选什么科目,实行新高考后 想学计算机专业怎么选科
  14. 【LeetCode-769. medium】最多能完成排序的块
  15. win11装安卓应用(2022精简版教程)
  16. python微信发红包看照片_微信发原图会泄露位置信息?用Python教你通过图片获取用户信息!...
  17. Android WebView简介
  18. MATLAB 求解定积分和不定积分
  19. 跨盘LV整合及硬盘分区合并
  20. Java 社区平台 Sym 2.6.0 发布,增加帖子列表渲染方式

热门文章

  1. nginx + lua 构建网站防护waf(一)
  2. jQuery增加删除修改tab导航特效
  3. 2022 SpringBoot/SSM的药品售货机平台 H5药品购买商城
  4. html是用来表示网上信息的符号标记语言,html标记的一般格式
  5. PAT之查找:遍历、二分、hash
  6. html手机弧线div,纯css实现让div的四个角成弧形
  7. is this mysql server_mysql出现is not allowed to connect to this mysql server异常的解决办法
  8. 关于64位CentOS上ptrace报linux/user.h no such file 错误的解决方法
  9. NYOJ 972(蓝桥杯) 核桃的数量
  10. 【hdu3501】求[1,n-1]与n不互质的所有数之和(单个欧拉函数求法+[1,n]和n互质的数之和公式----模版题)