【问题标题】:How to visualize binary data?如何可视化二进制数据?
【发布时间】:2013-06-17 14:23:28
【问题描述】:

我有一个 6x1000 二进制数据的数据集(6 个数据点,1000 个布尔维度)。

我对其进行聚类分析

[idx, ctrs] = kmeans(x, 3, 'distance', 'hamming');

我得到了三个集群。如何可视化我的结果?

我有 6 行数据,每行有 1000 个属性;其中 3 个在某种程度上应该是相似的或相似的。应用聚类将显示聚类。因为我知道集群的数量 我只需要找到类似的行。汉明距离告诉我们行之间的相似性,结果是正确的,有 3 个簇。

[编辑:对于任何合理的数据,kmeans 总是会找到询问的数字 集群]

我想学习这些知识 并使其易于观察和理解,而无需编写大量解释。

Matlab 的示例不适合,因为它处理数值二维数据,而我的问题涉及 n 维分类数据。

数据集在这里http://pastebin.com/cEWJfrAR

[EDIT1:如何检查集群是否重要?]

欲了解更多信息,请访问以下链接: https://chat.stackoverflow.com/rooms/32090/discussion-between-oleg-komarov-and-justcurious

如果问题不清楚,请询问您遗漏的任何内容。

【问题讨论】:

  • 你不喜欢kmeans()文档中示例的哪一部分?
  • 您需要提供一个最小的工作示例,而不需要回答者过多的努力。我对你的问题很感兴趣,复制粘贴所有未格式化的数据根本不可行。
  • 您的问题被否决了,因为您不太清楚您要做什么。该文档提供了有关如何可视化数据的示例。如果这对您不起作用,您应该将其包含在您的问题中,并评论为什么我不适用于您的情况。提供你为什么要做你正在做的事情的背景可以让你“跳出框框”来回答——也许你的方法不是解决手头问题的最佳方法。最后:考虑this website on how to ask good questions
  • 您的问题应该尽可能独立,不需要人们阅读大量外部资源。

标签: matlab binary machine-learning cluster-analysis k-means


【解决方案1】:

我为我的数据使用了条形码类型的可视化。 Oleg 之前在这里发布的代码对于我的解决方案来说太重了(图像文件超过 500 kb),所以我使用 image() 来制作数字

function barcode(A)
B = (A+1)*2;
image(B);
colormap flag;

set(gca,'Ydir','Normal')    
axis([0 size(B,2) 0 size(B,1)]);
ax = gca;
ax.TickDir = 'out'

end

【讨论】:

    【解决方案2】:

    定义

    二进制字符串 a 和 b 的汉明距离等于 XOR b 中的个数(总体计数)(请参阅Hamming distance)。

    解决方案

    由于您有六个数据字符串,因此您可以创建一个填充了汉明距离的 6 x 6 矩阵。矩阵是对称的(a 到 b 的距离与 b 到 a 的距离相同),对角线为 0(a 到自身的距离为 nul)。

    例如,您的第一个和第二个字符串之间的汉明距离是:

    hamming_dist12 = sum(xor(x(1,:),x(2,:)));
    

    循环并填充您的矩阵:

    hamming_dist = zeros(6);
    for i=1:6,
      for j=1:6,
        hamming_dist(i,j) = sum(xor(x(i,:),x(j,:)));
      end
    end
    

    (是的,考虑到对称性和零对角线,这段代码是多余的,但计算量很小,优化不值得)。

    将您的矩阵打印为文本格式的电子表格,让读者找出哪个数据字符串与哪个相似。

    这不使用您的“kmeans”方法,但您添加的有关问题的描述有助于塑造这个开箱即用的答案。希望对你有帮助。


    结果

        0  182  481  495  490  500
      182    0  479  489  492  488
      481  479    0  180  497  517
      495  489  180    0  503  515
      490  492  497  503    0  174
      500  488  517  515  174    0
    

    编辑 1:

    如何读表?该表是一个简单的distance table。每行和每列代表一系列数据(这里是二进制字符串)。第 1 行和第 2 列交叉处的值是字符串 1 和字符串 2 之间的汉明距离,即 182。字符串 1 和 2 之间的距离与字符串 2 和 1 之间的距离相同,这就是为什么矩阵是对称的.


    数据分析

    可以很容易地识别出三个聚类:1-2、3-4 和 5-6,它们的汉明距离分别为 182、180 和 174。 在一个集群中,数据有约 18% 的差异。相比之下,不属于集群的数据具有约 50% 的差异(这是随机给定的二进制数据)。

    【讨论】:

    • 你是如何进行数据分析的?你是怎么知道课程的?
    • 我在回答中阐明了距离表的想法。
    【解决方案3】:

    演示文稿

    我推荐Kohonen network 或类似的技术来呈现您的数据,比如二维。通常这个区域被称为Dimensionality reduction

    我你也可以走更简单的方法,例如Principal Component Analysis,但没有任何保证可以有效地删除 9998 个维度:P

    scikit-learn 是一个很好的 Python 包,可以帮助您入门,类似的存在于 matlab、java 等。我可以向您保证,您自己实现其中一些算法相当容易。

    疑虑

    不过,我对您的数据集感到担忧。 6 个数据点确实是一个很小的数字。此外,乍一看,您的属性似乎是布尔值,如果是这种情况,则应使用曼哈顿距离。我认为(如果我错了,有人纠正我)汉明距离只有在你的属性以某种方式相关时才有意义,例如如果属性实际上是一个 1000 位长的二进制字符串,而不是 1000 个独立的 1 位属性。

    此外,对于 6 个数据点,您只有 2 ** 6 个组合,这意味着您拥有的 1000 个属性中有 936 个是真正冗余的,或者与冗余无法区分。

    K-means 几乎总能找到所需数量的集群。要测试集群的重要性,请使用不同的初始条件多次运行 K-means,并检查是否获得相同的集群。如果您每次甚至不时获得不同的集群,您就无法真正相信您的结果。

    【讨论】:

      【解决方案4】:

      您可以首先使用“条形码”图来可视化您的数据,然后使用它们所属的集群组标记行:

      % Create figure
      figure('pos',[100,300,640,150])
      
      % Calculate patch xy coordinates
      [r,c] = find(A);
      Y = bsxfun(@minus,r,[.5,-.5,-.5, .5])';
      X = bsxfun(@minus,c,[.5, .5,-.5,-.5])';
      
      % plot patch
      patch(X,Y,ones(size(X)),'EdgeColor','none','FaceColor','k');
      
      % Set axis prop
      set(gca,'pos',[0.05,0.05,.9,.9],'ylim',[0.5 6.5],'xlim',[0.5 1000.5],'xtick',[],'ytick',1:6,'ydir','reverse')
      
      % Cluster
      c = kmeans(A,3,'distance','hamming');
      
      % Add lateral labeling of the clusters
      nc   = numel(c);
      h    = text(repmat(1010,nc,1),1:nc,reshape(sprintf('%3d',c),3,numel(c))');
      cmap = hsv(max(c));
      set(h,{'Background'},num2cell(cmap(c,:),2))
      

      【讨论】:

      • 但它也表明,通过视觉检查很难学到任何东西。
      • @Hugues 没错,这就是我个人非常喜欢树状图的原因。
      • 我复制粘贴了你的代码,我得到了一些不同的东西。右侧的方框中没有数字。你用了什么数据。它将所有东西都放在一个集群下......“A”是原始数据对吗?
      • 我调用了从 pastebin 获得的 A 数据。我复制粘贴数据,在其周围放置一些[] 括号,然后分配给A = [...];。然后运行上面的代码一切正常。
      • 出于一个奇怪的原因...我也这样做,但结果不同。首先,右侧彩色方块的顶部没有数字,其次所有 6 个颜色都相同。我忘了什么吗?我只是复制粘贴的代码并使用我的数据如下:load random.txt data=random; A=[data]; 也直接尝试了A=random...
      【解决方案5】:

      为了表示高维向量或簇之间的差异,我使用了 Matlab 的dendrogram 函数。例如,在将数据集加载到矩阵 x 后,我运行了以下代码:

      l = linkage(a, 'average');
      dendrogram(l);
      

      并得到以下情节:

      连接两组节点的条形高度表示这两组节点之间的平均距离。在这种情况下,它看起来像 (5 和 6)、(1 和 2) 和 (3 和 4) 是聚集在一起的。

      如果您更愿意使用汉明距离而不是欧几里得距离(linkage 默认使用),那么您可以这样做

      l = linkage(x, 'average', {'hamming'});
      

      虽然对剧情影响不大。

      【讨论】:

        猜你喜欢
        • 2017-12-30
        • 2015-07-13
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 2018-11-27
        相关资源
        最近更新 更多