PCA原理参考链接来自:

https://blog.csdn.net/guyuealian/article/details/68487833

原理二

先来原理:

PCA的算法过程,用一句话来说,就是“将所有样本X减去样本均值m,再乘以样本的协方差矩阵C的单位化(也叫标准化)后的特征向量V,即为PCA主成分分析”,其计算过程如下:
    [1].将原始数据按行组成m行n列样本矩阵X(每行一个样本,每列为一维特征)
    [2].求出样本X的协方差矩阵C和样本均值m;(Matlab可使用cov()函数求样本的协方差矩阵C,均值用mean函数)
    [3].求出协方差矩阵的特征值D及对应的特征向量V;(Matlab可使用eigs()函数求矩阵的特征值D和特征向量V)
    [4].将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P;(eigs()返回特征值构成的向量本身就是从大到小排序的)
    [5].Y=(X-m)×P即为降维到k维后的数据;

上代码:

#-*- encoding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import numpy as np
from numpy import *
def PCA_compute(X,k):X=matrix(X)print"-"*20print "X=",Xprint"------------------下面是协方差矩阵-----------------------"Y=np.cov(X.T)#这里必须转置,理由见下方链接print Y#计算协方差矩阵print"-----------下面是特征值和特征向量------------------------------"#特征值a#这里总结下:#numpy计算特征值得到的类型是numpy.ndarray#numpy计算特征向量得到的类型是numpy.ndarrayeigenvalue,featurevector=np.linalg.eig(Y)print"-----------下面是特征值-----------------------------"idx = eigenvalue.argsort()[::-1] #获得特征值排序后的顺序,这个函数适用的前提是numpy.ndarray类型 print"+++++++++++++"print"type(eigenvalue)=",type(eigenvalue)print"type(featurevector)=",type(featurevector)eigenValues = eigenvalue[idx]print"特征值=\n",eigenValuesFeatureVectors = featurevector[:,idx]#featurevector是没有排序的#FeatureVectors是在特征值排序后,根据特征值的排序顺序进行排序的print"featureVectors=\n",FeatureVectorsprint"-----------下面是平均矩阵(原始矩阵的每列的均值)----------------------------"averageMatrix=np.mean(X, axis=0)#表示沿着y轴取平均#                     axis=1#                  ---------------->#                   col1 col2 col3#          ||   row1#    axis=0||   row2#          ||   row3#          \/print"averageMatrix=",averageMatrixaverageMatrix=averageMatrix.tolist()averageMatrix=averageMatrix[0]MeanMatrix=[]print"len(X[0])=",len(X)for index in range(len(X)):MeanMatrix.append(averageMatrix)MeanMatrix=mat(MeanMatrix)print"MeanMatrix=\n",MeanMatrixprint"-------------------接下来是主成分--------------------------"print mat(featurevector)tempX=mat(X)-mat(MeanMatrix)print tempXprint"FeatureVectors=",FeatureVectorsScore=(mat(X)-mat(MeanMatrix))*mat(FeatureVectors)return Score[:,0:k].copy()
if __name__ == '__main__':X=[ [1,2,1,1],[3,3,1,2],[3,5,4,3],[5,4,5,4],[5,6,1,5],[6,5,2,6],[8,7,1,2],[9,8,3,7]]k=2answer=PCA_compute(X,k)print answer

实验结果为:

[[-5.79467821  0.60705487]
 [-3.38863423  0.87952394]
 [-1.61549833 -1.56652328]
 [-0.15133075 -2.50507639]
 [ 0.99576675  0.56654487]
 [ 1.7515016  -0.65460481]
 [ 2.21615035  3.13807448]
 [ 5.98672282 -0.46499368]]

对比matlab代码的运行结果:

%% 样本矩阵X,有8个样本,每个样本有4个特征,使用PCA降维提取k个主要特征(k<4)
k=2;                            %将样本降到k维参数设置X=[1 2 1 1;3 3 1 2; 3 5 4 3; 5 4 5 4;5 6 1 5; 6 5 2 6;8 7 1 2;9 8 3 7];[Row Col]=size(X);%注意,matlab中得到的特征向量也是按列来读取的。
covX=cov(X);%求样本的协方差矩阵(散步矩阵除以(n-1)即为协方差矩阵)??
[V D]=eigs(covX)%求协方差矩阵的特征值D和特征向量V6??
meanX=mean(X)%样本均值m??
%所有样本X减去样本均值m,再乘以协方差矩阵(散步矩阵)的特征向量V,即为样本的主成份SCORE??
tempX=repmat(meanX,Row,1)
ans1=X-tempX
SCORE2=(X-tempX)*V%主成份:SCORE??
pcaData2=SCORE2(:,1:k)

可知结果完全一致。

然后我们来测试下其他博客上的数据集,把测试代码中修改如下:

if __name__ == '__main__':
    # X=[ [1,2,1,1],
    # [3,3,1,2],
    # [3,5,4,3],
    # [5,4,5,4],
    # [5,6,1,5],
    # [6,5,2,6],
    # [8,7,1,2],
    # [9,8,3,7]]
    # k=2
    X=[[10.2352,11.3220],
    [10.1223,11.8110],
    [9.1902,8.9049],
    [9.3064,9.8474],
    [8.3301,8.3404],
    [10.1528,10.1235],
    [10.4085,10.8220],
    [9.0036,10.0392],
    [9.5349,10.0970],
    [9.4982,10.8254]]

k=1
    answer=PCA_compute(X,k)
    print answer

运行后可知与连接

https://blog.csdn.net/google19890102/article/details/27969459

的计算结果完全一致。

python行数最短的PCA实现方式相关推荐

  1. hbase的备份恢复1,Expor过程,Import过程,统计hbase表行数;hbase备份恢复方式2:使用hdfs备份hbase数据,基于hbase数据进行恢复

    25.28 hbase数据备份和恢复 以下过程针对线上没有启动新旧集群的情况,所以使用hbase export / import的方式进行数据的备份和迁移 25.28.1 Export过程 首先,先进 ...

  2. python输出矩阵的行数_python查看矩阵的行列号以及维数方式

    print(X.shape):查看矩阵的行列号 print(len(X)):查看矩阵的行数 print(X.ndim):查看矩阵的维数 1 查看矩阵的行列号 2 查看矩阵的行数 3 查看矩阵的维数 补 ...

  3. python矩阵行数_python查看矩阵的行列号以及维数方式

    print(X.shape):查看矩阵的行列号 print(len(X)):查看矩阵的行数 print(X.ndim):查看矩阵的维数 1 查看矩阵的行列号 2 查看矩阵的行数 3 查看矩阵的维数 补 ...

  4. python显示行数_在idle中如何显示行号

    展开全部 其实IDLE提供了一个显32313133353236313431303231363533e78988e69d8331333365663438示所有行和所有字符的功能. 我们打开IDLE sh ...

  5. python 矩阵获取行数_4个最佳项目创意的代码片段和示例,旨在为Python和机器学习构建出色的简历!...

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一篇文章带你了解4个最佳项目创意的代码片段和示例 Python是一 ...

  6. python文件行数运行结果_python统计文件行数

    '(或者包含'\n'的字串,如在windows系统中): count = 0thefile = open(thefilepath, 'rb')while True:buffer = thefile.r ...

  7. 如何在Python中便宜地获取大文件的行数?

    我需要在python中获取一个大文件(数十万行)的行数. 内存和时间最有效的方法是什么? 目前,我这样做: def file_len(fname):with open(fname) as f:for ...

  8. python 代码行数统计工具_使用Python设计一个代码统计工具

    问题 设计一个程序,用于统计一个项目中的代码行数,包括文件个数,代码行数,注释行数,空行行数.尽量设计灵活一点可以通过输入不同参数来统计不同语言的项目,例如: # type用于指定文件类型 pytho ...

  9. python excel处理重复行并统计个数_python统计一个文本中重复行数的方法

    python统计一个文本中重复行数的方法 这篇文章主要介绍了python统计一个文本中重复行数的方法,涉及针对Python中dict对象的使用及相关本文的操作,具有一定的借鉴价值,需要的朋友可以参考下 ...

最新文章

  1. proDAD Erazr
  2. 生成式模型和判别式模型(转)
  3. 刚接触git,提交文件时,遇到no changes added to commit
  4. Cutting Codeforces Round #493 (Div. 2)
  5. Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(八)
  6. poj-2528线段树练习
  7. 检测高CPU线程定位shell脚本
  8. Python nltk包
  9. Jeesite 自定义api接口 404 访问不到页面
  10. 百度竞价排名曝光_企业入驻百度爱采购必须选好本地运营服务商
  11. python 用题库自动答题器_用题库自动答题
  12. 信息安全工程师考试大纲(2016)
  13. 日文输入键盘罗马字对应表
  14. Internet Explorer无法打开internet站点XXX,已终止操作 解决办法
  15. 浪潮存储服务器VAAI
  16. C / C++头文件大全
  17. unable to load dll 'gdiplus.dll' in docker
  18. BZOJ2456mode
  19. Windows平台搭建Mantis服务器
  20. mybatis源码-plugin源码

热门文章

  1. sql注入一点小心得
  2. React 中的父子组件 兄弟组件传值
  3. ISO时间转化时间戳
  4. java获得网页的编码方式_求一段代码,可以获得编码格式是gb2312的网页的页面源码,java实现!...
  5. python ttf svg path_SVG的path的使用
  6. webpack(1)-简介和基础知识
  7. CSS3动画---移动端上下固定高度,中间自适应
  8. typescript的数据类型
  9. CSS3制作一个简单的进度条
  10. leafLet API 中文文档翻译