2009-09-03 32 views
7

Tôi có một matrice của A (369x10) mà tôi muốn cluster trong 19 cụm. tôi sử dụng phương pháp nàyMatlab: K-có nghĩa là clustering

[idx ctrs]=kmeans(A,19) 

trong đó sản lượng idx (369x1) và CTR (19x10)

tôi nhận được điểm lên đến here.All hàng của tôi trong A được tập trung tại 19 cụm.

Bây giờ tôi có một mảng B (49x10) .Tôi muốn biết vị trí của các hàng B này tương ứng với 19 cụm.

Làm thế nào có thể trong MATLAB?

Cảm ơn bạn trước

+0

bạn mong đợi sản lượng nào? – SilentGhost

+0

Giả sử các cụm của tôi là p1..p19. và tôi có điểm dữ liệu thử nghiệm mà tôi chọn ngẫu nhiên từ dữ liệu thử nghiệm mà tôi sử dụng trong khi phân cụm. Tôi muốn thấy sth như thế; "dữ liệu thử nghiệm của tôi thuộc về p5" – tguclu

+2

Tôi tìm thấy một cách nhưng không chắc chắn đó là chính xác. ctrs giữ các trung tâm của mỗi cụm. Nếu tôi tính toán các yếu tố btw khoảng cách euclidian của ctrs và dữ liệu thử nghiệm của tôi và nhận được chỉ số tối thiểu thì nó sẽ cho tôi chỉ số cụm mà dữ liệu thử nghiệm của tôi thuộc về. bất kỳ ý tưởng nào? – tguclu

Trả lời

4

Tôi không thể nghĩ ra cách tốt hơn để làm điều đó hơn những gì bạn mô tả. Một hàm tích hợp sẽ tiết kiệm được một dòng, nhưng tôi không thể tìm thấy một dòng. Dưới đây là đoạn code tôi sẽ sử dụng:

[ids ctrs]=kmeans(A,19); 
D = dist([testpoint;ctrs]); %testpoint is 1x10 and D will be 20x20 
[distance testpointID] = min(D(1,2:end)); 
0

cho lượng nhỏ dữ liệu, bạn có thể làm

[testpointID,dum] = find(permute(all(bsxfun(@eq,B,permute(ctrs,[3,2,1])),2),[3,1,2])) 

nhưng điều này là hơi tối nghĩa; bsxfun với ctrs được phép tạo ra một mảng booleans 49 x 10 x 19, sau đó là 'all-ed' trên chiều thứ hai, được hoán vị trở lại và sau đó tìm thấy các id hàng. một lần nữa, có lẽ không thực tế cho một lượng lớn dữ liệu.

1

Giả sử bạn đang sử dụng bình phương khoảng cách Euclide số liệu, hãy thử này:

for i = 1:size(ctrs,2) 
d(:,i) = sum((B-ctrs(repmat(i,size(B,1),1),:)).^2,2); 
end 
[distances,predicted] = min(d,[],2) 

dự đoán sau đó nên chứa các chỉ số trọng tâm gần nhất, và khoảng cách nên chứa khoảng cách với trọng tâm gần nhất.

Hãy xem bên trong hàm kmean, tại hàm phụ 'distfun'. Điều này cho bạn thấy làm thế nào để làm điều trên, và cũng có chứa các tương đương cho các số liệu khoảng cách khác.

11

Sau đây là một ví dụ hoàn chỉnh về phân nhóm:

%% generate sample data 
K = 3; 
numObservarations = 100; 
dimensions = 3; 
data = rand([numObservarations dimensions]); 

%% cluster 
opts = statset('MaxIter', 500, 'Display', 'iter'); 
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ... 
    'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3); 

%% plot data+clusters 
figure, hold on 
scatter3(data(:,1),data(:,2),data(:,3), 50, clustIDX, 'filled') 
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (1:K)', 'filled') 
hold off, xlabel('x'), ylabel('y'), zlabel('z') 

%% plot clusters quality 
figure 
[silh,h] = silhouette(data, clustIDX); 
avrgScore = mean(silh); 


%% Assign data to clusters 
% calculate distance (squared) of all instances to each cluster centroid 
D = zeros(numObservarations, K);  % init distances 
for k=1:K 
    %d = sum((x-y).^2).^0.5 
    D(:,k) = sum(((data - repmat(clusters(k,:),numObservarations,1)).^2), 2); 
end 

% find for all instances the cluster closet to it 
[minDists, clusterIndices] = min(D, [], 2); 

% compare it with what you expect it to be 
sum(clusterIndices == clustIDX) 
2

Tôi không biết nếu tôi có được quyền ý nghĩa của bạn, nhưng nếu bạn muốn biết những cụm điểm của bạn thuộc về bạn có thể sử dụng KnnSearch chức năng một cách dễ dàng. Nó có hai đối số và sẽ tìm kiếm trong đối số đầu tiên cho đối số đầu tiên trong số đó là gần nhất với đối số hai.

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