Як ви протестуєте реалізацію k-засобів?


11

Відмова: Я опублікував це питання на Stackoverflow, але я подумав, що, можливо, це краще підходить для цієї платформи.

Як ви протестуєте власну реалізацію k-засобів для багатовимірних наборів даних?

Я думав запустити вже наявну реалізацію (тобто Matlab) на даних і порівняти результати з моїм алгоритмом. Але для цього потрібно, щоб обидва алгоритми працювали приблизно приблизно однаково, і відображення між двома результатами, ймовірно, не є частиною пирога.

У вас є краща ідея?

Відповіді:


10

До складу k-засобів входить стохастичний компонент, тому малоймовірно, що ви отримаєте той самий результат, якщо не будете мати абсолютно таку ж реалізацію і не використовувати однакову стартову конфігурацію. Однак ви можете побачити, чи відповідають ваші результати з відомими реалізаціями (не знаю про Matlab, але реалізація алгоритму k-засобів в R добре пояснена, див. Hartigan & Wong, 1979 ).

Що стосується порівняння двох серій результатів, то все ще існує проблема перемикання міток, якщо її потрібно запустити кілька разів. Знову ж таки, в пакеті e1071 R є дуже зручна функція (; matchClasses()), яка може бути використана для пошуку "найкращого" зіставлення між двома категоріями у двосторонній класифікаційній таблиці. В основному ідея полягає в тому, щоб переставити рядки так, щоб максимізувати їх згоду з стовпцями, або використовувати жадібний підхід і переставляти рядки та стовпці до тих пір, поки сума діагоналі (необмеженої угоди) не буде максимальною. Коефіцієнт узгодження, такий як статистика Kappa , також передбачений.

Нарешті, про те, як орієнтувати свою реалізацію, існує багато вільно доступних даних або ви можете імітувати виділений набір даних (наприклад, через обмежену модель суміші, див. Пакет MixSim ).


привіт чи, дякую за відповідь. Коли ви хочете, ви також можете відповісти на ідентичне запитання в SO, і я також прийняв би його. => Stackoverflow.com/questions/4280371 / ...
Framester

(+1) Перший абзац швидко потрапляє до суті справи.
whuber

6

Відображення між двома наборами результатів легко обчислити, оскільки інформація, яку ви отримуєте в тесті, може бути представлена ​​у вигляді набору з трьох кортежів: перший компонент є (багатовимірною) точкою, другий - міткою довільної кластери надається вашим алгоритмом, а третя - мітка (довільна) кластера, що постачається опорним алгоритмом. Побудуйте по kккТаблиця класифікації пар міток: якщо результати узгоджуються, це буде кратним матриці перестановки. Тобто кожен рядок і кожен стовпець повинні мати рівно одну ненульову комірку. Це проста перевірка програми. Також легко відстежувати невеликі відхилення від цього ідеального повернення до окремих точок даних, щоб ви могли точно бачити, як відрізняються обидві відповіді, якщо вони взагалі відрізняються. Я б не покладався на обчислення статистичних заходів узгодження: або існує досконала згода (аж до перестановки), або її немає, і в останньому випадку вам потрібно відстежити всі точки розбіжності, щоб зрозуміти, як вони відбуваються. Результати або згодні, або вони не відповідають; будь-яка кількість розбіжностей, навіть лише в одному пункті, потребує перевірки.

Для тестування ви можете використовувати кілька типів наборів даних: (1) опубліковані набори даних з опублікованими результатами k-засобів; (2) синтетичні набори даних із очевидними сильними кластерами; (3) синтетичні набори даних без явного кластеризації. (1) - це хороша дисципліна, яку слід використовувати, коли ви пишете будь-яку програму з математики чи статистики. (2) це легко зробити багатьма способами, наприклад, генеруючи деякі випадкові точки, що служать центрами кластерів, а потім генерувати хмари точок шляхом випадкового переміщення центрів кластерів порівняно невеликими кількостями. (3) надає деякі випадкові перевірки, які потенційно можуть виявити несподівані поведінки; знову ж таки, це хороша загальна дисципліна тестування.

Крім того, розгляньте можливість створення наборів даних, які підкреслюють алгоритм, лежачи просто на межах між крайніми рішеннями. Для цього знадобиться творчість і глибоке розуміння алгоритму (який, мабуть, у вас є!). Одним із прикладів, який я хотів би перевірити в будь-якому випадку, були б набори векторів форми де v - вектор без нульових компонентів, і я приймає послідовні цілісні значення 0 , 1 , 2 , , n - 1 . Я також хотів би перевірити алгоритм на множинах векторів, які утворюють рівносторонні багатокутники. В будь-якій ситуації випадки, коли n - ніivvi0,1,2,,н-1нкратно , особливо цікаві, в тому числі , де п є менше , ніж до . Загальним для цих ситуацій є те, що (а) вони використовують усі виміри проблеми, але (б) правильні рішення є геометрично очевидними, і (в) є кілька правильних рішень.кнк

г2уv2гхzхz

ш=z-(zх)х.

ушхухугнcos(2πк/н)х+гріх(2πк/н)ук0н-1


(+1) Ваші коментарі щодо можливих способів генерування відповідних синтетичних даних дуже вітаються.
chl

2

Одним з дуже простих «наївних» підходів було б використання простих синтетичних даних, для яких кожна реалізація повинна мати результат в однакових кластерах.

Приклад в Python з import numpy as np:

test_data = np.zeros((40000, 4))
test_data[0:10000, :] = 30.0
test_data[10000:20000, :] = 60.0
test_data[20000:30000, :] = 90.0
test_data[30000:, :] = 120.0

Бо n_clusters = 4він повинен дати вам перестановку[30, 60, 90, 120]


0

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

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