转: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\{ ...
随机推荐
- 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem C. Equivalent Cards 计算几何
Problem C. Equivalent Cards 题目连接: http://www.codeforces.com/gym/100253 Description Jane is playing a ...
- STM32 Controller area network (bxCAN) Identifier filtering
Identifier filtering In the CAN protocol the identifier of a message is not associated with the addr ...
- Linux驱动开发——指针和错误值
参考: <Linux设备驱动程序>第三版 P294 许多内部的内核函数返回一个指针值给调用者,而这些函数中很多可能会失败.在大部分情况下,失败是通过返回一个NULL指针值来表示的.这种技巧 ...
- Task.Delay方法的2个应用实例,单元测试等待,限时限次下载远程资源
如果想让程序异步等待一段时间,可以考虑使用Task.Delay方法. 比如,在单元测试中模拟一个异步操作. static async Task<T> DelayedResult<T& ...
- .NET对象的创建、垃圾回收、非托管资源的手动处理
本篇用来梳理对象的创建.垃圾的回收,以及非托管资源的手动处理. →首先运行应用程序,创建一个Windows进程. →CLR创建一块连续的虚拟地址空间,这个地址空间就是托管堆.而且,这个地址空间最初并没 ...
- Objective-C市场占有率排名升至第4位
TIOBE近日公布了2012年4月份的编程语言排行榜,终于不出小编所料,在上个月的编程语言排行榜中说过的“编程语言的王者之争不久很可能会发生改变”实现了,一方面是Java在上几个月中一直属于下滑状态, ...
- ASP.NET MVC:Form Authentication 相关的学习资源
看完此图就懂了 看完下面文章必须精通 Form authentication and authorization in ASP.NET Explained: Forms Authentication ...
- 关于面试总结10-selenium中隐藏元素如何定位?(hidden、display: none)
前言 面试题:selenium中隐藏元素如何定位?这个是很多面试官喜欢问的一个题,如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~很多面试官自己都搞不清楚啥 ...
- 【linux c】setsockopt 详解
转自:http://blog.csdn.net/zhonglinzhang/article/details/9183229 功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在 ...
- 用 iOS-System-Services 框架获取iOS设备所用的设备信息
参考资料地址 https://github.com/Shmoopi/iOS-System-Services 百度云盘下载地址 http://pan.baidu.com/s/1c05ot1m This ...