-3

我有一个 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

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

4

5 回答 5

6

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

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

并得到以下情节:

数据集的树状图

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

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

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

虽然对剧情影响不大。

于 2013-06-27T20:46:44.970 回答
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))

在此处输入图像描述

于 2013-06-27T20:06:44.233 回答
4

定义

二进制字符串 a 和 b 的 Hamming 距离 Hamming 距离等于 XOR b 中的个数(人口计数)(请参阅Hamming 距离)。

解决方案

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

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


数据分析

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

于 2013-06-28T08:12:17.270 回答
0

介绍

我推荐Kohonen 网络或类似的技术来呈现你的数据,比如二维。通常这个领域被称为降维

我你也可以走更简单的方法,例如主成分分析,但没有保证你可以有效地删除 9998 个维度:P

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

关注点

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

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

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

于 2013-07-04T08:55:31.450 回答
0

我为我的数据使用了条形码类型的可视化。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
于 2016-04-11T10:36:28.230 回答