目录
1)n_components:指定希望PCA降维后的特征维度数目
一、主成分分析
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),而应该表示为( , )
此时新的基底的一组基则表示为( , ),( , ),如下图所示
此时坐标虽然变了,但是模没变,长度还是原来的长度,但是表达方式改变了
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,满足是一个对角矩阵,并且对角元素按从大到小依次排列,那么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)求出协方差矩阵:
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 pd
data = pd.read_excel('hua.xlsx')
x = data.iloc[:,:-1]
y = data.iloc[:,-1]
pca = PCA(n_components=0.9) # 实例化PCA对象,特征维度数目为90%
pca.fit(x) # 进行训练不需要传入y
print('特征所占百分比{}'.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))