zoukankan      html  css  js  c++  java
  • [转]Earth Mover's Distance (EMD)

    转自: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>emd_problem.jpg 

    <ignore_js_op>snap1.gif 
    不同情况下EMD使用方式也不一样,但还是有一些共通之处。比如权重都是指特征量的重要程度。例如,一个直方图对应一个签名的情况下,直方图中的每一根柱(bar)代表一个特征量,柱的高度就对应其权重。在之前的相似图像检索 (2009/10/3)一文中,我使用到了图像颜色分布直方图相交距离(Histogram Intersection ),也可以用在EMD中当作ground distance使用。最早提出EMD概念的论文中有提到,EMD最初就是用来做相似图片检索的。
    运输问题概述
    <ignore_js_op>snap2.gif 
    <ignore_js_op>snap3.gif 
    很自然可以想到,给定两个签名,把一个变成另一个所需要的最小工作量,就是EMD对距离的定义,这里的「工作量」要基于用户对ground distance的定义,即特征量之间的距离的定义。然而,当特征量非常多的时候,由于要做一一匹配,其计算量是非常大的。因此,有人提出了一种将多个特征量组合起来做向量量化编码(Vector Quantization)后再组成签名的方法。
    EMD的一些优点可见这里
    举个栗子 <ignore_js_op>EMD_example.jpg 

    <ignore_js_op>snap4.gif 
    Rubner的C语言实现首先我们尝试使用Rubner桑公开的C语言代码(example1.c),编译依赖emd.c和emd.h。其中特征量类型feature_t在emd.h中定义如下:
    typedef struct { int X,Y,Z; } feature_t;具体实现代码见emd.c。对于上述例子的解答如下:

    普通浏览复制代码
    1. # include <stdio.h>
    2. # include <math.h>
    3. # include "emd.h"
    4. /* 欧几里得距离 */
    5. float dist(feature_t *F1, feature_t *F2) {
    6.     int dX = F1->X - F2->X;
    7.     int dY = F1->Y - F2->Y;
    8.     int dZ = F1->Z - F2->Z;
    9.     return sqrt(dXdX + dY*dY + dZ*dZ);
    10. }
    11. int main() {
    12.     /* 分布P的特征矢量 */
    13.     feature_t f1[4] = { {100,40,22}, {211,20,2}, {32,190,150}, {2,100,100} };
    14.     /*分布Q的特征矢量 */
    15.     feature_t f2[3] = { {0,0,0}, {50,100,80}, {255,255,255} };
    16.     /*分布P的权重 */
    17.     float w1[5] = { 0.40.30.20.1 };
    18.     /*分布Q的权重 */
    19.     float w2[3] = { 0.50.30.2 };
    20.     /*分布P的签名 */
    21.     signature_t s1 = { 4, f1, w1 };
    22.     /*分布Q的签名 */
    23.     signature_t s2 = { 3, f2, w2};
    24.     /* 计算EMD */ 
    25.     float e; 
    26.     e = emd(&s1&s2, dist, 00); 
    27.     printf("emd = %f ", e); return 0; 
    28. }



    <ignore_js_op>snap5.gif 
    结束语本文对与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的原文,在此基础上增加了一些内容。

  • 相关阅读:
    机器学习1
    第15次作业
    算符优先分析
    自下而上语法分析
    实验二 递归下降语法分析
    LL(1)文法的判断,递归下降分析程序
    消除左递归
    【shell】通过shell编写ping包及arp的监控并发送短信
    os和sys模块
    time模块和random模块
  • 原文地址:https://www.cnblogs.com/jackyzzy/p/3314667.html
Copyright © 2011-2022 走看看