numpyでk-meansを実装したときに使ったもの(Debug込み)

概要

  • KMeansをとりあえず実装した(irisの特定カラム用)
  • 可視化には@ipywidgets.interact をパーセプトロンのときと同様に使った
    • Debug用の出力ON/OFFもできるようにした
  • 簡単に実装できるのでぜひやってみるべき

TODO

  • 関数でなくsklearnのようにClassにする
  • 可視化の際にCentroidsの動きもわかるようにする
  • どのデータセットでも(N次元可変)対応できるようにする
  • 距離関数に任意のものを差し込めるようにする
  • EMアルゴリズムとの関係を記述する

built-in

  • round
    • (float, 2)を使って桁ので調整して表示

numpy

  • np.random.choice(data.index, n_cluster)
    • 各クラスタ中心決定
  • np.linalg.norm(np.c_[col1 - center_x, col2 - center_y], axis=1)
    • ノルム
    • 差分計算後に使うことでユークリッド距離にする
    • from scipy.spatial import distance にはいろんな距離がある
    • ユークリッド距離 distance.euclidean([0, 0], [1, 1])
      • 遅いらしい(http://stackoverflow.com/questions/1401712/how-can-the-euclidean-distance-be-calculated-with-numpy)
  • np.argmin([[各クラスタの中心との距離],[...]], axis=1)
    • クラスタ判定
  • np.all(new_clusters == old_clusters)
    • クラスタ決定の終了判定
  • np.sum(上記)
    • どれだけクラスタが安定しているか
  • np.where(new_clusters != old_clusters)
    • どこが移動したか
  • ary_x.mean(), ary_y.mean()
    • クラスタの中心移動

collection

  • Counter(1d-array)
    • 使えたので、各クラスタに属するデータ数を確認

seaborn

  • lmplot
    • クラスタ別のscatter plot
    • http://qiita.com/ksomemo/items/2ea2571434b25a6f70fd

その他

実装中にsklearnを見て学んだこと

  • sklearn.cluster.KMeans(verbose=1) で学習時の詳細経過表示
  • 他でもoptionにある
  • kmeans++を使っている
  • Cythonを使っている