Bất cứ ai cũng có thể chỉ cho tôi một triển khai k-mean (sẽ tốt hơn nếu trong matlab) có thể lấy ma trận khoảng cách trong đầu vào? Việc thực hiện MATLAB tiêu chuẩn cần ma trận quan sát trong đầu vào và không thể tùy chỉnh thay đổi số đo tương tự.
Bất cứ ai cũng có thể chỉ cho tôi một triển khai k-mean (sẽ tốt hơn nếu trong matlab) có thể lấy ma trận khoảng cách trong đầu vào? Việc thực hiện MATLAB tiêu chuẩn cần ma trận quan sát trong đầu vào và không thể tùy chỉnh thay đổi số đo tương tự.
Câu trả lời:
Vì k-mean cần có khả năng tìm phương tiện của các tập hợp con khác nhau của các điểm bạn muốn phân cụm, nên thực sự không có ý nghĩa gì khi yêu cầu một phiên bản của k-mean lấy ma trận khoảng cách làm đầu vào.
Bạn có thể thử k-medoid thay thế. Có một số triển khai MATLAB có sẵn.
Bạn có thể biến ma trận khoảng cách của mình thành dữ liệu thô và nhập chúng vào phân cụm K-Means. Các bước sẽ như sau:
1) Khoảng cách giữa các điểm N của bạn phải là bình phương euclide. Thực hiện "định tâm kép " của ma trận: Hàng trừ có nghĩa là từ mỗi phần tử; trong kết quả, cột trừ có nghĩa là từ mỗi phần tử; trong kết quả, thêm trung bình ma trận cho mỗi phần tử; chia cho âm 2. Ma trận bạn có bây giờ là ma trận SSCP (tổng bình phương và sản phẩm chéo) giữa các điểm của bạn trong đó điểm gốc được đặt ở tâm hình học của đám mây N điểm. (Đọc giải thích về định tâm kép ở đây .)
2) Thực hiện PCA (phân tích thành phần chính) trên ma trận đó và thu được ma trận tải thành phần NxN . Một số cột cuối cùng của nó có thể là 0, vì vậy hãy cắt chúng đi. Những gì bạn ở lại bây giờ thực sự là điểm thành phần chính, tọa độ điểm N của bạn trên các thành phần chính đi qua, như các trục, xuyên qua đám mây của bạn. Dữ liệu này có thể được coi là dữ liệu thô phù hợp với đầu vào K-Means.
PS Nếu khoảng cách của bạn không phải là các euclide bình phương chính xác về mặt hình học, bạn có thể gặp phải vấn đề: ma trận SSCP có thể không dương (bán) xác định. Vấn đề này có thể được đối phó theo nhiều cách nhưng mất độ chính xác.
X
(giả sử N * N) sẽ đối xứng, vì vậy colMeans(X) =rowMeans(X)
và một khi bạn trừ đi hàng hoặc col có nghĩa là : Y=X-rowMeans(X)
, mean(Y)
là 0.
You could turn your matrix of distances into raw data
(điểm 1 và 2), về cơ bản, tôi đề cập đến tỷ lệ đa chiều (MDS) của Torgerson , trong đó định tâm kép là bước đầu tiên. Vui lòng tìm kiếm trang web này (và cả Google) về quy trình đó. "Định tâm kép" là việc chuyển đổi khoảng cách (bình phương) thành ma trận sản phẩm vô hướng tương ứng được xác định trên điểm gốc đặt vào tâm của đám mây của các điểm.
Xin vui lòng xem bài viết này, được viết bởi một trong những người quen của tôi;)
http://arxiv.org/abs/1304.6899
Đó là về việc triển khai k-mean tổng quát, lấy ma trận khoảng cách tùy ý làm đầu vào. Nó có thể là bất kỳ ma trận không âm đối xứng nào với đường chéo bằng không. Lưu ý rằng nó có thể không cho kết quả hợp lý cho ma trận khoảng cách kỳ lạ. Chương trình được viết bằng C #.
Mã nguồn có thể được lấy bằng cách truy cập liên kết trên, sau đó nhấp vào Định dạng khác, sau đó nhấp vào Tải xuống nguồn. Sau đó, bạn sẽ nhận được một .tar.gz có chứa Program.cs. Ngoài ra, mã nguồn cũng có thể được sao chép từ PDF.
Bạn có thể sử dụng Thư viện máy học Java. Họ có một triển khai K-Means. Một trong các hàm tạo chấp nhận ba đối số
Người ta có thể dễ dàng mở rộng lớp Khoảng cách để đạt được kết quả mong muốn. Ý tưởng là trả về các giá trị từ một ma trận khoảng cách tùy chỉnh trong phương thức đo (Instance x, Instance y) của lớp này.
K-Means được giới thiệu để hội tụ giả định các thuộc tính nhất định của số liệu khoảng cách. Khoảng cách Euclide, khoảng cách Manhattan hoặc các số liệu tiêu chuẩn khác đáp ứng các giả định này. Do số liệu khoảng cách tùy chỉnh có thể không thỏa mãn các giả định này, nên hàm tạo có tham số thứ ba chỉ định số lần lặp để chạy để xây dựng trình phân cụm.