'''
总结一下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简单实现的更多相关文章

  1. 初识PCA数据降维

    PCA要做的事降噪和去冗余,其本质就是对角化协方差矩阵. 一.预备知识 1.1 协方差分析 对于一般的分布,直接代入E(X)之类的就可以计算出来了,但真给你一个具体数值的分布,要计算协方差矩阵,根据这 ...

  2. 主成分分析(PCA)

    相对与网上很多人分享的有关PCA的经历,我第一次接触PCA却不是从人脸表情识别开始的,但我所在的实验室方向之一是人脸的研究,最后也会回到这个方向上来吧. PCA(principal component ...

  3. 机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD(四) PCA与SVD 之 PCA中的SVD

    PCA中的SVD 1 PCA中的SVD哪里来? 细心的小伙伴可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?我们之前曾经提到过,P ...

  4. <学习opencv>opencv函数

    /*=========================================================================*/ // openCV中的函数 /*====== ...

  5. 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)

    Introduction 主成分分析(Principal Components Analysis)是一种对特征进行降维的方法.由于观测指标间存在相关性,将导致信息的重叠与低效,我们倾向于用少量的.尽可 ...

  6. PCA检测人脸的简单示例_matlab实现

    PCA检测人脸的简单示例,matlab R2009b上实现训练:训练用的20副人脸: %训练%Lx=X'*Xclear;clc;train_path='..\Data\TrainingSet\';ph ...

  7. PCA(主成分分析)的简单理解

    PCA(Principal Components Analysis),它是一种“投影(projection)技巧”,就是把高维空间上的数据映射到低维空间.比如三维空间的一个球,往坐标轴方向投影,变成了 ...

  8. 简单推导 PCA

    考虑二维数据降低到一维的例子,如下图所示: 最小化投影方差(maximize projected variance): 1N∑n=1N(uuT1xn−uuT1x¯)=uuT1Suu1,s.t.uuT1 ...

  9. 主成分分析(PCA)原理总结

    主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一.在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用.一般我们提到降维最容易想到的算法就 ...

随机推荐

  1. stl源码分析de练习

    // StlTest1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <vector> #include & ...

  2. 475. Heaters

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...

  3. 服务器上如何将D盘修改为E盘

    1.计算机管理→磁盘管理 2.右键点击需要调整的磁盘→更改驱动器号和路径 3.在弹出的设置框中→更改 4.点击右边的下拉箭头▼→选择一个盘符→确定 注意:如果盘符混乱,需要理顺,因为有些盘符占有了,不 ...

  4. Mysal表类型的区别-MyISAM,InnoDB

    1/ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数.因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源.I ...

  5. PHP(四)表单的基本处理

  6. 使用Git 管理heroku的项目(windows)

    此过程与管理github中的项目类似,即是普通的git配置 安装 Heroku Toolbelt, 里面包含了 msygit Foreman,以及heroku的命令行界面 1.首先在heroku上新建 ...

  7. 转载VC6.0 子窗口和父窗口

    这个是我周一在一家公司做的上机题中的一道,当场没做出来.我当时只跟考官说了设计思路,是带回来查了几本资料书之后才完成的.因为有半个学期没用VC开发了……,最近一直都在实践ASP.NET相关的…… 建立 ...

  8. 字符串匹配的KMP算法(转载)

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  9. WINSOCK网络函数

    1. 头文件及库文件 头文件:WINSOCK2.H 库:WS2_32.LIB库 如果是在WINCE中,不支持SOCK2,所以: 头文件:WINSOCK.H 库:WSOCK32.LIB 如果从MSWSO ...

  10. [Postgres]postgresql.conf : Permission denied处理一法

    使用yum安装完postgresql,没有使用默认的DATA地址,自己配置了DATA地址以后,使用root权限启动service service postgresql start ,报出了" ...