k-means法とは
k-means法は、データを適当なクラスタに分けた後、クラスタの平均を用いてデータがうまく分かれるように調整するアルゴリズムです。任意の指定のk個のクラスタを作成するアルゴリズムであることから、k-means法 (k点平均法と呼ばれています)。
k-means法のアルゴリズム
k-means法のアルゴリズムは以下のような工程を辿ります。
- 各点 $x_i$ に対してランダムにクラスタを割り振る
- 各クラスタに割り当てられた点について重心を計算する
- 各点について上記で計算された重心からの距離を計算し、距離が一番近いクラスタに割り当て直す。
- 2.と3.の工程を、割り当てられるクラスタが変化しなくなるまで行う
k-means法の実装
Pythonのコードは以下の通りです。
import numpy as np
import itertools
class KMeans:
def __init__(self, n_clusters, max_iter = 1000, random_seed = 0):
self.n_clusters = n_clusters
self.max_iter = max_iter
self.random_state = np.random.RandomState(random_seed)
def fit(self, X):
cycle = itertools.cycle(range(self.n_clusters))
self.labels_ = np.fromiter(itertools.islice(cycle, X.shape[0]), dtype = np.int)
self.random_state.shuffle(self.labels_)
labels_prev = np.zeros(X.shape[0])
count = 0
self.cluster_centers_ = np.zeros((self.n_clusters, X.shape[1]))
while (not (self.labels_ == labels_prev).all() and count < self.max_iter):
for i in range(self.n_clusters):
XX = X[self.labels_ == i, :]
self.cluster_centers_[i, :] = XX.mean(axis = 0)
labels_prev = self.labels_
dist = ((X[:, :, np.newaxis] - self.cluster_centers_.T[np.newaxis, :, :]) ** 2).sum(axis = 1)
self.labels_ = dist.argmin(axis = 1)
count += 1
def predict(self, X):
dist = ((X[:, :, np.newaxis] - self.cluster_centers_.T[np.newaxis, :, :]) ** 2).sum(axis = 1)
labels = dist.argmin(axis = 1)
return labels
まとめ
以上、Pythonを用いてk-means法を理解し、実装する方法について説明しました。このアルゴリズムはデータ分析や機械学習において非常に重要な役割を果たします。ぜひ活用してみてください。