转自:http://www.sigvc.org/bbs/forum.php?mod=viewthread&tid=981
Earth Mover's Distance (EMD)
原文: http://d.hatena.ne.jp/aidiary/20120804/1344058475
作者: sylvan5
翻译: Myautsai和他的朋友们(Google Translate、shuanger、qiu)
本文将讨论Earth Mover’s Distance (EMD),和欧式距离一样,它们都是一种距离度量的定义、可以用来测量某两个分布之间的距离。EMD主要应用在图像处理和语音信号处理领域,在自然语言处理上很少有听说。
EMD 问题如下图所示
<ignore_js_op>
Rubner的C语言实现首先我们尝试使用Rubner桑公开的C语言代码(example1.c),编译依赖emd.c和emd.h。其中特征量类型feature_t在emd.h中定义如下:
typedef struct { int X,Y,Z; } feature_t;具体实现代码见emd.c。对于上述例子的解答如下:
普通浏览复制代码
-
# include <stdio.h>
-
# include <math.h>
-
# include "emd.h"
-
/* 欧几里得距离 */
-
float dist(feature_t *F1, feature_t *F2) {
-
int dX = F1->X - F2->X;
-
int dY = F1->Y - F2->Y;
-
int dZ = F1->Z - F2->Z;
-
return sqrt(dXdX + dY*dY + dZ*dZ);
-
}
-
int main() {
-
/* 分布P的特征矢量 */
-
feature_t f1[4] = { {100,40,22}, {211,20,2}, {32,190,150}, {2,100,100} };
-
/*分布Q的特征矢量 */
-
feature_t f2[3] = { {0,0,0}, {50,100,80}, {255,255,255} };
-
/*分布P的权重 */
-
float w1[5] = { 0.4, 0.3, 0.2, 0.1 };
-
/*分布Q的权重 */
-
float w2[3] = { 0.5, 0.3, 0.2 };
-
/*分布P的签名 */
-
signature_t s1 = { 4, f1, w1 };
-
/*分布Q的签名 */
-
signature_t s2 = { 3, f2, w2};
-
/* 计算EMD */
-
float e;
-
e = emd(&s1, &s2, dist, 0, 0);
-
printf("emd = %f\n", e); return 0;
-
}
<ignore_js_op>
结束语本文对与EMD的讨论力求准确,但是错误难免,敬请批评指正,同时请参考其他文献。
参考文献
- Earth mover’s distance - Wikipedia link
- Y. Rubner, C. Tomasi and L. J. Guibas: The earth mover’s distance as a metric for image retrieval (PDF), International Journal of Computer Vision, 40(2), pp.99-121, 2000 - EMDの原論文。EMDを類似画像検索に適用しています。
- Code for the Earth Movers Distance (EMD) - Rubnerさんが公開されているC言語実装 link
- Fast Earth Mover’s Distance (EMD) Code - EMDを高速計算する実装 link
- 柳本, 大松: Earth Mover’s Distanceを用いたテキスト分類、人工知能学会全国大会, 2007. - EMDの説明がわかりやすい。画像や音声の手法がテキストにも使えるんですね。
- lpSolve - R言語のlpSolveのマニュアル。lp.transform()の詳しい仕様はここで。
- Formal definition of EMD
this article is mainly based on the original text written by sylvan5 on aidiary.some additional contents are added by mckelvin.
本文主要基于sylvan5发表在aidiary的原文,在此基础上增加了一些内容。