-3

バイナリ データのデータセット 6x1000 (6 データ ポイント、1000 ブール値) があります。

それに対してクラスター分析を実行します

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

そして、3 つのクラスターを取得します。結果を視覚化するにはどうすればよいですか?

それぞれ 1000 個の属性を持つ 6 行のデータがあります。そのうちの 3 つは、ある意味で似ているか似ている必要があります。クラスタリングを適用すると、クラスターが明らかになります。クラスターの数がわかっているので、同様の行を見つけるだけで済みます。ハミング距離は、行間の類似性を示しており、結果は 3 つのクラスターがあるという正しい結果です。

[編集: 合理的なデータの場合、kmeans は常に要求された数のクラスターを見つけます]

私はその知識を取り入れて、膨大な説明を書かなくても、簡単に観察でき、理解できるようにしたいと考えています。

私の質問はn次元のカテゴリデータに関するものですが、Matlabの例は数値の2Dデータを扱うため、適切ではありません。

データセットはこちら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);

そして、次のプロットを得ました:

データセットのデンドログラム プロット

ノードの 2 つのグループを結ぶバーの高さは、これら 2 つのグループのメンバー間の平均距離を表します。この場合、(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 に答える
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 に答える