2016-09-18 30 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;最大]每個。