0 PCA与SVD
1 降维究竟是怎样实现?
2 重要参数n_components
import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.decomposition import PCA
iris = load_iris() y = iris.target X = iris.data #作为数组,X是几维? X.shape #作为数据表或特征矩阵,X是几维? import pandas as pd pd.DataFrame(X)
#调用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)
#要将三种鸢尾花的数据分布显示在二维平面坐标系中,对应的两个坐标(两个特征向量)应该是三种鸢尾花降维后的 x1和x2,怎样才能取出三种鸢尾花下不同的x1和x2呢? X_dr[y == 0, 0] #这里是布尔索引,看出来了么? #要展示三中分类的分布,需要对三种鸢尾花分别绘图 #可以写成三行代码,也可以写成for循环 """ 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()
#属性explained_variance_,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小) pca.explained_variance_ #属性explained_variance_ratio,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比 #又叫做可解释方差贡献率 pca.explained_variance_ratio_ #大部分信息都被有效地集中在了第一个特征上 pca.explained_variance_ratio_.sum()
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 ratio") plt.show()
pca_mle = PCA(n_components="mle") pca_mle = pca_mle.fit(X) X_mle = pca_mle.transform(X) X_mle #可以发现,mle为我们自动选择了3个特征 pca_mle.explained_variance_ratio_.sum() #得到了比设定2个特征时更高的信息含量,对于鸢尾花这个很小的数据集来说,3个特征对应这么高的信息含量,并不 需要去纠结于只保留2个特征,毕竟三个特征也可以可视化
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_