python行数最短的PCA实现方式
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实现方式相关推荐
- hbase的备份恢复1,Expor过程,Import过程,统计hbase表行数;hbase备份恢复方式2:使用hdfs备份hbase数据,基于hbase数据进行恢复
25.28 hbase数据备份和恢复 以下过程针对线上没有启动新旧集群的情况,所以使用hbase export / import的方式进行数据的备份和迁移 25.28.1 Export过程 首先,先进 ...
- python输出矩阵的行数_python查看矩阵的行列号以及维数方式
print(X.shape):查看矩阵的行列号 print(len(X)):查看矩阵的行数 print(X.ndim):查看矩阵的维数 1 查看矩阵的行列号 2 查看矩阵的行数 3 查看矩阵的维数 补 ...
- python矩阵行数_python查看矩阵的行列号以及维数方式
print(X.shape):查看矩阵的行列号 print(len(X)):查看矩阵的行数 print(X.ndim):查看矩阵的维数 1 查看矩阵的行列号 2 查看矩阵的行数 3 查看矩阵的维数 补 ...
- python显示行数_在idle中如何显示行号
展开全部 其实IDLE提供了一个显32313133353236313431303231363533e78988e69d8331333365663438示所有行和所有字符的功能. 我们打开IDLE sh ...
- python 矩阵获取行数_4个最佳项目创意的代码片段和示例,旨在为Python和机器学习构建出色的简历!...
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一篇文章带你了解4个最佳项目创意的代码片段和示例 Python是一 ...
- python文件行数运行结果_python统计文件行数
'(或者包含'\n'的字串,如在windows系统中): count = 0thefile = open(thefilepath, 'rb')while True:buffer = thefile.r ...
- 如何在Python中便宜地获取大文件的行数?
我需要在python中获取一个大文件(数十万行)的行数. 内存和时间最有效的方法是什么? 目前,我这样做: def file_len(fname):with open(fname) as f:for ...
- python 代码行数统计工具_使用Python设计一个代码统计工具
问题 设计一个程序,用于统计一个项目中的代码行数,包括文件个数,代码行数,注释行数,空行行数.尽量设计灵活一点可以通过输入不同参数来统计不同语言的项目,例如: # type用于指定文件类型 pytho ...
- python excel处理重复行并统计个数_python统计一个文本中重复行数的方法
python统计一个文本中重复行数的方法 这篇文章主要介绍了python统计一个文本中重复行数的方法,涉及针对Python中dict对象的使用及相关本文的操作,具有一定的借鉴价值,需要的朋友可以参考下 ...
最新文章
- proDAD Erazr
- 生成式模型和判别式模型(转)
- 刚接触git,提交文件时,遇到no changes added to commit
- Cutting Codeforces Round #493 (Div. 2)
- Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(八)
- poj-2528线段树练习
- 检测高CPU线程定位shell脚本
- Python nltk包
- Jeesite 自定义api接口 404 访问不到页面
- 百度竞价排名曝光_企业入驻百度爱采购必须选好本地运营服务商
- python 用题库自动答题器_用题库自动答题
- 信息安全工程师考试大纲(2016)
- 日文输入键盘罗马字对应表
- Internet Explorer无法打开internet站点XXX,已终止操作 解决办法
- 浪潮存储服务器VAAI
- C / C++头文件大全
- unable to load dll 'gdiplus.dll' in docker
- BZOJ2456mode
- Windows平台搭建Mantis服务器
- mybatis源码-plugin源码