2019年7月24日k-means法を実行する際に妥当なkを決めたいという欲求があります。クラスタ集合の凝集度を定量化することでkと凝集度の関係を得られます。複数のkについてkと凝集度の関係を取得し、そこから妥当なkを発見する方法がエルボー法です。この記事においては以下を書いてみます。クラスタ集合の凝集度を定量化する方法kと凝集度の関係を表すグラフの書き方クラスタ集合の凝集度を定量化する方法これ以上無いくらいシンプルなやり方です。データポイントとcentroidの距離の2乗和(SSE)を凝集度として使います。それを全クラスタに関して計算し足し合わせます。足し合わせた値を歪み(distortion)と言っているところが多いです。クラスタ数kが増えるにつれてこの値は小さくなるだろうと予測できます。横軸にk、縦軸にSSEの和をとるグラフを書いてみると、kの増加に伴ってSSEの和が小さくなること、減少幅は次第に小さくなりそうです。(すべてのケースでそうなるのかは不明)減少幅が緩やかになる地点のkが費用対効果が高いkですし、ほぼ減少が止まる(サチる)地点のkを採用することは、それ以上kを増加させても意味がないという事実を根拠として使えそうです。前回から使っている多次元正規分布に従う擬似クラスタデータに対してk-meansを適用します。k=1から9まで適用し、k-distortionグラフを書いてみます。(だいぶPythonに慣れてきた..。clusters')plt.ylabel('Distortion')plt.show()複数の擬似点を中心に2次元正規分布に従う散らばりをもったデータ達です。k-distortionグラフです。もの凄い期待通りなグラフができました。k=5か6あたりでdistortionがサチっています。6-meansを適用し、centroidを重ねてみました。確かに4-meansと5-meansでは、5-meansの方が凝集していそうです。5-meansと6-meansだと、4と5程凝集度合いに変化がなさそうです。コメントをキャンセルコメントを投稿するにはログインしてください。関連記事6個のデータポイント近隣に発生させたデータ達を6-meansでクラスタ分割できるかmultivariate_normalを使って6個のデータポイント近隣にデータ達を発生させる。薄くクラスタを見つけられそうだけれど境界は曖昧で大分被っているという状況。...sklearnとmatplotlibでsihoutte係数を見てみようとして失敗した話とyellowbricksihoutteって何て読むのか...と思うけども”シルエット”だそう。