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

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模