PCA的Python实现
来源:互联网 发布:linux cp文件夹 编辑:程序博客网 时间:2024/06/05 07:11
本文主要参考下面的文章,文中的代码基本是把第二篇文章的代码手写实现了一下。
- pca讲解:http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html
- python实现:http://blog.csdn.net/u012162613/article/details/42177327
总体代码
"""总的代码.Func: 对原始的特征矩阵进行降维, lowDataMat为降维之后返回新的特征矩阵。Usage: lowDDataMat = pca(dataMat, k)"""# 零均值化def zeroMean(dataMat): # 求各列特征的平均值 meanVal = np.mean(dataMat, axis=0) newData = dataMat - meanVal return newData, meanValdef pca(dataMat,k): newData,meanVal=zeroMean(dataMat) covMat=np.cov(newData,rowvar=0) #求协方差矩阵,return ndarray;若rowvar非0,一列代表一个样本,为0,一行代表一个样本 eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量 eigValIndice=np.argsort(eigVals) #对特征值从小到大排序 k_eigValIndice=eigValIndice[-1:-(k+1):-1] #最大的k个特征值的下标 k_eigVect=eigVects[:,k_eigValIndice] #最大的k个特征值对应的特征向量 lowDDataMat=newData*k_eigVect #低维特征空间的数据 return lowDDataMat# reconMat=(lowDDataMat*k_eigVect.T)+meanVal #重构数据 # return lowDDataMat,reconMat
下面逐步来实现PCA
(0)先准备好数据
import numpy as np
# n维的原始数据,本例中n=2。data = np.array([[2.5,2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0], [2.3, 2.7],\ [2, 1.6], [1, 1.1], [1.5, 1.6], [1.1, 0.9]])print data
[[ 2.5 2.4] [ 0.5 0.7] [ 2.2 2.9] [ 1.9 2.2] [ 3.1 3. ] [ 2.3 2.7] [ 2. 1.6] [ 1. 1.1] [ 1.5 1.6] [ 1.1 0.9]]
(1)零均值化
# (1)零均值化def zeroMean(dataMat): # 求各列特征的平均值 meanVal = np.mean(dataMat, axis=0) newData = dataMat - meanVal return newData, meanValnewData, meanVal = zeroMean(data)print 'the newData is \n', newDataprint 'the meanVal is \n', meanVal
the newData is [[ 0.69 0.49] [-1.31 -1.21] [ 0.39 0.99] [ 0.09 0.29] [ 1.29 1.09] [ 0.49 0.79] [ 0.19 -0.31] [-0.81 -0.81] [-0.31 -0.31] [-0.71 -1.01]]the meanVal is [ 1.81 1.91]
(2)对各维特征的协方差矩阵
# (2)求协方差矩阵,rowvar=036表示每列对应一维特征covMat = np.cov(newData, rowvar=0)print covMat# 若rowvar=1表示没行是一维特征,每列表示一个样本,显然咱们的数据不是这样的# covMat2 = np.cov(newData, rowvar=1)# print covMat2
[[ 0.61655556 0.61544444] [ 0.61544444 0.71655556]]
(3)求(2)中的协方差矩阵的特征值和特征向量
# (3)求协方差矩阵的特征值和特征向量,利用numpy中的线性代数模块linalg中的eig函数eigVals, eigVects = np.linalg.eig(np.mat(covMat))print '特征值为:\n', eigValsprint '特征向量为\n', eigVects
特征值为:[ 0.0490834 1.28402771]特征向量为[[-0.73517866 -0.6778734 ] [ 0.6778734 -0.73517866]]
上面的结果中:
特征值为:
[ 0.0490834 1.28402771]
特征向量为
[[-0.73517866 -0.6778734 ]
[0.6778734 -0.73517866]]
特征值0.0490834对应的特征向量是第一列(-0.73517866 0.6778734)T
(4)降维到k维(k < n)
# (4)保留主要的成分,将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将对应的k个特征向量分别作为列向量组成的特征向量矩阵。# 比如本例子中保留1.28402771对应的特征向量(-0.6778734 -0.73517866)^Tk = 1 # 此例中取k = 1eigValIndice = np.argsort(eigVals) # 从小到大排序n_eigValIndice = eigValIndice[-1:-(k+1):-1] # 取值最大的k个下标n_eigVect = eigVects[:, n_eigValIndice] # 取对应的k个特征向量print n_eigVectprint n_eigVect.shapelowDataMat = newData*n_eigVect # 低维特征空间的数据reconMat = (lowDataMat * n_eigVect.T) + meanVal # 重构数据,得到降维之后的数据print '将样本点投影到选取的低维特征向量上,实际使用的是这个结果作为新的特征:\n', lowDataMatprint '降维之后的样本:\n', reconMat
[[-0.6778734 ] [-0.73517866]](2L, 1L)
将样本点投影到选取的低维特征向量上,实际使用的是这个结果作为新的特征:
[[-0.82797019] [ 1.77758033] [-0.99219749] [-0.27421042] [-1.67580142] [-0.9129491 ] [ 0.09910944] [ 1.14457216] [ 0.43804614] [ 1.22382056]]降维之后的样本:[[ 2.37125896 2.51870601] [ 0.60502558 0.60316089] [ 2.48258429 2.63944242] [ 1.99587995 2.11159364] [ 2.9459812 3.14201343] [ 2.42886391 2.58118069] [ 1.74281635 1.83713686] [ 1.03412498 1.06853498] [ 1.51306018 1.58795783] [ 0.9804046 1.01027325]]
降维之后的样本:
[[ 2.37125896 2.51870601]
[ 0.60502558 0.60316089]
[ 2.48258429 2.63944242]
[ 1.99587995 2.11159364]
[ 2.9459812 3.14201343]
[ 2.42886391 2.58118069]
[ 1.74281635 1.83713686]
[ 1.03412498 1.06853498]
[ 1.51306018 1.58795783]
[ 0.9804046 1.01027325]]
原始样本:
[[ 2.5 2.4]
[ 0.5 0.7]
[ 2.2 2.9]
[ 1.9 2.2]
[ 3.1 3. ]
[ 2.3 2.7]
[ 2. 1.6]
[ 1. 1.1]
[ 1.5 1.6]
[ 1.1 0.9]]
通过比较可以看出,通过降维之后我们成功地实现了特征从二维降到了一维,降维之后会和原始数据有一定的变化,
我们可以认为通过这种方式消除了一部分的噪声(当然实际上很可能损失了部分真实信息)。
——————————————-分割线———————————————————
利用sklearn实现PCA
- 参考博文:http://blog.csdn.net/u012162613/article/details/42192293
# 原始数据data = np.array([[2.5,2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0], [2.3, 2.7],\ [2, 1.6], [1, 1.1], [1.5, 1.6], [1.1, 0.9]])# print data
# 好吧,就是这么简单from sklearn.decomposition import PCApca = PCA(n_components=1)new_feature = pca.fit_transform(data)print new_feature
[[-0.82797019]
[ 1.77758033]
[-0.99219749]
[-0.27421042]
[-1.67580142]
[-0.9129491 ]
[ 0.09910944]
[ 1.14457216]
[ 0.43804614]
[ 1.22382056]]
- PCA的Python实现
- PCA的python代码实现
- PCA降维的python实现
- PCA人脸识别的python实现
- python 实现PCA
- python中实现PCA
- PCA降维 python实现
- PCA python代码实现
- PCA python实现
- python的PCA
- PCA学习笔记 python实现
- PCA原理及Python实现
- 用Python一步一步实现PCA
- PCA——python实现
- 利用Python实现基于PCA算法的人脸识别
- 使用python的numpy库实现PCA算法
- EOF与PCA算法的python实现和比较
- pca算法的实现
- shmvc之test
- FTP+Nginx图片服务器
- android快速开发--常用utils类
- JS面向对象(一)-----------理解对象
- 用Redis bitmap统计活跃用户、留存
- PCA的Python实现
- 【Android】常用 Git 命令清单
- 面试算法题:求n以内的完数
- SourceTree以及GitHub的简单使用
- java设计模式之抽象工厂设计模式
- Selenium WebDriver 2.0 升级到3.0 需要注意的事项 (2)
- 上下左右控件的联动/股票列表联动
- C#中 存在主界面中的菜单项,在其他类中或者界面中,找不到的问题
- 机器学习--决策树算法