常见的数据降维算法有:奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。

PCA降维的基本思想:通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值、特征向量、选择特征值最大(即方差最大)的K个特征所对应的特征向量组成的矩阵,这样可以将数据矩阵转换到新的空间当中,实现数据特征的降维。

PCA降维有两种思路:一种是特征值分解协方差矩阵,一种是奇异值分解协方差矩阵。下面介绍基于奇异值分解的方法

一:关于特征值分解

a)特征值与特征向量

如果一个向量v是矩阵A的特征向量,将一定可以表示成下面的形式

其中,λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。

b)特征值分解矩阵

对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:

其中,Q是矩阵A的特征向量组成的矩阵,则是一个对角阵,对角线上的元素就是特征值。

二:SVD分解矩阵原理

奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:

假设A是一个m*n的矩阵,那么得到的U是一个m*m的方阵,U里面的正交向量被称为左奇异向量。Σ是一个m*n的矩阵,Σ除了对角线其它元素都为0,对角线上的元素称为奇异值,是v的转置矩阵,是一个n*n的矩阵,它里面的正交向量被称为右奇异值向量。而且一般来讲,我们会将Σ上的值按从大到小的顺序排列。

SVD分解矩阵A的步骤:

(1) 求的特征值和特征向量,用单位化的特征向量构成 U。

(2) 求的特征值和特征向量,用单位化的特征向量构成 V。

(3) 将或者的特征值求平方根,然后构成 Σ

三:实现PCA算法的步骤:

(1)去均值(即去中心化)每一位特征减去各自的平均值。

(2)计算协方差矩阵1/n*xx'

(3)   用奇异值分解法求协方差矩阵1/n*xx'的特征值与特征向量

(4)对特征值从大到小排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P

(5)将数据转换到K个特征向量构建的新空间中即Y=PX

如何选择主成分个数K

1-    <=t

Sii为SVD分解时产生的S矩阵

t的值可以自己设置,t取0.01则代表PCA保留了99%的信息。

最好的K维特征是将n维样本点转换为K维后,每一维上的样本方差都很大。

补:matlab自带的mean函数用法。mean(x)默认求矩阵列的平均值。mean(x,2)求矩阵行的平均值。

std函数:求矩阵的标准差

std(A)是最常见的求标准差的函数,除以的是N-1

std(A,flag)代表的是用哪一个标准差函数,如果取0则代表除以N-1,如果1代表的是除以N

std(A,flag,dim)第三个参数代表的是按照列求标准差,还是按照行求标准差。

repmat函数处理大矩阵且内容重复时会用到

eg  B=repmat([1 2;3 4],2,3)

B= 1 2  1 2 1 2

3 4  3 4 3 4

1 2  1 2 1 2

3 4  3 4 3 4

length(x)矩阵   M行N列返回M和N这两个数的最大值。

归一化(按列减均值)

标准化(按列缩放到指定范围)

正则化(范数)

eig函数的用法

a=[-1,1,0;-4,3,0;1,0,2]

eig(a)= [2,1,1]'

[v,d]=eig(a)

v =

0    0.4082    0.4082
         0    0.8165    0.8165
    1.0000   -0.4082   -0.4082

d =

2     0     0
     0     1     0
     0     0     1

v是特征向量对应的特征矩阵。d是特征向量组成的矩阵。

rot函数的用法

b=rot90(a)逆时针旋转90度

b=rot90(a,-1)顺时针旋转90度

matlab代码实现(待改进:此方法采用的是基于特征值分解的方法,改进为用奇异值分解的方法)

function S=princa(X)
[m,n]=size(X); %计算矩阵的行m和列n%-------------第一步:标准化矩阵-----------------%
mv=mean(X); %计算各变量的均值
st=std(X); %计算各变量的标准差
X=X-repmat(mv,m,1); %标准化矩阵X%-------------第二步:计算相关系数矩阵-----------------%
% R1=X'*X/(m-1); %方法一:协方差矩阵计算公式
% R2=cov(X);     %方法二:协方差矩阵计算函数
R=corrcoef(X); %方法三:相关系数矩阵函数%-------------第三步:计算特征向量和特征值-----------------%
[V,D]=eig(R);       %计算矩阵R的特征向量矩阵V和特征值矩阵D,特征值由小到大%将特征向量矩阵V从大到小排序%将特征值矩阵由大到小排序
E=diag(D);          %将特征值矩阵转换为特征值向量%-------------第四步:计算贡献率和累计贡献率-----------------%
ratio=0; %累计贡献率
for k=1:nr=E(k)/sum(E);   %第k主成份贡献率ratio=ratio+r;  %累计贡献率if(ratio>=0.8)  %取累计贡献率大于等于90%的主成分q=k;break;end
end%-------------第五步:计算得分-----------------%
V=V(:,1:q);
S=X*V;

python代码实现

import numpy as np
def pca(X,k):n_samples, n_features = X.shapemean=np.array([np.mean(X[:,i]) for i in range(n_features)])norm_X=X-meanscatter_matrix=np.dot(np.transpose(norm_X),norm_X)eig_val, eig_vec = np.linalg.eig(scatter_matrix)eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]eig_pairs.sort(reverse=True)feature=np.array([ele[1] for ele in eig_pairs[:k]])data=np.dot(norm_X,np.transpose(feature))return data#print(eig_pairs)
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(pca(X,1))

利用sklearn中的PCA函数实现

from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca=PCA(n_components=1)
pca.fit(X)
print(pca.transform(X))
#ske

参考资料:写得巨好超级推荐https://blog.csdn.net/program_developer/article/details/80632779

PCA降维算法原理及代码实现(python和matlab)相关推荐

  1. PCA降维工作原理及代码案例实现

    PCA降维工作原理 PCA利用了协方差矩阵的特征值分解.过程分为四个步骤: (1)创建数据集的协方差矩阵 协方差:用来度量两个随机变量关系的统计量 (2)保留协方差矩阵的特征值 (3)保留前K个特征值 ...

  2. 【主成分分析】PCA降维算法及Matlab代码实现

    前言   机器学习中经常会遇到高维变量的大数据集,并且大数据集的很多高维变量之间并不是独立的,它们之间往往存在相关关系.这些变量一方面为机器学习提供了大量的信息,另一方面由于信息冗余也增加了数据处理的 ...

  3. 深度强化学习-D3QN算法原理与代码

    Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能.如果对Doubel DQN和Duelin ...

  4. 深度强化学习-Double DQN算法原理与代码

    深度强化学习-Double DQN算法原理与代码 引言 1 DDQN算法简介 2 DDQN算法原理 3 DDQN算法伪代码 4 仿真验证 引言 Double Deep Q Network(DDQN)是 ...

  5. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

  6. SSD算法原理与代码(三)

    说明:这几篇文章是讲解SSD,从算法原理.代码到部署到rk3588芯片上的过程.环境均是TF2.2,具体的安装过程请参考网上其他的文章. 一.SSD简介 SSD算法是一个优秀的one-stage目标检 ...

  7. 计算机图形学--中点椭圆算法原理及代码实现

    目录 椭圆的几何特性: 算法原理: 代码实现: 说明,我们这里讨论的椭圆都是对称轴平行于坐标轴的椭圆,对于其他方程较为复杂的椭圆我们不做讨论. 椭圆的几何特性: 首先我们考虑椭圆的几何特性.椭圆是抽对 ...

  8. 论文|Node2vec算法原理、代码实战和在微信朋友圈的应用

    1 概述 Node2vec是2016年斯坦福教授 Jure Leskovec.Aditya Grover提出的论文,论文的下载链接为:https://arxiv.org/pdf/1607.00653. ...

  9. 萤火虫算法_40多种智能优化算法原理和代码分享

    40多种智能优化算法原理和代码分享 <智能优化算法讲解>PDF下载地址: <智能优化算法原理讲解>PDF​mianbaoduo.com 包括: 1.海鸥算法SOA 智能优化算法 ...

最新文章

  1. js经典校验之注册与登录校验
  2. Warning: Permanently added the RSA host key for IP address '13.229.188.59' to the list of known host
  3. 吴恩达机器学习笔记(三) —— Regularization正则化
  4. Web-Scale Data
  5. 第六十四期:微软将不再把 .NET Framework API 移植到 .NET Core 3.0
  6. 设计模式C++实现(3)——建造者模式
  7. Java操作某方法时报错:java.lang.NoSuchMethodError
  8. Qt4_Quit按键
  9. matlab卷积神经网络的创建与图片识别
  10. v-distpicker
  11. latex 打出罗马数字
  12. 【Flutter 问题系列第 49 篇】在 Flutter 中如何给组件设置背景色、圆角、边框、形状、阴影、渐变色、背景图片等效果
  13. oracle 创建新的表空间,oracle创建表空间新建新用户并受权
  14. 基于VisualStudio历时20年打造的史诗级游戏
  15. ABAQUS 求解应力强度因子
  16. 基于wiki中文语料库的gensim模型使用方法以及R语言的调用方式
  17. Alextnet网络
  18. Unity3D NGUI分离RGBA通道
  19. 如何精准化的做微信公众号运营?
  20. 东华oj-进阶题第87题-挤牛奶

热门文章

  1. GARFIELD@01-16-2005
  2. pct_change()
  3. 点到面的战略和银行共生关系的文献总结
  4. change from a ppt to the report
  5. fly a kite
  6. <<温泉屋的小老板娘>>观后感
  7. Java利用QRCode.jar包实现二维码编码与解码
  8. 初学Java对某些问题的理解
  9. Windows 7 Bcdedit 应用
  10. 15年IT研发老兵的困惑,生存与生活的状态