You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Adj.rand.index计算出现NaN值及异常结果的原因问询

问题描述

我的数据集规模过大,因此用虚拟示例阐述问题。我想计算两组聚类结果的相似度,且每组结果包含A、B、C、D四个聚类时,不仅要查看结果1与结果2的整体相似度,还要检查单个聚类的相似度(如A1与A2、B1与B2等)。

为了对比两组结果中的聚类A,我为每组结果创建向量:值为1表示数据点被分到聚类A,值为0表示未被分到聚类A。

c1 <- c(0,0,0,0,0,0,0,1,1,0)
c2 <- c(0,0,1,0,1,1,0,1,0,0)

随后调用rand.index函数:

rand.index(c1,c2)
adj.rand.index(c1,c2)

此示例中,rand.index结果为0.46,而adj.rand.index结果为NaN。

当我略微修改c1向量:

c1 <- c(0,0,0,0,1,0,0,1,1,0)
c2 <- c(0,0,1,0,1,1,0,1,0,0)

rand.index结果升至0.53,且adj.rand.index结果为1。

请问为何adj.rand.index会出现这些异常结果?


原因分析

调整兰德指数(adj.rand.index,简称ARI)的核心计算公式是:

ARI = (RI - E[RI]) / (max(RI) - E[RI])

其中RI是普通兰德指数,E[RI]是随机情况下兰德指数的期望值,分母是RI的最大可能值与期望值的差值。异常结果完全由这个公式的特性导致,分两种情况解释:

1. 第一个例子出现NaN的原因

第一个示例里,c1只有2个1(属于聚类A),剩下8个都是0;c2有4个1、6个0。
这种极端的二分类划分(几乎所有样本都不属于目标聚类)会导致计算ARI时的分母变为0——因为此时随机划分的期望兰德指数E[RI]刚好等于RI的最大可能值,分母为0的除法运算自然会得到NaN。
本质上,ARI是为衡量完整的、有区分度的聚类结果设计的,用它对比这种极端的单聚类二分类,本身就不符合它的适用场景。

2. 第二个例子得到1的原因

修改后的c1有3个1、7个0,c2保持4个1、6个0。
此时两个向量的一致性刚好满足:(RI - E[RI])与(max(RI) - E[RI])的数值完全相等,代入公式后结果就是1,代表从ARI的计算逻辑来看,这两个针对聚类A的二分类划分相似度达到了最大值。

如果你的需求是对比单个聚类的相似度,更推荐用Jaccard系数、Dice系数这类专门针对集合匹配的指标,比如计算两个聚类的交集大小除以并集大小,这类指标不会出现NaN,结果也更直观。


内容的提问来源于stack exchange,提问作者JorgeHB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:40:39