2012-07-13 134 views
1

好吧,這聽起來會讓人感到困惑,但我會盡我所能讓它足夠清晰。我有一個完整的數據集fulldata,這個數據集是494021x6匹配數據示例matlab

我使用就可以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看起來是這樣的:

enter image description here

這是與原始fulldata其中1000個隨機行。

而且indX看起來是這樣的:

enter image description here

這是從fulldata相應的行號。

問題IM到達時我用K均值聚類的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行數爲K1,在塔K2輸出7(最好)

例如:

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

今後一項建議:發帖提問時,嘗試將代碼減少到只有相關的部分。鏈接到您以前的問題,如果你認爲它會給出額外的上下文。拿出簡單的例子(MWE),其他人可以測試以重現問題......例如,刪除上面代碼中的所有繪圖,因爲它與此處的問題無關。你也可以不用提到SVD分解和規範化(通過隨機選擇行來簡單陳述'data'是'fulldata'的一個子集)。我向你保證,你會得到更多的答案:) – Amro 2012-07-16 11:56:28

回答

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),:) 
+0

Amro你的方法和'K1 = indX(clustIDX == 1),:)... 2,3,4 etc'的區別是什麼?我的輸出顯示了集羣1到6中的行? – 2012-07-16 14:42:39

+0

@JungleBoogie:如果你的意思是'indX(clustIDX == 1)',那麼它與上面代碼中的'groupdIdx {1}'相同。雖然'data(clustIDX == 1,:)'是我的'groupedData {1}'。我不是創建多個變量,而是將結果存儲在單元格數組中。我想了一個完整的例子(你可以複製粘貼)將幫助你理解 – Amro 2012-07-16 17:28:36

+0

Ahhh謝謝Amro,當我第一次看到它時,迭代完全覆蓋了我的頭,這節省了相當多的時間,而不是創建多個輸出! +1 – 2012-07-18 21:01:46

1

除非我是錯解釋上面的東西,你已經有了(在indX)的fulldata行號...所有你需要做的,看到的,例如,從fulldata集羣1行是:

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

kmeans不會重新排序的數據,所以每一行1:1000的clustIDX仍然對應於您開始使用的data/datasample的同一行1:1000。

換言之,clustIDX將成爲長度爲1000的向量,其中每個元素是該行的(整數)聚類分配。因此,您可以將此用於邏輯索引,您可以在與您用於羣集的樣本data對應的訂單中有1000行的任何位置。

+0

嘿Kaelin這輸出屬於集羣1的原始數據是好的,但它不附加indX行號告訴我集羣1中的哪些點屬於從fulldata哪一行。我必須用fulldata手動交叉檢查羣集1中的所有點? – 2012-07-15 14:39:10

+3

如果我理解你的問題和Kaelin的答案,我想'indX(clustIDX == 1)'將會有你需要的行號。 – Turix 2012-07-16 01:22:00