沿用7-5中的测试数据,使用scikit-learn中的PCA

from sklearn.decomposition import PCA pca = PCA(n_components=1) pca.fit(X)

输入:pca.components_
输出:array([[-0.75366744, -0.65725595]])
这个轴与7-5中的计算结果是相反的。因为scikit-learn中不是什么梯度下降法而是什么数学方法计算的。
轴的方向相反不影响算法的结果

对比原始数据与降维再恢复后的数据

X_reduction = pca.transform(X) X_restore = pca.inverse_transform(X_reduction) plt.scatter(X[:, 0], X[:, 1], color='b', alpha=0.5) plt.scatter(X_restore[:, 0], X_restore[:, 1], color='r', alpha=0.5) plt.show()

使用真实数据测试PCA降维对效率和准确度的影响

真实数据

import numpy as np import matplotlib.pyplot as plt from sklearn import datasets digits = datasets.load_digits() X = digits.data y = digits.target from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

几种降维结果比较

PCA后的维数运行时间score
不降维82.9 ms0.9866666666666667
22.20.6066666666666667
281,05
时间更少了?
0.98

结论: 如果n_components选择合适,会大大减少训练时间而略微减少分类准确度,这样做是值得的。

选择合适的降维效果

确定新坐标系中每个维度保存了原数据的方差百分比

pca = PCA(n_components=X_train.shape[1]) pca.fit(X_train) pca.explained_variance_ratio_

输出结果:

plt.plot([i for i in range(X_train.shape[1])], [np.sum(pca.explained_variance_ratio_[:i+1]) for i in range(X_train.shape[1])]) plt.show()

输出结果:
这张图表示了前N个维度所占方差的百分比

保留原始数据95%的方差

pca = PCA(0.95) pca.fit(X_train) pca.explained_variance_ratio_

对原始数据降至2维的结果也有一定参考意义

pca = PCA(n_components=2) pca.fit(X) X_reduction = pca.transform(X) for i in range(10): plt.scatter(X_reduction[y==i, 0], X_reduction[y==i,1], alpha=0.8) plt.show()

假如只是要区分图中紫色的数据和红色的数据,降到2维就足够了