[Ruby]ロジスティック回帰の実装

要は機械学習です。

クイズ
1要素目にグループ{t,f}、2,3要素目にデータが入る。
このデータに対して機械学習を行い、2,3要素目の値を引数として
できるだけ正確なグループを割り当てられるようなプログラムを作成せよ。

t,7,4
f,2,5
f,4,5
f,3,1
t,9,12
f,4,3
t,5,6
f,5,2
t,4,8
f,1,1

このサンプルデータは線形分離可能です。
何故ならば、2要素目+3要素目 > 10 を満たすグループをt、そうでないものをfに分類しているから。

逆に、そのような方法(線形連結)で分離ができるデータを線形分離可能と言います。
2016/02/09 補足:
i要素目の値が大きければ大きいほど(小さければ小さいほど)グループに分類されやすくなるデータ。



参考にしたロジスティック回帰の情報。
  • http://gihyo.jp/dev/serial/01/machine-learning/0018 (機械学習 はじめよう)
  • http://gihyo.jp/dev/serial/01/machine-learning/0019
  • 講義資料


完全に説明できる自信は皆無なので、解説は上のリンクに丸投げします。
下に示すプログラムでこっそり定義しているsigmoid関数はユークリッド距離を確率距離[0,1]に丸めるやつです。
過学習を防ぎます。多分。

何をやるのかと言うと、重みベクトルを求めます。重みベクトルとは、要素に掛ける係数。
データのi要素目をD[i]、重みベクトルのi要素目をW[i]として、
K = D[1]W[1]+D[2]+D[2]+...+D[n]+D[n]
Kが0以上なら、重みベクトルが示すグループに含まれている、という判断をするらしい。

プログラムを示します。Ideoneにもありますよ!( http://ideone.com/ewjJHj)
2016/02/11 検証が明らかに間違っていたので、修正とリファクタリング


res>=0 ならば、trueに分類されていることを示します。(ソースコードではchk>0になっているけれども浮動小数点だから気にしない)





線形分類でない(このデータでは最後のレコードが間違った分類になっている)場合。
正しく分類できません。
t,7,4
f,2,5
f,4,5
f,3,1
t,9,12
f,4,3
t,5,6
f,5,2
t,4,8
f,1,1
t,2,3

決まった回数だけ学習を行わせ、その中で最も成績の良かった重みベクトルを結果として返すようにすれば
多少は良い結果が得られるかもしれません。


Rubyはこのようなプロトタイピングが簡単にできて素晴らしいです。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : アルゴリズムとデータ構造 Ruby 機械学習

コメントの投稿

非公開コメント

プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1253位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
219位
アクセスランキングを見る>>