匹配数据样本matlab

时间:2012-07-13 18:16:54

标签: matlab data-binding cluster-analysis matching

好的,这听起来真的很混乱,但我会尽力使它清楚。我有一个名为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, :)

另请注意,当我选择“随机行”时,我还会输出与全数字中的行匹配的indX行。

所以datasample看起来像这样:

enter image description here

这是与原始全数匹配的1000个随机行。

indX看起来像这样:

enter image description here

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的输出如下所示:

enter image description here

我希望有一些额外的文件,例如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

2 个答案:

答案 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),:)