2011-10-18 33 views
9

(Lời nói đầu: Tôi không phải là nhà thống kê hay lập trình viên. Tôi làm việc trong nhân văn, vì vậy hãy thương xót tâm hồn mình).Tính toán khoảng cách Euclide trong R không có ý nghĩa

tôi cần phải tính toán khoảng cách Euclide giữa một loạt các điểm trong R. Tôi đã sử dụng dist(), như sau:

> x <- c(0,0) 
> y <- c(0,10) 
> dist(rbind(x,y)) 
    x 
y 10 

Cho đến nay, như vậy tốt. Nhưng khi tôi nhìn vào kết quả của tôi (với số thực), họ đã bị khủng khiếp. Vì vậy, nhiều như vậy mà tôi figured R kịch bản của tôi đã lấy dữ liệu từ các cột sai. Nhưng tôi đã kiểm tra và không phải vậy.

Vì vậy, tôi bắt đầu chơi xung quanh với số đồ chơi và tôi đã rất ngạc nhiên. Ví dụ trên (một đường thẳng đứng) hoạt động một cách chính xác, cũng như những điều sau đây (một đường ngang):

> x <- c(0,10) 
> y <- c(0,0) 
> dist(rbind(x,y)) 
    x 
y 10 

Nhưng khi dòng dạng hai điểm là đường chéo, lạ xảy ra sau đó:

> x <- c(0,10) 
> y <- c(0,10) 
> dist(rbind(x,y)) 
    x 
y 0 

Một khoảng cách 0? Huh? Điều đó không thể đúng.

Và khi những điểm giống hệt nhau (đó là hoàn toàn có thể trong dữ liệu của tôi), chúng tôi đi xuống hang thỏ:

> x <- c(0,0) 
> y <- c(10,10) 
> dist(rbind(x,y)) 
    x 
y 14.14214 

nên đây không phải là 0? Những điểm giống hệt nhau, sau khi tất cả, do đó, có thể không có khoảng cách giữa chúng.

Chỉ trong trường hợp có sự cố với dist(), tôi đã cố gắng triển khai công thức theo cách thủ công, bằng Wikipedia. Cùng một kết quả:

> sqrt(sum((x - y)^2)) 
[1] 14.14214 

Như tôi đã nói ở trên, nền toán học của tôi là tối thiểu, vì vậy tôi hoàn toàn mong đợi rằng lỗi ở đây là của tôi. Nếu có, vui lòng giải thích nó là gì và cách sửa nó. Nhưng từ nơi tôi đứng ngay bây giờ, có vẻ như có điều gì đó rất sai.

Và tệ nhất là tôi không thể phân tích dữ liệu của mình.

+3

+1 cho bài đăng đầu tiên rõ ràng tuân thủ nguyên tắc tài liệu. –

Trả lời

14

Có vẻ như bạn muốn dist(cbind(x, y)), không phải dist(rbind(x, y)).

+0

Điều đó thực sự dường như làm các trick - kể từ khi vector x của tôi có tất cả các tọa độ x, và vector y của tôi có tất cả các y, tôi cần phải ràng buộc bởi cột, không phải hàng. Cảm ơn! –

9

dist tính ma trận khoảng cách giữa mỗi cặp hàng đối số của nó. Nếu hàng của bạn giống hệt nhau, như trong ví dụ 'lạ' đầu tiên của bạn, thì khoảng cách thực sự sẽ là 0. Nếu hàng của bạn là hằng số 0 và hằng số 10, như trong ví dụ thứ hai, thì khoảng cách thực sự sẽ là sqrt ((10- 0)^2 + (10-0)^2) = 14.142 ...

+0

A-ha! Tất cả rõ ràng. Đánh giá cao sự trợ giúp. –

7

gì bạn nghĩ rằng bạn đang làm khi bạn chạy này:

x <- c(0,10) 
y <- c(0,0) 
dist(rbind(x,y)) 

là bạn đã xác định hai điểm, (0,0)(10,0), và hỏi R để tính toán khoảng cách giữa hai điểm.

Nhưng bạn chưa thực sự yêu cầu R làm điều đó!

Khi bạn rbind các vectơ xy cùng, bạn kết thúc với ma trận:

rbind(c(0,10),c(0,0)) 
    [,1] [,2] 
[1,] 0 10 
[2,] 0 0 

Khi bạn gọi dist, nó tính toán khoảng cách giữa các hàng của ma trận này. Do đó, khoảng cách giữa chúng là 10.

Hy vọng điều đó có ý nghĩa ngay bây giờ!

+0

Cảm ơn rất nhiều! Nó thực sự có ý nghĩa bây giờ. –

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