《机器学习》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大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时