如何在" k-means聚类中初始化质心"属于数据点的域?

时间:2016-09-18 19:57:47

标签: python-3.x cluster-analysis k-means

如何修改此代码以初始化所采用数据点的域内的质心?

例如:如果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

2 个答案:

答案 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