Elixirで線形回帰してみた
この記事はElixir Advent Calendar 2017の17日目の記事です。
最近始めたElixirで何かOutputしたいということで線形回帰のアルゴリズムを実装してみました。
リポジトリはこちら https://github.com/foresta/mlex.git
Elixirでも機械学習できないこともない(かもしれない)ことを書いていこうかなと思います。
背景 最近の私の興味があるものとしてEilxirと機械学習があります。
Elixirはサンプルアプリや簡単なツールを制作した程度、機械学習はcourseraのコースを一通りやり本を数冊読んだ程度です。
今回はその両方の学習と、どうせ機会学習アルゴリズム実装するなら書きごごちの良いElixirで書いてみたいと思い実装してみました。
線形回帰とは データを元に線形モデルを作成しその線形モデルを用いて未知のデータを予測するものです。
図1はデータの次元が2次元の場合の線形回帰の概念を示し、×印が与えられたデータ、直線が学習した結果の線形モデルを表しています。
図1 線形回帰のサンプルグラフ 詳しくはこちらのサイトを参照してください。
https://qiita.com/ynakayama/items/5732f0631c860d4b5d8b http://gihyo.jp/dev/serial/01/machine-learning/0008 学習データ 今回学習には以下のデータセットを使用しました。
linnerud_physiological.csv linnerud_exercise.scv linnerud_physiological.csvには体重・ウエスト・心拍数等の身体的特徴データが、 linnerud_exercise.csvには懸垂・腹筋・跳躍に関するデータがあります。
今回は身体的特徴と、懸垂のデータで線形回帰をしてみます。
実装 使用したライブラリは以下のような感じです。
defp deps do [ {:matrix, "~> 0.3.0"}, {:csv, "~> 2.0.0"}, {:explotter, git: "https://github.com/foresta/explotter.git"} ] end ソースコードは以下のような感じです。
mlex/apps/sample/lib/linnerud.ex
def run do # 1. load dataset features = load_linnerud_feature_dataset() targets = load_linnerud_target_dataset() # 2. setup featuresex pulses = features[:pulse] waists = features[:waist] weights = features[:weight] number_of_data = length pulses bias = for _times <- 1.