算法之主成分分析PCA详解(包含理论推导和代码)

2023-05-16

1、PCA介绍

主成分分析算法(Principal Component Analysis)简称PCA,是一种常用的统计方法。该方法对高维的数据进行筛选,选出最具有代表性最重要的的几维数据,是一种有效的降维方法。

为什么要用PCA?

在m维数据中,当m非常大的时候,往往会存在较多相关性比较强的数据,从而影响算法的性能和准确率,因此,学者就开始研究,在保证数据的信息量尽量不变或很少改变的情况下,较大幅度的降低数据的维度呢?那么PCA就出来了。

2、PCA的理论推导

PCA是一种数据降维的算法,假设有m维数据,每个数据的维度是k维([kx1]的列向量),m是一个超大值,需要对其进行降维,降到n维,m维数据如下(每一列是一条数据):
在这里插入图片描述
为了将X从[kxm] 降维到[kxn],假设存在一个投影矩阵W,将X映射到[kxn]得到Z,公式如下
在这里插入图片描述
为了保证投影前后单条数据的信息不会发生变化,所以,这里的W矩阵应该是一个标准正交基矩阵,否则,会出现总信息量的变化,所以,W矩阵的表示形式如下:
在这里插入图片描述
其中:
在这里插入图片描述
由于W是一个标准正交基矩阵,那么存在如下的约束:
在这里插入图片描述
写成矩阵形式如下:
在这里插入图片描述
设投影后的数据矩阵为Z,公式如下:
在这里插入图片描述
完成数据降维后,假设将Z还原到mxk维后,数据的损失量尽可能的小,如何映射回mxk维?不难想到WxZ即可映射到与原来数据维度相同的数据,得出下面的公式:
在这里插入图片描述

有了原数据和映射还原后的数据,我们就可以做出假设,两个数据之间尽可能的相同,所以要满足:
在这里插入图片描述
而F范数公式如下:
在这里插入图片描述

上面的公式跟F范数一致,所以目标函数可以写成F范数的平方,并且W是一个标准正交基矩阵,所以可以写成如下的优化问题:
在这里插入图片描述
在这里插入图片描述

3、PCA模型求解

PCA的优化目标函数是一个凸函数,并且约束是一个等式约束,因此,可以断定该优化问题存在解析解,那么接下来开始凸优化求解析解的推导过程。
首先,介绍一下F范数的一个性质:
在这里插入图片描述
因此,目标函数可以优化成:

在这里插入图片描述
由于约束条件是一个等式约束,可以通过拉格朗日乘子法进行处理,如下:
在这里插入图片描述
在对W求导之前,先给出矩阵迹求导的相关定理
在这里插入图片描述
目标函数对W进行求导并化简:
在这里插入图片描述

由于目标函数是一个凸函数,因此,最大值肯定在导数=0的位置,因此令导数等于0进行化简:
在这里插入图片描述
通过上面的公式,可以发现跟矩阵特征值特征向量公式一样,因此,W可以看成XXT的特征向量组成的矩阵,而λ则是XXT的特征值,因此,W可以通过XXT的特征值分解的方法进行求解。

4、python实现代码

首先介绍一下PCA算法的主要流程:

1、对数据矩阵X进行去中心化.
2、计算矩阵X的协方差矩阵XXT
3、计算协方差矩阵的特征值和特征向量
4、选取前n个最大的特征值对应的特征向量构成W
5、利用X与W相乘,实现数据的降维
import numpy as np
from numpy.linalg import eig

def pca(X, n):
	X = X - X.mean(axis=0)
	covX = np.cov(X.T, ddof=0)
	eigVal, eigVectors = eig(covX)
	n_large_indexs = eigVal.argsort()[-n:][::-1]
	W = eigVectors[n_large_indexs]
	return np.dot(X, W.T)

if __name__ == '__main__':
	# test example: 4x3 映射成 4x2  
    X = np.array([[1,  2,  3],
                  [4,  5,  6],
                  [55, 88, 7],
                  [22, 44, 11]]);
    X_pca = pca(X, 2)
    print(X_pca)

输出结果:

[[ 33.66073984  18.2056667 ]
 [ 28.49016813  18.56869237]
 [-52.99155317 -34.25229705]
 [ -9.1593548   -2.52206202]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法之主成分分析PCA详解(包含理论推导和代码) 的相关文章

随机推荐

  • 实现微信小程序和手机app远程控制51单片机控制L298N电机驱动器控制马达(ESP8266 AT89S52 http请求转串口通信系统 mqtt )

    首先你有这样的8266 这种8266自身带2个按键和烧录芯片方便调试 xff0c 综合性价比较高 还有就是你需要有一个51单片机或者其他芯片都行 有了这2个芯片我们开始吧 xff01 1 先看一段视频效果演示 xff0c 再来介绍实现步骤
  • play() failed because the user didn‘t interact with the document first

    使用js调用音频文件报错 xff0c 错误信息如下 xff1a play failed because the user didn t interact with the document first 翻译 xff1a play方法调用失败
  • 电脑蓝屏:KERNEL_SECURITY_CHECK_FAILURE 分析

    此KERNEL SECURITY CHECK FAILURE bug 检查的值为 0x00000139 此 bug 检查指示内核检测到关键数据结构损坏 引起电脑蓝屏问题的topsecpf sys xff0c 删除 LIST ENTRY损坏可
  • springBoot集成mybatis使用ResultHandler返回map数据类型

    在 springBoot 的 web 项目中 xff0c 平时查询数据返回都是 xff1a 集合 list 实体类 bean 数量 int long 如果返回 map xff0c 也是Map lt String Map lt String
  • java测试示例-生成ULID

    ULID全称Universally Unique Lexicographically Sortable Identifier xff0c 直译就是通用唯一按字典排序的标识符 xff0c 原始仓库是https github com ulid
  • jdk8-获取本机ip、判断ip范围、ip与long互转等

    在配置nginx的ip白名单时候 xff0c 会通过ip段进行配置 xff08 如 10 10 10 10 24 xff09 就在思考这种配置怎么通过代码解析并判断 xff0c 故通过搜索网络内容 xff0c 并通过java编写测试代码 代
  • python3通过文件头判断文件类型

    最近 xff0c 在学习python3中 xff0c 感觉入门挺简单 xff0c 毕竟本身是java开发 xff0c 很多容易理解一些东西 这几天对文件类型的验证有点想法 xff0c 就在网上搜索 xff0c 是找到了很多博客 xff0c
  • mysql数据数据表的排序规则修改

    在工作中同事遇到的问题 xff0c 是找一种简便的方法批量修改数据表字段的排序规则 xff0c 在MySQL中叫collation xff0c 和编码CHARACTER一起出现的 collation有三种级别 xff0c 分辨是数据库级别
  • linux 普通用户sudo无需手动敲密码

    普通用户在执行一些root权限的操作时 xff0c 需要用到sudo命令来执行 xff0c 同时需要手动输入密码 xff0c 比较繁琐 xff0c 下面的操作来减少手动输入密码 1 visudo命令编辑 etc sudoers文件 sudo
  • Qt QFile 删除文件最后n个字节的数据

    QFile无需打开文件 xff0c 即可删除文件最后面的n个字节的数据 方法很简单 xff0c 可以通过QFile自带的resize函数进行大小的处理 resize size 如果 size的大小大于file的大小 xff0c file后面
  • Qt中通过C++ 实现udp广播报文

    Qt UDP消息交互 udp广播原理介绍客户端实现方法客户端思路实现代码 服务端实现方法服务端思路实现代码 udp广播原理介绍 UDP是面向非连接的网络交互协议 xff0c 在UDP交互中 xff0c 存在客户端和服务端 xff0c 客户端
  • 实现手机app和微信小程序和树莓派智能音箱远程控制arduino获取甲醛温湿度和控制灯(esp8266 ZE08-CH2O DHT11 MQTT 语音识别 语言合成 http请求转串口通信系统 )

    首先你有这样的esp8266 这种esp8266自身带2个按键和烧录芯片方便调试 xff0c 综合性价比较高 需要有一个arduino uno 连接甲醛探测器和温湿度探测器 或者其他芯片都行 还有就是你要有树莓派和usb麦克风 xff0c
  • 什么是法线贴图?

    什么是法线贴图技术呢 xff1f 这是一种用来实现3D效果的一种技术 xff0c 要想理解这种技术还请您听我慢慢道来 我们知道 xff0c 在游戏中经常会有这样的情况 xff0c 就是一个平面 这个平面在现实中并不是一 个 平 面 xff0
  • 串口中断收发定长数据

    一 实验设计效果 配置串口助手波特率为115200 xff0c 传输数据长度为8 Bit xff0c 无奇偶校验位 xff0c 1个停止位 xff1b 通过串口助手向MCU发送指定长度的字符串 xff0c MCU接收到指定长度的字符串后 x
  • Qt 中C++ async实现并行处理

    在项目中 xff0c 难免遇到性能问题 xff0c 为了提高处理的性能 xff0c 针对可以并行处理的部分单独提取出来 xff0c 利用并行编程来提高处理的速度 xff0c 从而实现高性能 C 43 43 11中有一个async 函数 xf
  • 深度学习环境入门之手写数字识别

    在自己的windows环境下配置好了深度学习的环境 xff0c 本文主要记录一下用深度学习的环境下实现一个简单的手写数字识别的模型训练和使用 1 在pycharm中配置conda环境 xff1a 环境配置好以后 xff0c 可以开始手写数字
  • 算法之KMP算法 全新思路介绍!

    KMP算法是一个经典的字符串匹配算法 xff0c 也是一种常用的字符串匹配算法 在KMP算法没出现之前 xff0c 大家在字符串匹配的时候 xff0c 都是两个for循环嵌套完成字符串之间的匹配 这种算法称作 BF算法 xff08 暴力求解
  • c++ linux utf-8 编码 中文汉字分割(超简单代码)

    UTF 8 编码对于英文字母 xff0c 占用一个字节 xff1b UTF 8 编码对于中文字母 xff0c 占用多个字节 xff0c 最大占用6个字节 xff0c 其中第一个字节二进制的最高位连续1的个数来表示占用字节的个数 xff0c
  • 算法之并查集

    并查集 xff0c 顾名思义 xff0c 就是合并不同的集合 xff0c 并查集是一种集合合并和查找算法 这是一种思想很奇妙的算法 xff0c 学会它 xff0c 在你后续的程序学习中可以有很多的可以用的地方 什么是并查集 xff1f 举个
  • 算法之主成分分析PCA详解(包含理论推导和代码)

    1 PCA介绍 主成分分析算法 xff08 Principal Component Analysis xff09 简称PCA xff0c 是一种常用的统计方法 该方法对高维的数据进行筛选 xff0c 选出最具有代表性最重要的的几维数据 xf