K-means是一种标准的无监督聚类算法,在给定一组“点”和多个K聚类的情况下,它将将每个“点”分配给K个聚类之一。
K均值的伪码
注意,K-means有很多变体。您必须实现我在下面描述的算法。只要给定相同的初始点,您可以获得与该算法相同的结果,就可以对算法进行一些更改或使用内置函数。
在此挑战中,所有输入将是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
输入和输出
- 您可以通过
STDIN
,或将K和P 用作函数参数等。 - P和P中的点可以使用您选择的语言对集合/列表自然使用的任何结构表示。
- K是严格的正整数。
- 您可以假设输入有效。
- P中至少总是有K点。
- 您可以将群集输出到
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]]
。