2016-08-03 15 views
12

Sau khi thử một vài thuật toán phân cụm, tôi có hiệu suất tốt nhất trên tập dữ liệu của mình bằng cách sử dụng flexclust::kcca với family = kccaFamily("angle").Làm thế nào để tạo ra số liệu thống kê hiệu suất của clustering từ flexclust?

Dưới đây là ví dụ sử dụng bộ dữ liệu Nclus từ flexclust.

library(fpc) 
library(flexclust) 
data(Nclus) 

k <- 4 
family <- flexclust::kccaFamily("angle") 
model <- flexclust::kcca(Nclus, k, family) 

Bây giờ tôi muốn tối ưu hóa số lượng cụm. Bộ số liệu hiệu suất toàn diện nhất cho các mô hình cụm dường như được tìm thấy bằng cách sử dụng fpc::cluster.stats. Hàm này cần hai đầu vào: ma trận khoảng cách và các cụm được gán.

Loại thứ hai dễ dàng; nó chỉ là [email protected].

Tôi đang đấu tranh với những gì cần cung cấp cho ma trận khoảng cách. kcca không trả về một đối tượng khoảng cách (hoặc nếu có, tôi không tìm thấy nó).

Tôi đoán rằng thông thường tôi sẽ sử dụng dist(Nclus). Trong trường hợp này, tôi không muốn khoảng cách Euclide (hoặc bất kỳ phương pháp nào khác có sẵn cho dist) – Tôi muốn đo khoảng cách được sử dụng bởi thuật toán phân cụm. Tôi có thể tạo lại ma trận khoảng cách được sử dụng bởi kcca bằng cách sử dụng mã từ hàm đó.

control <- as(list(), "flexclustControl") 
centers <- flexclust:::initCenters(Nclus, k, family, control) 
distmat <- distAngle(Nclus, centers$centers) 

Sau đó, tôi chỉ có thể tính toán các số liệu thống kê mô hình cluster bằng cách sử

fpc::cluster.stats(distmat, [email protected]) 

Vấn đề đang được đem lại cho tôi hai cảnh báo về các đối số khoảng cách.

Warning messages: 
1: In as.dist.default(d) : non-square matrix 
2: In as.matrix.dist(d) : 
    number of items to replace is not a multiple of replacement length 

Điều đó khiến tôi nghi ngờ tôi đang đưa ra điều sai.

Làm cách nào để chuyển ma trận khoảng cách tới cluster.stats?

+0

Ngẫu nhiên, 'fpc :: cluster.stats' đòi hỏi nhiều bộ nhớ, do đó không thực tế cho các tập dữ liệu có kích thước vừa phải. Tôi đã đi với 'cụm :: bóng 'cuối cùng. –

Trả lời

3

Tôi đoán bạn nên sử dụng

distmat <- distAngle(Nclus, Nclus) 

Tuy nhiên, tôi không chắc chắn rằng điều này có ý nghĩa theo quan điểm xây dựng mô hình: để kiểm tra việc thực hiện sản lượng phân nhóm của bạn, bạn nên sử dụng các số liệu đó là phù hợp hơn cho bạn trường hợp sử dụng cụ thể; điều này có thể (hoặc có thể không) là khoảng cách L1:

distmat <- dist(Nclus, "manhattan") 

Đặc biệt, tôi đoán rằng việc giảm thiểu các "góc giữa quan sát và centroid/trung bình chuẩn" là không giống như giảm thiểu các góc nội cụm giữa các quan sát; tôi cũng đoán rằng số lượng thứ hai không đặc biệt hữu ích cho các mục đích lập mô hình. Nói cách khác, tôi coi distAngle là một cách thay thế ("lừa") để xác định các cụm k, nhưng sau đó tôi sẽ đánh giá các cụm được xác định bằng các số liệu khác. Hy vọng điều này có ý nghĩa với bạn ...

+2

Tôi đồng ý với renato. Vấn đề là 'cluster.stats()' mong đợi một ma trận khoảng cách cặp đối xứng với mọi phần tử được so sánh với mọi phần tử khác (ví dụ: 'as.matrix (dist (Nclus))'). Tuy nhiên, biểu thức 'distAngle (Nclus, centres centre $ center)' so sánh các điểm dữ liệu với các centroid cluster, vì vậy bạn có được một ma trận khoảng cách không đối xứng. Như vậy, bạn sẽ cần sử dụng một thước đo khoảng cách khác, chẳng hạn như khoảng cách L1 được renato đề xuất hoặc tìm cách tiếp cận khác để đánh giá các bài tập nhóm. –

+0

@KeithHughitt lời giải thích của bạn thực ra rõ ràng hơn rất nhiều so với tôi ... –

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