2016-09-18 26 views
0

如何修改此代码以初始化所采取的数据点域内的质心?如果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]。 质心不一定是数据点。如何初始化属于数据点域的“k-均值聚类”中的质心?

注意:数据的数据表是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

示例代码有什么问题?质心是不是独一无二的? –

+0

@ James K - 初始化的质心不应该只是数据点中的一个,而质心(x,y)应该是任何值,使得x属于:[1,42],y属于:[5,55]为它会影响k均值聚类的性能。 – Utkarsh

回答

0

您目前的方法类似于选择初始质心的Forgy方法。您可以使用random.sample来选择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

0

的初始化k均值使用随机采样的数据点的常用方法。

通过从数据范围中抽取随机数进行初始化确实不是改善结果。这看起来似乎是一个好主意,但它是非常有问题的,因为它建立在数据均匀分布的错误假设之上。相反,数据是聚类的,最好的中心位于聚类的中间。特别是,你会看到空的簇很频繁,所以这个初始化通常是你的最差的选择

如果您坚持,请在每个轴上找到最小值和最大值,然后从Uniform [min;最大]每个。