【skLearn 降维算法】PCA

网友投稿 288 2022-08-25

【skLearn 降维算法】PCA

文章目录

​​降维算法 PCA​​

​​一、数据维度概念​​​​二、skLearn中的降维算法​​​​三、PCA与SVD​​

​​① 降维的实现步骤解析​​​​② 重要参数n_components​​

​​• 累积可解释方差贡献率曲线​​​​• 最大似然估计自选超参数​​​​• 按信息量占比选超参数​​

​​③ 重要参数 svd_solver​​​​④ 重要属性 components_​​

​​• 迷你案例:人脸识别应用​​

​​可视化faces.images数据集​​​​PCA降维处理faces.data数据集​​

​​⑤ 重要接口inverse_transform​​

​​• 迷你案例:用人脸识别看PCA降维后的信息保存量​​​​• 迷你案例:PCA 手写数字数据集噪音过滤​​

​​⑥ 重要接口、参数、属性总结​​

降维算法 PCA

一、数据维度概念

对于数组和Series来说,​​维度就是功能shape返回的结果​​,shape中返回了几个数字,就是几维。索引以外的数据,不分行列的叫一维(此时shape返回唯一的维度上的数据个数),有行列之分叫二维(shape返回行x列),也称为表。一张表最多二维,复数的表构成了更高的维度。当一个数组中存在2张3行4列的表时,shape返回的是(更高维,行,列)。当数组中存在2组2张3行4列的表时,数据就是4维,shape返回(2,2,3,4)。

数组中的每一张表,都可以是一个​​特征矩阵​​或一个​​DataFrame​​,这些结构永远只有一张表,所以一定有行列,其中行是样本,列是特征。针对每一张表,​​维度指的是样本的数量或特征的数量​​,​​一般无特别说明,指的都是特征的数量​​。除了索引之外,一个特征是一维,两个特征是二维,n个特征是n维。

对图像来说,​​维度就是图像中特征向量的数量​​。特征向量可以理解为是坐标轴,一个特征向量定义一条直线,是一维,两个相互垂直的特征向量定义一个平面,即一个直角坐标系,就是二维,三个相互垂直的特征向量定义一个空间,即一个立体直角坐标系,就是三维。三个以上的特征向量相互垂直,定义人眼无法看见,也无法想象的高维空间。

降维算法中的”降维“,指的是降低特征矩阵中特征的数量。降维的目的是​​为了让算法运算更快,效果更好​​,但其实还有另一种需求:​​数据可视化​​。从上面的图我们其实可以看得出,图像和特征矩阵的维度是可以相互对应的,即一个特征对应一个特征向量,对应一条坐标轴。所以,三维及以下的特征矩阵,是可以被可视化的,这可以帮助我们很快地理解数据的分布,而三维以上特征矩阵的则不能被可视化,数据的性质也就比较难理解。

​​返回顶部​​

二、skLearn中的降维算法

三、PCA与SVD

在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响。同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或者有一些特征带有的信息和其他一些特征是重复的(比如一些特征可能会线性相关)。我们希望能够找出一种办法来帮助我们衡量特征上所带的信息量,让我们在降维的过程中,能够即减少特征的数量,又保留大部分有效信息——​​将那些带有重复信息的特征合并,并删除那些带无效信息的特征等等​​——逐渐创造出能够代表原特征矩阵大部分信息的,特征更少的,新特征矩阵。

之前学习过一种重要的特征选择方法:​​方差过滤​​。如果一个特征的方差很小,则意味着这个特征上很可能有大量取值都相同(比如90%都是1,只有10%是0,甚至100%是1),那这一个特征的取值对样本而言就没有区分度,这种特征就不带有有效信息。从方差的这种应用就可以推断出,如果一个特征的方差很大,则说明这个特征上带有大量的信息。因此,在降维中,PCA使用的信息量衡量指标,就是样本方差,又称可解释性方差,方差越大,特征所带的信息量越多。

​​Var​​代表一个特征的方差,​​n​​代表样本量,​​xi​​代表一个特征中的每个样本取值,​​xhat​​代表这一列样本的均值。​​计算中,为什么样本方差里面要除以(n-1)而不是n?​​

① 降维的实现步骤解析

class sklearn.decomposition.PCA (n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

PCA作为矩阵分解算法的核心算法,其实没有太多参数,但是每个参数的意义和运用都很难,因为几乎每个参数都涉及到高深的数学原理。为了参数的运用和意义变得明朗,我们来看一组简单的二维数据的降维:

我们现在有一组简单的数据,有特征​​x1​​和​​x2​​,三个样本数据的坐标点分别为​​(1,1),(2,2),(3,3)​​。我们可以让​​x1​​和​​x2​​分别作为两个特征向量,很轻松地用一个二维平面来描述这组数据。这组数据现在每个特征的均值都为2,方差则等于:

每个特征的数据一模一样,因此方差也都为1,数据的方差总和是2。

此时,我们根据信息含量的排序,取信息含量最大的一个特征,因为我们想要的是一维数据。所以我们可以将​​x2'​​删除,同时也删除图中的​​x2'​​特征向量,剩下的​​x1'​​就代表了曾经需要两个特征来代表的三个样本点。通过旋转原有特征向量组成的坐标轴来找到新特征向量和新坐标平面,我们将三个样本点的信息压缩到了一条直线上,实现了二维变一维,并且尽量保留原始数据的信息。一个成功的降维,就实现了。

过程

二维特征矩阵

n维特征矩阵

1

输入原数据,结构为 (3,2)

找出原本的2个特征对应的直角坐标系,

本质是找出这2个特征构成的2维平面

输入原数据,结构为 (m,n)

找出原本的n个特征向量构成的n维空间

2

决定降维后的特征数量:1

决定降维后的特征数量:k

3

旋转,找出一个新坐标系

本质是找出2个新的特征向量,以及它们构成

的新2维平面

新特征向量让数据能够被压缩到少数特征上,并且总信息量不损失太多

通过某种变化,找出n个新的特征向量,以及它们

构成的新n维空间

4

找出数据点在新坐标系上,2个新坐标轴上的

坐标

找出原始数据在新特征空间V中的n个新特征向量上

对应的值,即“将数据映射到新空间中”

5

选取第1个方差最大的特征向量,删掉没有被

选中的特征,成功将2维平面降为1维

选取前k个信息量最大的特征,删掉没有被选中的

特征,成功将n维空间V降为k维

在步骤3当中,我们用来找出n个新特征向量,让数据能够被压缩到少数特征上并且总信息量不损失太多的技术就是矩阵分解。PCA和SVD是两种不同的降维算法,但他们都遵从上面的过程来实现降维,只是两种算法中矩阵分解的方法不同,信息量的衡量指标不同罢了。

在数学原理中,无论是PCA和SVD都需要遍历所有的特征和样本来计算信息量指标。并且在矩阵分解的过程之中,会产生比原来的特征矩阵更大的矩阵,比如原数据的结构是(m,n),在矩阵分解中为了找出最佳新特征空间V,可能需要产生(n,n),(m,m)大小的矩阵,还需要产生协方差矩阵去计算更多的信息,所以降维算法过程计算量大,有时会很缓慢。

降维和特征选择都是特征工程技术,它们有什么不同?特征工程中有三种方式:特征提取,特征创造和特征选择。​​特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,我们依然知道这个特征在原数据的哪个位置,代表着原数据上的什么含义​​。而​​降维算法,是将已存在的特征进行压缩,降维完毕后的特征不是原本的特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征​​。通常来说,在新的特征矩阵生成之前,我们无法知晓降维算法们都建立了怎样的新特征向量,新特征矩阵生成之后也不具有可读性,我们无法判断新特征矩阵的特征是从原数据中的什么特征组合而来,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。降维算法因此是特征创造(feature creation,或feature construction)的一种。可以想见,PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归),因为无法解释的新特征和标签之间的关系不具有意义。在线性回归模型中,我们使用特征选择。

​​返回顶部​​

② 重要参数n_components

​​n_components​​是我们降维后需要的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的k值,一般输入[0, min(X.shape)]范围中的整数。一说到K,大家可能都会想到,类似于KNN中的K和随机森林中的​​n_estimators​​,这是一个需要我们人为去确认的超参数,并且我们设定的数字会影响到模型的表现。如果留下的特征太多,就达不到降维的效果,如果留下的特征太少,那新特征向量可能无法容纳原始数据集中的大部分信息,因此,n_components既不能太大也不能太小。

可以先从我们的降维目标说起:如果我们希望可视化一组数据来观察数据分布,我们往往将数据降到三维以下,很多时候是二维,即​​n_components​​的取值为​​2​​。

# 导库import numpy as npimport pandas as pdfrom matplotlib import pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.decomposition import PCA# 提取数据集iris = load_iris()x = pd.DataFrame(iris.data) # 二维数组 --- 四维特征矩阵y = iris.target# 训练模型获取降维结果result = PCA(n_components=2).fit_transform(x)# 可视化plt.figure(figsize=(10,6))plt.scatter(result[y==0,0],result[y==0,1],color='red',label=iris.target_names[0])plt.scatter(result[y==1,0],result[y==1,1],color='yellow',label=iris.target_names[1])plt.scatter(result[y==2,0],result[y==2,1],color='blue',label=iris.target_names[2])plt.legend()plt.title("PCA of IRIS Dataset",color="white")plt.tick_params(axis="x",colors="white")plt.tick_params(axis="y",colors="white")plt.show(

鸢尾花的分布被展现在我们眼前了,明显这是一个分簇的分布,并且每个簇之间的分布相对比较明显,也许​​versicolor​​和​​virginia​​这两种花之间会有一些分类错误,但​​setosa​​肯定不会被分错。这样的数据很容易分类,可以遇见,​​KNN​​,​​随机森林​​,​​神经网络​​,​​朴素贝叶斯​​,​​Adaboost​​这些分类器在鸢尾花数据集上,未调整的时候都可以有​​95%​​上下的准确率。

探索降维后的数据:

# 探索降维后的数据pca = PCA(n_components=2).fit(x)#属性explained_variance,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)explained = pca.explained_variance_print("降维后每个新特征向量上所带的信息量大小:\n",explained)#属性explained_variance_ratio,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比#又叫做可解释方差贡献率explained_ratio = pca.explained_variance_ratio_print("降维后每个新特征向量所占的信息量占原始数据总信息量的百分比:\n",explained_ratio)降维后每个新特征向量上所带的信息量大小: [4.22824171 0.24267075]降维后每个新特征向量所占的信息量占原始数据总信息量的百分比: [0.92461872 0.05306648]

​​返回顶部​​

• 累积可解释方差贡献率曲线

当参数​​n_components​​中不填写任何值,则默认返回​​min(X.shape)​​个特征,一般来说,样本量都会大于特征数目,所以什么都不填就相当于转换了新特征空间,但没有减少特征的个数。一般来说,不会使用这种输入方式。但我们却可以使用这种输入方式来画出累计可解释方差贡献率曲线,以此选择最好的​​n_components​​的整数取值。

# n_components采用默认值,选取min(x.shape)pca = PCA().fit(x)explained_ratio = pca.explained_variance_ratio_print("降维后每个新特征向量所占的信息量占原始数据总信息量的百分比:\n",explained_ratio)降维后每个新特征向量所占的信息量占原始数据总信息量的百分比: [0.92461872 0.05306648 0.01710261 0.00521218]

累积可解释方差贡献率曲线是一条以降维后保留的特征个数为横坐标,降维后新特征矩阵捕捉到的可解释方差贡献率为纵坐标的曲线,能够帮助我们决定n_components最好的取值。

# 使用np.cumsum()对可解释方差贡献率进行累加np.cumsum(explained_ratio)array([0.92461872, 0.97768521, 0.99478782, 1. ])

可视化:

# 可视化累计可解释方差贡献率曲线pca_line = PCA().fit(x)plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))plt.xticks([1,2,3,4])plt.xlabel("number of components after dimension reduction",color="white")plt.ylabel("cumulative explained variance",color="white")plt.tick_params(axis="x",colors="white")plt.tick_params(axis="y",colors="white")plt.show()

​​返回顶部​​

• 最大似然估计自选超参数

除了输入整数,n_components还有哪些选择呢?之前我们提到过,矩阵分解的理论发展在业界独树一帜,勤奋智慧的数学大神​​Minka, T.P.​​在麻省理工学院媒体实验室做研究时找出了让PCA用最大似然估计(maximum likelihood estimation)自选超参数的方法,输入“​​mle​​”作为​​n_components​​的参数输入,就可以调用这种方法 。

pca_mle = PCA(n_components="mle").fit(x)result = pca_mle.transform(x)print("降维后的数据形状是:\n",result.shape)print("累计可解释方差贡献率为:\n",pca_mle.explained_variance_ratio_.sum())降维后的数据形状是: (150, 3)累计可解释方差贡献率为: 0.9947878161267246

通过结果可以发现,利用最大似然估计自选的超参数值为3,再结合累计可解释方差贡献率曲线来看,在​​n_compnotallow=3​​的时候,三个特征所包含的整体信息量较为可观。

​​返回顶部​​

• 按信息量占比选超参数

输入​​[0,1]​​之间的浮点数,并且让参数​​svd_solver = "full'​​,表示希望降维后的总解释性方差占比大于​​n_components​​指定的百分比,即是说,希望保留百分之多少的信息量。比如说,如果我们希望保留​​97%​​的信息量,就可以输入​​n_components = 0.97​​,PCA会自动选出能够让保留的信息量超过97%的特征数量。

pca_f = PCA(n_components=0.97,svd_solver="full")pca_f = pca_f.fit(x)X_f = pca_f.transform(x)pca_f.explained_variance_ratio_array([0.92461872, 0.05306648])

​​返回顶部​​

③ 重要参数 svd_solver

细心的小伙伴可能注意到了,​​svd_solver​​是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?

简而言之,SVD在矩阵分解中的过程比PCA简单快速,虽然两个算法都走一样的分解流程,但SVD可以作弊耍赖。但是遗憾的是,SVD的信息量衡量指标比较复杂,要理解”奇异值“远不如理解”方差“来得容易,因此,sklearn将降维流程拆成了两部分:一部分是计算特征空间V,由奇异值分解完成,另一部分是映射数据和求解新特征矩阵,由主成分分析完成,实现了用SVD的性质减少计算量,却让信息量的评估指标是方差,具体流程如下图:

但在 sklearn中,矩阵U和Σ虽然会被计算出来(同样也是一种比起PCA来说简化非常多的数学过程,不产生协方差矩阵),但完全不会被用到,也无法调取查看或者使用,因此我们可以认为,u和在fit过后就被遗弃了。奇异值分解追求的仅仅是V,只要有了V,就可以计算出降维后的特征矩阵。在 transform过程之后,fit中奇异值分解的结果除了V(kn)以外,就会被舍弃,而v(n)会被保存在属性​​components_​​当中,可以调用查看。

重要参数 svd_solver 的取值:参数svd_solver是在降维过程中,用来控制矩阵分解的一些细节的参数。有四种模式可选:​​"auto"​​,​​"ful"​​,​​"arpack"​​,​​"randomized"​​,默认"auto"。

而参数 ​​random_state​​在参数​​svd_solver​​的值为"​​arpack​​“or”​​randomized​​"的时候生效可以控制这两种SVD模式中的随机模式。通常我们就选用​​auto​​。

​​返回顶部​​

④ 重要属性 components_

现在我们了解了,​​V(k,n)​​是新特征空间,是我们要将原始数据进行映射的那些新特征向量组成的矩阵。我们用它来计算新的特征矩阵,但我们希望获取的毕竟是​​X_dr​​,为什么我们要把V(k,n)这个矩阵保存在n_components这个属性当中来让大家调取查看呢?

我们之前谈到过PCA与特征选择的区别,即特征选择后的特征矩阵是可解读的,而PCA降维后的特征矩阵式不可解读的:PCA是将已存在的特征进行压缩,降维完毕后的特征不是原本的特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。通常来说,在新的特征矩阵生成之前,我们无法知晓PCA都建立了怎样的新特征向量,特征矩阵生成之后也不具有可读性,我们无法判断新特征矩阵的特征是从原数据中的什么特征组合而来,新特征然带有原始数据的信息,却已经不是原数据上代表着的含义了。

但是其实,在矩阵分解时,PCA是有目标的:​​在原有特征的基础上,找出能够让信息尽量聚集的新特征向量​​。在sklearn使用的PCA和SVD联合的降维方法中,这些新特征向量组成的新特征空间其实就是V(k,n)。当V(k,n)是数字时,我们无法判断V(k,n)和原有的特征究竟有着怎样千丝万缕的数学联系。但是,如果原特征矩阵是图像,V(k,n)这个空间矩阵也可以被可视化的话,我们就可以通过两张图来比较,就可以看出新特征空间究竟从原始数据里提取了什么重要的信息。

• 迷你案例:人脸识别应用

# 导库from sklearn.datasets import fetch_lfw_peoplefrom sklearn.decomposition import PCAfrom matplotlib import pyplot as pltimport numpy as np# 加载数据集# 在数据集中每个人取出60张面部照片faces = fetch_lfw_people(min_faces_per_person=60){'data': array([[138. , 135.66667 , 127.666664 , ..., 1.6666666 , 1.6666666 , 0.33333334], [ 71.333336 , 56. , 67.666664 , ..., 247.66667 , 243. , 238.33333 ], [ 84.333336 , 97.333336 , 72.333336 , ..., 114. , 194.33333 , 241. ], ..., [ 29.333334 , 29. , 29.333334 , ..., 145. , 147. , 141.66667 ], [ 49.333332 , 55.666668 , 76.666664 , ..., 186.33333 , 176.33333 , 161. ], [ 31. , 26.333334 , 28. , ..., 34. , 42. , 69.666664 ]], dtype=float32), 'images': array([[[138. , 135.66667 , 127.666664 , ..., 69. , 68.333336 , 67.333336 ], [146. , 139.33333 , 125. , ..., 68.333336 , 67.666664 , 67.333336 ], [150. , 138.33333 , 124.333336 , ..., 68.333336 , 67.666664 , 66.666664 ], ..., ............................ ..., [ 44.666668 , 42.666668 , 44.666668 , ..., 22.333334 , 25.333334 , 46.333332 ], [ 42.333332 , 42.333332 , 45. , ..., 25.333334 , 32.666668 , 49.666668 ], [ 46. , 49.333332 , 51.666668 , ..., 34. , 42. , 69.666664 ]]], dtype=float32), 'target': array([1, 3, 3, ..., 7, 3, 5], dtype=int64), 'target_names': array(['Ariel Sharon', 'Colin Powell', 'Donald Rumsfeld', 'George W Bush', 'Gerhard Schroeder', 'Hugo Chavez', 'Junichiro Koizumi', 'Tony Blair'], dtype='

从数据集中可以看出,包含了七个人的面部图像信息​​data​​以及​​images​​。

faces.images.shape(1348, 62, 47)# 1348 是矩阵中图像的个数# 62 是每个图像的特征矩阵的行数# 47 是每个图像的特征矩阵的列数

​​返回顶部​​

可视化faces.images数据集

我们通过绘制子图的形式先展示出数据的基本样式,绘制一幅包含有20个子图的图片,展示出每张图片的信息。

fig,axes = plt.subplots(4,5 # 总共的子图数:行、列 ,figsize=(20,10) # 总图的大小 ,subplot_kw = {"xticks":[],"yticks":[]} # 不显示每张子图的坐标 )axes[0][0].imshow(faces.images[0,:,:])

通过遍历展示前20条人脸数据:

通过​​imshow()​​中的​​cmap参数​​可以控制生成图片的颜色。​​Matplotlib颜色选取网站:= faces.data # 提取二维数据pca = PCA(150).fit(x) # 实例化PCA降维v = pca.components_print("PCA降维后的新特征矩阵维度为:\n",v.shape)PCA降维后的新特征矩阵维度为: (150, 2914)

可视化降维后的数据:由于降维只改变了数据的特征维度,基本的结构没有改变,所以每张图片的信息依然可以拆解为​​62x47​​的特征矩阵进行可视化。

fig,axes = plt.subplots(3,8 # 总共的子图数:行、列 ,figsize=(20,10) # 总图的大小 ,subplot_kw = {"xticks":[],"yticks":[]} # 不显示每张子图的坐标 )k = 0 for i in range(3): for j in range(8): axes[i][j].imshow(v[k,:].reshape(62,47),cmap="gray") k=k+1

这张图稍稍有一些恐怖,但可以看出,比起降维前的数据,新特征空间可视化后的人脸非常模糊,这是因为原始数据还没有被映射到特征空间中。但是可以看出整体比较亮的图片,获取的信息较多,整体比较暗的图片,却只能看见黑漆漆的一块。在比较亮的图片中,眼睛,鼻子,嘴巴,都相对清晰,脸的轮廓,头发之类的比较模糊。

这说明,新特征空间里的特征向量们,大部分是"五官"和"亮度"相关的向量,所以新特征向量上的信息肯定大部分是由原数据中和"五官"和"亮度"相关的特征中提取出来的。到这里,我们通过可视化新特征空间V,解释了一部分降维后的特征:虽然显示出来的数字看着不知所云,但画出来的图表示,这些特征是和"五官"以及"亮度"有关的。这也再次证明了,​​PCA能够将原始数据集中重要的数据进行聚集​​。

​​返回顶部​​

⑤ 重要接口inverse_transform

• 迷你案例:用人脸识别看PCA降维后的信息保存量

人脸识别是最容易的,用来探索 inverse_ transform功能的数据。我们先调用一组人脸数据​​X(m,n)​​,对人脸图像进行绘制,然后我们对人脸数据进行降维得到​​x_dr​​,之后再使用​​inverse_transform(x_dr)​​返回一个​​inverse(m,n)​​并对这个新矩阵中的人脸图像也进行绘制。如果PCA的降维过程是可逆的,我们应当期待​​X(m,n)​​和​​inverse(m,n)​​返回一模一样的图像,即携带一模一样的信息。

fig,axes = plt.subplots(2,10 ,figsize=(20,5) ,subplot_kw={"xticks":[],"yticks":[]} )for j in range(10): axes[0,j].imshow(faces.images[j,:,:],cmap="binary_r") # 原始数据 axes[1,j].imshow(x_inverse[j].reshape(62,47),cmap="binary_r") # 降维逆转数据

可以明显看出,这两组数据可视化后,由降维后再通过 ​​inverse_transform​​转换回原维度的数据画出的图像和原数据画的图像大致相似,但原数据的图像明显更加清晰。这说明:inverse_transform并没有实现数据的完全逆转。

这是因为,在降维的时候,部分信息已经被舍弃了,x_dr中往往不会包含原数据100%的信息,所以在逆转的时候,即便维度升高,原数据中已经被舍弃的信息也不可能再回来了。所以,降维不是完全可逆的。​​Inverse_transform​​的功能,是基于​​x_dr​​中的数据进行升维,将数据重新映射到原数据所在的特征空间中,而并非恢复所有原有的数据。但同时,我们也可以看出,降维到​​150​​以后的数据,的确保留了原数据的大部分信息,所以图像看起来,才会和原数据高度相似,只是稍稍模糊罢了。

​​返回顶部​​

• 迷你案例:PCA 手写数字数据集噪音过滤

降维的目的之一就是希望希望抛弃掉对模型带来负面影响的特征,而我们相信,带有效信息的特征方差应该是远远大于噪音的,所以相比噪音,有效的特征所带的信息不会应该不会在PCA过程中被大量抛弃。​​inverse_transform​​能够在不恢复原始数据的情况下,将降维后的数据返回到原本的高维空间,即是说能够实现"​​保证维度但去掉方差很小特征所带的信息​​"。利用 ​​inverse_transform​​的这个性质,我们能够实现噪音过滤。

# 导库from sklearn.datasets import load_digitsfrom sklearn.decomposition import PCAfrom matplotlib import pyplot as pltimport numpy as np# 加载数据集digits = load_digits()x = digits.dataprint("手写数字数据集的data的形状:\n",digits.data.shape)print("手写数字数据集的images的形状:\n",digits.images.shape)手写数字数据集的data的形状: (1797, 64)手写数字数据集的images的形状: (1797, 8, 8)# 数据集可视化fig, axes = plt.subplots(4, 10, figsize=(20, 8), subplot_kw={ "xticks": [], "yticks": [] })k = 0 # 控制从原始数据中提取的数据索引for i in range(4): for j in range(10): axes[i][j].imshow(x[k].reshape(8, 8), cmap="binary") k = k+1

进行人为添加噪音,再次绘制:

# 人为添加噪音rng = np.random.RandomState(42)# 在指定的数据集中,随机抽取服从正态分布的数据# 两个参数:指定的数据集、抽取出来的正态分布的方差noisy = rng.normal(digits.data,2)# 数据集可视化fig, axes = plt.subplots(4, 10, figsize=(20, 8), subplot_kw={ "xticks": [], "yticks": [] })k = 0 # 控制从原始数据中提取的数据索引for i in range(4): for j in range(10): axes[i][j].imshow(noisy[k].reshape(8, 8), cmap="binary") k = k+1

进行降维逆转(降噪)处理后,可视化:

# 降维处理 pca = PCA(0.5,svd_solver="full").fit(noisy)x_dr = pca.transform(noisy)print("保留50%数据信息量降维后的数据形状为:\n",x_dr.shape)保留50%数据信息量降维后的数据形状为: (1797, 6)# 逆转降处理without_noisy = pca.inverse_transform(x_dr)# 可视化# 数据集可视化fig, axes = plt.subplots(4, 10, figsize=(20, 8), subplot_kw={ "xticks": [], "yticks": [] })k = 0 # 控制从原始数据中提取的数据索引for i in range(4): for j in range(10): axes[i][j].imshow(without_noisy[k].reshape(8, 8), cmap="binary") k = k+1

​​返回顶部​​

⑥ 重要接口、参数、属性总结

到这里,我们已经完成了对PCA的学习。我们学习了重要参数参数​​n_components​​,​​svd_solver​​, ​​random_state​​;学习了三个重要属性: ​​components_​​, ​​explained_variance​​以及​​explained_variance_ratio​​,无数次用到了接口​​fit​​,​​transform​​, ​​fit_transform​​,还讲解了与众不同的重要接口 ​​inverse_transform​​所有的这些内容都可以被总结在这张图中:

​​返回顶部​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Spring Boot】构建后台管理系统
下一篇:裂变营销方案,裂变营销成功案例!(100个裂变营销案例)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~