2015-12-30 3 views
2

Доказательство прототипа концепции, которое я должен сделать для моего проекта в прошлом году, - это реализовать K-Means Clustering на большом наборе данных и отобразить результаты на графике. Я знаю только объектно-ориентированные языки, такие как Java и C#, и решил попробовать MATLAB. Я замечаю, что с функциональным языком подход к решению проблем очень различен, поэтому я хотел бы получить некоторое представление о некоторых вещах, если это возможно.Как классифицировать свои данные для кластеров K-Means

Предположим, что у меня есть следующий набор данных:

raw_data

400.39 513.29 499.99 466.62 396.67 
234.78 231.92 215.82 203.93 290.43 
15.07 14.08 12.27 13.21 13.15 
334.02 328.79 272.2 306.99 347.79 
49.88 52.2 66.35 47.69 47.86 
732.88 744.62 687.53 699.63 694.98 

И я выбрал строки 2 и 4, чтобы быть 2 центроиды:

центроиды

234.78 231.92 215.82 203.93 290.43 % Centroid 1 
334.02 328.79 272.2 306.99 347.79 % Centroid 2 

Я хочу теперь вычислить евклидовы расстояния каждой точки к каждому центроиду, а затем назначить каждую точку ближайшему центроиду и отобразить это на графике. Предположим, я хочу, чтобы я хотел классифицировать центроиды как синие и зеленые. Как я могу сделать это в MATLAB? Если бы это была Java, я бы инициализировал каждую строку как объект и добавлял к отдельным ArrayLists (представляющим кластеры).

Если строки 1, 2 и 3 принадлежат к первому центроиду/кластеру, а строки 4, 5 и 6 относятся ко второму центроиду/кластеру - как я могу их классифицировать, чтобы отображать их как синие или зеленые точки на график? Я новичок в MATLAB и действительно интересуюсь этим. Спасибо за любую помощь.

ответ

1

(Во-первых, Matlab имеет гибкую функцию измерения расстояния, pdist2, а также kmeans, но я предполагаю, что вы хотите создать свой код с нуля).

В Matlab вы пытаетесь реализовать все как матричную алгебру, без петель над элементами.

В вашем случае, если R является raw_data матрица и C матрица Центроиды, вы можете перенести измерение, которое представляет центроид номер на 3-е место по permC=permute(C,[3 2 1]); Затем функция bsxfun позволяет вычесть C из R при дальнейшем увеличении третьего измерения R: D=bsxfun(@minus,R,permC). Элементарный квадрат, за которым следует суммирование по столбцам SqD=sum(D.^2,2), даст вам квадрат расстояний каждого наблюдения от каждого центроида. Выполнение всех этих операций в рамках одного оператора и сдвига третьего (центроид) измерение обратно на 2-е место будет выглядеть следующим образом:

SqD=permute(sum(bsxfun(@minus,R,permute(C,[3 2 1])).^2,2),[1 3 2]) 

Выбор центроида минимального расстояния теперь просто: [minDist,minCentroid]=min(SqD,[],2)

Если это выглядит сложным, я рекомендую проверить продукт каждого подэтапа и прочитать справку каждой команды.

Смежные вопросы