自分が利用する必要があったので ruby で実装されたナイーブベイズ分類器および K 平均法クラスタリングのための gem パッケージをリリースした。
いつも通り gem install コマンドでインストールできる。
gem install naivebayes
gem install kmeans
gem install kmeans
NaiveBayes
https://rubygems.org/gems/naivebayes
K-means clustering
https://rubygems.org/gems/kmeans
使い方は上からたどれるドキュメントやソースコードを見てねという感じなのですが、せっかくなので書くとこんな感じになる。
require 'naivebayes'
# 多変数ベルヌーイモデル
puts "--- The Bernoulli model ---"
classifier = NaiveBayes::Classifier.new(:model => "berounoulli")
# 分類器を訓練する
classifier.train("positive", {"aaa" => 0, "bbb" => 1})
classifier.train("negative", {"ccc" => 2, "ddd" => 3})
result = classifier.classify({"aaa" => 1, "bbb" => 1})
# ポジティブと判定される
p result # => {"positive" => 0.8767123287671234,"negative" => 0.12328767123287669}
# 多項分布モデル
puts "--- Relation to multinomial unigram language model ---"
classifier = NaiveBayes::Classifier.new(:model => "multinomial")
# 分類器を訓練する
classifier.train("positive", {"aaa" => 0, "bbb" => 1})
classifier.train("negative", {"ccc" => 2, "ddd" => 3})
result = classifier.classify({"aaa" => 1, "bbb" => 1})
# ポジティブと判定される
p result # => {"positive" => 0.9411764705882353,"negative" => 0.05882352941176469}
# 多変数ベルヌーイモデル
puts "--- The Bernoulli model ---"
classifier = NaiveBayes::Classifier.new(:model => "berounoulli")
# 分類器を訓練する
classifier.train("positive", {"aaa" => 0, "bbb" => 1})
classifier.train("negative", {"ccc" => 2, "ddd" => 3})
result = classifier.classify({"aaa" => 1, "bbb" => 1})
# ポジティブと判定される
p result # => {"positive" => 0.8767123287671234,"negative" => 0.12328767123287669}
# 多項分布モデル
puts "--- Relation to multinomial unigram language model ---"
classifier = NaiveBayes::Classifier.new(:model => "multinomial")
# 分類器を訓練する
classifier.train("positive", {"aaa" => 0, "bbb" => 1})
classifier.train("negative", {"ccc" => 2, "ddd" => 3})
result = classifier.classify({"aaa" => 1, "bbb" => 1})
# ポジティブと判定される
p result # => {"positive" => 0.9411764705882353,"negative" => 0.05882352941176469}
多変数ベルヌーイモデルと多項分布モデルの違いは教科書や論文などを参照してください。
require 'kmeans/pair'
require 'kmeans/pearson'
require 'kmeans/cluster'
# ハッシュの分布からピアソン相関係数により距離を決定
uniform_hash = {
"test01"=> {"hoge"=>0, "fuga"=>1, "piyo"=>0 },
"test02"=> {"hoge"=>2, "fuga"=>1, "piyo"=>3 },
"test03"=> {"hoge"=>3, "fuga"=>0, "piyo"=>1 },
"test04"=> {"hoge"=>0, "fuga"=>2, "piyo"=>0 },
"test05"=> {"hoge"=>4, "fuga"=>2, "piyo"=>3 },
"test06"=> {"hoge"=>3, "fuga"=>1, "piyo"=>1 }}
# 分割するクラスターの数を centroid で指定
result = Kmeans::Cluster.new(uniform_hash, {
:centroids => 5,
:loop_max => 10
})
result.make_cluster
# 結果は実行ごとに異なる
p result.cluster.values #=> [["test01", "test04"], ["test02"], ["test03", "test05"], ["test06"], []]
require 'kmeans/pearson'
require 'kmeans/cluster'
# ハッシュの分布からピアソン相関係数により距離を決定
uniform_hash = {
"test01"=> {"hoge"=>0, "fuga"=>1, "piyo"=>0 },
"test02"=> {"hoge"=>2, "fuga"=>1, "piyo"=>3 },
"test03"=> {"hoge"=>3, "fuga"=>0, "piyo"=>1 },
"test04"=> {"hoge"=>0, "fuga"=>2, "piyo"=>0 },
"test05"=> {"hoge"=>4, "fuga"=>2, "piyo"=>3 },
"test06"=> {"hoge"=>3, "fuga"=>1, "piyo"=>1 }}
# 分割するクラスターの数を centroid で指定
result = Kmeans::Cluster.new(uniform_hash, {
:centroids => 5,
:loop_max => 10
})
result.make_cluster
# 結果は実行ごとに異なる
p result.cluster.values #=> [["test01", "test04"], ["test02"], ["test03", "test05"], ["test06"], []]
今のところ集合間の距離算出にはピアソン相関係数を利用している。そのうちマンハッタン距離などでも求められるようにするかもしれない。