Global K-means 実装がうまくいかない
環境: Jupyter Notebook, Macbook air, Python2.7
Global K-meansを実装したんですが、アルゴリズムがうまく働いていないのでそれについて質問させてもらいました。K=3以上のクラスタリングになるとなぜかcentroidが近くに設置されます。どこがおかしいんでしょうか?
アルゴリズムについてはHEREスライドの12,13ページにあります。
Global K-means実行結果は以下のとうりです(K=3)
class GlobalKmeans(object):
def __init__(self, X, cluster):
self.X = X
self.num = X.shape[0]
self.label = np.zeros((self.num, 1))
self.cluster = cluster
def distance(self, x, y):
return np.linalg.norm(x-y)
def assign(self):
# Make array for storing value of Cost function
current_distance = 0
temp_dis = 0
clas_rabel = 0
for i in xrange(self.num):
# self.X[i]をcentroid候補として固定
for j in xrange(self.num):
# まず固定したcentroid候補とcurrentデータとの距離測定
kyori = self.distance(self.X[i], self.X[j])
for k in xrange(self.k):
# currentデータと各centroidsとの距離測定
k_kyori = self.distance(self.centroid[k], self.X[j])
#from IPython.core.debugger import Pdb; Pdb().set_trace()
# 一番近い距離をkyoriにする
if k_kyori < kyori:
kyori = k_kyori
else:
kyori = kyori
# 1回目
if i == 0:
current_distance = current_distance + kyori
# 2回目以降はtemp
else:
temp_dis = temp_dis + kyori
# ラベル更新
if temp_dis <= current_distance:
clas_rabel = i
if self.k < self.cluster:
# Add centroid
self.centroid = np.concatenate((self.centroid, self.X[clas_rabel].reshape((1,2))), axis = 0)
#from IPython.core.debugger import Pdb; Pdb().set_trace()
def give_label(self):
for i in xrange(self.num):
temp = self.distance(self.X[i], self.centroid[0])
labe = 0
for k in xrange(self.k):
if k == 0:
continue
if temp > self.distance(self.X[i], self.centroid[k]):
labe = k
self.label[i] = labe
def fit(self):
self.k = 1
self.centroid = np.mean(self.X, axis = 0).reshape((1,2))
while(self.k <= self.cluster):
self.assign()
self.k = self.k + 1
self.k = self.k - 1
self.give_label()
def plot(self):
plt.figure(figsize=(10,10))
for j in xrange(self.cluster):
points = X[np.where(self.label == j)[0]]
plt.scatter(points[:,0], points[:,1])
plt.scatter(self.centroid[j,0], self.centroid[j,1], s = 300, marker = "x")