机器学习(二十二) 原型聚类:k均值算法、学习向量量化、高斯混合聚类

无监督学习 (unsupervised learning) 目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,此类学习任务中研究与应用最多的是"聚类"(clustering)。

22.1 聚类概述

"聚类"试图将样本集划分为若干个不相交的子集 - (cluster,亦称类)。++聚类仅能自动形成簇结构++ ,簇所对应的语义需要由使用者把握和命名。聚类任务中也可使用有标记训练样本,++++但样本的类标记与聚类产生的簇结构有所不同。++++

形式化:假定样本集D={x1, x2, ..., xm},每个样本xi=(xi1, xi2, ..., xin)是一个n维特征向量,聚类算法将样本集D划分为k个不相交的簇{C1, C2, ..., Ck},样本xi的"簇标记"(cluster label)表示为 λi ∈{1,2, ..., k},即xi∈Cλi。聚类结果可用簇标记向量 λ=(λ1, λ2, ..., λm)表示。

聚类能够找寻数据内在的分布结构,可作为分类等其他学习任务的前驱过程。例如,可先对数据进行聚类,根据聚类结果将每个簇定义为一个类,然后再基于这些类训练分类器,用于判别新数据的类型。

22.1.1 聚类性能度量

对聚类结果,需要通过某种性能度量评估其好坏;另一方面,可直接将其作为聚类过程的优化目标,更好地得到符合要求的聚类结果。什么样的聚类结果比较好?直观上看,我们希望"物以类聚"​,即同一簇的样本尽可能彼此相似,不同簇的样本尽可能不同。也就是说,++聚类结果的"簇内相似度" (intra-cluster similarity) 高且"簇间相似度" (inter-cluster similarity) 低++。

对于数据集D={x1, x2, ..., xm},聚类给出的簇划分为 C={C1, C2, ..., Ck},"参考模型"(reference model,例如领域专家给出的划分结果) 簇划分为 C*={C1*, C2*, ..., Cs*}。相应地,令 λi 与 λi* 表示样本 xi 在 C 和 C* 分别对应的簇标记。

a=|SS|, SS={(xi, xj) | λi=λj, λi*=λj*, i<j}

b=|SD|, SD={(xi, xj) | λi=λj, λi*≠λj*, i<j}

......

集合SS包含了++++在C中隶属于相同簇且在C*中也隶属于相同簇的样本对(xi, xj)(i<j),++++集合SD包含了在C中隶属于相同簇但在C*中隶属于不同簇的样本对 ...... 每个样本对(xi,xj)(i<j)仅能出现在一个集合中,因此有a+b+c+d=m(m-1)/2成立。由此得出以下常用的聚类性能度量"外部指标" (external index,即将聚类结果与某个参考模型进行比较):

• Jaccard系数 (Jaccard Coefficient,简称JC)

JC = a/(a+b+c)

• FM指数 (Fowlkes and Mallows Index,简称FMI)

FMI = √(a/(a+b) · a/(a+c))

• Rand指数 (Rand Index,简称RI)

RI = 2(a+d)/m(m-1)

22.1.2 样本距离计算

给定样本xi=(xi1, xi2, ..., xin)与xj=(xj1, xj2, ..., xjn),最常用的是++"闵可夫斯基距离"(Minkowski distance)++ :

dist-mk(xi, xj) = = (|xi1-xj1|^p+|xi2-xj2|^p+...+|xin-xjn|^p)^(1/p)

p=2时,dist-mk(xi, xj)即++欧氏距离(Euclidean distance)++ :

dist-ed(xi, xj) = = (|xi1-xj1|^2+|xi2-xj2|^2+...+|xin-xjn|^2)^(1/2)

p=1时,dist-mk(xi, xj)即++曼哈顿距离(Manhattan distance)++ :

dist-man(xi, xj) = = |xi1-xj1|+|xi2-xj2|+...+|xin-xjn|

当样本空间中不同属性的重要性不同时,可使用++"加权距离"(weighted distance)++ :

dist-wmk(xi, xj) =

以上距离计算公式都是事先定义好的,但在不少现实任务中,有必要基于数据样本确定合适的距离计算式,这需要通过"距离度量学习"(distance metric learning)实现。

22.2 原型聚类

"原型"是指样本空间中具有代表性的点。原型聚类亦称"基于原型的聚类"(prototype-based clustering),此类算法假设聚类结构能通过一组原型刻画(构建)。

22.2.1 k均值算法

给定样本集D={x1, x2, ..., xm},++k均值(k-means)算法针对聚类的簇划分C={C1, C2, ..., Ck} 最小化平方误差++

其中 是簇Ci的中心点(向量)。直观来看,上述平方误差E计算式在一定程度上刻画了簇内样本围绕簇中心点的紧密程度,最小化E值则最大化簇内样本相似度。

k均值算法流程:

  1. 从样本集D中随机选择k个样本作为一组初始中心点 {μ1, μ2, ..., μk}

  2. Repeat

  3. for j=1,2, ..., m do

  4. 计算每个样本xj与各中心点μi的距离:dji=||xj-μi||2

  5. 以距离最近的中心点确定样本xj对应的簇标记 λj 与簇 Cλj

  6. end for

  7. for i=1,2, ..., k do

  8. 根据新划分的簇,重新计算每个簇的中心点向量:

  9. if μi≠μi* : 更新当前中心点:μi=μi*

  10. end for

  11. Until 当前中心点 {μ1, μ2, ..., μk}不再变化

输出:簇划分C={C1, C2, ..., Ck}

中心点及簇划分迭代更新的过程如图所示:

<每个中心点及其对应的簇的更新过程表现了以中心点向量为原型,在迭代中逐渐寻找和确认与其它中心点相比较之下彼此相似度最高的样本子集。>

22.2.2 学习向量量化

与k均值算法类似,++​"学习向量量化"(Learning Vector Quantization,简称LVQ)也是通过找到一组"原型向量"刻画(构建)聚类结构++ 。++但LVQ假设数据样本带有类别标记,学习过程利用样本的这些监督信息辅助聚类++。

给定样本集D={(x1,y1), (x2,y2), ..., (xm,ym)},每个样本 xj 是n维特征向量(xj1, xj2, ..., xjn), yj∈Y是样本 xj 的类别标记。LVQ的目标是学得一组"n维原型向量"{P1, P2, ..., Pq},每个原型向量对应的类别标记 {t1, t2, ..., tq}, ti∈Y。每个原型向量 Pi 代表一个聚类簇。

学习向量量化 (LVQ) 算法流程:

令学习率η∈(0,1)

  1. 对原型向量 {P1, P2, ..., Pq} 进行初始化,例如可从类别标记为 ti 的样本中随机选取一个作为原型向量 Pi

  2. Repeat

  3. for j=1,2, ..., m do

  4. 计算样本 (xj, yj) 与每个原型向量 Pi 之间的距离:dji=||xj-Pi||2

  5. 找出与 xj 距离最近的原型向量 Pi* 及其类别标记 ti*

  6. if yj=ti* : P' = Pi* + η(xj-Pi*)
    <若距离最近的原型向量 Pi* 与 xj 的类别标记相同,
    ||P'-xj||2 = ||Pi* + η(xj-Pi*) -xj||2 = (1-η)||Pi*-xj||2

可以看出原型向量 Pi* 在更新为 P' 之后与 xj 之间的距离缩小,即Pi* (即P') 向 xj 的方向靠拢。>

  1. else : P' = Pi* - η(xj-Pi*)
    <同理,若Pi*与xj的类别标记不同,则更新为P'之后与xj之间的距离将增大为 (1+η)·||Pi*-xj||2,即Pi* (即P') 向 xj 的方向远离。>

  2. 更新原型向量 Pi*=P'

  3. end for

  4. Until 满足停止条件 (例如已达到最大迭代轮数,或原型向量更新很小甚至不再更新)

输出:原型向量{P1, P2, ..., Pq}

LVQ算法(q=5)迭代不同轮次之后,原型向量及簇划分的更新过程如图所示:

最终学得一组原型向量{P1, P2, ..., Pq}后,即可实现对样本空间的簇划分:对任意样本xi,它将划入与其距离最近的原型向量所代表的簇中。也就是说,每个原型向量Pi定义了一个与之相关的区域Ri,此区域中每个样本与Pi的距离不大于它与其他原型向量之间的距离。

若将Ri中全部样本以原型向量Pi表示,则可实现数据的++"有损压缩"(lossy compression)++ ,这称为++"向量量化"(vector quantization)++,LVQ由此得名。

22.2.3 高斯混合聚类

与k均值、LVQ使用原型向量刻画(构建)聚类结构不同,高斯混合 (Mixture-of-Gaussian) 聚类采用概率模型刻画(构建)聚类结构。

++高斯分布由 n维均值向量 μi 和 n×n协方差矩阵 Σi 这两个参数确定++ 。++假设样本x服从高斯分布 N(x | μi, Σi) ,则样本x在高斯分布(μi, Σi)中的概率密度函数记为 p(x | μi, Σi) :++

++由此可定义样本x在 "高斯混合分布" 中的概率密度函数为 :++

<∫pM(x)dx=1,Σ(i=1,k)αi=1>

++此 "高斯混合分布" 由k个高斯成分(μi, Σi)组成,其中 αi 为相应的"混合系数" (mixture coefficient)++。

假设样本x的生成过程由高斯混合分布给出:首先,根据α1,α2,...,αk定义的先验概率分布选择高斯成分,然后,根据被选择的高斯成分的概率密度函数进行采样,从而生成相应的样本。

<高斯混合分布 (Gaussian Mixture Model, GMM) 生成样本的具体步骤如下:

假设有两个高斯成分 (k=2),参数如下:

成分1:权重α1=0.3,均值μ1=[0,0],协方差矩阵Σ1 = (标准正态分布)

成分2:权重α2=0.7, 均值μ2=[5,5],协方差矩阵Σ2 = (椭圆分布,主轴与坐标轴成45°)

  1. 选择成分 :

生成一个[0,1]区间内的均匀随机数u。若u≤0.3,选择成分1;否则选择成分2。

  1. 从选中的高斯成分中采样 :

成分1采样 : 使用++标准正态分布++生成 x1, x2∼N(0,1)

Python实现 : sample = ++np.random.multivariate_normal++(μ1, Σ1)

成分2采样 : ++通过Cholesky分解 (Σ=LLᵀ) 生成协方差矩阵Σ的平方根L,再结合标准正态分布采样++。

Python实现 :

++L = np.linalg.cholesky(Σ2)++

++z = np.random.randn(2)++

++sample = μ2 + L @ z++

生成的样本会集中在两个区域:一个以(0,0)为中心(成分1),另一个以(5,5)为中心(成分2)。由于成分2的权重更高(70%),大部分样本会落在(5,5)附近,但仍有30%的样本在(0,0)附近。

>

若训练集D={x1, x2, ..., xm} 由上述过程生成,++令随机变量 zj ∈{1, 2, ..., k} 表示生成样本xj的高斯成分,其取值未知 <隐变量>++。显然,zj的先验概率P(zj=i)对应于 αi (i=1,2,...,k)。根据贝叶斯定理,zj 的后验分布对应于

++由此 pM(zj=i | xj) 给出样本xj由第i个高斯成分生成的后验概率,将其简记为 γji (i=1,2,...,k)++。

++当高斯混合分布确定时,高斯混合聚类把样本集D也划分为k个簇 C={C1, C2, ..., Ck},每个样本 xj 的簇标记 λj 如下确定:++

++λj = argmax(i∈{1,2,...,k}) γji++

从原型聚类的角度来看,高斯混合聚类是采用高斯分布概率模型对原型(样本集)进行刻画,簇划分由原型(样本)对应的生成概率 γji 最大的高斯成分 i 确定。

高斯混合聚类算法流程:

样本集D={x1, x2, ..., xm}

高斯混合分布个数为k

  1. 初始化高斯混合分布的模型参数 {(αi, μi, Σi ) | 1≤i≤k} <想象:太阳系太空的混沌之初>

  2. Repeat

  3. for j=1, 2, ..., m do

  4. 根据 pM(zj=i | xj) 计算每个样本 xj 由各高斯成分 (αi, μi, Σi) 生成的后验概率 γji

  5. end for

  6. for i=1, 2, ..., k do

  7. 基于每个样本γji,计算高斯成分 i 新的均值向量 :

μi* = Σ(j=1,m)γjixj / Σ(j=1,m)γji

  1. 基于每个样本γji,计算高斯成分 i 新的协方差矩阵 :

Σi* = Σ(j=1,m)γji(xj-μi*)(xj-μi*)T / Σ(j=1,m)γji

  1. 基于每个样本γji,计算高斯成分 i 新的混合系数 :

αi* = Σ(j=1,m)γji /m

  1. end for

  2. 更新高斯概率模型参数 {(αi, μi, Σi) | 1≤i≤k} = {(αi*, μi*, Σi*) | 1≤i≤k}

  3. Until 满足停止条件 (例如已达到最大迭代轮数,或似然函数LL(D)增长很少甚至不再增长) <想象:太阳系行星系统形成:木星、土星、地球、火星 ...>

  4. for j=1, 2, ..., m do

  5. 从最后一次迭代中选择最大的 γji 确定样本 xj 的簇标记 λj,并将 xj 划分到相应的簇 Cλj

<想象:每一粒尘埃都归属到自己的星球>

  1. end for

输出:簇划分C={C1, C2, ..., Ck}

以西瓜数据集4.0为例,令高斯混合分布k=3,将高斯混合分布的模型参数初始化为:

高斯混合系数 α1=α2=α3=1/3;

均值向量 μ1=x6=(0.403, 0.237),μ2=x22=(0.714, 0.346),μ3=x27=(0.532, 0.472);

2×2协方差矩阵 Σ1=Σ2=Σ3=[[0.1, 0.0], [0.0, 0.1]]。

在第一轮迭代中,以样本x1=(0.697, 0.460)为例,通过Python程序精确计算出x1由各高斯成分生成的后验概率为 γ11=0.219,γ12=0.404,γ13=0.377。

根据每个样本由各高斯成分生成的后验概率 γji 更新模型参数αi、μi、Σi

模型参数更新后,重复执行上述过程若干轮次,高斯混合聚类更新过程如图所示:

相关推荐
东离与糖宝2 小时前
告别AI投毒!Java后端实现大模型prompt过滤与敏感信息拦截实战
java·人工智能
xiami_world2 小时前
6款思维导图软件深度评测:协作、AI能力与工具选型对比
人工智能·ai·信息可视化·思维导图
qq_454245032 小时前
AI自改进的复杂度边界
人工智能
新缸中之脑2 小时前
Chrome 146:终结专用AI浏览器?
前端·人工智能·chrome
政安晨2 小时前
政安晨【零基础玩转开源AI项目】玩转OpenClaw:让AI拥有“双手“的智能体框架完全指南
人工智能·openclaw·clawbot·养虾·openclaw完全指南·养小龙虾完全指南·开源openclaw
产品人卫朋2 小时前
如何在平凡的生活中看到商机?
人工智能·产品经理·ipd流程
昨日之日20062 小时前
FLUX.2-klein-kv - 又轻又快 新一代AI文生图/图像编辑模型 KV缓存加速迭代 支持50系显卡 一键整合包下载
人工智能·ai作画