2016-01-15 66 views
5

我已經寫了一個函數,將訓練樣例分配給它們最接近的質心,作爲K均值聚類算法的一部分。在我看來,尺寸是滿意的,有時代碼正確運行。但經常出現錯誤如何匹配在查找函數matlab中使用的矩陣的元素數

在賦值A(:) = B中,A和B中元素的個數必須是 一樣。

爲線

idx(i) = find(dist == value); 

下面是代碼

function idx = findClosestCentroids(X, centroids) 

K = size(centroids, 1); 
idx = zeros(size(X,1), 1); 
dist = zeros(K, 1); 

for i = 1:size(X,1) 
    for j = 1:K 
     dist(j) = sum((X(i,:) - centroids(j,:)).^2); 
    end 
    value = min(dist); 
    idx(i) = find(dist == value); 
end 

有什麼問題嗎?

+2

rayryeng已經正確地回答了你的問題,但你可能有興趣嘗試一種矢量化的方法'[,,idx] = min(sum(bsxfun(@minus,X,permute(centroids,[3,2,1]))。^ 2,2),[] ,3)''它可以讓你跳過所有的循環,預分配和臨時矩陣,甚至可以壓縮成一行。 – Dan

+0

@丹好主意:)......這是深夜,我沒有時間寫下矢量化的解決方案。這是一個很好的評論。 – rayryeng

回答

4

這是因爲您可能會發現多個羣集與查詢點共享相同的距離。 find確定全部值滿足布爾條件作爲參數。 idx(i)意味着您正在將單個值分配給idx數組的位置,但find可能會產生多個值,並且會給出您所看到的分配錯誤。

而是使用的min第二輸出參數,它決定了指數首次出現的最小值,而這正是你想要完成什麼

function idx = findClosestCentroids(X, centroids) 

K = size(centroids, 1); 
idx = zeros(size(X,1), 1); 
dist = zeros(K, 1); 

for i = 1:size(X,1) 
    for j = 1:K 
     dist(j) = sum((X(i,:) - centroids(j,:)).^2); 
    end 
    [~,idx(i)] = min(dist); %// Change 
end 
相關問題