Affinity Propagation聚类实战:从原理到代码实现

1. 什么是Affinity Propagation聚类?它能帮你解决什么问题?

如果你玩过“找朋友”的游戏,大概能理解聚类的意思——把一堆人按照他们的相似度分成几个小圈子。在数据科学里,我们面对的不是人,而是一堆数据点,比如用户画像、商品特征、文章关键词等等。聚类的目标就是让机器自动把这些数据点分门别类,把相似的归到一起,不相似的分开。

今天要聊的Affinity Propagation(AP)聚类,就是一种挺特别的“找朋友”算法。我第一次接触它是在处理一批用户行为数据时,当时用K-Means试了好几次,总感觉分出来的群组有点“硬凑”,因为K-Means需要你事先告诉它“要分成几类”。这就像你还没开始游戏,就得先规定好最终要有几个朋友圈子,这在实际问题里往往很难事先确定。

AP算法最吸引我的地方就在于,它不需要你指定最终的聚类数量。它会自动从所有数据点里,找出那些最有“领袖气质”的点作为聚类中心(它管这些中心叫“Exemplar”),然后把其他点分配给这些中心。这个“领袖气质”不是凭空来的,而是通过数据点之间互相“投票”和“拉票”迭代计算出来的,整个过程非常有趣,模拟了社交网络中的信息传播。

所以,AP聚类特别适合那些你心里没谱、不知道数据里到底藏着几个自然类别的场景。比如,分析一批新闻文章的主题分布,或者对未知的客户群体进行细分。它的结果往往更“自然”,因为聚类中心是真实存在的数据点,而不是像K-Means那样计算出来的虚拟均值点。不过,天下没有免费的午餐,AP的强大也带来了计算上的代价,这个我们后面会详细说。

2. AP聚类的核心原理:一场数据点间的“选举”

要理解AP,咱们可以把它想象成一场热闹的“班级选举”,目标是选出几位班长(聚类中心),其他同学(数据点)则选择跟随哪位班长。

2.1 构建“好感度”网络:相似度矩阵

选举开始前,大家得互相了解一下。AP算法做的第一件事,就是计算每两个数据点之间的相似度(Similarity),形成一个相似度矩阵(S Matrix)。通常,我们用负的欧几里得距离来表示这个相似度。为什么是负的?因为距离越近表示越相似,我们想让相似度值越大越好,所以取个负号。比如点A和点B距离是5,那么它们的相似度 s(A, B) = -5。

这里有个关键角色叫 Preference。你可以把它理解为每个同学的“竞选意愿”或“自我认同感”。在算法里,它通常被设置为相似度矩阵对角线上的值。这个值越大,说明这个数据点越倾向于把自己当作一个聚类中心。如果你把所有点的Preference都设成一个统一的值(比如所有相似度的中位数),那么算法就会根据数据分布自动决定中心的数量。调高Preference值,会鼓励算法选出更多的聚类中心;调低它,中心数量则会减少。 这是AP算法中为数不多需要你手动干预的重要参数之一。

2.2 第一轮投票:吸引度矩阵

选举开始了,第一轮是“提名投票”,对应AP里的 吸引度矩阵(R Matrix)。它的计算反映了“点i认为点k有多适合当自己的班长”。

具体公式是:R(i, k) = S(i, k) - max{ A(i, k') + S(i, k') },其中 k' 表示除了k以外的所有其他候选点。

这个公式怎么理解呢?S(i, k) 是i对k的直接好感分。A(i, k') + S(i, k') 代表了i如果选择其他班长k'可能获得的总“收益”。R(i, k) 就是k相对于i的最佳备选班长的优势程度。如果这个值很大且为正,说明k在i眼里是远超其他人的优秀班长候选人;如果是负值,说明i觉得还有别人比k更合适。

我刚开始看这个公式也觉得绕,后来用个例子就明白了。假设计算 R(小明, 小红)S(小明, 小红) 是小红对小明的直接吸引力。然后小明会看,如果选小刚(A(小明, 小刚)+S(小明, 小刚))或者选小华(A(小明, 小华)+S(小明, 小华))会得到多少“好处”,取其中最大的那个。最后用小红直接的吸引力减去这个最大的“备选好处”,就得到了小红在小明这里的净吸引力。这个值会不断更新。

2.3 第二轮拉票:归属度矩阵

第一轮投票结束后,潜在的班长们(那些吸引度高的点)开始“拉票”了。这就是 归属度矩阵(A Matrix)。它衡量的是“点k认为点i有多适合成为自己的成员”。

它的计算分两部分:

  1. 对于对角线元素(自我归属度)A(k, k) = sum( max(0, R(i', k)) ),对所有 i' ≠ k 求和。这意思是,班长k看看有多少同学给他投了正面的提名票(R>0),把这些正面票数加起来,就是他的“群众基础”或“支持度”。支持度越高,他当班长的底气越足。
  2. 对于非对角线元素A(i, k) = min( 0, R(k, k) + sum( max(0, R(i', k)) ) ),其中 i' 既不是i也不是k。这可以理解为,班长k在争取同学i时,会考虑自己的“群众基础”(除了i以外的支持度)加上“自我认同感” R(k, k)。然后告诉同学i:“你看,我的基本盘这么稳(总和),你加入我这边,最多也就是让这个总和不变(因为取min(0, ...)),不会拖后腿,但也不会额外增加太多负担。” 这个值通常是负的或零,起到了抑制某些点盲目宣称自己有很多成员的作用。

2.4 决策与迭代:评估矩阵与阻尼因子

每一轮投票和拉票后,我们会把吸引度矩阵R和归属度矩阵A加起来,得到 评估矩阵(C Matrix)C(i, k) = R(i, k) + A(i, k)

对于每个点i,我们找出C(i, k)值最大的那个k。如果这个k正好就是i自己(即C(i, i)最大),那么恭喜,点i成功当选为聚类中心(Exemplar)。否则,点i就选择那个使C(i, k)最大的点k作为它的中心。

这个过程不是一次完成的,而是反复迭代。R和A矩阵会根据上一轮的结果不断更新,直到聚类中心不再变化,或者达到最大迭代次数。

为了防止迭代过程中“票数”震荡过大、无法收敛,AP引入了一个 阻尼因子(Damping factor),通常取值在0.5到1之间。更新R和A时,会混合上一轮的值:新值 = λ * 旧值 + (1 - λ) * 根据公式计算的新值。λ就是阻尼因子。这个参数对收敛速度影响很大,一般设置在0.5到0.9之间。值越大,收敛越慢但越平稳;值太小可能导致振荡。

3. 手把手实现:从零开始与调用sklearn

理解了原理,咱们来动手实现。我会展示两种方式:一种是纯Python手搓核心迭代过程,帮你彻底吃透;另一种是用scikit-learn快速实战。

3.1 纯Python实现核心迭代(理解本质)

我们先来模拟一下原理部分提到的那个5个参与者的简单例子。这个例子数据维度清晰,非常适合用来验证我们对公式的理解。

import numpy as np

# 示例数据:5个参与者,5个特征维度 (Tax Rate, Fee, Interest Rate, Quantity Limit, Price Limit)
# 数据已简化,实际中可能需要标准化
data = np.array([
    [3, 4, 3, 2, 1], # Alice
    [4, 3, 5, 1, 1], # Bob
    [3, 5, 3, 3, 3], # C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值