转载请注明出处:https://editor.csdn.net/md?articleId=104839136
主成分分析(Principal components analysis,以下简称PCA)的思想是将n维特征映射到k维上(k<n),这k维是全新的正交特征(新的坐标系)。这k维特征称为主元,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。实现这思想的方法就是降维,用低维的数据去代表高维的数据,也就是用少数几个变量代替原有的数目庞大的变量,把重复的信息合并起来,既可以降低现有变量的维度,又不会丢失重要信息的思想。
关于降维的原理和推导过程在这里就不在赘述了,可以参考本文后面提供的参考资料。
这里主要针对用Sklearn库里的PCA,并解释里面的参数、属性、方法。
Sklearn库中PCA 一、参数说明(Parameters)sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
1. n_components:int, float, None or str
意义 :代表返回的主成分的个数,也就是你想把数据降到几维
n_components=2 代表返回前2个主成分
0 < n_components < 1代表满足最低的主成分方差累计贡献率
n_components=0.98,指返回满足主成分方差累计贡献率达到98%的主成分
n_components=None,返回所有主成分
n_components=‘mle’,将自动选取主成分个数n,使得满足所要求的方差百分比
2. copy : bool类型, False/True 默认是True
意义:在运行的过程中,是否将原数据复制。由于你在运行的过程中,是在降维,数据会变动。
这copy主要影响的是,调用显示降维后的数据的方法不同。
copy=True时,直接 fit_transform(X),就能够显示出降维后的数据。
copy=False时,需要 fit(X).transform(X) ,才能够显示出降维后的数据。
(fit_transform()方法后面会讲到!)
3. whiten:bool类型,False/True 默认是False
意义:白化。白化是一种重要的预处理过程,其目的就是降低输入数据的冗余性,使得经过白化处理的输入数据具有如下性质:(i)特征之间相关性较低;(ii)所有特征具有相同的方差。
4. svd_solver:str类型,str {‘auto’, ‘full’, ‘arpack’, ‘randomized’}
意义:定奇异值分解 SVD 的方法。
svd_solver=auto:PCA 类自动选择下述三种算法权衡。
svd_solver=‘full’:传统意义上的 SVD,使用了 scipy 库对应的实现。
svd_solver=‘arpack’:直接使用 scipy 库的 sparse SVD 实现,和 randomized 的适用场景类似。
svd_solver=‘randomized’:适用于数据量大,数据维度多同时主成分数目比例又较低的 PCA 降维。
1. components_:返回最大方差的主成分。
2. explained_variance_:它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。
3. explained_variance_ratio_:它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。(主成分方差贡献率)
4. singular_values_:返回所被选主成分的奇异值。
实现降维的过程中,有两个方法,一种是用特征值分解,另一种用奇异值分解,前者限制比较多,需要矩阵是方阵,而后者可以是任意矩阵,而且计算量比前者少,所以说一般实现PCA都是用奇异值分解的方式。
5. mean_:每个特征的经验平均值,由训练集估计。
6. n_features_:训练数据中的特征数。
7. n_samples_:训练数据中的样本数量。
8. noise_variance_:噪声协方差
1. fit(self, X,Y=None) #模型训练,由于PCA是无监督学习,所以Y=None,没有标签。
如:
model=decomposition.PCA(n_components=2)
model.fit(X)
2. fit_transform(self, X,Y=None)#:将模型与X进行训练,并对X进行降维处理,返回的是降维后的数据。
如:
X_new=model.fit_transform(X)
3. get_covariance(self)#获得协方差数据
4. get_params(self,deep=True)#返回模型的参数
如:
print(model.get_params())
输出:{'copy': True, 'iterated_power': 'auto', 'n_components': 3, 'random_state': None, 'svd_solver': 'auto', 'tol': 0.0, 'whiten': False}
5. get_precision(self)#计算数据精度矩阵( 用生成模型)
6. inverse_transform(self, X)#将降维后的数据转换成原始数据,但可能不会完全一样
7. score(self, X, Y=None)#计算所有样本的log似然平均值
8. transform(X)#将数据X转换成降维后的数据。当模型训练好后,对于新输入的数据,都可以用transform方法来降维。
import numpy as np
from sklearn import decomposition,datasets
iris=datasets.load_iris()#加载数据
X=iris['data']
model=decomposition.PCA(n_components=2)
model.fit(X)
X_new=model.fit_transform(X)
Maxcomponent=model.components_
ratio=model.explained_variance_ratio_
score=model.score(X)
print('降维后的数据:',X_new)
print('返回具有最大方差的成分:',Maxcomponent)
print('保留主成分的方差贡献率:',ratio)
print('所有样本的log似然平均值:',score)
print('奇异值:',model.singular_values_)
print('噪声协方差:',model.noise_variance_)
g1=plt.figure(1,figsize=(8,6))
plt.scatter(X_new[:,0],X_new[:,1],c='r',cmap=plt.cm.Set1, edgecolor='k', s=40)
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('After the dimension reduction')
plt.show()
五、参考资料(Reference data)
主成分分析(Principal components analysis)-最大方差解释:
https://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html
主成分分析(Principal components analysis)-最小平方误差解释:
https://www.cnblogs.com/jerrylead/archive/2011/04/18/2020216.html
机器学习(七)白化whitening:
https://blog.csdn.net/hjimce/article/details/50864602?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
scikit-learn源码之降维–PCA:
https://zhuanlan.zhihu.com/p/53268659
Sklearn中的PCA:
https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html?highlight=pca#sklearn.decomposition.PCA.set_params