【问题标题】:Show rows on clustered kmeans data在聚集的 kmeans 数据上显示行
【发布时间】:2012-07-08 05:23:21
【问题描述】:

您好,我想知道当您在图形屏幕上对数据进行聚类时,有没有办法在您滚动数据点时显示数据点属于哪些行?

从上面的图片中,我希望有一种方法,如果我选择或滚动点,我可以知道它属于哪一行。

代码如下:

%% 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”的哪一行。

【问题讨论】:

  • 右上角那个集群中心有什么问题?而且这两个深蓝色的星团对我来说看起来并不明智。
  • 是的,对我来说有 3 个不同的集群,我还没有遇到一种方法可以让程序明智地选择正确数量的集群,因此它的试验和错误 atm 当然我也在努力去除异常值。但我真的需要一种方法来快速找出这些点代表什么行的原因或数据。
  • 查看剪影以选择集群数量:mathworks.com/help/toolbox/stats/bq_679x-18.html

标签: matlab statistics plot cluster-analysis k-means


【解决方案1】:

您可以使用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 视图中的样子(具有不同的显示样式):

【讨论】:

  • 嗨!我将此函数粘贴到 matlab 中并收到以下错误“错误:此上下文中不允许函数定义。”
猜你喜欢
  • 2019-01-23
  • 1970-01-01
  • 2013-02-22
  • 2018-04-26
  • 2016-07-12
  • 2021-08-02
  • 2018-08-13
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多