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实现的更多相关文章

  1. PCA主成分分析Python实现

    作者:拾毅者 出处:http://blog.csdn.net/Dream_angel_Z/article/details/50760130 Github源代码:https://github.com/c ...

  2. PCA算法Python实现

    源代码: #-*- coding: UTF-8 -*- from numpy import * import numpy def pca(X,CRate): #矩阵X每行是一个样本 #对样本矩阵进行中 ...

  3. Machine Learning in Action – PCA和SVD

    降维技术, 首先举的例子觉得很好,因为不知不觉中天天都在做着降维的工作 对于显示器显示一个图片是通过像素点0,1,比如对于分辨率1024×768的显示器,就需要1024×768个像素点的0,1来表示, ...

  4. 主成分分析(PCA)原理及R语言实现

    原理: 主成分分析 - stanford 主成分分析法 - 智库 主成分分析(Principal Component Analysis)原理 主成分分析及R语言案例 - 文库 主成分分析法的原理应用及 ...

  5. 机器学习算法实现(R&Python code)

    Machine Learning Algorithms Machine Learning Algorithms (Python and R) 明天考试,今天就来简单写写机器学习的算法 Types Su ...

  6. 主成分分析(PCA)原理及R语言实现 | dimension reduction降维

    如果你的职业定位是数据分析师/计算生物学家,那么不懂PCA.t-SNE的原理就说不过去了吧.跑通软件没什么了不起的,网上那么多教程,copy一下就会.关键是要懂其数学原理,理解算法的假设,适合解决什么 ...

  7. 机器学习降维--PCA

    1.原理和概念 PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法. PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征 ...

  8. 统计学方法(PCA、ICA、RCA、LCA)

    ---------------------------------------------------------------------------------------------------- ...

  9. 主成分分析 | Principal Components Analysis | PCA

    理论 仅仅使用基本的线性代数知识,就可以推导出一种简单的机器学习算法,主成分分析(Principal Components Analysis, PCA). 假设有 $m$ 个点的集合:$\left\{ ...

随机推荐

  1. [java] 虚拟机(JVM)底层结构详解[转]

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本语法到 ...

  2. 【汇总】PHP-FPM 配置优化(转)

    -----------------------开启php-fpm慢脚本日志 request_slowlog_timeout = 30sslowlog = /usr/local/php/var/log/ ...

  3. 添加Godaddy二级域名子域名方法

    我们在申请注册了Godaddy域名后,如果需要开通二级域名,方法简单只需要在Godaddy添加二级域名(子域名)只要在域名管理后台添加A记录或CNAME别名(Aliases)即可.但我们如果需要添加二 ...

  4. 使用React改版网站

    网站是毕业设计的作品,开发这个网站的目的主要用于记录一些笔记,以及聚合一些资讯信息,也算自己在网络世界中的一块静地吧,可以在这里一些技术上想法的实践. 网站最初前端使用vue开发,在前段时间由于项目的 ...

  5. Android 数据存储01之SharedPreferences

    Android 数据存储01之SharedPreferences 版本 修改内容 日期 修改人 V1.0 原始版本 2013/2/20 skywang 1 SharedPreferences概括 Sh ...

  6. ZServer4D开源项目

    ZServer4D开源项目 ZServer4D 是一套从商业项目剥离而出的云服务器中间件,可以承载百万级的分布式负载服务,并且支持IoT及内网穿透. 作者将它开源了 https://github.co ...

  7. shapefile与字符集编码设置

    在 ArcGIS Desktop (ArcMap, ArcCatalog, and ArcToolbox) 中,有编码页转换功能(CODE PAGE CONVERSION),可以读写多种字符编码的 s ...

  8. Step Detector and Step Counter Sensors on Android

    Step Detector and Step Counter Sensors on Android 时间 2014-03-31 11:56:00 Tech Droid 原文  http://techd ...

  9. Ioc:Autofac Registration Concepts

    Reflection Components When using reflection-based components, Autofac automatically uses the constru ...

  10. Git:常用命令(二)

    查看提交历史 git log 撤消操作 任何时候,你都有可能需要撤消刚才所做的某些操作.接下来,我们会介绍一些基本的撤消操作相关的命令.请注意,有些操作并不总是可以撤消的,所以请务必谨慎小心,一旦失误 ...