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)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...
随机推荐
- 利率计算--web版--软件工程
1.客户说:帮我开发一个复利计算软件. 完成复利公式计算程序,并成功PUSH到github上. 截止时间:3.10晚12点之前. 按照这个要求完成了. 演示. 计算:本金为100万,利率或者投资回报率 ...
- 自旋构造(更新)c#
int x; void MultiplyXBy (int factor) { var spinWait = new SpinWait(); while (true) { int snapshot1 = ...
- python 中numpy的var,std及cov
var:表示方差, 即各项-均值的平方求和后再除以N , std:表示标准差,是var的平方根. cov:协方差 ,与var类似,但是除以(N-1)
- Linux文件扩展思考随笔
Linux文件时间 ============================================================ ls -l 文件名 仅看到的是最后被修改的时间 Linux ...
- Axure8.0入门级基础操作到高手产品经理
宅男下载了一个Axure8.0.从来没有用过,那就从最基础的了解一下呗. 1.添加元件,选择元件设置样式(右侧对话框中)略!!!!! 2.按住ctrl键,用鼠标点选元件,可以任意旋转3.点元件上的黑圆 ...
- Linq使用中的ToList注意事项
在使用Linq时,如果查询逻辑太复杂,可以拆分为多个Linq查询,下一个Linq在上一个Linq查询的结果上继续操作,这样逻辑清晰,又不会出错.但在使用ToList的时候需要注意,最常见碰到的错误是: ...
- pycharm设置及激活码
电脑上装了python2.7和python3.6两个版本(之前用的都是python3,因为要学习机器学习和深度学习了,机器学习的有些模块还没有更新到python3,于是乎又装了python2)为了能在 ...
- scvmm sdk之powershell(一)
shell表示计算机操作系统中的壳层,与之相对的是内核,内核不能与用户直接交互,而是通过shell为用户提供操作界面,shell分为两类,一种提供命令行界面,一种提供图形界面.windows powe ...
- Centos 7 安装记录
0.安装中选择最小安装 1.centos7安装图形界面 之前转载过一篇“centos6安装图形界面”的文章,地址见http://my.oschina.net/u/1169607/blog/335304 ...
- Navicat 连接阿里云RDS
背景: Navicat 是一个非常优秀与易用的数据库可视化管理软件,相信很多人都用过.这次服务器升级,数据库用了阿里云的RDS,阿里云自带的数据库管理面板功能有限,用不习惯.所以还是想着用 Navic ...