K-засоби - це стандартний алгоритм кластеризації без нагляду, який, задавши набір "точок" та декілька кластерів K, призначить кожну "точку" одному з кластерів K.
Псевдокодекс К-засобів
Зауважте, що існує багато варіантів K-засобів. Ви повинні реалізувати алгоритм, який я описую нижче. Можливо, у алгоритмі є певна зміна або використовувати вбудовані модулі до тих пір, поки ви отримаєте такий самий результат, як і цей алгоритм, даючи ті самі початкові точки.
У цьому виклику всі входи будуть точками на 2D площині (кожна точка представлена своїми координатами у x та y).
Inputs: K, the number of clusters
P, the set of points
Choose K points of P uniformly at random
Each chosen point is the initial centroid of its cluster
Loop:
For each point in P:
Assign to the cluster whose centroid is the nearest (Euclidean distance)
In case of a tie, any of the tied cluster can be chosen
Recompute the centroid of each cluster:
Its x coordinate is the average of all x's of the points in the cluster
Its y coordinate is the average of all y's of the points in the cluster
Until the clusters don't change from one iteration to the next
Output: the set of clusters
Входи та виходи
- Ви можете приймати K і P через
STDIN
, або як аргумент функції тощо. - P і точки P можуть бути представлені за допомогою будь-якої структури, природної для набору / списків на обраній вами мові.
- K - суворо додатне ціле число.
- Ви можете припустити, що дані є дійсними.
- Завжди буде не менше K балів у P.
- Ви можете вивести кластери
STDOUT
, повернути їх з функції тощо. - Впорядкованість кластерів і впорядкування всередині кластерів є неважливими. -Ви можете повернути групи точок, які представляють кластери, або кожну точку, позначену ідентифікатором кластеру (наприклад, цілим числом).
Тестові справи
Оскільки отримані кластери залежать від того, які точки були обрані спочатку, ви не зможете отримувати однакові результати (або один і той же результат щоразу, коли запускаєте код).
Отже, візьміть лише результат як приклад виведення.
Input:
K = 1
P = [[1,2.5]]
Output:
[[[1,2.5]]]
Input:
K = 3
P = [[4,8], [15,16], [23,42], [-13.37,-12.1], [666,-666]]
Output:
[[[666,-666]],[[-13.37,-12.1],[4,8]],[[15,16],[23,42]]]
Input:
K = 2
P = [[1,1], [1,1], [1,1]]
Output:
[[[1,1]],[[1,1],[1,1]]]
Оцінка балів
Це код-гольф , тому найкоротша відповідь у байтах виграє.
1
, всі точки другого кластера мають мітку 2
тощо)
K=2, P = [[1,1], [1,1], [1,1]]
.