集合知プログラミング 3.3-1 階層的クラスタリング データファイル読み込み

集合知プログラミング

集合知プログラミング

集合知プログラミングですが、飛ばし飛ばし自分の出来そうなところをやっています。
今回は、3章の階層的クラスタリングを可視化としたデンドログラム作成するプログラムに挑戦します。
そして本日は、その第一段階であるデータファイルの読み込みまでです。
クラスタリングに用いるブログのデータファイルを読み込むための関数を作ります。


実は本では、ブログのフィードデータからデータファイルを生成するプログラミングも紹介されています。
しかし今回はズルをして、データファイルはあらかじめ用意されたものを利用することにします。
スキルをつけて、また挑戦したいと思います。
こちらからデータファイルをダウンロードします。

http://kiwitobes.com/clusters/blogdata.txt

このファイルをこれから作るプログラムと同じディレクトリに保存しておきます。
ファイル名は、"clusters.rb"としました。

#!/user/bin/ruby
module Clusters
  #最初の行を列の名前のリストとして読み込み、左端の列を行の名前のリストとして読み込む
  #すべてのデータをリストのすべてのアイテムがそれぞれの行のデータである1つの巨大なリストに入れる
  def self.readfile(filename)
    ifh = open(filename, "r")
    #一行ごとに読み出し
    lines = ifh.readlines
  
    #最初の行は列のタイトル
    colnames = lines[0].strip.split(/\t/)
    lines.shift
    rownames = []
    data = []
    for line in lines do
      p = line.strip.split(/\t/)
      #それそれの行の最初の列は行の名前
      rownames << p.shift
      #行の残りの部分がその行のデータ
      data << p.map{|x| x.to_f}
    end
end

irbで確認してみます。

$ irb
irb(main):001:0> load 'clusters.rb'
=> true
irb(main):002:0> Clusters.readfile('blogdata.txt')
...

最後のdataの部分はeachメソッドでしようとしてうまくいかなかったのですが、mapメソッドを知りとても便利だと感じました。
その他に、配列の最後へ要素を追加する方法として、"Array#<<メソッド"以外に"Array#pushメソッド"もあることがわかりました。
意味は一緒なのでしょうか。


このあとは実際にクラスタリングの部分に入るのですが、また一苦労しそうです。