k-означає реалізацію з власною матрицею дистанції у вході


14

Чи може хтось вказати мені на реалізацію k-засобів (було б краще, якщо в matlab), яка може взяти матрицю відстані у введенні? Стандартна реалізація matlab потребує вхідної матриці спостереження, і неможливо настроїти зміну міри подібності.


2
Ви можете спробувати генерувати необроблені дані, що відповідають вашій матриці евклідових відстаней і вводити їх до K-Means. Альтернативним простим підходом може бути використання методу Уорда ієрархічного кластеризації матриці: K-Means та Ward поділяють схожу ідеологію того, що таке кластер.
ttnphns


Не Matlab, але сторінка python у розділі --it-moguće-вказувати-your-own-distance-function-using-scikits-learn-k-означає може використовувати будь-яку з 20-ти непарних показників у scipy.spatial. відстань.
denis

Відповіді:


13

Оскільки k-засоби повинні вміти знаходити засоби різних підмножин точок, які ви хочете кластеризувати, насправді не має сенсу запитувати версію k-засобів, яка приймає матрицю відстані як вхідну інформацію.

Ви можете спробувати k-medoids . Є кілька реалізацій matlab.


1
Привіт, дякую за відповідь; замість того, щоб безпосередньо дати матрицю відстані, чи можна було б надати як вхід спеціальну метрику відстані? Справа в тому, що я маю порівнювати два методи кластеризації, і оскільки у другому я використовую власну матрицю подібності, я хочу використовувати той самий підхід з kmeans, щоб отримати справедливе порівняння.
Євгеніо

2
ELKI дозволяє використовувати довільні функції відстані з k-засобами. Зверніть увагу, що алгоритм може згодом збігатися. K-засоби дійсно розраховані на евклідову відстань у квадраті (сума квадратів). З іншими відстанями середнє значення може більше не оптимізуватися, і алгоритм з часом не збіжиться. Серйозно, подумайте про використання k-медоїдів. Насправді було написано, щоб дозволити використовувати ідею k-означає з довільними відстанями.
Мав QUIT - Anonymous-Mousse

Існує також піклустеризація бібліотеки python / C ++, яка дозволяє постачати власну метричну функцію: github.com/annoviko/pyclustering/isissue/417
CpILL

8

Ви можете перетворити матрицю відстаней у необроблені дані та ввести їх у кластеризацію K-Means. Етапи полягають у наступному:

1) Відстані між вашими N точками повинні бути квадратними евклідовими. Виконайте " подвійне центрування " матриці: середнє значення абстрактного рядка від кожного елемента; у підсумку, середній стовпчик означає серед кожного елемента; в результаті додайте середнє значення матриці до кожного елемента; ділимо на мінус 2. Матриця, яку ви маєте зараз, - це матриця SSCP (сума-квадратів і перехресних добутків) між вашими точками, в якій початок покладено в геометричний центр хмари з N точок. (Прочитайте пояснення подвійного центрування тут .)

2) Виконайте PCA (аналіз основних компонентів) на цій матриці та отримайте матрицю завантаження компонентів NxN . Деякі з останніх стовпців цього, ймовірно, будуть усі 0, тому відріжте їх. Те, що ви залишаєтесь зараз, - це фактично основні показники компонентів, координати ваших N точок на основні компоненти, які проходять, як осі, через вашу хмару. Ці дані можуть розглядатися як необроблені дані, придатні для введення K-Means.

PS Якщо ваші відстані не є геометрично правильними квадратними евклідовими, ви можете зіткнутися з проблемою: матриця SSCP може бути не позитивною (напів) визначеною. З цією проблемою можна впоратися кількома способами, але з втратою точності.


Дякую за вашу відповідь! Насправді у мене немає матриці реальної відстані, а матриці подібності (0 ... 1) серед об'єктів, і подібність обчислюється не точно за допомогою евклідових відстаней, а за власним алгоритмом, який враховує необроблені дані, але не в стандартний спосіб. Я думаю, що в цьому випадку я не можу застосувати вашу процедуру, я прав?
Євгеніо

Ви все ще можете, перетворивши подібність на відстані. Останнє, ймовірно, не є справжнім евклідовим (і тому SSCP матиме деякі негативні власні значення); потім спробуйте додати малу константу до відстаней, поки SSCP не втратить позначку. eig. Існують також інші способи подолати проблему. І, будь ласка, пам’ятайте, що ви подвоюєте центральну матрицю відстаней у квадраті .
ttnphns

PS І до речі. Якщо ваша матриця схожа, то, ну, ще краще. Ви просто трактуєте це як ту матрицю SSCP, про яку я говорив, і робити PCA з нею. Проте проблема можливих негативних власних значень залишається.
ttnphns

@ttnphns, вибач я пропускаю ваше пояснення для кроку 1. матрицю відстаней X(скажімо , N * N) буде симетричними, так colMeans(X) =rowMeans(X) і як тільки ви віднімаєте рядки або Col кошти: Y=X-rowMeans(X), mean(Y)0.
Zhubarb

1
@Zhubarb, коли я кажу You could turn your matrix of distances into raw data(пункти 1 і 2), я посилаюсь, по суті, на багатовимірне масштабування Торгерсона (MDS) , в якому подвійне центрування є початковим кроком. Перегляньте цей веб-сайт (і Google) про цю процедуру. "Подвійне центрування" - це перетворення (квадратних) відстаней у відповідну скалярну матрицю добутку, визначену над початком, покладеним у центроїд хмари точок.
ttnphns

3

Будь ласка, дивіться цю статтю, написану одним з моїх знайомих;)

http://arxiv.org/abs/1304.6899

Йдеться про узагальнену реалізацію k-засобів, яка приймає довільну матрицю відстані як вхід. Це може бути будь-яка симетрична негативна матриця з нульовою діагоналлю. Зауважте, що це може не дати розумних результатів для дивних матриць відстані. Програма написана на C #.

Вихідний код можна отримати, перейшовши на вищезазначене посилання, потім натисніть кнопку Інші формати, потім натисніть Завантажити джерело. Тоді ви отримаєте .tar.gz, що містить Program.cs. Крім того, вихідний код можна скопіювати і з PDF.


3

Ви можете використовувати бібліотеку машинного навчання Java. Вони мають K-Means реалізацію. Один з конструкторів приймає три аргументи

  1. K Значення.
  2. Об'єктом цього є екземпляр класу DistanceMeasure .
  3. Кількість ітерацій.

Можна легко розширити клас DistanceMeasure для досягнення бажаного результату. Ідея полягає у поверненні значень із власної матриці відстані методом вимірювання (Instance x, Instance y) цього класу.

K-Means гарантовано збігається, припускаючи певні властивості метрики відстані. Евклідова відстань, відстань Манхеттена або інші стандартні показники задовольняють цим припущенням. Оскільки спеціальна метрика відстані може не задовольняти цим припущенням, у конструктора є третій параметр, який визначає кількість ітерацій, які потрібно виконати для побудови кластера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.