好的,这听起来真的很混乱,但我会尽力使它清楚。我有一个名为fulldata
的完整数据集,此数据集为494021x6
。
我使用svds(奇异值分解)就像这样:
%% dimensionality reduction
columns = 6
[U,S,V]=svds(fulldata,columns);
然后我从fulldata
:
%% 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, :)
另请注意,当我选择“随机行”时,我还会输出与全数字中的行匹配的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
,它只是indX
中与K1,K2 ......等群集数据相匹配的相应行号的列表。或者可能附加indX行号到第7列的K1,K2输出(最好)
例如:
K1 cluster data | Belongs to fulldata row number
0.4 0.5 0.6 0.4 | 456456 etc
答案 0 :(得分:1)
除非我误解上述内容,否则您已经(在indX
中)fulldata
行号...您需要做的只是查看{{{1}行中的行集群1中的1}}是:
fulldata
fulldata(indX(clustIDX == 1), :)
不对数据进行重新排序,因此clustIDX的每一行1:1000仍然对应于您开始使用的kmeans
/ data
的同一行1:1000。
换句话说,datasample
将是长度为1000的向量,其中每个元素是该行的(整数)簇分配。因此,您可以使用此方法在与您用于聚类的样本clustIDX
对应的顺序中有1000行的任何位置进行逻辑索引。
答案 1 :(得分: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),:)