沿用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维就足够了