Kode untuk Earth Movers Distance (EMD)

Pengantar

Ini merupakan implementasi dari Earth Movers Distance, seperti yang dijelaskan dalam [1] . The Merck menghitung jarak antara dua distribusi, yang diwakili oleh tanda tangan. Tanda tangan adalah set fitur tertimbang yang menangkap distribusi. Fitur dapat dari jenis apa pun dan dalam jumlah dimensi, dan didefinisikan oleh pengguna.

The Merck didefinisikan sebagai jumlah minimum kerja yang diperlukan untuk mengubah satu tanda tangan ke yang lain. Gagasan "bekerja" didasarkan pada tanah jarak yang ditetapkan pengguna yang merupakan jarak antara dua fitur. Ukuran dari dua tanda tangan bisa berbeda. Juga, jumlah bobot dari satu tanda tangan dapat berbeda dari jumlah bobot dari yang lain (pertandingan parsial). Karena ini, Merck dinormalkan dengan jumlah yang lebih kecil.

Kode diterapkan di C, dan didasarkan pada solusi untuk masalah Transportasi seperti yang dijelaskan dalam [2]

Tolong beritahu saya tahu dari bug yang Anda temukan, atau pertanyaan, komentar, saran, dan kritik yang Anda miliki. Jika Anda menemukan kode ini berguna untuk pekerjaan Anda, saya ingin sekali mendengar dari Anda. Setelah Anda melakukannya, saya akan memberitahu Anda tentang perbaikan, dll Juga, pengakuan dalam publikasi yang menjelaskan pekerjaan yang menggunakan kode ini akan sangat dihargai.

Pemakaian

Untuk menggunakan kode, lakukan langkah-langkah berikut:

  1. download file emd.hdan emd.c (periksa log perubahan untuk perubahan terbaru).
  2. Dalam emd.h, memodifikasi baris

    typedef int feature_t;

    untuk mencerminkan fitur tipe data Anda. Struktur dapat digunakan juga, misalnya

    typedef struct {
       int X, Y, Z;
    } Feature_t;

  3. Untuk menghitung EMD, hubungi:

    mengapung EMD (signature_t * Signature1, signature_t * Signature2,
       mengambang (* func) (feature_t *, feature_t *),
       flow_t * Flow, int * FlowSize);

    dimana

    Signature1, Signature2:

    Pointer ke dua tanda tangan yang jarak mereka kita ingin menghitung.

    Dist:

    Pointer ke fungsi jarak tanah. yaitu fungsi yang menghitung jarak antara dua fitur.

    Flow:

    (Opsional) Pointer ke vektor flow_t (didefinisikan dalam emd.h) di mana aliran yang dihasilkan akan disimpan. Aliran harus memiliki unsur-unsur n2-1 n1 +, di mana n1 dan n2 adalah ukuran dari dua tanda tangan masing-masing. Jika NULL, aliran tidak dikembalikan.

    FlowSize:

    (Opsional) Dalam hal Flowtidak NULLFlowSize harus menunjuk ke integer mana jumlah elemen aliran (selalu kurang atau sama dengan n1 + n2-1) akan ditulis.

  4. Kompilasi emd.cdan link ke kode Anda.

Tipe data signature signature_tdidefinisikan dalam emd.hsebagai:

typedef struct
{
  int n; / * Jumlah fitur dalam distribusi * /
  feature_t * Fitur; / * Pointer untuk fitur vektor * /
  mengapung * Berat; / * Pointer untuk bobot fitur * /
} signature_t;

Jenis fitur data feature_tdidefinisikan dalam emd.hdan harus diubah oleh pengguna untuk mencerminkan jenis fitur nya.

Dalam kasus khusus, pengguna mungkin ingin mengubah beberapa nilai dalam definisi di emd.h:

#define MAX_SIG_SIZE 100

Maksimum yang diizinkan sejumlah fitur di tanda tangan

#define MAX_ITERATIONS 100

Jumlah maksimum iterasi. Untuk masalah biasa, 100 harus lebih dari cukup.

#define INFINITY 1e20

INFINITY harus jauh lebih besar dari nilai lain dalam masalah

#define EPSILON 1e-6

EPSILON menentukan akurasi dari solusi.

Contoh

  1. example1.c
    Dalam contoh ini fitur yang di ruang tiga dimensi, dan jarak tanah adalah jarak Euclidean. 
    Untuk mencoba contoh ini, Anda perlu untuk mengubah feature_tdalam emd.hmenjadi 

    typedef struct {int X, Y, Z; } Feature_t;

  2. example2.c
    Di sini, bukannya menyediakan fungsi untuk menghitung jarak tanah, mereka diberikan dalam matriks yang telah ditetapkan. Hal ini dilakukan dengan mendefinisikan feature_tsebagai int (default), dan pengaturan fitur di setiap tanda tangan untuk memiliki nomor berturut-turut. Fungsi jarak tanah menggunakan angka-angka ini sebagai indeks untuk biaya matriks yang telah ditetapkan. 
    Aliran yang dihasilkan dikembalikan dari emdfungsi dengan melewati sebagai parameter terakhir vektor flow_t, dan pointer ke intmana jumlah sebenarnya dari elemen arus akan ditulis. 
    Juga, dalam contoh ini total bobot dari dua tanda tangan yang berbeda. Tanda tangan pertama memiliki berat total 1 sedangkan tanda tangan kedua memiliki berat total 0,9.

Log perubahan

Tanggal decription
05/10/98 Berubah dari kesalahan cek mutlak untuk cek kesalahan relatif + Fixed bug yang menyebabkan "kesalahan tak terduga di findBasicVariables" pesan kesalahan (terima kasih Mark Ruzon)
03/04/98 Fixed bug yang kadang-kadang menyebabkan kecelakaan bila tanda tangan kedua hanya memiliki satu fitur (terima kasih Mark Ruzon)
03/31/98 Fixed bug dalam kasus di mana * baik * tanda tangan hanya memiliki satu fitur (terima kasih Rajesh Batra)

Referensi

[1] Y. Rubner , C. Tomasi , dan LJ Guibas . Sebuah Metric untuk Distribusi dengan Aplikasi untuk Database Gambar. Prosiding 1998 IEEE International Conference on Computer Vision, Bombay, India , Januari 1998, hlm. 59-66. 

[2] FS Hillier dan GJ Lieberman. Pengenalan Pemrograman Matematika McGraw-Hill , 1990.