《机器学习》PCA数据降维 推导、参数讲解、代码演示及分析

2024-09-06 08:28

本文主要是介绍《机器学习》PCA数据降维 推导、参数讲解、代码演示及分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、主成分分析

1、什么是主成分分析?

2、什么是降维?

3、如何进行主成分分析

        1)数据标准化

        2)计算协方差矩阵

        3)计算特征值和特征向量

        4)选择主成分

        5)构建投影矩阵

        6)数据降维

4、为什么要进行主成分分析

        1)数据可视化

        2)数据压缩

        3)特征选择

        4)数据预处理

二、PCA中的数学

1、基

        1)什么是基

        2)图像表示

        3)什么样的向量可以成为基?

2、基变换

        1)基变换的含义

        2)单个二维向量变换

        3)示例

        4)多个二维向量变换

        5)多个多维向量变换

3、如何选择基

        1)如何才能保留较多的原始数据信息?

        2)方差公式

        3)数据特征减去均值

        4)三维空间数据转变到二维图示

        5)协方差

        1、含义

        2、公式

        3、目标

        6)协方差矩阵

        7)人为构建矩阵

        1、目标

        2、原始数据

        3、含义

        4、协方差矩阵对角化

        8)协方差矩阵C对角化

        1、公式

        2、实对称矩阵特性

        3、最终目标

4、求解步骤

5、计算实例

1)特征减去均值

2)计算协方差矩阵

3)计算协方差矩阵的特征值和特征向量

4)矩阵P

5)降维

三、参数解析

1、用法

2、参数

1)n_components:指定希望PCA降维后的特征维度数目

2)copy :bool类型,默认为True。

3)whiten:判断是否进行白化。

4)svd_solver:即指定奇异值分解SVD的方法

3、属性

4、PCA对象方法

四、代码实现

1、完整代码

2、运行结果


一、主成分分析

1、什么是主成分分析?

        主成分分析是一种经典的无监督降维方法,用于将高维数据集投影到一个较低维的子空间中。PCA的目标找到一个新的坐标系,其中新的轴被称为“主成分”,这些主成分是原始数据中方差最大的方向。通过选择较少的主成分,可以保留数据集中的大部分信息,并且可以减少特征的数量,从而降低计算复杂度。

2、什么是降维?

        数据特征又叫做数据的维度,减少数据的特征即是降维

例如:下列数据有四个特征,即四个维度,如何减少他们的维度,同时又保留大部分特征的信息就是接下来的操作。


3、如何进行主成分分析

        1)数据标准化

                将原始数据进行标准化,使每个特征的均值为0,标准差为1。这一步是为了确保不同特征之间的量纲差异不会影响PCA的结果。

        2)计算协方差矩阵

                根据标准化后的数据,计算协方差矩阵。协方差矩阵反映了数据特征之间的相关性。

 

        3)计算特征值和特征向量

                对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征值表示各个特征向量对应的主成分的重要程度,特征向量表示数据在不同主成分上的投影。

 

        4)选择主成分

                根据特征值的大小,选择最大的k个特征值对应的特征向量作为主成分。k的选择一般根据保留的信息量来确定,可以使用特征值的累积贡献率来判断,例如保留总方差的95%。

 

        5)构建投影矩阵

                将选择的k个特征向量按列排成一个投影矩阵,该矩阵将原始数据投影到主成分所构成的子空间。

 

        6)数据降维

                将原始数据通过投影矩阵进行降维,得到降维后的数据集。降维后的数据集仅包含k个主成分,维度减少了。

4、为什么要进行主成分分析

        1)数据可视化

                主成分分析可以将高维数据映射到二维或三维空间中,在可视化分析中提供更好的观察和理解数据的能力。通过将数据投影到较低维度的空间,我们可以更容易地检测数据的分布、聚类和异常值。

 

        2)数据压缩

                主成分分析可以通过保留较高方差的主成分,将数据从高维度降低到低维度。这有助于减少存储空间和计算成本,并提高数据处理效率。

 

        3)特征选择

                主成分分析可以帮助识别出在数据中具有最大方差的特征。通过选择具有较高方差的主成分,我们可以从原始数据中提取出最重要的特征。

 

        4)数据预处理

                主成分分析可以用于数据预处理的步骤。通过将数据投影到较低维度的空间中,我们可以减少噪声和冗余数据,从而改善后续的数据分析和建模结果。

二、PCA中的数学

1、基

        1)什么是基

                基,也称基底,是描述、刻画向量空间的基本工具

        2)图像表示

        如图所示,横纵坐标轴叫做基底单位向量(0,1)和(1,0)叫做这个二维空间的一组基,而向量A的坐标完全由这组基来表示,如下所示:

        注意:这里的x和y和之前的表示不同,之前的是前面多少列为特征集,有一列作为标签列,而现在的则是将原本的数据做了一个转置,得到现在的,前多少行为特征集,有一列作为标签行。即,一列表示一条数据。

        所以这里表示的是这一组基乘以x方向的长度与y方向上的长度,最终得到的值就是这个向量在当前的基底表示的坐标为(3,2)

        3)什么样的向量可以成为基?

                任何两个线性无关二维向量都可以成为一组基,即表示两组向量互相垂直就是线性无关,如下图所示,蓝色线表示一组新的基底,原本的向量映射在不同基底上对应的坐标不同。

2、基变换

        1)基变换的含义

                两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。

                抽象地说,一个矩阵可以表示一种线性变换。

        2)单个二维向量变换

        如图所示,将原本的(x1,x2)基底变换为(y1,y2),此时新的坐标系单位向量坐标则不能表示为(1,1),而应该表示为( 1/\sqrt{2}1/\sqrt{2} )

        此时新的基底的一组基则表示为( 1/\sqrt{2}1/\sqrt{2} ),( -1/\sqrt{2}1/\sqrt{2} ),如下图所示

此时坐标虽然变了,但是模没变,长度还是原来的长度,但是表达方式改变了

        3)示例

                所以此时即可得到原坐标(3,2)转变后的坐标为,(内积的定义):

        4)多个二维向量变换

                其计算方式和上述类似,同样是将新的基底的一组基乘以多个二维向量,得到的新的坐标:

        此时三组向量(1,1),(2,2),(3,3),他们在新的坐标系中表示的坐标为上图所示的状态

        5)多个多维向量变换

上述都是将二维数据映射到二维空间,那么如果是多维数据映射到多维空间呢?如下所示

        上图表示的是n维的向量向R维空间映射,作内积得到的结果为R行m列,因为基的第一行乘以特征第一列得到一个结果,第一行乘以第二列得到第二个几个,然后一行乘以所有的列,得到结果的一行,而基有R行,乘以m列后,得到的结果就为R行m列,即将原本的维度为n的数据,转变成了维度为R的数据,这就是卷积,即一个矩阵和另一个矩阵相乘,将一个矩阵变换到新的空间中。

3、如何选择基

        1)如何才能保留较多的原始数据信息?

如下所示有一堆数据点,将他们映射到新的空间后投影到坐标轴上得到的状态:

        此时可以发现,投影到不同的轴上的数据点紧密程度不同,从而得到投影的轴上的点的分布状态,而数据的离散程度可以用方差来表示,方差越大则表示数据的离散程度越大,如果我们取方差小的当做新的数据,此时点之间的排布非常紧密,很多个点重合在一起,此时则无法满足较多的保存原始数据,所以我们更需要离散程度更高的当做新的数据。

        2)方差公式

        3)数据特征减去均值

        此时问题变为,寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大(二维变一维)。

        4)三维空间数据转变到二维图示

        如图所示,在一个三维空间中,有一堆数据点,想要将这些数据点降维到二维空间,首先要找到一个基,使得这些数据点投影到这个基上面的方差最大,因为要转变的是二维空间,所以找到这样一个基之后需要找第二个基,而这两个基又必须满足线性无关性,所以第二个基需要满足垂直于第一个基的同时又要是方差次大的状态,以此而得到新的基底。

        5)协方差
                1、含义

                        协方差表示两个字段之间的相关性,当协方差为0时,表示两个字段完全独立

                2、公式

                3、目标

                        利用协方差为0,选择另一组基,这组基的方向一定与第一组基正交。

        6)协方差矩阵

                假设我们有a,b两个字段,组成矩阵:X,用X乘以其转置,并乘以1/m:

        此时得到的即为协方差矩阵,可以发现,其对角线上的数据为方差,斜对角线上的数据为协方差,此时如果协方差的值为0,则表示两个字段完全独立。

        7)人为构建矩阵
               1、目标

                        除对角线上的元素外,其余的元素都为0,并且方差从大到小排列

               2、原始数据

                        X --> 协方差矩阵:C

                        一组基按行组成的矩阵:P

                        基变换后的数据:Y—>协方差矩阵:D

                        PX = Y (P为新的基,X为需要降维的数据,P为降维后的数据)

               3、含义

                        寻找一个矩阵P,满足PCP^{T}是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K列就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述条件。

                4、协方差矩阵对角化

        8)协方差矩阵C对角化
                1、公式

                2、实对称矩阵特性

                    实对称矩阵:矩阵的转置等于其本身,实对称矩阵必可对角化

                    对角化:除对角线外其余元素均为0

                3、最终目标

                        P是协方差矩阵C特征向量单位化按行排列出的矩阵,其中每一行都是C的一个特征向量

4、求解步骤

        1)将原始数据按列组成n行m列矩阵X;

        2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值

        3)求出协方差矩阵:C=\frac{1}{m}XX^{T}

        4)求出协方差矩阵的特征值及对应的特征向量;

        5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

        6)Y=PX即为降维到k维后的数据。

5、计算实例

        1)特征减去均值

        2)计算协方差矩阵

        3)计算协方差矩阵的特征值和特征向量

        4)矩阵P

        5)降维

三、参数解析

1、用法

PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)[source]

2、参数

        1)n_components:指定希望PCA降维后的特征维度数目

                指定整数,表示要降维到的目标,比如十维的数据,指定n_components=5,表示将十维数据降维到五维,如果为小数,表示累计方差百分比。

        2)copy :bool类型,默认为True。

                表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算

        3)whiten:判断是否进行白化。

                白化就是对降维后的数据的每个特征进行归一化,让方差都为1.默认值是False,即不进行白化。

        4)svd_solver:即指定奇异值分解SVD的方法

                由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。 full则是传统意义上的SVD,使用了scipy库对应的实现。arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。

3、属性

        components_:array, shape (n_components, n_features) 指表示主成分系数矩阵
        explained_variance_:降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。
        explained_variance_ratio_:降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。【一般看比例即可 >90%】

4、PCA对象方法

四、代码实现

1、完整代码

from sklearn.decomposition import PCA  # 导入PCA库
import pandas as pddata = pd.read_excel('hua.xlsx')
x = data.iloc[:,:-1]
y = data.iloc[:,-1]pca = PCA(n_components=0.9)  # 实例化PCA对象,特征维度数目为90%
pca.fit(x)   # 进行训练不需要传入yprint('特征所占百分比{}'.format(sum(pca.explained_variance_ratio_)))
print(pca.explained_variance_ratio_)print('PCA降维后数据:')
new_x = pca.transform(x)   # 将原始数据转换成新的维度的数据
print(new_x)   # 数据x在主成分空间中的表示,具体来说,这个方法将数据x从原始特征空间转换到主成分空间from sklearn.model_selection import train_test_split  # 导入切分库x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0)  # 对原始数据切分
# x_train,x_test,y_train,y_test = train_test_split(new_x,y,test_size=0.2,random_state=0)  # 对新维度的数据切分
# 导入逻辑回归分类器
from sklearn.linear_model import LogisticRegression  
classifier = LogisticRegression()
classifier.fit(x_train,y_train)  # 传入训练数据集# 训练集预测
train_predict = classifier.predict(x_train)
print(train_predict)# 测试集预测
test_predict = classifier.predict(x_test)
print(test_predict)from sklearn import metrics
print(metrics.classification_report(y_train,train_predict))
print(metrics.classification_report(y_test, test_predict))

2、运行结果

这篇关于《机器学习》PCA数据降维 推导、参数讲解、代码演示及分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141502

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni