これは本当に紛らわしいように聞こえますが、十分に明確にするために最善を尽くします。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-indX
K1、K2などのクラスターデータと一致する対応する行番号のリストなどの追加ファイルが必要でしたindX
。または、列7のK1、K2出力にindX行番号を追加することもできます(推奨) )。
例えば:
K1 cluster data | Belongs to fulldata row number
0.4 0.5 0.6 0.4 | 456456 etc