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)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...
随机推荐
- vargant
http://blog.csdn.net/openn/article/details/54927375
- 利用BeanUtils.copyProperties 克隆出新对象,避免对象重复问题
1.经常用jQuery获取标签里面值val(),或者html(),text()等等,有次想把获取标签的全部html元素包括自己也用来操作,查询了半天发现$("#lefttr1"). ...
- Oracle学习笔记(一)
用户与表空间 系统用户: 一.系统用户级别sys.system 最高级(sys级别高于system)sysman 操作企业管理器使用的scott 创始人之一的名字scott默认密码是tiger登录方法 ...
- 三大语言实例 (python,C/C++,Java)
Python3.5语言实例: #coding = utf-8 import sys def Sub_string(a,b): c=[0]*len(b) for i in range(len(a)): ...
- UIWebview与js交互[转]
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌入页面中,通过这个方法我们可以在iOS ...
- swift NSURLSession 使用方法
//NSURLSession /*创建一个session ->创建一个task -> 启动task -> 处理回调 */ //http://www.douban.com/j/app/ ...
- Linux 基础教程 29-tcpdump命令-1
什么是tcpdump 在Linux中输入命令man tcpdump给出的定义如下所示: tcpdump - 转储网络上的数据流 是不是感觉很懵?我们用通俗.形象.学术的表达方式来全方位描述tc ...
- Linux C 网络编程——3. TCP套接口编程
1. 基本流程 2. socket() int socket(int domain, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,就像open ...
- 咏南BS开发框架
咏南BS开发框架 开发工具为:DELPHI 2006及以上版本.欢迎索取演示. 通用的三级权限管理. 登录验证 输入帐号和密码验证登录系统. 功能菜单 在这里设置好菜单,系统运行的时候会根据菜单设置动 ...
- java分页实例Demo
前两天测试过的一个分页的demo,在网上看到的,挺好的,就写了下来. 分页也是web里面必须的,有使用的价值. demo文件打包上传了,链接:http://pan.baidu.com/s/1o6sME ...