机器学习-聚类

一.k-means算法

k均值聚类算法是一种迭代求解算法,一般采用常见的欧氏距离作为样本距离度量准则。

每个样本点到本簇中心的距离的平方和也称为误差平方和(SSE)

1.k-means流程

(1).初始化聚类中心:从所有数据点中,随机选择k个不重复的点作为初始的k个聚类中心(k需提前指定)。

(2).分配数据点:计算每个数据点到k个聚类中心的距离(常用欧氏距离),将该点分配到距离最近的聚类中心所在的簇

(3).更新聚类中心:针对每个簇,计算簇内所有数据点的均值(即各维度坐标的平均值),将这个均值作为该簇新的聚类中心。

(4). 判断迭代终止:重复步骤2和步骤3,直到聚类中心的位置变化小于预设的阈值(如移动距离极小),或迭代次数达到设定上限,算法停止。

例子:用k-means算法将下面九个点聚类为两个簇

最终稳定的聚类为K1:ABDF K2:CEHGI

2.用python实现k-means算法

KMeans.py

python 复制代码
# -*- coding: utf-8 -*-
"""
Created on Thu
k-means clustering algorithm
@author:zzy

"""

import numpy as np
import matplotlib.pyplot as plt


def L2(vecXi,vecXj):
    '''
    计算欧氏距离
    param vecXi:
    param vecXj:
    return:
    '''
    return np.sqrt(np.sum(np.power(vecXi -vecXj,2)))

def kMeans(S,k,distMeans=L2):
    '''
    k均值聚类
    param S:
    param K:
    param distMeans:
    return SSE:误差平方和
    '''

    m = np.shape(S)[0]
    sampleTag = np.zeros(m)

    n = np.shape(S)[1]
    clusterCents = np.array([[-1.93964824,2.33260803],[7.79822795,6.72621783],[10.64183154,0.20088133]])



    sampleTagChanged = True
    SSE = 0.0
    while sampleTagChanged:
        sampleTagChanged = False
        SSE = 0.0

        for i in range(m):
            minD = np.inf
            minIndex = -1
            
            for j in range(k):
                d = distMeans(clusterCents[j,:],S[i,:])
                if d < minD:
                    minD = d
                    minIndex = j
            if sampleTag[i] != minIndex:
                sampleTagChanged = True
            sampleTag[i] = minIndex
            SSE += minD**2
        print(clusterCents)
        plt.scatter(clusterCents[:,0].tolist(),clusterCents[:,1].tolist(),c='r',marker='^',linewidths=7)
        plt.scatter(S[:,0],S[:,1],c=sampleTag,linewidths=np.power(sampleTag+0.5,2))
        plt.show()
        print(SSE)

        #重新计算簇中心
        for i in range(k):
            ClustI = S[np.nonzero(sampleTag[:]==i)[0]]
            clusterCents[i,:] = np.mean(ClustI,axis=0)
    return clusterCents,sampleTag,SSE




if __name__=='__main__':
    samples = np.loadtxt(r"D:\360MoveData\Users\Administrator.DESKTOP-E5JRNOM\Desktop\jqxx\kmeansSamples.txt")
    clusterCents, sampleTag,SSE = kMeans(samples,3)
    plt.show()
    print(clusterCents)
    print(SSE)
复制代码
kmeansSamples.txt

8.764743691132109049e+00 1.497536962729086341e+01 4.545778445909218313e+00 7.394332431706460262e+00 5.661841772908352333e+00 1.045327224311696668e+01 6.020055532521467967e+00 1.860759073162559929e+01 1.256729723000295529e+01 5.506569916803323750e+00 4.186942275051188211e+00 1.402615035721461290e+01 5.726706075832996845e+00 8.375613974148174989e+00 4.099899279500291094e+00 1.444273323355928795e+01 2.257178930021525254e+00 1.977895587652345855e+00 4.669135451288612515e+00 7.717803834787531070e-01 8.121947597697801058e+00 7.976212807755792555e-01 7.972277764807800260e-02 -1.938666197338206221e+00 8.370047062442882435e+00 1.077781799178707622e+01 6.680973199869320922e+00 1.553118858170866545e+01 5.991946943553537963e+00 1.657732863976965021e+01 5.641990155271871643e+00 1.554671013661827672e+01 -2.925147643580102041e+00 1.108844569740028163e+01 4.996949605297930752e+00 1.986732057663068707e+00 3.866584099986317025e+00 -1.752825909916766900e+00 2.626427441224858939e+00 2.208897582166075324e+01 5.656225833870900388e+00 1.477736974879376675e+01 -3.388227926726261607e-01 5.569311423852095544e+00 1.093574481611491223e+01 1.124487205516641275e+01 4.650235760178413003e+00 1.278869502885029341e+01 8.498485127403823114e+00 9.787697108749913610e+00 7.530467091751554598e+00 8.502325665434069535e+00 6.171183705302398792e+00 2.174394049079376856e+01 -9.333949569013078040e-01 1.594142490265068712e+00 -6.377004909329702542e+00 3.463894089865578341e+00 7.135980906743346175e+00 1.417794597480970609e+01

运行得到

3.k-means算法的优缺点

优点:

(1).计算复杂度低,可解释性强。算法逻辑简单直观,时间复杂度为 O(nkt) (其中 n 是样本数, k 是聚类数, t 是迭代次数),在处理中大规模数据时效率较高,且聚类结果容易理解。

(2).收敛性有保障。只要迭代次数足够,算法能保证收敛到一个局部最优解。

(3).对数值型数据适配性好。适用于连续型数值数据的聚类分析,在许多领域如客户分群、图像分割等场景中应用广泛。

缺点:

(1).需预先指定聚类数 k。实际应用中,用户往往难以提前确定最优的 k 值,若 k 选择不当,会严重影响聚类效果。

(2).对初始聚类中心敏感。不同的初始中心可能导致不同的聚类结果(局部最优而非全局最优),如前面示例中若初始中心选择不同,最终聚类可能有差异。

(3).对非球形簇、不同密度或大小的簇适应性差。仅能识别球形且密度、大小相近的簇,对于不规则形状(如环形、月牙形)或密度差异大的簇,聚类效果不佳。

(4).**对噪声和离群点敏感。**离群点会显著影响聚类中心的计算,导致聚类结果偏离真实分布。

(5).只能处理数值型数据。无法直接处理类别型或混合类型的数据,若要处理这类数据,需先进行数值化转换(如独热编码),但可能引入偏差。

二.改进算法

二分k-means算法试图克服k-means算法收敛于局部最优值的缺陷。核心思路是通过"二分拆分"逐步构建k个聚类

1.二分k-means算法流程

(1). 初始化聚类集合

将所有样本点合并为1个初始聚类,记为聚类集合 C = \{C_1\} ( C_1 包含所有样本)。

​(2). 计算初始SSE

计算当前聚类集合中每个聚类的误差平方和(SSE),总SSE为各聚类SSE之和。

SSE定义:聚类内所有样本到该聚类中心的欧氏距离的平方和

​(3). 迭代拆分聚类

循环执行以下步骤,直到聚类集合的大小等于目标 k :

选择待拆分的聚类:从当前聚类集合 C 中,选择SSE最大的聚类(记为 C_i )------因为SSE大意味着该聚类内部样本差异大,更适合拆分。

拆分选中的聚类:对 C_i 执行普通K-means(k=2),得到2个子聚类 C_{i1} 和 C_{i2} 。

更新聚类集合:从 C 中移除 C_i ,加入 C_{i1} 和 C_{i2} 。

更新总SSE:重新计算新聚类集合的总SSE(若总SSE降低,说明拆分有效)。

​(4). 输出结果

当聚类集合的大小达到 k 时,停止迭代,输出最终的 k 个聚类。

2.k-means++算法流程

K-Means++的核心是通过"距离加权概率"选择初始中心

(1).随机选1个样本作为第一个聚类中心,避免完全无方向的初始化。

(2).计算每个样本到"已选中心"的最短距离(d(x,\mu)),衡量样本与现有中心的分散程度。

(3).用距离的平方(D(x)^2)作为权重计算选择概率(P(x)),距离越远的样本被选中的概率越高,保证初始中心的分散性。

(4).重复步骤2-3,直到选够k个初始中心,后续流程与普通K-Means一致。

3.k-medoids算法

k--medoids算法与k--means算法不同之处在于簇中心的计算方式不同。k-means:簇中心是虚拟的"均值点",由簇内所有数据点的特征均值计算得出,该点未必是数据集中的实际样本。k-medoids:簇中心是真实的"代表点"(medoid),从簇内所有实际数据点中选出,其特点是使簇内其他点到它的总距离最小。

k-medoids算法核心是选择实际数据点作为聚类中心(medoid),通过迭代替换中心来最小化簇内数据点到中心的总距离

k--medoids算法流程

(1). 初始化 :从所有数据点中随机选择k个不重复的点,作为初始medoid(聚类中心)。

​(2).分配簇 :计算每个非medoid点到所有k个medoid的距离,将该点分配到距离最近的medoid所在的簇。

​(3).尝试替换(Swap) :对每个簇,依次用簇内的非medoid点(候选点)替换当前medoid,计算替换后簇内的总距离(成本)。

​(4).判断是否更新 :若替换后的总距离比替换前更小,则保留该候选点为新medoid;否则,维持原medoid不变。

​(5). 迭代终止:重复步骤2-4,直到所有medoid都不再被替换,或达到预设的迭代次数,算法收敛。

4.Mini Batch k-means算法

Mini Batch k-means算法通过略微牺牲优化质量来取得显著减少计算时间的效果。它的基本思路是用随机抽取的代表样本来进行优化计算,而不是在全部样本上进行计算

Mini Batch k--means算法流程

(1). 初始化:随机选k个点作为初始簇中心。

(2). 抽批次:每次从全量数据中取一小部分样本(Mini Batch)。

(3). 更中心:将批次内样本分配到最近簇,用这批样本更新对应簇中心。

(4). 终止:重复2-3,直到簇中心变化极小或迭代次数达标。

三.聚类算法基础

1.聚类任务

聚类任务是无监督学习下的核心任务,核心是让算法自动将无标签数据,按"相似度/距离"分成若干组(簇),最终实现"簇内数据相似、簇间数据差异大"的效果。

2.样本点常用距离度量

(1)Lp距离

Lp距离(Lp Metric)是一类距离的通用表示框架,通过调整参数p的值,可涵盖欧氏距离、曼哈顿距离等常见距离,核心是衡量n维空间中两点的"差异程度"。

其数学定义为:

关键通过p值区分具体距离类型:

当 p=1 时,即曼哈顿距离,计算"直角折线"距离(如城市中沿街道行走的路径)。

当 p=2 时,即欧氏距离,计算"空间直线"距离(如两点间的最短路径)。

当 p→∞ 时,即切比雪夫距离,取两点各维度差值的最大值(如棋盘上国王的一步最大移动距离

(2).VDM距离

VDM距离,即值差异度量(Value Difference Metric),是一种用于衡量离散无序属性之间距离的方法,核心思想是将离散无序的数据转化为可以量化的差异度量,以进行比较和分析。在实际应用中,VDM距离常与闵可夫斯基距离结合,用于处理包含有序属性和无序属性的混合属性数据 。

对于定义域为{飞机,火车,轮船}这样的离散无序属性,不能直接在属性值上计算距离,此时可采用VDM

其中,m_{u,a}表示在属性u上取值为a的样本数,m_{u,a,i}表示在第i个样本簇中在属性u上取值为a的样本数,k为样本簇数。

(3).混合加权距离

混合加权距离是一种将多种距离度量方法结合起来,并为每种距离度量分配相应权重,从而计算数据点之间差异的方法,它可以更全面地反映数据点之间的相似性或差异性。

在实际应用中,混合加权距离常用于处理包含多种类型特征的数据。如在基于混合加权距离的KNN心衰患者死亡率评估模型中,就利用值差度量和曼哈顿距离混合计算样本间的距离,以提高模型性能。

(4). 余弦相似度

余弦相似度是衡量两个向量在空间中夹角余弦值的指标,核心用于判断向量方向的相似性,值越接近1表示方向越一致(相似度越高),越接近-1则方向越相反。

3.聚类算法评价指标

1.外部指标

(1).Jaccard系数(JC)

Jaccard系数(JC,又称交并比)是衡量两个集合相似度的指标,核心通过"交集大小与并集大小的比值"量化重合程度,广泛用于聚类、分类、文本匹配等场景。

(2).FM指数(FMI)

FM指数(Fowlkes-Mallows Index,FMI)是一种用于聚类结果外部评价的指标,核心通过"精确率"与"召回率"的几何平均,量化聚类分组与真实标签的匹配程度。

其中,a+b是出现在同一预先分组中样本对数,a+c是出现在同一算法分簇中的样本对数。该指数取值于0~1,值越大,算法分簇与预先分组越接近,值越小,算法分簇与预先分组越不相关。

2.内部指标

若某聚类算法给出的分簇C={C1,C2,C3,...,Ck},定义

(1) 样本xm与同簇Ci其他样本的距离:

该距离也称为xm的簇内平均不相似度

(2) 样本xm与 不同簇Cj内样本的平均距离:

该距离也称为xm与簇Cj的平均不相似度

(3).样本Xm与簇的最小平均距离:

该距离是取xm与所有其他不同簇的平均距离中的最小值

(4).簇内样本平均距离:

(5).簇内样本最大距离:

(6).簇最小距离:

(7).簇中心距离:

根据以上距离,可定义以下内部评价指标

(1)轮廓系数(SC)

单一样本xm的轮廓系数为:

一般使用的轮廓系数是对所有样本的轮廓系数取均值。CS值高表示簇内密集,簇间疏散。

(2).DB指数(DBI)

DB指数,即Davies-Bouldin Index,是一种用于评估聚类算法性能的内部指标。

它基于簇内的紧密性和簇间的分离性来衡量聚类的质量,其值越小,说明聚类效果越好。

(3).Dunn指数(DI)

Dunn指数(DI)是评估聚类效果的指标,通过计算"类间最小距离"与"类内最大直径"的比值,取各聚类对应值的最小值。其核心逻辑是衡量类间分离度与类内紧致度,数值越大代表聚类结果越优,适用于K-means等算法的结果评估。

4. 聚类算法分类

(1).划分聚类

核心:将数据划分为预设数量的簇,通过迭代优化簇内相似度。

典型算法:K-means(基于距离的簇中心更新)、K-medoids(抗噪声,用实际样本点作中心)

(2).密度聚类

核心:基于样本密度划分簇,能发现任意形状的簇,自动识别噪声。

典型算法:DBSCAN(通过ε邻域和最小点数定义核心点)、OPTICS(优化DBSCAN的参数敏感性)

(3).层次聚类

核心:通过"凝聚(从单个样本开始合并)"或"分裂(从全样本开始拆分)"生成聚类树。

代表算法:AGNES(凝聚式)、DIANA(分裂式)。

(4).网络聚类

核心:依赖网络拓扑结构(而非节点属性),需同时考虑节点连接的"密度""权重""方向"(如无向/有

向图);部分场景会结合节点属性(如用户画像)优化聚类效果。

典型算法:GN算法(Girvan-Newman)、Louvain算法

(5).模型聚类

核心:基于概率模型或生成模型的聚类方法

典型算法:高斯混合模型(Gaussian Mixture Model, GMM)、贝叶斯高斯混合模型(Bayesian Gaussian Mixture Model)、隐马尔可夫模型(Hidden Markov Model, HMM)

四.DBSCAN及其派生算法

DBSCAN是经典的密度聚类算法

1.密度相关概念

(1).ε-邻域

对于数据集中的任意样本点 p ,以 p 为中心、以预设距离阈值ε 为半径的区域内,所有包含的样本点的集合,称为 p 的 ε-邻域,记为 Nε(p)

ε是DBSCAN算法需要指定的两个参数之一

(2).核心点和边界点

核心点:DBSCAN中,若点的ε-邻域内样本数≥预设最小点数阈值MinPts,该点为核心点,是聚类扩展的基础

边界点:自身非核心点,但落在某核心点的ε-邻域内,属于聚类却不驱动聚类生长

简而言之,核心点是"高密度核心",边界点是"核心周围的低密度边缘",二者共同构成DBSCAN的聚类结构

(3).直接密度可达

若点q在核心点p的ε-邻域内,且p是核心点(ε-邻域样本数≥MinPts),则q从p直接密度可达,是密度关系的"直接连接"

(4).密度可达

若存在点链p→p₁→p₂→...→q,每相邻两点直接密度可达,且p是核心点,则q从p密度可达,体现"传递性",是单向关系

(5).密度相连

若存在核心点o,点p和q均从o密度可达,则p与q密度相连,是双向关系,同一聚类内的点彼此密度相连。

2.DBSCAN算法流程

  1. 设定核心参数 :确定两个关键参数------ε(epsilon,邻域半径) 和 MinPts(邻域内最少样本数),这是算法的基础

  1. 识别核心点 :遍历所有样本点,若某点邻域(以该点为中心、ε为半径)内的样本数 ≥ MinPts,则标记为核心点;反之则为非核心点

  1. 扩展密度簇 :从任意未分类的核心点出发,将其所有直接/间接密度可达的样本(通过核心点连接的点)归为同一簇,并标记簇内所有点

  1. 标记噪声点:遍历完所有核心点后,剩余未被任何簇包含的非核心点,即为噪声点(异常值)

3.OPTICS算法

OPTICS(Ordering Points To Identify the Clustering Structure)算法是一种基于密度的聚类算法,它可以看作是DBSCAN算法的扩展。与DBSCAN直接输出聚类结果不同,OPTICS通过计算样本点的可达距离(reachability distance)和核心距离(core distance),生成一个有序的点序列和对应的可达距离图,从而帮助用户识别不同密度的聚类结构

  1. 核心距离(Core Distance):对于给定的参数 min_samples ,样本点成为核心点所需的最小距离(即第 min_samples 个最近邻的距离)。若样本点不是核心点,则核心距离未定义

  2. 可达距离(Reachability Distance):从核心点 p 到点 q 的可达距离,定义为 max(核心距离(p), 距离(p, q)) 。若 p 不是核心点,则可达距离未定义

OPTICS算法流程

  1. 初始化所有点为"未处理"状态

  2. 遍历每个未处理的点 p :

​ ▪ p 是核心点,计算其所有 ε 邻域内的点,生成一个有序的种子列表(按可达距离排序)。

​▪从种子列表中选取可达距离最小的点 q ,标记为"已处理",并将其加入结果序列。

​▪若 q 是核心点,计算其邻域内点相对于 q 的可达距离,更新种子列表。

​3. 重复步骤2,直到所有点都被处理,生成最终的有序序列和可达距离

4.AGNES算法

(1).簇之间的距离变量

①簇最小距离

簇最小距离是两个簇成员之间的最小距离

②簇最大距离

③簇平均距离

簇平均距离是两个簇成员之间距离的平均值

④簇中心距离

(2).算法流程

AGNES(Agglomerative Nesting)是一种自底向上的层次聚类算法,其核心流程是从每个样本为单个簇开始,不断合并距离最近的簇,直到满足停止条件(如达到预设簇数)

1 .初始化簇

将数据集中的每个样本都视为一个独立的簇,即初始簇的数量等于样本数量 n ,记为 {C1,C2,...,Cn } 。

2.计算簇间距离矩阵

根据选择的簇间距离度量(如单链接、全链接、平均链接、重心距离等),计算所有簇对之间的距离,生成一个 n × n 的距离矩阵。

3.合并距离最近的两个簇

在距离矩阵中找到距离最小的两个簇 Ci 和 Cj ,将它们合并为一个新的簇 Cnew = Ci ∪ Cj 。

4:更新簇集合和距离矩阵

从簇集合中移除 Ci 和 Cj ,并将新簇 Cnew 加入簇集合。

重新计算新簇与所有剩余簇之间的距离,更新距离矩阵。

5.重复合并过程

重复步骤3和步骤4,直到满足停止条件(常见条件:簇的数量达到预设值、簇间最小距离超过某个阈值、所有样本合并为一个簇)。

相关推荐
海琴烟Sunshine2 小时前
leetcode 338. 比特位计数 python
python·算法·leetcode
闻缺陷则喜何志丹3 小时前
【贪心 字典序 回文 最长公共前缀】LeetCode3734. 大于目标字符串的最小字典序回文排列|分数未知
c++·算法·力扣·贪心·字典序·回文·最长公共前缀
weixin_514221853 小时前
FDTD代码学习-1
学习·算法·lumerical·fdtd
武子康4 小时前
AI研究-118 具身智能 Mobile-ALOHA 解读:移动+双臂模仿学习的开源方案(含论文/代码/套件链接)
人工智能·深度学习·学习·机器学习·ai·开源·模仿学习
长桥夜波4 小时前
机器学习日报12
人工智能·机器学习
AI柠檬4 小时前
机器学习:数据集的划分
人工智能·算法·机器学习
mm-q29152227294 小时前
YOLOv5(PyTorch)目标检测实战:TensorRT加速部署!训练自己的数据集(Ubuntu)——(人工智能、深度学习、机器学习、神经网络)
人工智能·深度学习·机器学习
搞科研的小刘选手4 小时前
【多所高校合作】第四届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2025)
图像处理·人工智能·机器学习·计算机视觉·数据挖掘·人脸识别·人机交互
让我们一起加油好吗5 小时前
【数论】裴蜀定理与扩展欧几里得算法 (exgcd)
算法·数论·裴蜀定理·扩展欧几里得算法·逆元