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)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...
随机推荐
- Golang之字符串操作(反转中英文字符串)
//字符串反转package main import "fmt" func reverse(str string) string { var result string strLe ...
- 利率计算--web版--软件工程
1.客户说:帮我开发一个复利计算软件. 完成复利公式计算程序,并成功PUSH到github上. 截止时间:3.10晚12点之前. 按照这个要求完成了. 演示. 计算:本金为100万,利率或者投资回报率 ...
- Sypder 安装和使用
一.安装Spyder 我傻傻以为直接下载Spyder就可以用了,但我其实大错特错了.Spyder虽然提供科学计算,但是它还需要一个介于Python和其之间的框架,或者说,显示界面PyQt5.(PyQt ...
- CMake使用技巧集
1.注意CMake不允许出现相同的目标名称,即使是不同的目录下的CMakeLists.txt 2.将头文件搜索路径插入到其它的前面: include_directories(BEFORE /tmp) ...
- Swift使用CoreLocation,你必须要看这一篇
CoreLocation,在我们这里讨论的是一个最常用的东西,就是用Location Manger获取用户当前的位置. 整个的来说非常简单.只要这样: import CoreLocation 需要使用 ...
- 23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter
23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter 2016-07-22 (www.cnblogs.com/icmzn) 模式理解
- 23 DesignPatterns学习笔记:C++语言实现
DesignPatterns学习笔记:C++语言实现 (转载请注明出处:http://www.cnblogs.com/icmzn/p/5680784.html) 1. 创建型设计模式: (1)Faco ...
- 咏南中间件新增SQL日志
为了方便开发时跟踪调试SQL语句的执行情况,咏南中间件新增SQL日志,所有执行过的SQL都会写入SQL日志文件中. SQLDEBUG设为1,启用:设为0,停止写SQL日志.
- 自我介绍及注册github和上传文件
自我介绍: 周侃 年龄20 喜好:玩游戏,赚钱,交际 理想:想要改变中国手游界颓靡的时代,让它进入新次元. 注册github,以及上传文件: 今天给大家来讲解下如何注册githup 当我们打开gith ...
- WebApi 插件式构建方案:IOC 容器初始化
body { border: 1px solid #ddd; outline: 1300px solid #fff; margin: 16px auto; } body .markdown-body ...