Skip to content

Instantly share code, notes, and snippets.

@PhilOwen
Last active October 27, 2017 08:10
Show Gist options
  • Save PhilOwen/7962d98798fd8f51da06b879d47f8d98 to your computer and use it in GitHub Desktop.
Save PhilOwen/7962d98798fd8f51da06b879d47f8d98 to your computer and use it in GitHub Desktop.
Rのニューラルネットを、Haskellからインラインで

Rのneuralnetパッケージを、Haskellからインラインで使ってみる。
inline-rというHaskellパッケージを使えば、 RコードをHaskellのQuasiQuotes内に埋め込める。

Haskell->Rであれば、Haskellでの変数名に 末尾_hsを付けた変数がRで自動的に使えるので、かなり楽。 浮動小数点数や、文字列、 それらのリストも特に問題なし (Haskellのリストは、Rのベクターに対応)。 R->Haskellに値を戻す方法は後日。

ただ、Mac OSでは、なぜかCヘッダがinline-rと相性が良くないらしく、 このプログラムはコンパイルが通らない。 Mint Linux上ではうまく行ったので、さしあたりそれで。
また、このHaskellプログラムでは パッケージのインストールまではやらないので、 R側で事前にinstall.packages("neuralnet")しておく必要がある。

Rの利用例としては、 XORをニューラルネットに学習させてみた。
neuralnet()でニューラルネットのモデルを作り、 学習まで一度にやる。 パラメータはかなり大事。 それ次第で、それなりに発展的なこともできるらしい。 また、良くないパラメータを与えると 残念なモデルができる(hidden=2を与えるとか…)。
compute()で、学習させたモデルに入力を与えて、予測させる。

inline-rは最初いくらか手間がかかるが、 Rのこういう専門的な関数や描画機能が さらっと使えるのはそれなりに便利そうである。

References

import Language.R.Instance(runRegion)
import Language.R.QQ
xorLearnAndPredict :: [[Double]] -> IO ()
xorLearnAndPredict table = do
let [xs, ys, zs] = table
runRegion $ do
[r|
library("neuralnet")
df <- data.frame(xs_hs, ys_hs, zs_hs)
nn <- neuralnet(zs_hs~xs_hs+ys_hs, df, hidden=3)
predicted <- compute(nn, data.frame(xs_hs, ys_hs))
print(predicted$net.result)
plot(nn, rep="best")
|]
return ()
main :: IO ()
main = do
let xs = [0, 1, 0, 1] :: [Double]
ys = [0, 0, 1, 1] :: [Double]
zs = [0, 1, 1, 0] :: [Double]
xorLearnAndPredict [xs, ys, zs]
getContents >>= print
name: neuralnet-r
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.20
executable neuralnet-r
main-is: Main.hs
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: base
, inline-r
default-language: Haskell2010
default-extensions: QuasiQuotes
resolver: lts-8.13
packages:
- '.'
extra-deps: []
flags: {}
extra-package-dbs: []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment