Нахождение ближайших центроидов в ак означает кластеризацию - PullRequest
0 голосов
/ 02 мая 2020

С

X = [1.8421 4.6076;
     5.6586 4.8;
     6.3526 3.2909;
     2.904  4.6122;
     3.232  4.9399;
     1.2479 4.9327]

И

centroids = [3  3;
             6  2;
             8  5]

Я пытаюсь найти ближайший центроид к каждой точке в x. Я кодирую в Octave, и вот мой код

K = size(centroids, 1);
idx = zeros(size(X,1), 1);   %idx is the vector storing the index of the closest centroid
for e = 1: size(X,1)
    difference(1, :) = X(e,:) - centroids(1,:);
    min_distance = sum(difference(1,:).^2);
    for j = 2:K
        difference(j, :) = X(e,:) - centroids(j,:);
        distance = sum(difference.^2);
        if distance<min_distance
            min_distance = distance;
            idx(e) = centroids(j);
        endif
    endfor
endfor

Код работает, но я получаю

idx = 0 0 0

только для первых трех записей x

1 Ответ

0 голосов
/ 03 мая 2020

Вы должны быть последовательными в размере вашего операнда при расчете расстояния и правильно установить idx:

K = size(centroids, 1);
difference=zeros(size(centroids));
idx = zeros(size(X,1), 1);   %idx is the vector storing the index of the closest centroid
for e = 1: size(X,1)
    difference(1, :) = X(e,:) - centroids(1,:);
    min_distance = sum(difference(1,:).^2);
    idx(e)=1;
    for j = 2:K
        difference(j, :) = X(e,:) - centroids(j,:);
        distance = sum(difference(j,:).^2);
        if (distance<min_distance)
            min_distance = distance;
            idx(e) = j;
        endif
    endfor
endfor
idx

с этим изменением, результат будет:

idx =

   1
   3
   2
   1
   1
   1
...