《Python机器学习基础教程》笔记

预处理步骤,有时可以提高监督算法的精度,或者减少内存占用和时间开销。不过评估无监督算法却没有什么好方法,唯一的方法就是人工检查。

一、无监督学习的分类

无监督学习主要有两种类型:数据集变换与聚类。

数据集变换:数据集的无监督变换是创建数据新的表示,与数据原始表示相比,新的表示可能更容易被人或其他机器学习算法所理解。利用无监督学习进行数据变换最常见的目的就是可视化、压缩数据,以及寻找信息量更大的数据表示以用于进一步的处理。相关的算法有:主成分分析、非负矩阵分解(NMF)和流形学习。

聚类:聚类算法将数据划分成不同的组,每组包含相似的物项。其目的是划分数据,使得一个簇内的数据点非常相似且不同簇内的数据点非常不同。聚类算法为每个数据点分配(预测)一个数字,表示这个点属于哪个簇。常用的聚类算法有:k均值聚类、凝聚聚类和DBSCAN。

下面介绍一下以上提及的算法(涉及到的算法或者属性名等均基于Scikit-Learn):

二、无监督学习算法介绍


1.主成分分析(PCA)——用于降维

原理:

一种旋转数据集的方法,旋转后的特征在统计上不相关。算法首先找到方差最大的方向,将其标记为“成分1”(这是数据中包含最多信息的方向),然后,算法找到与第一个方向正交且包含最多信息的方向,这就是“成分2”,以此类推。一般来说,主成分的个数与原始特征相同。

使用PCA:

将PCA对象实例化,调用fit方法找到主成分,然后调用transform来旋转并降维。默认情况下,PCA保留所有的主成分,如需降维,则要在创建PCA对象时指定想要保留的主成分个数(n_components)。

重要知识点:

①PCA是一种无监督方法,在寻找旋转方向时没有用到任何类别信息。

②PCA的一个缺点在于,通常不容易对图中的两个轴做出解释。

③主成分被保存在PCA对象的components_属性中,components_中的每一行对应一个主成分,按重要性排序;列对应PCA原始特征属性。

④成分对应于输入空间里的方向。

应用举例:

        人脸识别的一个常见任务就是看某个前所未见的人脸是否属于数据库中的某个已知人物。想要度量人类的相似度,计算原始像素空间中的距离是一种相当糟糕的方法,例如将人脸向右移动一个像素将会发生巨大的变化,得到一个完全不同的表示,这时就需要使用PCA,使用沿着主成分方向的距离可以提高精度。我们可以将人脸数据降维到只包含一些主成分,然后反旋转回到原始空间。回到原始特征空间可以通过inverse_transform方法来实现。


2.非负矩阵分解(NMF)——用于降维

原理:

将数据分解成非负加权求和。

重要知识点:

①与PCA相比,NMF得到的分量更容易解释。

②NMF的分量没有按任何特定方法排序,所有分量的地位平等。

③NMF的主要参数是我们想要提取的分量个数。

④反向变换的数据质量与使用PCA时类似,但要稍差一些,因为PCA找到的是重建的最佳方向,NMF通常并不用于对数据进行重建或编码。

⑤NMF适用于具有叠加结构的数据,包括音频、基因表达和文本数据。


3.流形学习

流形学习能够对数据进行复杂的映射,其中特别有用的一个算法是t-SNE算法,下面就t-SNE算法进行介绍。

原理:

找到数据的一个二维表示,尽可能地保存数据点之间的距离。它尝试让原始特征空间中距离较近的点更加靠近,原始特征空间中相距较远的点更加远离,试图保存那些表示哪些点比较靠近的信息。

重要知识点:

①t-SNE完全是无监督的,但它能找到数据的一种二维表示,仅根据原始空间中数据点之间的靠近程度就能将各个类别明确开来。

②t-SNE默认参数的效果通常就很好。


4.k均值聚类

原理:

试图找到代表数据特定区域的簇中心。算法交替执行以下两个步骤:将每个数据点分配给最近的簇中心,然后将每个簇中心设置为所分配的所有数据点的平均值。如果簇的分配不再发生变化,那么算法结束。

重要知识点:

①算法运行期间,为每个训练数据点分配一个簇标签,在kmeans.labels_属性中。

②簇中心被保存在cluster_centers_属性中。

③用predic方法为新数据点分配簇标签,预测时会将最近的簇中心分配给每个新数据点。

③(缺点)即使你知道给定数据集中簇的“正确”个数,k均值可能也不是总能找到它们。

④(缺点)k均值还假设所有簇在某种程度上具有相同的“直径”,因此,它无法识别非球形簇。

⑤k均值利用簇中心来表示每个数据点,可以将其看作仅用一个分量来表示每个数据点,该分量由簇中心给出。

⑥k均值运行速度较快。


5.凝聚聚类

原理:

首先每个点自成一簇,然后合并两个最相似的簇,直到满足某种停止准则为止。合并准则有如下三种:

①ward:(默认选项)挑选两个簇来合并,使得所有簇中的方差增加最小。

②average:将簇中所有点之间平均距离最小的两个簇合并。

③complete:将簇中点之间最大距离最小的两个簇合并。

重要知识点:

①凝聚算法不能对新数据点做出预测。

②凝聚聚类的Scikit-Learn实现需要指定簇的个数,不过凝聚聚类方法为选择正确的个数提供了一些帮助。

③凝聚聚类的可视化有两种方法:层次聚类和树状图。层次聚类可以看出聚类过程(每个点从一个单一点簇变为属于最终的某个簇),但它依赖数据的二维性质,不能用于具有两个以上特征的数据集。对于高维数据集,可用树状图对其可视化,目前Scikit-Learn没有绘制树状图的功能,但是可以利用Scipy生成树状图。

④树状图在底部显示数据点,以这些点作为叶节点绘制一棵树,每合并两个簇就添加一个新的父节点。树状图的y轴不仅说明凝聚算法中两个簇何时合并,每个分支的长度还表示被合并的簇之间的距离。

⑤凝聚聚类无法分离像two-moons数据集这样复杂的形状。

⑥凝聚聚类中没有簇中心的概念。


6.DBSCAN(具有噪声的基于密度的空间聚类应用)

原理:

簇形成数据的密集区域,并由相对较空的区域分隔开。算法首先任取一个点,然后找到到这个点的距离小于等于eps的所有的点。如果距起始点的距离在eps之内的数据点个数小于min_samples,那么这个点被标记为噪声,即它不属于任何簇。如果距离在eps之内的数据点个数大于min_samples,则这个点被标记为核心样本,并被分配一个新的簇标签。然后访问该点的所有邻居(在距离eps以内),如果它们还没被分配一个簇,那么就将刚刚创建的新的簇标签分配给它们(边界点)。如果它们是核心样本,那么就依次访问其它邻居,以此类推。簇逐渐增大,直到在簇的eps距离内没有更多的核心样本为止。然后选取另一个尚未被访问过的点,并重复相同的过程。

重要知识点:

①不需要用户先验地设置簇的个数,可以划分具有复杂形状的簇,还可以找出不属于任何簇的点。

②DBSCAN有两个参数:min_samples和eps,min_samples决定簇的最小尺寸,eps隐式地控制找到的簇的个数。

③DBSCAN不允许对新的测试数据进行预测。

④一共有三种类型的点:核心点、与核心点的距离在eps之内的点(叫作边界点)和噪声。边界点所属的簇依赖于数据点的访问顺序。


将高维数据集可视化的方法:创建散点图矩阵和对每个特征分别计算所有类别的直方图。其中散点图矩阵展示特征所有可能的两两组合,直方图对每个特征计算所有类别的直方图。对于特征多的数据集来说,直方图更适应,例如有M个特征,若是画散点图矩阵,则需要画M*M个图,而如果画直方图,则只需画M个。