\

k-means法とは

k-means法は、データを適当なクラスタに分けた後、クラスタの平均を用いてデータがうまく分かれるように調整するアルゴリズムです。任意の指定のk個のクラスタを作成するアルゴリズムであることから、k-means法 (k点平均法と呼ばれています)。

k-means法のアルゴリズム

k-means法のアルゴリズムは以下のような工程を辿ります。

  1. 各点 $x_i$ に対してランダムにクラスタを割り振る
  2. 各クラスタに割り当てられた点について重心を計算する
  3. 各点について上記で計算された重心からの距離を計算し、距離が一番近いクラスタに割り当て直す。
  4. 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法を理解し、実装する方法について説明しました。このアルゴリズムはデータ分析や機械学習において非常に重要な役割を果たします。ぜひ活用してみてください。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です