JavaScriptによるk-Nearest Neighbor体験デモ

研究室の後輩向けに機械学習実装レクチャのようなものをやってみたのだけれど,知識ゼロの学生を対象にした場合にはk-NN (特に1-NN) から始めるのがよかろうと思ってそこから解説してみた*1.実装もとても簡単.

なおk最近傍法とか呼ばれたりもするk-NNは,入力されたデータ点のk個の近傍のラベルによって分類するという方法.

帰宅してから,これcanvasを使えばブラウザから利用できるデモできるんじゃね? ということを思いついてさっそく実装.せっかくだから正規分布からデータ生成するロジックも追加してみた.k-NNとか機械学習とかわからない人たちにイメージをつけるのに役に立つかもしれないので公開.ご自由にお試しください*2

k-NNくらい簡単だと静止した図の説明で大体事足りるのだけれど,動くデモがあった方が眠くならないだろうし.

使い方

  • 青い点,赤い点がそれぞれ正例,負例
  • 画面をクリックするとテストデータをプロットできる
  • "Find k-nearest neighbor" ボタンをクリックするとk個の近傍を選択,多数決結果を表示
  • "Generate data" ボタンをクリックすると訓練データを再度生成できる
    • 生成データ数,平均\mu,標準偏差\sigma をそれぞれ手動で設定できる

てきとうな感想

  • Box-Muller法で正規乱数を発生 -> 各クラスのサンプルを生成というのがデモに親和性が高くてよかった.別のデモでも再利用しよう.
  • ずいぶん前にcanvasを使ったことがあったけれど,少しはcanvasの使い方に慣れた気がする.
  • JavaScript書くのは久しぶりだけれど,前よりもサクサク書けるようになった気がする.相変わらずJavaScriptオブジェクト指向は使えない.
  • 今までconsole.log()というJavaScriptコンソールへの出力方法を知らなかったのでwindow.alert()などでprintfデバッグをしていたのだけれど,console.log()を使うようになって捗る捗る.
  • 今回は類似度をユークリッド距離で計算しているが,いろんな距離を選択できるようにして一見直感に合わない近傍を選択するようなデモにすると,もっと面白いのかなぁ (やる気はない).

*1:かのHal DaumeIII氏も機械学習スタートアップに決定木->k-NN->パーセプトロンという流れがよいとおっしゃっている.natural language processing blog: How I teach machine learning

*2:ただしコードは超いい加減なので,参考にしないでください.再利用したい奇特な方がいればお好きにどうぞ