Fuzzy C-means入門と実践:数式・アルゴリズム・応用と実装のコツ
概要:Fuzzy C-meansとは何か
Fuzzy C-means(FCM、ファジィC平均法)は、データを重なり合うクラスタに分割するための代表的なファジィクラスタリング手法です。各データ点は各クラスタに属する度合い(メンバシップ値)を持ち、これにより境界がはっきりしない、またはノイズを含むデータに対して柔軟にクラスタリングできます。代表的な導入はJ.C. Bezdekによる1981年の著作で広く知られていますが、発展系・派生手法も多数存在します。
基本的な考え方と目的関数
FCMは以下の目的関数(目的関数を最小化することを目標)に基づきます:
- J_m = Σ_{i=1}^N Σ_{j=1}^C u_{ij}^m ||x_i - c_j||^2
ここで、x_iはi番目のデータ点、c_jはj番目のクラスタ中心、u_{ij}はデータ点iがクラスタjに属する度合い(0≤u_{ij}≤1)、mはファジィネスパラメータ(通常m>1, 一般にm=2がよく使われる)です。制約として各データ点に対してΣ_{j=1}^C u_{ij} = 1 が成り立ちます。
更新式(反復更新の核)
目的関数を最小化するために、クラスタ中心とメンバシップを交互に更新します。代表的な更新式は次の通りです:
- クラスタ中心の更新: c_j = (Σ_{i=1}^N u_{ij}^m x_i) / (Σ_{i=1}^N u_{ij}^m)
- メンバシップの更新: u_{ij} = 1 / Σ_{k=1}^C (||x_i - c_j|| / ||x_i - c_k||)^{2/(m-1)}
距離には通常ユークリッド距離が使われますが、問題に応じて他の距離尺度(加重距離、マハラノビス距離など)を用いることも可能です。
アルゴリズムの手順
- 1) クラスタ数Cとファジィ係数mを設定する(mは通常1.5〜3の範囲で2が多い)。
- 2) メンバシップ行列U = [u_{ij}]をランダムに初期化(各iについてΣ_j u_{ij}=1)するか、初期クラスタ中心を設定する。
- 3) クラスタ中心c_jをUから計算する。
- 4) 中心を使ってUを更新する。
- 5) 目的関数の変化やUの変化が許容閾値以下になるまで3〜4を繰り返す(最大反復回数で打ち切ることもある)。
- 6) 最終的にUとcを出力する。必要なら最大メンバシップに基づくハードクラスタ割当も行える。
パラメータと初期化の注意点
・クラスタ数C:事前に決める必要があり、適切なCはデータ特性に依存します。エルボー法、シルエット、あるいは情報量基準(ただしFCMのために直接設計された基準は少ない)などを利用して検討します。
・ファジィ係数m:mが大きいとメンバシップがより平坦になりクラスタが曖昧になります。m=2が実務ではよく使われますが、データのノイズ量や分離度に応じて調整します。
・初期化:メンバシップの初期化により局所最適に陥る可能性があるため、複数回ランダム初期化して最良解を取る、あるいはk-meansの結果を初期中心に利用するなどの戦略が有効です。
距離尺度と派生手法
標準FCMはユークリッド距離を前提としますが、以下のような派生手法があります:
- Gustafson–Kessel (GK) FCM:各クラスタに適応的な共分散(楕円形クラスタ)を許す手法。マハラノビス的距離を導入して異方性クラスタに対応します。
- Possibilistic C-means(PCM):従来の確率的メンバシップ制約(Σ_j u_{ij}=1)を外し、外れ値に対して頑健なメンバシップ推定を行う。Krishnapuram & Kellerらの研究で提案されています。
- Kernel FCM:カーネル関数を用いることで、非線形分離面を扱えるようにするカーネル化手法があります。
収束性と計算量
FCMは目的関数を反復的に最小化するため、通常は単調減少し(適切な更新式の下で)局所最適に収束します。ただしグローバル最適性は保証されず、初期化に依存します。計算量の観点では、1反復あたりのコストはO(N × C × d)(N:データ数、C:クラスタ数、d:次元)であり、高次元・大量データに対しては計算負荷が大きくなります。高速化のためにミニバッチ、サンプリング、近傍制限、または効率的な距離計算の工夫が使われます。
利点と欠点
- 利点:・柔軟なクラスタ境界(重なりを表現できる)・各点のクラスタ帰属度が得られるため、曖昧さを扱いやすい・画像処理やパターン認識で直感的に利用しやすい。
- 欠点:・初期化に敏感で局所解に陥りやすい・外れ値に弱い(PCMなどで改善可能)・事前にクラスタ数を決める必要がある・大規模データや高次元データで計算コストが高い。
実務的な適用上のポイント
- データ前処理:スケーリング(標準化や最小最大正規化)を必ず行う。距離が特徴スケールに敏感なため、各次元のスケールを揃えることが精度向上に直結します。
- ノイズ対策:外れ値が多い場合はPCMやロバスト距離を検討する。事前に外れ値検出を行って除去・重み付けするのも有効です。
- 初期化の工夫:複数回実行して最良結果を採用する、k-means++風の初期中心選択、あるいは階層クラスタリングで候補を絞るなど。
- 可視化と解釈:低次元化(PCAやt-SNE)してメンバシップ分布を可視化すると、クラスタの曖昧さや重なりが把握しやすくなります。
実装とライブラリ
FCMは比較的実装が容易で、多くの言語・ライブラリで利用できます。代表例:
- Python:scikit-fuzzy(skfuzzy.cluster.cmeans)に標準実装あり。
- MATLAB:Fuzzy Logic Toolboxにfcm関数があり、GUIや可視化ツールも利用可能。
- R:ebiometやe1071などのパッケージに類似機能がある場合があります(ただし実装の仕様を確認)。
実装時は数値安定性に注意(距離がゼロに近くなるとゼロ割が発生する)。この場合は微小値で除算を安定化する、あるいは距離ゼロはそのクラスタへのメンバシップを1に固定するなどの対処を行います。
代表的な適用例
- 画像セグメンテーション:ピクセル単位でメンバシップを割り当て、領域の曖昧境界を表現。色空間や空間的正則化と組み合わせることが多い。
- 医用画像解析:組織の境界が不鮮明な場合に弾力的に使用される。
- バイオインフォマティクス:遺伝子発現データなどで、遺伝子が複数の機能群に関与する際の曖昧なクラスタリングに有用。
- 顧客セグメンテーション:顧客行動が明確なグループに分かれない場合のソフトクラスタリング。
実務でよくある質問と回答
- Q. クラスタ数がわからないときは? A. 複数のCで実験してクラスタの解釈性や外部指標(もしラベルがあれば)を比較する。階層クラスタやギャップ統計量、シルエットを参考にする。
- Q. mはどのように選べばいい? A. m=2がデフォルト。ノイズが多ければやや大きめにして柔らかくするなどデータに応じてチューニングする。
- Q. 高次元データではどうする? A. 前処理として次元削減(PCA、UMAPなど)や特徴選択を行い、計算負荷と過学習を軽減する。
まとめ
Fuzzy C-meansは、曖昧さを明示的に扱える柔軟なクラスタリング手法であり、画像処理や生物情報学、マーケティングなど幅広い分野で有効です。一方で初期化や外れ値の影響、事前に必要なクラスタ数の決定などの課題もあります。実務では前処理、複数回の初期化、場合によっては派生手法(PCM、GK、Kernel FCM)を使い分けることで実用性を高められます。
参考文献
- Fuzzy clustering — Wikipedia
- J.C. Bezdek, Pattern Recognition with Fuzzy Objective Function Algorithms (1981) — 参考情報
- scikit-fuzzy: cmeans documentation and examples
- MathWorks: fcm (Fuzzy C-means) — MATLAB Documentation
- K. Krishnapuram, J. M. Keller, "A Possibilistic Approach to Clustering" (1993), IEEE Transactions on Fuzzy Systems


