PCA简单实现
'''
总结一下PCA的算法步骤:
设有m条n维数据。
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵C=1/m*(XX^T)
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)Y=PX即为降维到k维后的数据
# http://blog.codinglabs.org/articles/pca-tutorial.html
# https://zhuanlan.zhihu.com/p/37777074
'''
import numpy as np
# 1. 如果原始数据是按照行排列的:
'''
def PCA(original_X,componens_k):
# 1. 首先获得原始数据X的均值,如果数据按照行排列,特征按照列排列,则axis=0; 否则axis=1
norm_X = X - np.mean(original_X,axis=0) # 去均值之后的数据X
# 2. 计算协方差矩阵,由于散列矩阵和协方差矩阵仅相差一个系数,对特征向量的求解不影响,因此可以不加系数
scatter_matrix = np.dot(np.transpose(norm_X),norm_X) # 由于这里数据是按照列排布的,所以C = X^T·X
# 3. 计算协方差矩阵(散列矩阵)的特征值和特征向量
eig_val, eig_vec = np.linalg.eig(scatter_matrix)
# 4. 将各自的各自的特征值和特征向量绑定在一起按照从大到小的顺序排列
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:, i]) for i in range(X.shape[1])]
eig_pairs.sort(reverse=True)
# 5. 按照特征值从大到小的排列顺序得到的特征向量,取前K行组合成降维矩阵P
dim_re_matrix = np.array([ele[1] for ele in eig_pairs[:componens_k]])
dim_re_data = np.dot(norm_X,np.transpose(dim_re_matrix))
return dim_re_data
'''
# 2. 如果原始数据是按照列排列的:
def PCA(original_X,componens_k):
original_X = np.transpose(original_X) # 原始数据是行排列的,这里使用转置将其转化为列排列进行试验
norm_X = original_X - np.mean(original_X,axis=1,keepdims=True)
covariance_matrix = (1 / norm_X.shape[1]) * np.dot(norm_X,np.transpose(norm_X))
eig_val, eig_vec = np.linalg.eig(covariance_matrix)
eig_pairs = [(np.abs(eig_val[i]),eig_vec[:,i]) for i in range(norm_X.shape[0])]
eig_pairs.sort(reverse=True)
dim_re_matrix = np.array([ele[1] for ele in eig_pairs[:componens_k]])
dim_re_data = np.dot(dim_re_matrix,norm_X)
return dim_re_data # [[-2.12132034 -0.70710678 0. 2.12132034 0.70710678]]
# 3. 使用sklearn的PCA
'''
from sklearn.decomposition import PCA
import numpy as np
def PCA_(original_X,components_k):
pca = PCA(n_components=1)
pca.fit(original_X)
return pca.transform(original_X)
'''
if __name__ == '__main__':
X = np.array([[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]])
# X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(PCA_(X, 1))
PCA简单实现的更多相关文章
- 初识PCA数据降维
PCA要做的事降噪和去冗余,其本质就是对角化协方差矩阵. 一.预备知识 1.1 协方差分析 对于一般的分布,直接代入E(X)之类的就可以计算出来了,但真给你一个具体数值的分布,要计算协方差矩阵,根据这 ...
- 主成分分析(PCA)
相对与网上很多人分享的有关PCA的经历,我第一次接触PCA却不是从人脸表情识别开始的,但我所在的实验室方向之一是人脸的研究,最后也会回到这个方向上来吧. PCA(principal component ...
- 机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD(四) PCA与SVD 之 PCA中的SVD
PCA中的SVD 1 PCA中的SVD哪里来? 细心的小伙伴可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?我们之前曾经提到过,P ...
- <学习opencv>opencv函数
/*=========================================================================*/ // openCV中的函数 /*====== ...
- 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)
Introduction 主成分分析(Principal Components Analysis)是一种对特征进行降维的方法.由于观测指标间存在相关性,将导致信息的重叠与低效,我们倾向于用少量的.尽可 ...
- PCA检测人脸的简单示例_matlab实现
PCA检测人脸的简单示例,matlab R2009b上实现训练:训练用的20副人脸: %训练%Lx=X'*Xclear;clc;train_path='..\Data\TrainingSet\';ph ...
- PCA(主成分分析)的简单理解
PCA(Principal Components Analysis),它是一种“投影(projection)技巧”,就是把高维空间上的数据映射到低维空间.比如三维空间的一个球,往坐标轴方向投影,变成了 ...
- 简单推导 PCA
考虑二维数据降低到一维的例子,如下图所示: 最小化投影方差(maximize projected variance): 1N∑n=1N(uuT1xn−uuT1x¯)=uuT1Suu1,s.t.uuT1 ...
- 主成分分析(PCA)原理总结
主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...
随机推荐
- Linux gperf命令
一.简介 GNU 的 gperf 工具是一种 "完美的" 散列函数,可以为用户提供的一组特定字符串生成散列表.散列函数和查找函数的 C/C++ 代码.通过本文学习如何使用 gper ...
- python教学视频
3 X王的 链接: http://pan.baidu.com/s/1bW2UrO 密码: quit4 django 链接: http://pan.baidu.com/s/1o8UsNDS 密码: 8x ...
- [SoapUI]怎样从应答报文中获取某个字段的值,然后用其改写某个变量
import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def holde ...
- yum 系列(一) yum 和 rpm 常用命令
yum 系列(一) yum 和 rpm 常用命令 一.yum 常用命令 yum 命令:http://man.linuxde.net/yum yum 是在 Fedora 和 RedHat 以及 SUSE ...
- 没有Home键之后的iPhone会是什么样子?
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 之前笔者推测新一代的iPhone不会再有“Home”键.果不其然,9月13日苹果发布会证实了笔者的观 ...
- Oracle GoldenGate 四、数据过滤和数据项匹配
写在开始前 从两周前我花了大量的业余时间阅读GoldenGate官方文档,并根据文档实践和进一步学习了解GoldenGate,以下便是根据官方文档理解总结的GoldenGate学习内容: Oracle ...
- 如何在centos环境下搭建java环境
在CentOS上安装Java环境:[1]使用yum安装java 现阶段做企业级项目开发一般都采用Java语言.开发的项目需要放在服务器上运行测试,若以CentOS系统为服务器系统,首先要解决就是Cen ...
- ie7下 li多了4像素
当li 设置了float 后,在ie7 下便会产生margin-bottom:4px的bug,即使设置margin-bottom为0也不能清除. 可以通过csshack 解决: 1:在ie7下 将he ...
- m2e 插件
官网 http://www.eclipse.org/m2e/ 在线安装地址 http://download.eclipse.org/technology/m2e/releases 插件简介 Launc ...
- 装饰者模式及C++实现
装饰者模式 时常会遇到这样一种情况,我已经设计好了一个接口,并且也有几个实现类,但是这时我发现我设计的时候疏忽了,忘记了一些功能,或者后来需求变动要求加入一些功能,最简单的做法就是修改接口,添加函数, ...