1

好的,这听起来真的很令人困惑,但我会尽力让它足够清楚。我有一个完整的数据集,称为fulldata这个数据集是494021x6.

我像这样使用svds(奇异值分解):

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

然后我从以下随机选择 1000 行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, :)

另请注意,当我选择“随机行”时,我还会输出与 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它只是一个相应行号的列表,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
4

2 回答 2

1

除非我误解了上面的内容,否则您已经拥有 (in indX)fulldata行号......例如,您需要做的就是查看fulldata集群 1 中的行:

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

kmeans不会对数据重新排序,因此 clustIDX 的每一行 1:1000 仍对应于您开始使用的data/的同一行 1:1000。datasample

换句话说,clustIDX将是一个长度为 1000 的向量,其中每个元素都是该行的(整数)簇分配。因此,您可以将其用于任何有 1000 行的逻辑索引,其顺序与data您用于聚类的样本相对应。

于 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 回答