本站消息

  本站每日ip已达10000,出租广告位,位置价格可谈,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2020-03(72)

2020-04(60)

2020-05(28)

荐(无监督数据降维)主成分分析法 - PCA

发布于2020-05-17 18:50     阅读(121)     评论(0)     点赞(25)     收藏(5)



SKlearn官网 - sklearn.decomposition.PCA

一,数学原理

参考:通俗易懂的主成分分析法(PCA)详解

二,PCA的使用

class sklearn.decomposition.PCA(n_components=None, *, 
	copy=True, whiten=False, svd_solver='auto', tol=0.0, 
	iterated_power='auto', random_state=None)

1,参数

n_components:intfloatNone or str
			  当其大于1,且为正数时:需要保留的维度
			  当0 < n_components < 1时:需要保留原数据可解释的度的百分之几	
	
copy:bool, default=True
	  如果为False,则传递给fit的数据将被覆盖,并且运行
	  fit(X).transform(X)将不会产生预期的结果,请改用
	  fit_transform(X)。

whiten:bool, 可选(default False)
		如果为True(默认情况下为False),则将components_矢量
		乘以n_samples的平方根,然后除以奇异值,以确保具有单位
		分量方差的不相关输出。

		泛白会从转换后的信号中删除一些信息(组件的相对方差标
		度),但有时可以通过使下游估算器的数据符合某些硬性假设
		来提高下游估算器的预测准确性。

2,属性(方法)

components_:array, shape (n_components, n_features)
			 特征空间中的主轴,表示数据中最大方差的方向。组件
			 按排序 explained_variance_。

explained_variance_:array, shape (n_components,)
					 每个选定组件说明的方差量。
					 等于X的协方差矩阵的n_components个最大特征值。

explained_variance_ratio_:array, shape (n_components,)
						   每个选定组件解释的方差百分比。
						   如果n_components未设置,则将存储
						   所有分量,并且比率之和等于1.0。

singular_values_:array, shape (n_components,)
				  对应于每个选定组件的奇异值。奇异值等于
				  n_components 低维空间中变量的2范数。

mean_:array, shape (n_features,)
	   根据训练集估算的每特征经验均值。
	   等于X.mean(axis=0)。

n_components_:int
			   估计的组件数。
			   当n_components设置为'mle'01之间的数字
			   (svd_solver =='full')时,将从输入数据中估计
			   该数字。否则等于参数n_components,如果
			   n_components为None,则等于n_features和
			   n_samples的较小值。

n_features_:int
			 训练数据中的特征数量。

n_samples_:int
		    训练数据中的样本数量。

noise_variance_:float
				 根据Tipping and Bishop 1999的概率PCA模型估计的噪声协方差。
				 需要计算估计的数据协方差和分数样本。
				 等于X协方差矩阵的(min(n_features,n_samples)-n_components)个最小特征值的平均值。

3,示例

这里使用数字识别的数据,以及kNN算法

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, test_size=0.2) 

可以看出此时,数据维度为64

x_train.shape
>>>(1437, 64)

保留所有维度(特征)做kNN算法

%%time
from sklearn.neighbors import KNeighborsClassifier

kNN_classifier = KNeighborsClassifier()
kNN_classifier.fit(x_train, y_train)
>>> Wall time: 78 ms

保留所有维度时的准确度

kNN_classifier.score(x_test, y_test)
>>> 0.9777777777777777

重点
进行PCA降维(从64维降至2维)
注意:对测试集降维时,不可以重新拟合PCA算法,要使用x_train拟合的PCA进行降为

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pca.fit(x_train)
x_train_reduction = pca.transform(x_train)
x_test_reduction = pca.transform(x_test)
%%time

kNN_classifier = KNeighborsClassifier()
kNN_classifier.fit(x_train_reduction, y_train)
>>> Wall time: 2 ms

可以看出当只保留2个维度时准确度过低

kNN_classifier.score(x_test_reduction, y_test)
>>> 0.6194444444444445
'''表示只保留的(14.7+13.7)%的方差信息(特征信息)
-降维到2维度是可信度太低'''
pca.explained_variance_ratio_
>>> array([0.14766332, 0.13708212])

我们来看一下,每一个特征所占可信的百分比

pca = PCA(n_components=x_train.shape[1])
pca.fit(x_train)
pca.explained_variance_ratio_
array([1.47663319e-01, 1.37082118e-01, 1.18096318e-01, 8.30528497e-02,
       5.82234857e-02, 4.93950699e-02, 4.31673479e-02, 3.71697003e-02,
       3.37564927e-02, 3.08558779e-02, 2.38410022e-02, 2.27033177e-02,
       1.86248506e-02, 1.71280718e-02, 1.45014087e-02, 1.39292791e-02,
       1.34209616e-02, 1.25513680e-02, 1.00296802e-02, 8.88825053e-03,
       8.70986633e-03, 8.03133349e-03, 7.65322153e-03, 7.26124768e-03,
       6.94377770e-03, 5.95562460e-03, 5.85075759e-03, 5.22376048e-03,
       4.96122747e-03, 4.26953249e-03, 3.82713368e-03, 3.54858246e-03,
       3.33788387e-03, 3.25852623e-03, 3.05706857e-03, 2.92001586e-03,
       2.62094836e-03, 2.27552797e-03, 2.16452071e-03, 2.14005187e-03,
       1.87783108e-03, 1.59226127e-03, 1.51161475e-03, 1.41757015e-03,
       1.19523457e-03, 1.10190613e-03, 9.62019170e-04, 8.47896454e-04,
       5.48248494e-04, 3.79242817e-04, 2.22769625e-04, 8.51191406e-05,
       5.14896740e-05, 4.97757855e-05, 3.96997516e-05, 1.52010302e-05,
       5.29455625e-06, 3.23397983e-06, 1.23259991e-06, 5.61055922e-07,
       4.19614970e-07, 6.18786317e-34, 6.18786317e-34, 5.57495373e-34])

随着维度的增加可信度的变化(x:维度,y:可信度%)

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()

在这里插入图片描述
重点
当我们不知道该选择几个维度比较好时,我们可以直接填入想保留的可信度(%)

pca = PCA(0.95)
pca.fit(x_train)
>>> PCA(copy=True, iterated_power='auto', n_components=0.95, random_state=None,
    svd_solver='auto', tol=0.0, whiten=False)

当可信度为95%时,保留了29个维度(特征)

pca.n_components_
>>> 29

可以看出,此时的精确度有明显的提高

kNN_classifier.score(x_test_reduction, y_test)
>>> 0.975

下面将所有的数据降维到2维

pca = PCA(n_components=2)
pca.fit(x)
x_reduction = pca.transform(x)
x_reduction.shape
>>> (1797, 2)
for i in range(10):
    plt.scatter(x_reduction[y==i, 0], x_reduction[y==i, 1], alpha=0.8)
plt.show()

在这里插入图片描述
可以看出如果区分个别类别是,仅使用2维的数据就已经可以进行很好的区分了(例如区分蓝色与粉色)

原文链接:https://blog.csdn.net/weixin_46072771/article/details/106131389



所属网站分类: 技术文章 > 博客

作者:898shd

链接: https://www.pythonheidong.com/blog/article/377306/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

25 0
收藏该文
已收藏

评论内容:(最多支持255个字符)