1

これは本当に紛らわしいように聞こえますが、十分に明確にするために最善を尽くします。fulldataこのデータセットと呼ばれる完全なデータセットがあり494021x6ます。

私はその上でsvds(特異値分解)を次のように使用します:

%% dimensionality reduction 
columns = 6
[U,S,V]=svds(fulldata,columns);

fulldata次に、 :からランダムに1000行を選択します。

%% randomly select dataset
rows = 1000;
columns = 6;

%# pick random rows
indX = randperm( size(fulldata,1) );
indX = indX(1:rows)';

%# pick columns in a set order (2,4,5,3,6,1)
indY = indY(1:columns);

%# filter data
data = U(indX,indY);

次に、このランダムに選択された1000行に正規化を適用します。

% apply normalization method to every cell
maxData = max(max(data));
minData = min(min(data));
data = ((data-minData)./(maxData));

fulldata次に、選択した1000行に一致する元のセットからデータサンプルを出力します。

% output matching data
dataSample = fulldata(indX, :)

また、「ランダム行」を選択すると、fulldataの行と一致するindX行も出力されることに注意してください。

したがって、datasample次のようになります。

ここに画像の説明を入力してください

これは、元のフルデータと一致する1000のランダムな行です。

そしてindXこのように見えます:

ここに画像の説明を入力してください

これは、からの対応する行番号ですfulldata

到達した問題は、K-Meansを使用して1000のランダムな行をクラスター化し、各クラスターのデータを次のように出力する場合です。

%% generate sample data
K = 6;
numObservarations = size(data, 1);
dimensions = 3;

%% cluster
opts = statset('MaxIter', 100, 'Display', 'iter');
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ...
'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3);

%% plot data+clusters
figure, hold on
scatter3(data(:,1),data(:,2),data(:,3), 5, clustIDX, 'filled')
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 100, (1:K)', 'filled')
hold off, xlabel('x'), ylabel('y'), zlabel('z')
grid on
view([90 0]);

%% plot clusters quality
figure
[silh,h] = silhouette(data, clustIDX);
avrgScore = mean(silh);

% output the contents of each cluster
K1 = data(clustIDX==1,:)
K2 = data(clustIDX==2,:)
K3 = data(clustIDX==3,:)
K4 = data(clustIDX==4,:)
K5 = data(clustIDX==5,:)
K6 = data(clustIDX==6,:)

K1、k2 ... K6を対応するindX行番号に一致させるにはどうすればよいですか?たとえば、K1の出力は次のようになります。

ここに画像の説明を入力してください

K1-indXK1、K2などのクラスターデータと一致する対応する行番号のリストなどの追加ファイルが必要でしたindX。または、列7のK1、K2出力にindX行番号を追加することもできます(推奨) )。

例えば:

K1 cluster data | Belongs to fulldata row number
0.4 0.5 0.6 0.4 | 456456 etc
4

2 に答える 2

1

上記の解釈を誤解していない限りindX、行番号は既に ( に) あります。たとえば、クラスター 1fulldataの行を確認するために必要なことは次のとおりです。fulldata

fulldata(indX(clustIDX == 1), :)

kmeansデータの順序を変更しないため、clustIDX の各行 1:1000 は、開始したdata/の同じ行 1:1000 に引き続き対応datasampleします。

別の言い方clustIDXをすれば、長さ 1000 のベクトルになり、各要素はその行の (整数) クラスター割り当てになります。dataしたがって、クラスタリングに使用したサンプルに対応する順序で 1000 行ある場合は、論理インデックス作成にこれを使用できます。

于 2012-07-14T00:22:10.927 に答える
1

説明する例:

%# lets use an example data of size 150x4
load fisheriris
fulldata = meas;

%# pick 100 rows at random
rIdx = randperm(size(fulldata,1));
rIdx = rIdx(1:100)';                  %#'
data = fulldata(rIdx,:);

%# cluster the subset data
K = 3;
clustIDX = kmeans(data, K);

%# divide the data according to which cluster instances were assigned to
groupedIdx = cell(K,1);
groupedData = cell(K,1);
for i=1:K
    %# instances
    groupedData{i} = data(clustIDX==i,:);

    %# corresponding row indices into the original fulldata
    groupedIdx{i} = rIdx(clustIDX==i);
end

%# check: these two should be equal
groupedData{1}(1,:)
fulldata(groupedIdx{1}(1),:)
于 2012-07-16T11:54:58.020 に答える