主成分分析法

  • 一个非监督学习的算法
  • 主要用于数据的降维
  • 通过降维,可以发现更便于人类理解的特征
  • 其他应用:可视化( 多维变成2维);去噪音(我们降维后丢失的信息可能很大一部分是噪音)

尽量使点与点之间距离最大,也就是最还原原来点与点之间状态距离
如何定义样本间的距离?使用方差,方差是用来描述样本整体分布疏密的指标,方差越大说明样本间越稀疏,越小说明越紧密,所以我们需要找一根线,样本点映射到这根线时,方差最大。

方差公式:Principal Component Analysis - 图1

第一步,需要将样本的均值归零(demean),也就是所有样本减去样本均值。
Principal Component Analysis - 图2
Principal Component Analysis - 图3
Principal Component Analysis - 图4

此时image.pngimage.png因为均值归零,公式简化成图中所示

主成分分析法主要使用梯度上升法来(sklearn使用数学的方法),使得样本保留的方差(目标函数)最大。

p7.9 人脸识别,太困了,先不看了

sklearn使用PCA

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from numpy.testing._private.utils import KnownFailureException
  4. from sklearn import datasets
  5. from sklearn.datasets import load_digits
  6. from sklearn.model_selection import train_test_split
  7. from sklearn.neighbors import KNeighborsClassifier
  8. from sklearn.decomposition import PCA
  9. digits = load_digits()
  10. X = digits.data
  11. y = digits.target
  12. X_train, X_test, y_train,y_test = train_test_split(X, y, random_state=666)
  13. print(X_train.shape)
  14. '''使用原始数据分类并测试'''
  15. knn_clf = KNeighborsClassifier()
  16. knn_clf.fit(X_train, y_train)
  17. print(knn_clf.score(X_test,y_test)) # out:0.98
  18. '''降维到2维'''
  19. pca = PCA(n_components=2)
  20. pca.fit(X_train)
  21. X_train_reduction = pca.transform(X_train)
  22. X_test_reduction = pca.transform(X_test)
  23. '''使用降维后的数据分类并测试'''
  24. knn_clf = KNeighborsClassifier()
  25. knn_clf.fit(X_train_reduction,y_train)
  26. print(knn_clf.score(X_test_reduction, y_test)) # out:0.60
  27. '''explained_variance_ratio_ 指标,会输出pac指定主成分个数后,每个主成分可以解释多少原数据的方差,\
  28. (并从大到小排列),因为PCA寻找主成分就是找使得原来的数据方差维持的最大'''
  29. pca.explained_variance_ratio_
  30. pca = PCA(n_components=X_train.shape[1]) # 有多少列就输出多少主成分
  31. pca.fit(X_train)
  32. pca.explained_variance_ratio_ # 这样就可以看到每一个主成分可以解释的原来的数据的方差
  33. '''绘制按大小排列的主成分代表的最大方差和与主成分数量的关系'''
  34. plt.plot([i for i in range(X_train.shape[1])],
  35. [np.sum(pca.explained_variance_ratio_[:i+1]) for i in range(X_train.shape[1])]) # 从0开始,所以要加1
  36. plt.show()
  37. '''保持解释原数据集95%方差'''
  38. pca = PCA(0.95)
  39. pca.fit(X_train)
  40. pca.n_components_ # 输出pca后有多少维度数据
  41. '''使用0.95 pca后的数据集测试分数'''
  42. X_train_reduction = pca.transform(X_train)
  43. X_test_reduction = pca.transform(X_test)
  44. knn_clf = KNeighborsClassifier()
  45. knn_clf.fit(X_train_reduction)
  46. print(knn_clf.score(X_test_reduction, y_test)) # out: 0.9799