1.1 概述主成分分析,是一种常用的数据分析手段,是图像处理中经常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据,经过PCA处理的数据中的各个样本之间的关系往往更直观,所以它是一种非常常用的数据分析和预处理工具。PCA处理之后的数据各个维度之间是线性无关的,通过剔除方差较小的那些维度上的数据,我们就可以达到数据降维的目的。 PCA从原始变量出发,通过旋转变化(原始变量的线性组合)构建出一组新的,互不相关的新变量,这些变量尽可能多的解释原始数据之间的差异性(数据内在的结构),他们就成为原始数据的主成分。由于这些变量不相关,因此他们无重叠的各自解释一部分差异性。依照每个变量解释时差异性大小排序,他们成为第一主成分,第二主成分,以此类推。 |
PCA算法流程1、按列计算数据集X的均值 2、求解矩阵 3、计算协方差矩阵 4、将特征值按照从大到小的排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵 5、计算 |
PCA优缺点优点1、它是无监督学习,完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。 2、用PCA技术可以对数据进行降维,同时对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。 3、各主成分之间正交,可消除原始数据成分间的相互影响。 |
缺点1、用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。 |
2、贡献率小的主成分往往可能含有对样本差异的重要信息。 3、特征值矩阵的正交向量空间是否唯一有待讨论。 4、特征值分解有一些局限性,比如变换的矩阵必须是方阵。 5、在非高斯分布的情况下,PCA方法得出的主元可能并不是最优的,此时在寻找主元时不能将方差作为衡量重要性的标准。 |
Python中鸢尾花数据(PCA)
1. import pandas as pd
2. import numpy as np
3. import matplotlib.pyplot as plt
4. from sklearn.decomposition import PCA
5. from sklearn.preprocessing import StandardScaler
6. from sklearn.datasets import load_iris
7. %matplotlib inline
8.
9. data = load_iris()
10. df1 = pd.DataFrame(data.data,columns=['sepal length', 'sepal width', 'petal length', 'petal width'])
11. df2 = pd.DataFrame(data.target,columns=["target"])
12. data = pd.concat([df1,df2],axis=1)
13. df = data.loc[:,'target'].to_frame()
14. data["target"] = df.replace({"target":{0:"Iris-setosa",1:"Iris-versicolor",2:"Iris-virginica"}})
15.
16. features = ['sepal length', 'sepal width', 'petal length', 'petal width']
17. # Separating out the features
18. x = data.loc[:, features].values
19. # Separating out the target
20. y = data.loc[:,['target']].values
21. # Standardizing the features
22. x = StandardScaler().fit_transform(x)
23.
24. # 查看标准化之后的数据
25. pd.DataFrame(data = x, columns = features)
26. #选择降维后的维数
27. pca = PCA(n_components=4)
28. principalComponents = pca.fit_transform(x)
29. pca.explained_variance_ratio_
30.
31. # 进行可视化
32. importance = pca.explained_variance_ratio_
33. plt.scatter(range(1,5),importance)
34. plt.plot(range(1,5),importance)
35. plt.title('Scree Plot')
36. plt.xlabel('Factors')
37. plt.ylabel('Eigenvalue')
38. plt.grid()
39. plt.show()
40.
41. # 进行降维
42. pca = PCA(n_components=2)
43. principalComponents = pca.fit_transform(x)
44. # 查看降维后的数据
45. principalDf = pd.DataFrame(data=principalComponents, columns=['principal component 1', 'principal component 2'])
46. finalDf = pd.concat([principalDf, data[['target']]], axis = 1)
47. finalDf
48.
49. # 对系数进行可视化
50. import seaborn as sns
51. df_cm = pd.DataFrame(np.abs(pca.components_), columns=data.columns[:-1])
52. plt.figure(figsize = (12,6))
53. ax = sns.heatmap(df_cm, annot=True, cmap="BuPu")
54. # 设置y轴的字体的大小
55. ax.yaxis.set_tick_params(labelsize=15)
56. ax.xaxis.set_tick_params(labelsize=15)
57. plt.title('PCA', fontsize='xx-large')
58. # Set y-axis label
59. #plt.savefig('factorAnalysis.png', dpi=200)
60.
61. fig = plt.figure(figsize = (8,8))
62. ax = fig.add_subplot(1,1,1)
63. ax.set_xlabel('Principal Component 1', fontsize = 15)
64. ax.set_ylabel('Principal Component 2', fontsize = 15)
65. ax.set_title('2 Component PCA', fontsize = 20)
66.
67.
68. targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
69. colors = ['r', 'g', 'b']
70. for target, color in zip(targets,colors):
71. indicesToKeep = finalDf['target'] == target
72. # 选择某个label下的数据进行绘制
73. ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1']
74. , finalDf.loc[indicesToKeep, 'principal component 2']
75. , c = color
76. , s = 50)
77. ax.legend(targets)
78. ax.grid()