2016-01-15 26 views
5

K-ortalama kümeleme algoritmasının bir parçası olarak en yakın yüzdeliklerine eğitim örnekleri atamak için bir işlev yazdım. Bana göre boyutlar tatmin edildi ve kod zaman zaman düzgün çalışıyor. Ama sık sık, Bir görev A (:) = B ise hatamatlab öğesinde kullanılan matris öğelerinin sayısını eşleştirme nasıl yapılır?

olsun, A unsurları ve B sayısı aynı olmalıdır. hat İşte

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

için

sorun burada kod nedir

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 

mı?

+2

rayryeng doğru soruya cevap vardır:

yerine endeksi, yapmak istediğiniz tam olarak ne küçük değeri oluşur ilk kez, bir belirleyen min ikinci çıkış argümanı kullanmak ama vektörel bir yaklaşım denemekle ilgilenebilirsiniz. [~, idx] = min (toplam (bsxfun (@minus, X, permute (centroids, [3,2,1])).^2,2), [] , 3) 'tüm döngüleri, ön tahsisi ve geçici matrisleri atlamanıza ve hatta tek bir hatta yoğunlaşmanıza izin verir. – Dan

+0

@Dan İyi fikir:) ... gece geç oldu ve vectorized çözümü yazmak için zamanım olmadı. Bu iyi bir yorum. – rayryeng

cevap

4

Bu, olası bir sorgu noktasına aynı uzaklığı paylaşan bir kümesinden daha fazla bulma olasılığınızdır. find, bağımsız değişken olarak Boole koşulunu sağlayan değerlerini belirler. idx(i), idx dizisinin yerine tek değeri atadığınızı, ancak find öğesinin birden fazla değer verebileceğini ve bu, gördüğünüz atama hatasını verdiğinizi gösterir. ,

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