轉自: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>
<ignore_js_op>
不同情況下EMD使用方式也不一樣,但還是有一些共通之處。比如權重都是指特征量的重要程度。例如,一個直方圖對應一個簽名的情況下,直方圖中的每一根柱(bar)代表一個特征量,柱的高度就對應其權重。在之前的相似圖像檢索 (2009/10/3)一文中,我使用到了圖像顏色分布直方圖相交距離(Histogram Intersection ),也可以用在EMD中當作ground distance使用。最早提出EMD概念的論文中有提到,EMD最初就是用來做相似圖片檢索的。
運輸問題概述
<ignore_js_op>
<ignore_js_op>
很自然可以想到,給定兩個簽名,把一個變成另一個所需要的最小工作量,就是EMD對距離的定義,這里的「工作量」要基於用戶對ground distance的定義,即特征量之間的距離的定義。然而,當特征量非常多的時候,由於要做一一匹配,其計算量是非常大的。因此,有人提出了一種將多個特征量組合起來做向量量化編碼(Vector Quantization)后再組成簽名的方法。
EMD的一些優點可見這里
舉個栗子 <ignore_js_op>
<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的原文,在此基礎上增加了一些內容。