《机器学习》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

相关文章

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制