Python 机器学习实战 —— 无监督学习(上)

​​​

前言

在上篇《Python 机器学习实战 —— 监督学习》介绍了 支持向量机、k近邻、朴素贝叶斯分类 、决策树、决策树集成等多种模型,这篇文章将为大家介绍一下无监督学习的使用。
无监督学习顾名思义数据中不包含已知的输出结果,学习算法中只有输入数据,算法需要从这些输入数据中提取相关规律。
无监督学习主要分为两种类型:数据集变换与聚类算法,数据集的无监督变换是创建数据集的新的表达方式,使其特性更容易理解,最常见的模型有 PCA、NMF、t-SNE 等模型。聚类算法则是将数据划分成不同的组,每组数据中包含有类似的特征,常见的模型有 KMeans、DBSCAN、GMM、Agglomerative 等,下面将对各种模型的特性与应用场景作详细介绍。

 

目录

前言

一、PCA 主成分分析

二、NMF 非负矩阵分解

三、ML 流形学习


数据集变换的一个主要常见应用就是降维和压缩数据,从多维数据中提取其重要的特征,最常用的模型就是 PCA 与 NMF。
另一个应用是流形学习,它试图把一个低维度流形数据嵌入到一个高维度空间来描述数据集,通过转换找不到的数据规律,常见的模型有 t-SNE、MDS、LLE、Isomap 等。 

一、PCA 主成分分析

1.1 PCA 降维的基本原理

主成分分析 PCA(Principal Component Analysis)是最常用的非监督学习,常用于高维数据的降维,可用于提取数据的主要特征分量。PCA 经常与监督学习合并使用,特别是在数据量较大的情况下,通过 PCA 压缩数据集,再使用监督学习模型进行分析可提升系统有效性。
PCA 会根据设置把数据点分解成一些分量的加权求和,利用降维的思想,把多指标转化为少数几个综合指标。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用于减少数据集的维数,同时保持数据集的对方差贡献最大的特征。
下面以一个最简单的例子作为说明,如图以一个二维特征的数据集为例,PCA 使用旋转数据集的方法,把旋转后新数据特征的重要性来选择特征的子集。左上角的图是原始的数据点,算法先找到方差最大的方向 Component1,此方向包含最多的信息量。然后并以其垂直方向为 Component 2,如此类推,因为这是二维数据集所以只包含两个成分,通常主成分个数会与维度数相等。定好成分以后,如图二把坐标轴旋转,令第一个成分与 X 轴平行,第二个成分与 Y 轴平行。在旋转时从数据中减去平均值,使到转换后的数据都是以 0 为中心。由于 X 轴与 Y 轴是不相关的,所以除了对角线,其他的矩阵都为 0。因此在图三旋转后只保存了 Component1 成分,这就把数据集从二维数据集降到一维数据集。最后把轴重新旋转到原来方向,并把平均值加到数据中,就得到图四。这就是最简单的 PCA 降维过程。

1.2 PCA 类简介

构造函数

1 class PCA(_BasePCA):
2     @_deprecate_positional_args
3     def __init__(self, n_components=None, *, copy=True, whiten=False,
4                  svd_solver='auto', tol=0.0, iterated_power='auto',
5                  random_state=None):
6     ......

参数说明

  • n_components:int, float 类型 or 'mle', 默认值国 None。int 时则是直接指定希望PCA降维后的特征维度数目,此时 n_components是一个大于等于1的整数。也可以使用 float 指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时 n_components是一个[0,1]之间的数。当然,我们还可以将参数设置为"mle", 此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维。我们也可以用默认值,即不输入n_components,此时n_components=min(样本数,特征数)。
  • copy: bool 类型,表示是否在运行算法时,将原始数据复制一份。默认为True,则运行PCA算法后,原始数据的值不会有任何改变。因为是在原始数据的副本上进行运算的。
  • whiten :bool 类型,判断是否进行白化,默认值为 False ,即不进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1.对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作。
  • svd_solver:str 类型,可选值 {'auto', 'full', 'arpack', 'randomized'} 之一,默认值为 auto 。即指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。 full则是传统意义上的SVD,使用了scipy库对应的实现。arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。
  • tol: float 类型,默认值为 0.0,代表求解方法精度。
  • iterated_power: int 类型,默认auto,代表当 svd_solver == ‘randomized’ 时幂方法的迭代次数。
  • random_state: int 类型,默认None,随机数种子,推荐设置一个任意整数,同一个随机值,模型可以复现。

常用属性

  • components_:返回主要成分,运行 transform 后的主要成分将保存在此属性当中。 
  • n_components_:返回所保留的成分个数 n。
  • explained_variance_:特征方差值,方差值越大,说明重要性要越高。与 explained_variance_ratio_ 同时使用可更清晰分辨每个特征的占比。
  • explained_variance_ratio_:每个特征方差贡献率,个比例越大,说明重要性要越高,所有总和为1。
  • noise_variance_:  根据概率主成分分析模型估计的噪声协方差。

常用方法

  • fit(self, X, y=None):   表示用数据X来训练PCA模型。
  • transform(selft,X):将数据X转换成降维后的数据。通过与 fit 同用,先调用 fix,当模型训练好后,再使用 transform 方法来降维。
  • fit_transform(self, X, y=None): 用X来训练PCA模型,同时返回降维后的数据。相当于结合了 fit 与 transform 两个方法。
  • inverse_transform(self, X):将降维后的数据转换成为原始数据。

1.3 应用实例

1.3.1 使用 PCA 降噪

尝试先使用 PCA 降噪,提取 60 个主要成分,再使用 KNeighborsClassifier 模型进行训练,对比一下测试结果。使用 PCA 降噪后,准确率从 30% 上升到 40%,可见通过有效提取主要成分有可能得到更好的数据模式。一般可以通过 explained_variance_ratio_ 属性,来判断所需要成分的数量,成分数量过少不能反映数量集的主要特征,成分数量过多,丢失了 PCA 降燥的意义,一般会把 explained_variance 保持到 90% 以上。

 1 def knn_test():
 2     #测试数据集
 3     person=datasets.fetch_lfw_people(min_faces_per_person=20)
 4     X_train,X_test,y_train,y_test=train_test_split(person.data,person.target,random_state=1)
 5     #使用 KNeighborsClassifier 模型进行测试
 6     knn = KNeighborsClassifier()
 7     knn.fit(X_train, y_train)
 8     #输出knn准确率
 9     print('KNN:\n  train data:{0}\n  test data:{1}'
10           .format(knn.score(X_train, y_train),
11                   knn.score(X_test, y_test)))
12 
13 def pca_test():
14     #测试数据集
15     person=datasets.fetch_lfw_people(min_faces_per_person=20)
16     X_train,X_test,y_train,y_test=train_test_split(person.data,person.target,random_state=1)
17     #建立PCA模型,使用60个主要成分
18     pca=PCA(60 ,whiten=True,random_state=2).fit(X_train)
19     #将数据X转换成降维后的数据
20     X_train_pca=pca.transform(X_train)
21     X_test_pca=pca.transform(X_test)
22     #建立 KNeighborsClassifier 模型
23     knn=KNeighborsClassifier()
24     #把过滤后60个特征的数据放入KNN模型进行训练
25     knn.fit(X_train_pca,y_train)
26     #输出准确率
27     print('\nPCA->KNN:\n  train data:{0}\n  test data:{1}'
28           .format(knn.score(X_train_pca, y_train),
29                   knn.score(X_test_pca, y_test)))
30     #观察累计方差贡献率
31     plt.plot(np.cumsum(pca.explained_variance_ratio_))
32     plt.xlabel('number of components')
33     plt.ylabel('cumulative explained variance')
34     plt.show()
35 
36 if __name__ == '__main__':
37     knn_test()
38     pca_test()

运行结果

1.3.2 提取面部特征

PCA 通过 fit_transform 方法完成降维后,可通过 inverse_transform 方法将降维后的数据转换成为原始数据。对比一下图一与图二,可以辨别二种不同的情况,通过使用此方法对图片进行压缩,原来 3023 个特征已经被压缩到 175 个,图片的特征已比较清晰。特征成分保存在 PCA 的 components_ 属性中,图三显示了前 15 个特征成分。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值