タグ

ブックマーク / hiroshiykw.blogspot.com (2)

  • Ward法再実装で少し速くなった

    PythonでWard法によるクラスタリング Ward法のパフォーマンスと分散処理のための考察 このシリーズの続き。 プログラムを書き直し、真っ当な行列的データを用意したところ、ずいぶん速くなり、588件でも19秒程度となった。(1100件でも2分程度なので、ずいぶんと自分が想定している実用化に近づいたと思う。) しかし、真っ当な行列データにすると、今度は最小距離の探索に9割の時間を取られるようになったため、ここを改造すべきと強く思う。 ここまでくれば、常に行列の成分のソート情報をなんらか記憶しておけばいいように思うのだが、そのソート情報の維持にはまたコストがかかるというジレンマ。 今は可変長の行列として、pythonのdefaultdict(lambda: defaultdict(float))を使っている。これで定義した簡易行列クラスは非常に便利なのでそんなにシビアでない計算の目的には

  • PythonでWard法によるクラスタリング

    Pythonで、Ward法によるクラスタリング(デンドログラム作成まで)を実装してみた。 参考にしたのは、岡山大学が公開しているこの資料。 (岡山大学の先生ありがとう!) 今回こんな車輪の再発明をしたのは、距離表と呼ばれる行列データを行列のイメージで保存せず、 [(ベクトル1とベクトル2の距離, ベクトル番号1, ベクトル番号2), ...] という形式のリストにして、距離でソートしておき、そのソート結果を維持したままこのリストを分割、更新していくという方針で作ったらどうかと思ったからです。 196個の19次元の非スパースなデータのデンドログラム作成に2.5秒だからなかなかのパフォーマンスではないだろうか。 CもC++もNumpy系の数値計算ライブラリも使わないでこれだから、いいですねえ。 使い方 読み込むデータファイルをタブ区切りで用意する。 1カラム目はデータの識別用ID文字列、2カラ

  • 1