2016-08-11 20 views
5

Tôi đang cố gắng để hiểu những gì đang xảy ra với tính toán của tôi về khoảng cách canberra. Tôi viết hàm canberra.distance đơn giản của riêng mình, tuy nhiên kết quả không nhất quán với hàm dist. Tôi đã thêm tùy chọn na.rm = T vào chức năng của mình, để có thể tính tổng khi không có mẫu số. Từ ?dist Tôi hiểu rằng họ sử dụng phương pháp tương tự: Terms with zero numerator and denominator are omitted from the sum and treated as if the values were missing.canberra khoảng cách - kết quả không phù hợp

canberra.distance <- function(a, b){ 
    sum((abs(a - b))/(abs(a) + abs(b)), na.rm = T) 
} 

a <- c(0, 1, 0, 0, 1) 
b <- c(1, 0, 1, 0, 1) 
canberra.distance(a, b) 
> 3 
# the result that I expected 
dist(rbind(a, b), method = "canberra") 
> 3.75 


a <- c(0, 1, 0, 0) 
b <- c(1, 0, 1, 0) 
canberra.distance(a, b) 
> 3 
# the result that I expected 
dist(rbind(a, b), method = "canberra") 
> 4 

a <- c(0, 1, 0) 
b <- c(1, 0, 1) 
canberra.distance(a, b) 
> 3 
dist(rbind(a, b), method = "canberra") 
> 3 
# now the results are the same 

cặp 0-0 và 1-1 dường như có vấn đề. Trong trường hợp đầu tiên (0-0) cả tử số và mẫu số bằng 0 và cặp này nên được bỏ qua. Trong trường hợp thứ hai (1-1) tử số là 0 nhưng mẫu số không và thuật ngữ sau đó cũng bằng 0 và tổng không nên thay đổi.

tôi thiếu gì ở đây?

EDIT: Để phù hợp với định nghĩa R, chức năng canberra.distance thể được sửa đổi như sau:

canberra.distance <- function(a, b){ 
    sum(abs(a - b)/abs(a + b), na.rm = T) 
} 

Tuy nhiên, kết quả đều giống nhau như trước đây.

+2

Tôi nghĩ rằng bạn có thể đã tình cờ gặp lỗi trong cơ sở R. Tôi không chắc chắn, nhưng [Wolfram Alpha đồng ý với bạn] (https://www.wolframalpha.com/input/?i=CanberraDistance%5B% 7B1, + 0, + 1, + 0% 7D, +% 7B0, + 1, + 0, + 0% 7D% 5D). Rất tiếc, tôi không thể tìm thấy tài liệu tham khảo có thẩm quyền nhưng việc triển khai của bạn có vẻ đúng theo Wikipedia và Wolfram. –

+0

Trên thực tế, [tài liệu về 'dist'] (https://stat.ethz.ch/R-manual/R-devel/library/stats/html/dist.html) xác định khoảng cách Canberra là * sum (| x_i - y_i |/| x_i + y_i |) * (khác với của bạn và của Wolfram). Nó cũng lưu ý rằng "[t] của anh ta dành cho các giá trị không âm (ví dụ: đếm): lấy giá trị tuyệt đối của mẫu số là sửa đổi R năm 1998 để tránh khoảng cách tiêu cực." - Định nghĩa của R được ghi nhận là khác nhau. –

+0

@KonradRudolph Cảm ơn bạn đã trả lời! Tôi đã chỉnh sửa bài đăng của mình. Với định nghĩa R của sự không thống nhất khoảng cách giữa Canberra và tôi vẫn không nghĩ đây là vấn đề. – Adela

Trả lời

0

Điều này có thể làm sáng tỏ sự khác biệt. Theo như tôi có thể thấy điều này là mã thực tế đang được chạy để tính toán khoảng cách

static double R_canberra(double *x, int nr, int nc, int i1, int i2) 
{ 
    double dev, dist, sum, diff; 
    int count, j; 

    count = 0; 
    dist = 0; 
    for(j = 0 ; j < nc ; j++) { 
    if(both_non_NA(x[i1], x[i2])) { 
     sum = fabs(x[i1] + x[i2]); 
     diff = fabs(x[i1] - x[i2]); 
     if (sum > DBL_MIN || diff > DBL_MIN) { 
     dev = diff/sum; 
     if(!ISNAN(dev) || 
      (!R_FINITE(diff) && diff == sum && 
      /* use Inf = lim x -> oo */ (int) (dev = 1.))) { 
      dist += dev; 
      count++; 
     } 
     } 
    } 
    i1 += nr; 
    i2 += nr; 
    } 
    if(count == 0) return NA_REAL; 
    if(count != nc) dist /= ((double)count/nc); 
    return dist; 
} 

Tôi nghĩ rằng thủ phạm là dòng này

if(!ISNAN(dev) || 
       (!R_FINITE(diff) && diff == sum && 
       /* use Inf = lim x -> oo */ (int) (dev = 1.))) 

mà xử lý một trường hợp đặc biệt và có thể không được ghi nhận.

+0

Cảm ơn bạn đã trả lời. Thật không may, tôi không thực sự có kỹ năng trong C + + vì vậy tôi không chắc chắn những gì đang xảy ra với những trường hợp đặc biệt. Bạn có thể làm sáng tỏ một chút không? – Adela

+0

Dòng chứa trường hợp đặc biệt nếu hai giá trị giống hệt nhau 'diff == sum' thì nó sẽ thêm một số vào tử số vì nó đặt' dev = 1'. Tuy nhiên, tại sao mã được vượt qua 'diff> DBL_MIN' ở nơi đầu tiên là một chút không rõ ràng với tôi. Có lẽ có một vấn đề với chuyển đổi điểm nổi/độ chính xác? – ekstroem

+0

Vâng, thêm một vào tử số sẽ giải thích trường hợp của cặp 1-1 và giá trị khoảng cách của 4. Tuy nhiên tôi không thể thấy làm thế nào điều này liên quan đến trường hợp của cặp 0-0. Bất kỳ ý tưởng? – Adela

Các vấn đề liên quan