Чи може хтось вказати мені на реалізацію k-засобів (було б краще, якщо в matlab), яка може взяти матрицю відстані у введенні? Стандартна реалізація matlab потребує вхідної матриці спостереження, і неможливо настроїти зміну міри подібності.
Чи може хтось вказати мені на реалізацію k-засобів (було б краще, якщо в matlab), яка може взяти матрицю відстані у введенні? Стандартна реалізація matlab потребує вхідної матриці спостереження, і неможливо настроїти зміну міри подібності.
Відповіді:
Оскільки k-засоби повинні вміти знаходити засоби різних підмножин точок, які ви хочете кластеризувати, насправді не має сенсу запитувати версію k-засобів, яка приймає матрицю відстані як вхідну інформацію.
Ви можете спробувати k-medoids . Є кілька реалізацій matlab.
Ви можете перетворити матрицю відстаней у необроблені дані та ввести їх у кластеризацію K-Means. Етапи полягають у наступному:
1) Відстані між вашими N точками повинні бути квадратними евклідовими. Виконайте " подвійне центрування " матриці: середнє значення абстрактного рядка від кожного елемента; у підсумку, середній стовпчик означає серед кожного елемента; в результаті додайте середнє значення матриці до кожного елемента; ділимо на мінус 2. Матриця, яку ви маєте зараз, - це матриця SSCP (сума-квадратів і перехресних добутків) між вашими точками, в якій початок покладено в геометричний центр хмари з N точок. (Прочитайте пояснення подвійного центрування тут .)
2) Виконайте PCA (аналіз основних компонентів) на цій матриці та отримайте матрицю завантаження компонентів NxN . Деякі з останніх стовпців цього, ймовірно, будуть усі 0, тому відріжте їх. Те, що ви залишаєтесь зараз, - це фактично основні показники компонентів, координати ваших N точок на основні компоненти, які проходять, як осі, через вашу хмару. Ці дані можуть розглядатися як необроблені дані, придатні для введення K-Means.
PS Якщо ваші відстані не є геометрично правильними квадратними евклідовими, ви можете зіткнутися з проблемою: матриця SSCP може бути не позитивною (напів) визначеною. З цією проблемою можна впоратися кількома способами, але з втратою точності.
X
(скажімо , N * N) буде симетричними, так colMeans(X) =rowMeans(X)
і як тільки ви віднімаєте рядки або Col кошти: Y=X-rowMeans(X)
, mean(Y)
0.
You could turn your matrix of distances into raw data
(пункти 1 і 2), я посилаюсь, по суті, на багатовимірне масштабування Торгерсона (MDS) , в якому подвійне центрування є початковим кроком. Перегляньте цей веб-сайт (і Google) про цю процедуру. "Подвійне центрування" - це перетворення (квадратних) відстаней у відповідну скалярну матрицю добутку, визначену над початком, покладеним у центроїд хмари точок.
Будь ласка, дивіться цю статтю, написану одним з моїх знайомих;)
http://arxiv.org/abs/1304.6899
Йдеться про узагальнену реалізацію k-засобів, яка приймає довільну матрицю відстані як вхід. Це може бути будь-яка симетрична негативна матриця з нульовою діагоналлю. Зауважте, що це може не дати розумних результатів для дивних матриць відстані. Програма написана на C #.
Вихідний код можна отримати, перейшовши на вищезазначене посилання, потім натисніть кнопку Інші формати, потім натисніть Завантажити джерело. Тоді ви отримаєте .tar.gz, що містить Program.cs. Крім того, вихідний код можна скопіювати і з PDF.
Ви можете використовувати бібліотеку машинного навчання Java. Вони мають K-Means реалізацію. Один з конструкторів приймає три аргументи
Можна легко розширити клас DistanceMeasure для досягнення бажаного результату. Ідея полягає у поверненні значень із власної матриці відстані методом вимірювання (Instance x, Instance y) цього класу.
K-Means гарантовано збігається, припускаючи певні властивості метрики відстані. Евклідова відстань, відстань Манхеттена або інші стандартні показники задовольняють цим припущенням. Оскільки спеціальна метрика відстані може не задовольняти цим припущенням, у конструктора є третій параметр, який визначає кількість ітерацій, які потрібно виконати для побудови кластера.