如何可视化二进制数据?

时间:2013-06-20 16:08:49

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

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

我对它进行聚类分析

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

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

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

  

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

我想接受这些知识 并且无需撰写大量解释即可轻松观察和理解。

Matlab的例子不合适,因为它涉及数字2D数据,而我的问题涉及n维分类数据。

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

  

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

有关更多信息,请访问以下链接: http://chat.stackoverflow.com/rooms/32090/discussion-between-oleg-komarov-and-justcurious

如果问题不明确,请询问您遗失的任何内容。

4 个答案:

答案 0 :(得分:6)

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

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

并得到以下情节:

Dendrogram plot of your dataset

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

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

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

虽然这对情节没什么影响。

答案 1 :(得分:5)

您可以首先使用“条形码”图表显示数据,然后使用他们所属的群集组标记行:

% 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))

enter image description here

答案 2 :(得分:4)

<强>定义

二进制字符串a和b的汉明距离汉明距离等于XOR b中的一个(人口数)(见Hamming distance)。

<强>解决方案

由于您有六个数据字符串,因此您可以创建一个填充汉明距离的6乘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 :(得分:0)

<强>演示

我建议使用Kohonen network或类似技术在2维中展示您的数据。通常,此区域称为Dimensionality reduction

我也可以采用更简单的方式,例如Principal Component Analysis,但没有保证可以有效删除9998维:P

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

<强>关注

我对您的数据集感到担心。 6个数据点实际上是一个很小的数字。而且你的属性乍一看似乎是布尔值,如果是这样的话,曼哈顿距离如果你应该使用的话。我认为(如果我错了,有人会纠正我)汉明距离只有在你的属性与某种程度相关时才有意义,例如: if属性实际上是一个1000位长的二进制字符串,而不是1000个独立的1位属性。

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

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