Lloyd法(ロイド法)徹底解説:原理・実装・応用と実務での注意点

概要 — Lloyd法とは何か

Lloyd法(ロイド法)は、代表点(セントロイド)を用いてデータをクラスタ化・量子化する反復的アルゴリズムで、k-means 法や centroidal Voronoi tessellation(CVT、中心的ヴォロノイ分割)として知られる手法の代表的実装です。もともとは信号量子化(PCM)の最小二乗誤差を求める目的で Stuart Lloyd によって提案され(1957年の内部報告、その後 1982 年に論文化)、後に k-means と同一視されることが多く、画像処理・圧縮・メッシュ生成・サンプリング・機械学習の前処理など広い分野で利用されています。

歴史的背景と命名

アルゴリズムは Stuart P. Lloyd に起源を持ち、1960 年代の量子化理論(Max の理論)と結びつき「Lloyd–Max アルゴリズム」としても言及されます。k-means としての扱いは数学・統計・機械学習コミュニティで広まり、実装や改良(k-means++、ミニバッチ k-means、分散版 k-means|| など)が続きました。

アルゴリズムの定義と数学的直感

目的は与えられたデータ集合 X = {x_i} を k 個のクラスタに分割し、各クラスタの重心(セントロイド)を最適化して総二乗距離誤差(inertia)を最小化することです。最小化したい目的関数は次のように表されます:

J = sum_{i=1..n} || x_i - c_{assign(i)} ||^2

ここで c_j はクラスタ j のセントロイド、assign(i) は点 x_i の割当てクラスタを表します。Lloyd法は次の二つのステップを反復します:

  • 割当てステップ:各点を最も近いセントロイドに割り当てる(Voronoi 分割)。
  • 再計算ステップ:各クラスタのセントロイドをそのクラスタに属する点の平均に更新する。

これらのステップは目的関数 J を単調非増加にし、局所最小に収束します(ただし大域的最小が保証されるわけではありません)。

手続き(擬似コード)

実装の基本的な流れは以下の通りです。

  • 初期化:k 個の初期セントロイドを決定(ランダムに選ぶ、k-means++ など)。
  • 反復:
    • 各データ点を最も近いセントロイドに割り当てる。
    • 各クラスタの新しいセントロイドを計算する(平均)。
    • セントロイドが変化しなくなるか、最大反復回数に達するまで繰り返す。

計算量と収束特性

単純実装の計算量は各反復で O(n k d)(n はデータ点数、k はクラスタ数、d は次元数)です。反復回数を I とすると総コストは O(n k d I) になります。高次元や大規模データではコストが問題となるため、多くの最適化や近似法が提案されています。

収束は必ず有限回で終了するとは言えませんが(連続値空間では)、ほとんどの実装は閾値停止や反復上限を設けます。重要なのは局所最適に陥ることで、初期化により結果が大きく変わる点です。

実装上の注意点とベストプラクティス

  • 初期化:ランダム初期化では結果が不安定になるため、k-means++(Arthur & Vassilvitskii)などの賢い初期化を使うと急速に良好な結果に収束する傾向があります。
  • 空クラスタの処理:ある反復でクラスタにデータが割り当たられないことがある。代表的対処法はランダムに点を選んで再初期化する、または分散が大きいクラスタから点を移す等です。
  • 停止基準:セントロイドの移動量が閾値以下、目的関数の変化が閾値以下、または最大反復回数に到達したら停止。
  • スケーリングと距離尺度:ユークリッド距離を用いるため各特徴量のスケールを揃える(標準化、正規化)が重要。異なる尺度だとクラスタが歪みます。
  • 高次元対策:次元削減(PCA、t-SNE は可視化向け)や特徴選択を検討。高次元では距離の集中現象に注意が必要です。

代表的な改良・派生手法

  • k-means++:初期セントロイドを確率的に選ぶことで初期化のばらつきを抑え、良好な局所解へ導きやすくする手法。
  • ミニバッチ k-means:大規模データ向けにランダムミニバッチで更新を行い計算コストを下げる(Sculley 2010)。
  • k-means||:分散環境(MapReduce 等)向けに設計されたスケーラブルな初期化法。
  • 高速化アルゴリズム:Elkan の三角不等式を使う高速 k-means、Hamerly の上界/下界を使った手法など。
  • 代替クラスタリング手法:非球状クラスタには DBSCAN、階層クラスタリング、GMM(混合ガウス)などが有力。

代表的な応用例(IT分野)

  • 画像量子化・カラーパレット生成:画像の色数を k に削減する際に用いられる。色空間で k-means を実行して代表色を決める。
  • ベクトル量子化とデータ圧縮:信号処理で離散的表現(コードブック)を作る用途。
  • クラスタリングによるユーザ分析・レコメンデーションの前処理:ユーザやアイテムをグルーピングして特徴を要約。
  • サンプリングとメッシュ生成:Centroidal Voronoi Tessellation はメッシュの最適化やブルーノイズサンプリングに利用。
  • 大規模データの近似検索の前処理:高速近似探索のための分割に利用。

実務でよくある問題と対処法

  • 局所最適に陥る:複数回異なる初期化で実行しベストを選ぶ。k-means++ を使う。
  • クラスタ数 k の決定:エルボー法、シルエットスコア、Gap 統計量、情報量基準(BIC/AIC)などを組み合わせて検討する。
  • カテゴリ変数の扱い:直接ユークリッド距離は不適。ワンホット化や混合距離、または別手法を検討。
  • スケールと外れ値:外れ値に敏感なため、ロバストスケーリングや外れ値除去を検討。

実装例とライブラリ

Python の scikit-learn には k-means 実装があり、k-means++、ミニバッチ k-means 等が利用可能です。GPU 環境では RAPIDS cuML が高速化を提供します。重要なのは実装上で初期化、停止条件、再現性(乱数シード)を明確にすることです。

Lloyd法を選ぶべき場面・避けるべき場面

Lloyd法はシンプルで高速に実装でき、球状クラスタや代表値抽出が目的の場面で非常に有効です。一方、形状が複雑なクラスタやカテゴリが混在するデータ、高次元で距離が意味をなさない場合は別手法を検討してください。

まとめ

Lloyd法(k-means)はその単純さと実用性から多くの IT 実務で活用されている基礎アルゴリズムです。初期化、スケーリング、k の選定といった実務上の工夫が結果の品質を大きく左右します。大規模データやリアルタイム処理ではミニバッチや分散版を、分布の形状が複雑な場合は別のクラスタリング手法を視野に入れると良いでしょう。

参考文献