注:PCA算法流程,此处不做介绍。
Scikit中KMeans的参数说明:
class sklearn.decomposition.PCA (n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0,iterated_power=’auto’, random_state=None)
具体参数可以参考:网站
https://www.w3cschool.cn/doc_scikit_learn/scikit_learn-modules-generated-sklearn-decomposition-pca.html?lang=en#sklearn.decomposition.PCA
- 对于参数
n_components
:是我们降维后需要的维度,即降维后需要保留的特征数量,一般输入[0, min(X.shape)]范围中的整数。如果留下的特征太多,就达不到降维的效果,如果留下的特征太少,那新特征向量可能无法容纳原始数据集中的大部分信息。
用PCA降维
-
问题:将鸢尾花数据集从原来的4维数据降成可以被可视化的二维数据。
-
编程:
- 1.调用库和模块
# 1. 调用库和模块 import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.decomposition import PCA
- 2.提取数据集
# 2. 提取数据集 iris = load_iris() # 加载鸢尾花数据集 y = iris.target # 获取标签 ,150个样本,每个样本一个标签 X = iris.data # 获取样本特征,150个样本*4维特征 #作为数组,X是几维? print(y.shape) print(X.shape) #作为数据表或特征矩阵,X是几维? import pandas as pd pd.DataFrame(X)
- 3.建模
#调用PCA pca = PCA(n_components=2) #实例化 pca = pca.fit(X) #拟合模型 X_dr = pca.transform(X) #获取新矩阵 X_dr #也可以fit_transform一步到位 #X_dr = PCA(2).fit_transform(X)
- 4.可视化
# 要将三种鸢尾花的数据分布显示在二维平面坐标系中,对应的两个坐标(两个特征向量)应该是三种鸢尾花降维后的x1和x2,怎样才能取出三种鸢尾花下不同的x1和x2呢? # X_dr[y == 0, 0] #这里是布尔索引,看出来了么? # 可视化方法一 # 要展示三中分类的分布,需要对三种鸢尾花分别绘图 """ plt.figure() plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0]) plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1]) plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2]) plt.legend() plt.title('PCA of IRIS dataset') plt.show() """ # 可视化方法二 colors = ['red', 'black', 'orange'] # iris.target_names # 查看鸢尾花的标签意义 plt.figure() for i in [0, 1, 2]: plt.scatter(X_dr[y == i, 0] ,X_dr[y == i, 1] ,alpha=.7 # 颜色透明度 ,c=colors[i] ,label=iris.target_names[i] ) plt.legend() # 显示图例 plt.title('PCA of IRIS dataset') # 设置标题 plt.show()
- 1.调用库和模块
探索降维后的数据
pca.explained_variance_
上图可以看出,降维后的第一维数据携带的信息量大于第二维数据。pca.explained_variance_ratio_
上图可以看出,大部分信息都被有效地集中在了第一个特征上。pca.explained_variance_ratio_.sum()
上图可以看出,特征信息保留了97.9685%, 所以在降维过程中信息丢失的不是特别严重。
选择最好的n_components:累积可解释方差贡献率曲线
- 当参数components中不填写任何值,则默认返回min(X.shape)个特征,一般来说,样本量都会大于特征数目,所以什么都不填就相当于转换了新特征空间,但没有减少特征的个数。一般来说,不会使用这种输入方式。但我们却可以使用这种输入方式来画出累计可解释方差贡献率曲线,以此选择最好的n_components的整数取值。
- 累积可解释方差贡献率曲线是一条以降维后保留的特征个数为横坐标,降维后新特征矩阵捕捉到的可解释方差贡献率为纵坐标的曲线,能够帮助我们决定n_components最好的取值。
import numpy as np
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")
plt.ylabel("cumulative explained variance")
plt.show()
上图可以看出,将鸢尾花数据集降成一维数据后,信息保留度为92.5%左右,但是降成二维,就可以保留到97%以上的信息。在实际选取n_components值时,应该选择曲线突然变缓的那个点(或者说是信息保留度不再明显发生变化的点)。