7

19 個のクラスターにクラスター化する A(369x10) の行列があります。私はこの方法を使用します

[idx ctrs]=kmeans(A,19)

idx(369x1) と ctrs(19x10) が得られます

ここまでで要点がわかりました。A のすべての行は、19 個のクラスターにクラスター化されています。

これで、配列 B(49x10) ができました。この B の行が、指定された 19 個のクラスターのどこに対応するかを知りたいです。

MATLABでどのように可能ですか?

前もって感謝します

4

5 に答える 5

4

あなたが説明した方法よりも良い方法は思いつきません。組み込み関数を使えば 1 行節約できますが、見つけられませんでした。使用するコードは次のとおりです。

[ids ctrs]=kmeans(A,19);
D = dist([testpoint;ctrs]); %testpoint is 1x10 and D will be 20x20
[distance testpointID] = min(D(1,2:end));
于 2009-09-03T15:54:47.563 に答える
2

意味が合っているかわかりませんが、ポイントがどのクラスターに属しているかを知りたい場合は、KnnSearch 関数を簡単に使用できます。2 つの引数があり、引数 2 に最も近い最初の引数を最初の引数で検索します。

于 2012-05-16T09:24:28.690 に答える
1

二乗ユークリッド距離メトリックを使用していると仮定して、これを試してください:

for i = 1:size(ctrs,2)
d(:,i) = sum((B-ctrs(repmat(i,size(B,1),1),:)).^2,2);
end
[distances,predicted] = min(d,[],2)

その場合、predicted には最も近い重心のインデックスが含まれ、distances には最も近い重心までの距離が含まれる必要があります。

kmeans 関数内のサブ関数 'distfun' を見てください。これは、上記を行う方法を示し、他の距離メトリックに相当するものも含まれています。

于 2009-09-07T16:56:01.980 に答える
0

少量のデータの場合、次のことができます

[testpointID,dum] = find(permute(all(bsxfun(@eq,B,permute(ctrs,[3,2,1])),2),[3,1,2]))

しかし、これはややあいまいです。並べ替えられた ctrs を持つ bsxfun は、ブール値の 49 x 10 x 19 の配列を作成します。これは、2 番目の次元で「すべて編集」され、元に並べ替えられ、行 ID が見つかります。繰り返しますが、大量のデータにはおそらく実用的ではありません。

于 2009-09-04T23:14:41.490 に答える