2012-07-08 2 views
2

안녕하세요. 그림 화면에서 데이터를 클러스터하면 거기에 스크롤 할 때 데이터 포인트가 속하는 행을 표시하는 방법이 있습니까? 내가 선택하는 경우하는 방법을 수 또는 내가가 소유하는 행 말할 수있는 포인트를 통해 스크롤 것이 좋겠습니다 위의 그림에서 클러스터 된 kmeans 데이터에 행 표시

enter image description here

. 정규화 원래부터 지배하는 행과 최종 열의 appedicies 거기 원래 형식으로 조직 재

%% dimensionality reduction 
columns = 6 
[U,S,V]=svds(fulldata,columns); 
%% randomly select dataset 
rows = 1000; 
columns = 6; 

%# pick random rows 
indX = randperm(size(fulldata,1)); 
indX = indX(1:rows); 

%# pick random columns 
indY = randperm(size(fulldata,2)); 
indY = indY(1:columns); 

%# filter data 
data = U(indX,indY); 
%% apply normalization method to every cell 
data = data./repmat(sqrt(sum(data.^2)),size(data,1),1); 

%% generate sample data 
K = 6; 
numObservarations = 1000; 
dimensions = 6; 

%% cluster 
opts = statset('MaxIter', 100, '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), 5, clustIDX, 'filled') 
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 100, (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) 

또는 가능 클러스터 데이터를 출력하는 방법 : 여기

는 코드 "fulldata".

+0

오른쪽 상단의 클러스터 센터? 그리고 두 개의 진한 파란색 클러스터는 나에게 합리적인 것처럼 보이지 않습니다. –

+1

나에게는 3 개의 뚜렷한 클러스터가있다. 프로그램이 클러스터의 올바른 양을 현명하게 선택할 수있는 방법을 찾아 왔기 때문에 시행 착오를 피할 수있다. 그러나 실제로이 점들이 어떤 행의 데이터를 왜 또는 왜 가져올 지 신속하게 파악할 수있는 방법이 필요합니다. –

+1

클러스터 수를 선택하기위한 실루엣을 확인하십시오. http://www.mathworks.com/help/toolbox/stats/bq_679x-18.html – Dan

답변

5

플롯에서 점을 선택할 때 툴팁을 표시하는 data cursors 기능을 사용할 수 있습니다. 수정 된 업데이트 기능을 사용하여 선택한 점에 대한 모든 종류의 정보를 표시 할 수 있습니다.

다음
function customCusrorModeDemo() 
    %# data 
    D = load('fisheriris'); 
    data = D.meas; 
    [clustIdx,labels] = grp2idx(D.species); 
    K = numel(labels); 
    clr = hsv(K); 

    %# instance indices grouped according to class 
    ind = accumarray(clustIdx, 1:size(data,1), [K 1], @(x){x}); 

    %# plot 
    %#gscatter(data(:,1), data(:,2), clustIdx, clr) 
    hLine = zeros(K,1); 
    for k=1:K 
     hLine(k) = line(data(ind{k},1), data(ind{k},2), data(ind{k},3), ... 
      'LineStyle','none', 'Color',clr(k,:), ... 
      'Marker','.', 'MarkerSize',15); 
    end 
    xlabel('SL'), ylabel('SW'), zlabel('PL') 
    legend(hLine, labels) 
    view(3), box on, grid on 

    %# data cursor 
    hDCM = datacursormode(gcf); 
    set(hDCM, 'UpdateFcn',@updateFcn, 'DisplayStyle','window') 
    set(hDCM, 'Enable','on') 

    %# callback function 
    function txt = updateFcn(~,evt) 
     hObj = get(evt,'Target'); %# line object handle 
     idx = get(evt,'DataIndex'); %# index of nearest point 

     %# class index of data point 
     cIdx = find(hLine==hObj, 1, 'first'); 

     %# instance index (index into the entire data matrix) 
     idx = ind{cIdx}(idx); 

     %# output text 
     txt = { 
      sprintf('SL: %g', data(idx,1)) ; 
      sprintf('SW: %g', data(idx,2)) ; 
      sprintf('PL: %g', data(idx,3)) ; 
      sprintf('PW: %g', data(idx,4)) ; 
      sprintf('Index: %d', idx) ; 
      sprintf('Class: %s', labels{clustIdx(idx)}) ; 
     }; 
    end 

end 

그것이 (다른 디스플레이 스타일로) 2D와 3D 뷰 모두에서 같은 모습입니다 : 여기

가 동작하는 예제입니다 뭐가 잘못

screenshot_2D screenshot_3D

+0

안녕하세요! 나는이 funtion을 matlab에 붙여 넣고 "오류 :이 컨텍스트에서는 함수 정의가 허용되지 않습니다."라는 오류 메시지가 나타납니다. –

관련 문제