机器学习算法基本型 聚类(笔记)

 

概念

如下一些例子,都是聚类:
  • 发现不同的客户群,刻画不同的消费群体的特征
  • 推导植物和动物的种类
  • 基因和蛋白质的分类
  • 气候带的划分
  • 文档的归类

对比理解,会好理解一些:分类,是先定好标准,1,2,3,然后把一堆事物分好类别,分别归类到1,2,3中;聚类,是我自己也不知道有什么标准,我就想看着这一堆数据,他们可以根据一些什么特征,让他们自动归成不同的类别,是一种总结规律的过程。因此,对于聚类来说,可以使用如下的思路,进行归类:

  1. 基于距离:用各式各样的距离来衡量数据对象之间的相似度,比如k-means算法;
  2. 基于密度:依据合适的密度函数进行类间聚类,比如DBSCAN算法;
  3. 基于模型:目标数据集由一系列的概率分布决定,比如高斯混合模型聚类算法;
  4. 基于图:基于图或超图模型,将高密度联通的对象聚为一类,比如谱聚类算法。

基于距离

欧氏距离(欧几里得距离)

image

 

曼哈顿距离(网格距离)

image

切比雪芙距离

image

 

 

余弦距离

image

 

小结

不同距离的计算方式,是为了在不同空间下,做好差异度的度量。比如城市街道,如果比较符合网格、栅格,我们就用曼哈顿距离计算,如果是求不同地点之间,根据经纬度去判断它的距离,就用haversine距离计算。

image

 

基于距离的聚类算法

K-means算法

核心思想:K就是选定几个“核”,然后根据欧几里得距离,去计算图中每个散点,距离每个核的距离。离哪个核近,就是哪个核的类。所以,挑选几个核(k的值),怎么分布/挑选核,都非常关键地影响着聚类的效果。之后在每个类中,需要重新计算出一个均值点。根据新的均值点,继续计算每个点到每个新核的距离。直到聚类结果不再改变核,或者达到最大迭代次数就可以停止了。

Tips:这里注意,在k-means算法中,均值点,不必是真实点,可以是虚拟点,重要的是保证均值点,是各点坐标的算术平均值。有一个变种,K-medoids算法,这个要求均值点必须是具体的数据点。具体应用的时候,K-medoids算法的鲁棒性更好。这是因为判断K-means的损失,是根据最小化平方误差来衡量的,即损失 = Σ(点到中心的距离)²;K-medoids的损失,是通过最小化绝对误差来的,即损失 = Σ|点到中心的距离|。因为损失公式的计算核心都是 每个点到均值点的距离,如果使用平方计算,就会增大损失,也就是,会放大异常值的影响。

比如一组点(10,11,12,13,14)和一个异常点100,100就会在kmeans算法中严重影响均值点的确定。(10,11,12,13,14)原先均值为12,加入异常点100后,均值 = (10+11+12+13+14+100)/6 = 26.67,但是总损失是:(10-26.67+ (11-26.67+ ... + (100-26.67)²=6465(损失非常大),均值因为(100-26.67)²,从12被拉倒了26.67;而k-medoids,当加入100这个异常点时,由于必须选择真实点作为新的均值,我们可以选择13,总损失中,最大的影响因子,就是|100-13|=87,但总损失是94(损失相对来说,少得多)。k-medoids中,会根据损失最小的,选择新的均值点。比如,如果选择100作为均值点,由于所有点到均值点的距离都很大,总的损失会更大,所以均值不会因为这个遥远、特别的异常点,被拉偏得过远。因此,k-medoids不会因为异常值有太大的影响,那么鲁棒性就会更好一些。当然,k-medoids的鲁棒性是以更高的计算成本为代价的,因为要比对每个候选点的损失,而k-means就是计算所有点的算术平均值即可,计算效率会更高。

image

image

 

K-means如何判断聚类效果的方式,有以下几个维度:

image

 

K-means怎么选择K:

 

在具体的应用中,可以有如下方式来决定K值:

1、根据经验。比如我正在对客户重要性做聚类,那我认为,分成高、中、低是合理的,那k=3即可;

2、先用层次聚类探索:层次聚类 → 树状图 → 建议K=4;然后再用K-means精炼:用K=4运行K-means → 得到最终聚类;

3、数据集很大,求效率,直接预估一个k值,开始计算。

Tips:什么是层次聚类?层次聚类和划分聚类,是聚类的两个主要方式。可以单独用,也可以结合用。目标就是为了让聚类更合理。划分聚类的一个典型,就是k-means算法。层次聚类,继续细分,可以分为自顶向下(分裂)和自底向上(凝聚),根据切割高度,判断有几个簇。更形象一点的理解就是,在树的不同深度,人工选择某个深度为切割高度,和树有几个交点,就是几个簇。当数据集不大(<1000),我想了解其更深层次、更合理的结构,我就用层次聚类,慢慢帮我做归并,得到一个整体的分层结构。

 

不同的聚类算法可能看到的聚类图像

1、基于距离的:需要指定簇的数目。簇形状只能是球形 / 凸形、大小均匀、互相分割清晰的。不依赖球形假设,跟着数据密度走。核心思想是,将空间划分为若干个球形/凸形区域。结果通常会看到数据被划分为几个“紧凑的球状簇”,每个簇都有明确的中心点。某些算法最终的图像上看,边界是线性的。这是由于,聚类的某些点,它根据决策的公式,比如k-means使用欧几里得距离,c1是簇1的中心点,c2是簇2的中心点,那么边界的点就是||xc1||²=||xc2||²。边界就是一组这样的点。如果展开,两边消去二次项,就会得到一个一次函数,这是一个线性的图像。所以这个边界,就是线性的。由于k-means的簇的定义和voronoi区域的定义完全一致,而voronoi图也有一个定理,就是边界是两个种子(中心点)的垂直平分线,是线性的。所以也可以证明,k-means的图形边界是线性的。但不代表所有基于距离的边界都是线性的。比如k-medoids就不线性,曼哈顿距离是分段线性。因此,基于距离的聚类算法适用场景:

✅ 肉眼容易分辨出的形状,比如簇大小相近、形状凸出、密度均匀
❌ 无法处理环形、流形、密度不均的数据

image

 

2、基于密度的:不需要指定簇的数目。簇形状是任意形状(弯月、长条、螺旋、嵌套),能识别噪声。对噪声直接剔除。不依赖球形假设,跟着数据密度走。核心思想是,高密度区域形成簇,低密度区域作为噪声或边界。结果通常会看到簇可以是任意形状(环形、S形、月牙形等),能识别噪声点(outliers),不需要预先指定簇数量。因此,基于密度的聚类算法适用场景:

✅ 肉眼较难分辨出的形状,如任意形状、能处理噪声、密度不均的数据
❌ 对参数(ε, min_samples)敏感,高维数据效果下降

 

image

 3、基于模型的:需要指定簇的数目。簇形状是椭圆、椭球、方向任意、大小可不同、概率归属。比 K-Means 强:可以是斜椭圆、长短轴不同、密度不同。核心思想是,观察到的数据,是某种混合机制产生的。针对每个点,以概率判断,属于哪个簇,有可能会同时属于多个簇,但实际分配时,通常取最大概率的簇为“硬分配”。边界会有平滑过渡的表现,根据最大化似然函数学习模型参数,使模型有效生成观测数据。最终是为了确定,每个点,是怎么生成的,来自哪里。比如一个班男生平均身高175,方差26,女生平均身高162,方差25。符合高斯分布。男女比例参半。这时候一个168的人,根据高斯分布的似然概率和贝叶斯的后验概率公式,得到一个判断:男生的概率是0.4,是女生的概率是0.6,那么在168这里,边界就不会特别明确,因为在概率世界里,不是非黑即白,只是偏向某个结果的可能性多一些,这就是软聚类。实际中,要怎么做决策,需要规定硬分类的判定方式,比如根据最大后验概率(MAP),直接判断为女性。或者,设定阈值,概率大于70%,才是女性,否则拒绝分类。或者基于经验,误判的风险高,那么就调整决策边界。也可以不做任何决策,就是生成此报告供下一步使用。因此,基于模型的聚类算法适用场景:

✅ 数据需要用概率解释,符合某种分布假设、需要软聚类
❌ 假设分布形式,计算复杂度高

 

image

 4、基于图的:需要指定簇的数目。簇形状是任意复杂形状(连通域),像 “按连通性切图”。噪声会强制归簇。非常擅长:嵌套圆、螺旋、高度非凸、复杂连通结构核心思想,将数据看作图,聚类是图的划分。结果通常可以看到利用数据的相似度矩阵,如果是使用谱聚类,也会使用图拉普拉斯对图做进一步深层的额分析。基于图的聚类算法,特别适合发现“流形结构”或“连通块”,对非凸形状效果很好。因此,基于图的聚类算法适用场景:

✅ 环形、螺旋形、小样本聚类
❌ 构建相似度矩阵计算成本高,需选择合适核函数

image

 

使用weka练习一个聚类算法-iris

实验目的:

iris数据集,包含了三种鸢尾花(setosa、versicolor、virginica),每种鸢尾花,都标注了它花萼的宽度、长度,花瓣的宽度、长度。每种鸢尾花的数目是50个。数据集一共是150个实例。我们要实验的,就是通过使用聚类算法,让算法帮我归并出3类簇,刚好可以对应我们的3类鸢尾花。来验证聚类算法的效果,如果合适,那么以后我们并不知道真实分类的数据集,但特征和iris类似的数据集,我们也可以使用这种聚类算法来使用,并进行聚类分析了。

数据说明:

image

 实验步骤:

1、weka的安装环境,需要java。可以自行下载weka并安装;

2、打开weka后,点击“explorer”,导入你要做练习的数据“iris.arff”:

image

image

3、点击“cluster--choose”,选择simplekmeans算法,并通过ignore attributes,把class去掉:

image

image

  4、修改simplekmeans的参数:

image

 

其他常用参数的解释:

  • displaystddevs:是否显示标准差和类别数目。有时候为了简洁性需求或者性能考虑,可能不希望展示
  • distancefunction:用于比较实例的距离函数(默认为 weka.core.euclideandistance)
  • dontreplacemissingvalues:是否不使用均值(mean)或者众数(mode)替换丢失的值
  • maxiterations:最大迭代次数
  • numclusters:所聚类的个数
  • preserveinstancesorder:是否预先排列实例的顺序
  • seed:设定的随机种子值。通过设置固定的 seed,确保结果是可复现的。否则,可能每一次都会产生不同的中心点,得到不同的聚类结果

 5、点击“start”,得到聚类结果。Number of iterations: 6,一共迭代6次。聚类0,对应versicolor品种,聚类1更明显些,对应setosa品种,聚类2,对应virginca品种。和我们猜测的也差不多,versicolor是最好辨认的,完全正确。setosa和virginca有较多重合的特征,确实容易混淆。整体可以看到对于一个150条的数据来说,SSE相对来说很低,聚类效果很好(如果不做聚类,也就是一个簇,那么根据SSE公式,粗略计算总数据的均值,然后计算各点到它的距离的平方和,SSE大约是60-80,现在经过聚类已经下降到6.998,降低了90%,这是非常显著的改进。通常,我们是根据SSE降低了多少,来评判效果。在机器学习文献中,KMeans在Iris数据集上的SSE通常在6-12之间,我们的6.998确实属于较好的结果。)。

image

 

 

image

 

posted @ 2026-02-02 17:09  1234roro  阅读(29)  评论(0)    收藏  举报