比較的分かりやすいし、それなりに速いし、実装も楽。みんな大好き k-means 法。 今回はそんな k-means 法を、 C# の LINQ(+MoreLINQ) で書いてみました。 k-means 法について 簡単に言うと、各データ点の、自分が所属するクラスタ中心との二乗誤差の総和を、貪欲に最小化する手法です。 クラスタ数 $k$ 、あるクラスタ $i$ に所属するデータ点の集合 $S_i$ として、式で書くとこんな感じ。 もう少し詳しく知りたい人には、神嶌先生の資料が分かりやすいです。 イメージをつかむなら、「K-means 法を D3.js でビジュアライズしてみた」が k-means 法を step-by-step で実行できて理解の助けになるかと思います。 k-means 法のアルゴリズム 計算の流れは、以下の通り。 データ点からランダムに k 個の点をクラスタ中心の初期値とし
![LINQ を使って 8 行で k-means 法を実装してみた - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/2cc581a820e3b3a9523fbfa76f0b9f2fc8065982/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9TElOUSUyMCVFMyU4MiU5MiVFNCVCRCVCRiVFMyU4MSVBMyVFMyU4MSVBNiUyMDglMjAlRTglQTElOEMlRTMlODElQTclMjBrLW1lYW5zJTIwJUU2JUIzJTk1JUUzJTgyJTkyJUU1JUFFJTlGJUU4JUEzJTg1JUUzJTgxJTk3JUUzJTgxJUE2JUUzJTgxJUJGJUUzJTgxJTlGJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz00NzMyMzI1YWM2OGFiNTZmYTU1N2NhYmEyNjAzM2MyMA%26mark-x%3D142%26mark-y%3D57%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDB5dGFrYXNoaW5hJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz05ZTc1MzY4NzZmMzM2ZWQ5MDM4NWY4M2FhZTI4MmU0Ng%26blend-x%3D142%26blend-y%3D486%26blend-mode%3Dnormal%26s%3Dfbedd1c5745c762193012ef417b2b187)