Giới thiệu 

Đây là việc thực hiện Khoảng cách Movers Trái đất, như được mô tả trong [1]. EMD tính toán khoảng cách giữa hai bản phân phối, được biểu diễn bằng chữ ký. Chữ ký là tập hợp các tính năng có trọng số nắm bắt các bản phân phối. Các tính năng có thể thuộc bất kỳ loại nào và trong bất kỳ số thứ nguyên nào và được xác định bởi người dùng.

EMD được định nghĩa là số lượng công việc tối thiểu cần thiết để thay đổi chữ ký này thành chữ ký khác. Khái niệm “công việc” dựa trên khoảng cách mặt đất do người dùng xác định là khoảng cách giữa hai tính năng. Kích thước của hai chữ ký có thể khác nhau. Ngoài ra, tổng trọng số của một chữ ký có thể khác với tổng trọng số của một phần khác (kết hợp từng phần). Bởi vì điều này, EMD được chuẩn hóa bởi tổng nhỏ hơn.

Mã được thực hiện trong C và dựa trên giải pháp cho vấn đề Giao thông vận tải như được mô tả trong [2]

Vui lòng cho tôi biết về bất kỳ lỗi nào bạn tìm thấy hoặc bất kỳ câu hỏi, nhận xét, đề xuất và phê bình nào mà bạn có. Nếu bạn thấy mã này hữu ích cho công việc của bạn, tôi rất muốn nghe từ bạn. Một khi bạn làm, tôi sẽ thông báo cho bạn về bất kỳ cải tiến, vv Ngoài ra, một sự thừa nhận trong bất kỳ ấn phẩm nào mô tả công việc sử dụng mã này sẽ được đánh giá cao.

Sử dụng 

Để sử dụng mã, hãy thực hiện các bước sau:

1.tải xuống các tệp emd.h và emd.c (kiểm tra nhật ký thay đổi để biết các thay đổi mới nhất).

2.Trong emd.h, sửa đổi dòng

typedef int feature_t;

để phản ánh loại dữ liệu tính năng của bạn. Các cấu trúc có thể được sử dụng quá, ví dụ

typedef struct {

    int X, Y, Z;

} feature_t;

3.Để tính toán EMD, hãy gọi:

float emd (signature_t * Chữ ký1, chữ ký_t * Chữ ký 2,

float (* func) (feature_t *, feature_t *),

flow_t * Flow, int * FlowSize);

Ở đâu

Chữ ký 1, Chữ ký 2:

Con trỏ đến hai chữ ký mà khoảng cách của chúng ta muốn tính toán.

Quận:

Con trỏ đến hàm khoảng cách mặt đất. tức là hàm tính toán khoảng cách giữa hai đối tượng địa lý.

Lưu lượng:

(Tùy chọn) Con trỏ tới một vectơ của flow_t (được định nghĩa trong emd.h), nơi lưu lượng kết quả sẽ được lưu trữ. Lưu lượng phải có các phần tử n1 + n2-1, trong đó n1 và n2 là kích thước của hai chữ ký tương ứng. Nếu NULL, luồng không được trả về.

FlowSize:

(Tùy chọn) Trong trường hợp Flow không phải là NULL, FlowSize phải trỏ đến một số nguyên nơi số lượng các phần tử dòng chảy (luôn luôn nhỏ hơn hoặc bằng n1 + n2-1) sẽ được ghi.

4.Biên dịch emd.c và liên kết nó với mã của bạn.

Chữ ký kiểu dữ liệu signature_t được định nghĩa trong emd.h là:

typedef struct

{

int n; / * Số lượng đối tượng trong bản phân phối * /

feature_t * Tính năng; / * Con trỏ đến các tính năng vector * /

float * Trọng lượng; / * Con trỏ tới trọng số của các tính năng * /

} signature_t;

Tính năng loại dữ liệu tính năng được định nghĩa trong emd.h và phải được người dùng sửa đổi để phản ánh loại đối tượng địa lý của anh ấy.

Trong trường hợp đặc biệt, người dùng có thể muốn thay đổi một số giá trị trong các định nghĩa trong emd.h:

#define MAX_SIG_SIZE 100

Số lượng tính năng tối đa được phép trong chữ ký

#define MAX_ITERATIONS 100

Số lần lặp tối đa. Đối với các vấn đề thông thường, 100 nên là quá đủ.

#define INFINITY 1e20

INFINITY phải lớn hơn nhiều so với bất kỳ giá trị nào khác trong vấn đề

#define EPSILON 1e-6

EPSILON xác định độ chính xác của giải pháp.

 

Ví dụ

1.example1.c

Trong ví dụ này, các tính năng trong không gian ba chiều, và khoảng cách mặt đất là khoảng cách Euclide.

Để thử ví dụ này, bạn cần sửa đổi feature_t trong emd.h thành

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

2.example2.c

Ở đây, thay vì cung cấp một hàm để tính toán khoảng cách mặt đất, chúng được đưa ra trong một ma trận được xác định trước. Điều này được thực hiện bằng cách xác định feature_t là int (mặc định), và thiết lập các tính năng trong mỗi chữ ký để có các số liên tiếp. Hàm khoảng cách mặt đất sử dụng các số này làm chỉ mục cho ma trận chi phí được xác định trước.

Luồng kết quả được trả về từ hàm emd bằng cách truyền tham số cuối cùng là một vectơ của flow_t, và một con trỏ tới int nơi mà số lượng các phần tử luồng thực tế sẽ được viết.

Ngoài ra, trong ví dụ này, tổng trọng số của hai chữ ký là khác nhau. Chữ ký đầu tiên có tổng trọng số là 1 trong khi chữ ký thứ hai có tổng trọng số là 0,9.

 

Nhật ký thay đổi

 

Ngày

Sự miêu tả

05/10/98 Đã thay đổi từ kiểm tra lỗi tuyệt đối thành kiểm tra lỗi tương đối + Sửa lỗi gây ra thông báo lỗi “Lỗi không mong muốn trong findBasicVariables” (cảm ơn Mark Ruzon)
03/04/98 Đã khắc phục lỗi đôi khi gây ra sự cố khi chữ ký thứ hai chỉ có một tính năng (cảm ơn Mark Ruzon)
03/31/98 Đã khắc phục lỗi trong trường hợp cả chữ ký * cả * chỉ có một tính năng (nhờ Rajesh Batra)

Tài liệu tham khảo

Orignal Source: https://users.cs.duke.edu/~tomasi/software/emd.htm