如何修改此代码以初始化所采用数据点的域内的质心?
例如:如果DATA = [[2.0,5.0],[1.0,5.0],[22.0,55.0],[42.0,12.0],[15.0,16.0]] 然后质心(x,y)可以是任何值,使得x属于:[1,42]并且y属于:[5,55]。 质心不一定是数据点。
注意:数据的dataype是float。
import random
import math
BIG_NUMBER = math.pow(10, 10)
data = []
centroids = []
class Centroid:
def __init__(self, x, y):
self.x = x
self.y = y
def set_x(self, x):
self.x = x
def get_x(self):
return self.x
def set_y(self, y):
self.y = y
def get_y(self):
return self.y
def initialize_centroids(k,DATA):
for j in range(k):
x = random.choice(DATA)
centroids.append(Centroid(x[0], x[1]))
return
答案 0 :(得分:1)
初始化k-means的常用方法是使用随机采样的数据点。
通过从数据范围中绘制随机数进行初始化不可以改善结果。这看起来似乎是一个好主意,但它存在很大问题,因为它建立在数据均匀分布的错误假设之上。相反,数据是聚类的,最好的中心位于集群的中间。特别是,您会经常看到空群集,因此此初始化通常是最差选择。
如果你坚持,找到每个轴上的最小值和最大值,然后从Uniform [min;每个最大值。
答案 1 :(得分:0)
您当前的方法类似于选择初始质心的Forgy方法。您可以使用random.sample
选择 k 数据点,而不是循环和进行随机选择。这通常是一种很好的方法。然而,你的评论与这个问题相矛盾,说明质心不能是数据点。
另一种方法是将每个数据点随机分配给一个初始分区(例如shuffle然后对数据进行切片)并使用 k 随机选择的分区的计算质心
random.shuffle(data)
random_partitions = [data[i::k] for i in range(k)]
centroids = [ "calculate centroid of partition()" for partition in random_partitions]
这种方法倾向于将质心放在数据中间附近,这可能是理想的。
请参阅https://en.wikipedia.org/wiki/K-means_clustering#Initialization_methods