机器学习之理解聚类

决策树、随机森林、逻辑回归都属于“有监督学习”。

聚类属于“无监督学习”,其作用就是将数据划分成有意义或有用的簇。

聚类的应用:

  1. 对客户信息进行分类,以实现精准营销。
  2. 可以用于降维和矢量量化(vector quantization)常常用于图像、声音、视频等非结构化数据的压缩。

聚类和分类的区别:
分类是训练数据有标签,新来一个数据判断属于哪一类。

聚类是训练数据没有标签,通过聚类算法将数据集聚成k类。

聚类 分类
核心 将数据分成多个组
探索每个组的数据是否有联系
从已经分组的数据中去学习把新数据放到已经分好的组中去
学习类型 无监督,无需标签进行训练 有监督,需要标签进行训练
典型算法 K-Means,DBSCAN,层次聚类,光谱聚类 决策树,贝叶斯,逻辑回归
算法输出 聚类结果是不确定的
不一定总是能够反映数据的真实分类
同样的聚类,根据不同的业务需求
可能是一个好结果,也可能是一个坏结果
分类结果是确定的
分类的优劣是客观的
不是根据业务或者算法需求决定
一、KMeans聚类算法

关键概念:簇和质心

KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇,直观上来看是簇是一组一组聚集在一起的数据,在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。
簇中所有数据的均值通常被称为这个簇的“质心”(centroids)。在一个二维平面中,一簇数据点的质心的横坐标就是这一簇数据点的横坐标的均值,质心的纵坐标就是这一簇数据点的纵坐标的均值。同理可推广至高 维空间。

KMeans算法训练过程:

  1. 设置超参数k,定义将训练集聚成k个类。然后随机抽取k个样本作为最初的质心
  2. 开始循环:将每个样本点分配到离他们最近的质心,生成k个簇;然后对每个簇计算所有被分到该簇的样本点的平均值作为新的质心。
  3. 当质心的位置不再发生变化,迭代停止,聚类完成。

KMeans算法是一个非常耗时的聚类算法,其平均复杂度O(knT),k是超参数,表示簇数,n是整个数据集中的样本量。T是所需要迭代次数。

聚类算法最终的目的就是簇内差异小,簇外差异大。衡量这个差异的标准就是样本点到其所在簇的质心的距离。即一个簇内样本到质心的距离尽量小。计算样本点到质心的距离主要有以下几种方法:
机器学习之理解聚类_第1张图片
其中x表示簇中的样本点,u表示该簇中的质心,n表示每个样本点中的特征数目,i表示组成点x的每个特征。
若采用欧几里得距离,则一个簇中所有样本点到质心的距离的平方和为:机器学习之理解聚类_第2张图片
其中,m为一个簇中样本的个数,j是每个样本的编号。这个公式被称为簇内平方和(cluster Sum of Square), 又叫做Inertia。而将一个数据集中的所有簇的簇内平方和相加,就得到了整体平方和(Total Cluster Sum of Square),又叫做total inertia。Total Inertia越小,代表着每个簇内样本越相似,聚类的效果就越好。因此KMeans追求的是,求解能够让Inertia最小化的质心。实际上,在质心不断变化不断迭代的过程中,总体平方和是越来越小的。我们可以使用数学来证明,当整体平方和最小的时候,质心就不再发生变化了。如此,K-Means的求解过程,就变成了一个最优化问题

注意:
记得我们在逻辑回归中曾有这样的结论:损失函数本质是用来衡量模型的拟合效果的,只有有着求解参数需求 的算法,才会有损失函数。Kmeans不求解什么参数,它的模型本质也没有在拟合数据,而是在对数据进行一种探索。所以如果你去问大多数数据挖掘工程师,甚至是算法工程师,他们可能会告诉你说,K-Means不存在什么损失函数,Inertia更像是Kmeans的模型评估指标,而非损失函数。

但我们类比过了Kmeans中的Inertia和逻辑回归中的损失函数的功能,我们发现它们确实非常相似。所以,从“求解模型中的某种信息,用于后续模型的使用“这样的功能来看,我们可以认为Inertia是Kmeans中的损失函数,虽然这种说法并不严谨。

对比来看,在决策树中,我们有衡量分类效果的指标准确度accuracy,准确度所对应的损失叫做泛化误差,但我们不能通过最小化泛化误差来求解某个模型中需要的信息,我们只是希望模型的效果上 表现出来的泛化误差很小。因此,决策树、KN、聚类等算法,是绝对没有损失函数的。

二、sklearn.cluster.KMeans
  1. 重要参数n_clusters:n_clusters是KMeans中的k,表示着我们告诉模型我们要分几类。这是KMeans当中唯一一个必填的参数,默认为8类,但通常我们的聚类结果会是一个小于8的结果。通常,在开始聚类之前,我们并不知道n_clusters究竟是多少。
三、聚类算法的模型评估指标

不同于分类模型和回归,聚类算法的模型评估不是一件简单的事。在分类中,有直接结果(标签)的输出,并且分类的结果有正误之分,所以我们使用预测的准确度,混淆矩阵,ROC曲线等等指标来进行评估,但无论如何评估,都是在”模型找到正确答案“的能力。而回归中,由于要拟合数据,我们有SSE均方误差,有损失函数来衡量模型的拟合程度。但这些衡量指标都不能够使用于聚类。

问:如何衡量聚类算法的效果?
聚类模型的结果不是某种标签输出,并且聚类的结果是不确定的,其优劣由业务需求或者算法需求来决定,并且没有永远的正确答案。

KMeans的目标是确保“簇内差异小,簇外差异大”,因此可以通过衡量簇内差异来衡量聚类的效果。而Inertia是用距离来衡量簇内差异的指标,因此,我们可以使用Inertia来作为聚类的衡量指标,Inertia越小模型越好。但是这个指标有很大的缺陷:

  1. 它不是有界的,只知道Inertia越小越好,并不知道多小的值是模型的极限。
  2. 它的计算太容易受到特征数目的影响,数据维度很大的时候,Inertia的计算量会陷入维度诅咒之中,计算量会爆炸,不适合用来一次次评估模型。
  3. 它会受到超参数K的影响,在我们之前的常识中其实我们已经发现,随着K越大,Inertia注定会越来越小,但 这并不代表模型的效果越来越好了
  4. Inertia对数据的分布有假设,它假设数据满足凸分布(即数据在二维平面图像上看起来是一个凸函数的样子),并且它假设数据是各向同性的(isotropic),即是说数据的属性在不同方向上代表着相同的含义。但是现实中的数据往往不是这样。所以使用Inertia作为评估指标,会让聚类算法在一些细长簇,环形簇,或者不规则形状的 流形时表现不佳。

衡量聚类好坏的指标分两种情况来看:

  1. 当真是标签已知的时候,

你可能感兴趣的:(人工智能,机器学习)