K-means - это стандартный алгоритм кластеризации без наблюдения, который, учитывая набор «точек» и количество кластеров 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]]
.