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

如何用xtabs创建包含模型自对比值的对称矩阵?

嘿,咱们一步步来搞定这个对称矩阵的问题吧!

先看看当前的xtabs矩阵

先运行你提供的代码,生成的dm是个有向交叉表——只有你记录过的单向比较有值,反向和对角线位置都是0:

d <- data.frame(M1 = c("M1", "M1", "M1", "M2", "M2", "M3"), M2 = c("M2", "M3", "M4", "M3", "M4", "M4"), C = c(1, 1, 4, 2, 2, 6))
dm = xtabs(C~M1+M2, data=d)
dm

输出结果:

M2
M1   M2 M3 M4
  M1  1  1  4
  M2  0  2  2
  M3  0  0  6
第一步:转成对称矩阵

因为你提到单向比较的结果和反向一致,那我们可以把矩阵转置后和原矩阵合并,让反向位置也补上对应的值。这里用pmax()函数,能自动把原矩阵和转置矩阵的对应位置取最大值(刚好覆盖原矩阵里的0值):

# 生成对称矩阵
sym_dm <- pmax(dm, t(dm))

现在sym_dm就变成双向都有值的矩阵了:

M2
M1   M2 M3 M4
  M1  1  1  4
  M2  1  2  2
  M3  1  2  6

如果你需要的是取双向的均值(比如万一后续有双向记录的话),可以换成这个:

sym_dm <- (dm + t(dm)) / 2
第二步:补全自对比的对角线值

模型和自身的对比,通常我们默认评分为0(你可以根据需求改成其他数值),直接给对角线赋值就行:

# 获取所有模型名称
model_names <- rownames(sym_dm)
# 给对角线设置为0
diag(sym_dm)[model_names] <- 0

现在最终的对称矩阵就完整了:

M2
M1   M2 M3 M4
  M1  0  1  4
  M2  1  0  2
  M3  1  2  0
可选:只保留M1、M2、M3三个模型

如果你只关心这三个模型的对比结果,可以筛选一下:

sym_dm_subset <- sym_dm[c("M1","M2","M3"), c("M1","M2","M3")]

得到的结果:

M2
M1   M1 M2 M3
  M1  0  1  1
  M2  1  0  2
  M3  1  2  0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:25:06