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

使用R语言emdist包计算不同样本量分布的EMD问题

问题分析与解决方案

报错原因:对emdist包输入格式的误解

你遇到的A and B must be matrices of the same dimensions报错,核心是emd2d函数的设计目标是处理同维度的直方图数据,而非直接处理不同数量的离散观测点。它要求两个输入矩阵的行、列数完全一致,每个矩阵元素对应二维空间中一个bin的质量,而非你构造的“观测值+权重”的结构。

emdist包各函数的正确用法

emdist包的几个EMD函数适用场景不同,针对你的需求(不同数量的一维离散点),正确的函数是emdr,而非emd2d或emd:

  • emd:用于一维直方图,要求输入两个长度相同的向量(对应每个bin的质量)。
  • emd2d:用于二维直方图,要求两个同维度矩阵。
  • emdr:专门用于不同数量的离散点集的EMD计算,需要分别传入点坐标、点对应的质量(权重)。

针对你的需求的正确代码

你的核心需求是计算sample和sample2中variable列的EMD,且权重可忽略(每个点质量相同),以下是正确实现:

library(emdist)

# 提取需要计算的变量列
sample_var <- sample[, "variable"]
sample2_var <- sample2[, "variable"]

# 构造权重:每个点质量相同,归一化到总和为1(也可以用rep(1, n),EMD会自动处理)
wx <- rep(1 / length(sample_var), length(sample_var))
wy <- rep(1 / length(sample2_var), length(sample2_var))

# 用emdr计算一维离散点的EMD
emd_result <- emdr(x = sample_var, wx = wx, y = sample2_var, wy = wy, dist = "manhattan")
print(emd_result)

代码说明

  • x和y分别传入两个分布的观测点向量(一维)。
  • wx和wy是对应点的质量权重,这里设置为均匀分布(每个点占比相同),如果不需要归一化,直接用wx = rep(1, length(sample_var))也可以,EMD会自动处理两个分布质量总和的差异。
  • dist参数指定点之间的距离度量,这里用曼哈顿距离,你也可以根据需求改为"euclidean"等。

为什么之前用emd/emdr返回0?

你之前错误地将“观测值+权重”的矩阵直接传入emd或emdr,导致函数无法正确解析点坐标和权重,从而计算出错误的0值。只有当输入格式完全符合函数要求时,才能得到正确结果。

替代方案:使用transport包(可选)

如果你觉得emdist包的参数设计不够直观,可以尝试transport包,它的emd函数更直接支持离散点的EMD计算:

library(transport)
emd_result <- emd(a = sample_var, b = sample2_var)
print(emd_result)

这个函数会默认将每个点的质量设为1,自动计算两个离散分布的EMD。

内容的提问来源于stack exchange,提问作者flâneur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:32:47