转:PCA的Python实现
http://blog.csdn.net/jerr__y/article/details/53188573
本文主要参考下面的文章,文中的代码基本是把第二篇文章的代码手写实现了一下。
- 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, meanVal
def 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
下面逐步来实现PCA
(0)先准备好数据
import numpy as np
- 1
# 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
- 1
- 2
- 3
- 4
[[ 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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
(1)零均值化
# (1)零均值化
def zeroMean(dataMat):
# 求各列特征的平均值
meanVal = np.mean(dataMat, axis=0)
newData = dataMat - meanVal
return newData, meanVal
newData, meanVal = zeroMean(data)
print 'the newData is \n', newData
print 'the meanVal is \n', meanVal
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
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]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
(2)对各维特征的协方差矩阵
# (2)求协方差矩阵,rowvar=036表示每列对应一维特征
covMat = np.cov(newData, rowvar=0)
print covMat
# 若rowvar=1表示没行是一维特征,每列表示一个样本,显然咱们的数据不是这样的
# covMat2 = np.cov(newData, rowvar=1)
# print covMat2
- 1
- 2
- 3
- 4
- 5
- 6
[[ 0.61655556 0.61544444]
[ 0.61544444 0.71655556]]
- 1
- 2
- 3
(3)求(2)中的协方差矩阵的特征值和特征向量
# (3)求协方差矩阵的特征值和特征向量,利用numpy中的线性代数模块linalg中的eig函数
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
print '特征值为:\n', eigVals
print '特征向量为\n', eigVects
- 1
- 2
- 3
- 4
特征值为:
[ 0.0490834 1.28402771]
特征向量为
[[-0.73517866 -0.6778734 ]
[ 0.6778734 -0.73517866]]
- 1
- 2
- 3
- 4
- 5
- 6
上面的结果中:
特征值为:
[ 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)^T
k = 1 # 此例中取k = 1
eigValIndice = np.argsort(eigVals) # 从小到大排序
n_eigValIndice = eigValIndice[-1:-(k+1):-1] # 取值最大的k个下标
n_eigVect = eigVects[:, n_eigValIndice] # 取对应的k个特征向量
print n_eigVect
print n_eigVect.shape
lowDataMat = newData*n_eigVect # 低维特征空间的数据
reconMat = (lowDataMat * n_eigVect.T) + meanVal # 重构数据,得到降维之后的数据
print '将样本点投影到选取的低维特征向量上,实际使用的是这个结果作为新的特征:\n', lowDataMat
print '降维之后的样本:\n', reconMat
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
[[-0.6778734 ]
[-0.73517866]]
(2L, 1L)
- 1
- 2
- 3
- 4
将样本点投影到选取的低维特征向量上,实际使用的是这个结果作为新的特征:
[[-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]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
降维之后的样本:
[[ 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
# 原始数据
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
- 1
- 2
- 3
- 4
# 好吧,就是这么简单
from sklearn.decomposition import PCA
pca = PCA(n_components=1)
new_feature = pca.fit_transform(data)
print new_feature
- 1
- 2
- 3
- 4
- 5
[[-0.82797019]
[ 1.77758033]
[-0.99219749]
[-0.27421042]
[-1.67580142]
[-0.9129491 ]
[ 0.09910944]
[ 1.14457216]
[ 0.43804614]
[ 1.22382056]]
转:PCA的Python实现的更多相关文章
- PCA主成分分析Python实现
作者:拾毅者 出处:http://blog.csdn.net/Dream_angel_Z/article/details/50760130 Github源代码:https://github.com/c ...
- PCA算法Python实现
源代码: #-*- coding: UTF-8 -*- from numpy import * import numpy def pca(X,CRate): #矩阵X每行是一个样本 #对样本矩阵进行中 ...
- Machine Learning in Action – PCA和SVD
降维技术, 首先举的例子觉得很好,因为不知不觉中天天都在做着降维的工作 对于显示器显示一个图片是通过像素点0,1,比如对于分辨率1024×768的显示器,就需要1024×768个像素点的0,1来表示, ...
- 主成分分析(PCA)原理及R语言实现
原理: 主成分分析 - stanford 主成分分析法 - 智库 主成分分析(Principal Component Analysis)原理 主成分分析及R语言案例 - 文库 主成分分析法的原理应用及 ...
- 机器学习算法实现(R&Python code)
Machine Learning Algorithms Machine Learning Algorithms (Python and R) 明天考试,今天就来简单写写机器学习的算法 Types Su ...
- 主成分分析(PCA)原理及R语言实现 | dimension reduction降维
如果你的职业定位是数据分析师/计算生物学家,那么不懂PCA.t-SNE的原理就说不过去了吧.跑通软件没什么了不起的,网上那么多教程,copy一下就会.关键是要懂其数学原理,理解算法的假设,适合解决什么 ...
- 机器学习降维--PCA
1.原理和概念 PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法. PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征 ...
- 统计学方法(PCA、ICA、RCA、LCA)
---------------------------------------------------------------------------------------------------- ...
- 主成分分析 | Principal Components Analysis | PCA
理论 仅仅使用基本的线性代数知识,就可以推导出一种简单的机器学习算法,主成分分析(Principal Components Analysis, PCA). 假设有 $m$ 个点的集合:$\left\{ ...
随机推荐
- vue 直接改变数组数据不刷新
因为 JavaScript 的限制,Vue.js 不能检测到下面数组变化: 直接用索引设置元素,如 vm.items[0] = {}: 修改数据的长度,如 vm.items.length = 0. 为 ...
- PHP 图像居中裁剪函数
图像居中裁减的大致思路: 1.首先将图像进行缩放,使得缩放后的图像能够恰好覆盖裁减区域.(imagecopyresampled — 重采样拷贝部分图像并调整大小) 2.将缩放后的图像放置在裁减区域中间 ...
- RabbitMQ 延时消息队列
消息延时在日常随处可见: 1.订单创建10min之后不发起支付,自动取消. 2.30min定时推送一次邮件信息. 最常用到方式后台定时任务轮训,量小的时候可以使用,量大会出现数据读取会性能问题.Rab ...
- 解决 PermGen space Tomcat内存设置(转)
在使用Java程序从数据库中查询大量的数据或是应用服务器(如tomcat.jboss,weblogic)加载jar包时会出现java.lang.OutOfMemoryError异常.这主要是由于应用服 ...
- USBDM RS08/HCS08/HCS12/Coldfire V1,2,3,4/DSC/Kinetis Debugger and Programmer -- BDM Construction and Firmware
Construction. Build the hardware using the information provided in the PCB download. The following a ...
- 如何利用 jQuery 修改 css 中带有 !important 的样式属性?
使用 jQuery 修改 css 中带有 !important 的样式属性 外部样式为: div.test { width:auto !important; overflow:auto !import ...
- 内存加载DLL
1.前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL ...
- 使用Coding4Fun工具包
Coding4Fun是一款很受WP开发者喜爱的开源类库,对于开发者来说,Coding4Fun上手很简单.只要从CodePlex下载Coding4Fun工具包,下载完成后,解压文件到一个文件夹中,里面有 ...
- 【spring cloud】【spring boot】网管服务-->配置文件添加endpoints.enabled = false,SpringBoot应用监控Actuator使用的安全隐患
转载:https://xz.aliyun.com/t/2233 ==================================================================== ...
- 使用android 隐藏类和方法
在应用程序中添加与android.jar包相同的包目录,添加要隐藏类和方法.保证能编译通过就可以.