SlideShare a Scribd company logo
1 of 27
OH My Julia
                 ~JuliaでGLM編~

        2012/12/01
         Japan.R#3
          和田 計也

サイバー系
サイバー系


     はじめに


     ※この発表は個人の
     見解であり、所属す
     る組織の公式見解で
     はありません。

2012/12/01               1
サイバー系


     自己紹介
  和田 計也(@wdkz)
         静岡県袋井市出身




  サイバー系企業でデータマイニングエンジニア職
         最近DACを買いました



  前職はバイオベンチャー
         バイオマーカ探索してた
         学生時代は枯草菌の研究




2012/12/01                          2
サイバー系


     UseR! 2012行ってきました




2012/12/01                       3
サイバー系


     パネルディスカッションより
       • Rユーザが知るべき第二言語は?




             Rcpp作者のDirkさん   pymc作者のChrisさん   lme4作者のDouglasさん




              C++                Python        Julia




じゅ、Juliaだってー!?
2012/12/01                                                               4
サイバー系


     Julia

             何かよくわからんけど
             ・速くて
             ・数値計算できる
             ・64bitOSだと64bit
             のメモリ空間使えるか
             らRの2^31-1問題と
             サヨナラできる
             ⇒Rの替わりに
              使えんかのう疑惑
             (特に大規模データ)




2012/12/01                     5
サイバー系


     Juliaのビルド
        #CentOSの話ですいません
        git clone git://github.com/JuliaLang/julia.git
        cd julia
        make
        #CentOS6系ならたぶん上記↑ので大丈夫なはずです
        #CentOS5系は激しく苦労します

        #yumでgcc44をインストール
        #ソースからgcc version 4.7.xを
        #インストール

        #まずgcc version 4.7.xでmakeします
        #(julia自体のビルドは成功するのですが、LAPACKのビルドに失敗します。)
        #次にgcc44で(make cleanとかせずに)makeを再開します。
        #コンパイラの指定はjulia/Make.incで行います。
        #これで無事ビルドが最後まで行われます。

        #尚、VirtualBox上のCentOS5, CentOS6, Ubuntu12でjuliaのmakeを
        #したらインスタンスごと落ちた...


             求められるビルドセンス
2012/12/01                                                              6
サイバー系


     ちなみに...




               先週CentOS版のバイナリが出たっぽいのでこれで
               すんなりインストールできるんじゃないかと思う




2012/12/01                                         7
サイバー系


     初めてのJulia




             ん、何故Windows環境なんだ?とか言わない



2012/12/01                                     8
サイバー系


     大規模データをJuliaでGLMしたい
     • Juliaの標準関数にはGLMが含まれていない
     • ググる

     • ふむふむ、githubにGLMのJulia実装をあげてる人がいるのね~




     • ってlme4作者のDouglas Batesさんじゃん!




2012/12/01                                       9
サイバー系


     JuliaでGLMしたかった
 だが、実行してみるとどうしてもエラーになります...




                   記述通りJulia
                   でGLMしようと
                   してもエラー
                   になるって本
                   当かい!?



             ※注)今はもう直ってて動くかもしれません


2012/12/01                              10
サイバー系




      作って
     JuliaのGLMは




      みた
2012/12/01            11
サイバー系


     作ったGLMの制約

  • ロジスティック回帰のみの例示です
    • Rでいうfamily=binomial(“logit”)
    • もちろん、リンク関数と分布を定義すれば“一般化”できます

  • いろいろ不完全です
    • 現状、分布とlink関数が分離できていません
    • weights, offsetパラメータ実装してません

  • glmというよりはglm.fitの実装です       glm.fitの詳細は次ページ
        • JuliaにはRでいうformulaがない
        • JuliaにはRでいうdata.frameがない
        • つまり、glm(y~x, data=smpl.data)みたいな引数を渡す作りにす
          るわけにはいかない!!

2012/12/01                                            12
サイバー系


     (参考)Rのglm.fitについて
  • Rのglm関数はdata.frameとformulaからmodel.matrixを作成
    してglm.fit関数を呼び出している
     • glm(formula=y~x1+x2+x3, data=smpl.df,
       family=binomial(“logit”))
                                内部でこうなってます          X <- model.matrix(formula, data)

        • glm.fit(x=X, y=y, family=binomial(link=“logit”))

             smpl.df                       y              X(これがmodel.matrix型)
                   y    X1      X2    X3            y          (Intercept)   X1 X2male X3B X3C
               1   0    60     male   A         1   0        1          1    60      1    0  0
               2   0    50   female   B         2   0        2          1    50      0    1  0
               3   0    80     male   C         3   0        3          1    80      1    0  1
               4   0    60     male   B         4   0        4          1    60      1    1  0
               5   0    75     male   B         5   0        5          1    75      1    1  0
               6   0    70     male   A         6   0        6          1    70      1    0  0
               7   1    90     male   A         7   1        7          1    90      1    0  0
               8   1    80   female   C         8   1        8          1    80      0    0  1
               9   1    72   female   B         9   1        9          1    72      0    1  0
              10   1    65     male   C        10   1       10          1    65      1    0  1
              11   1    45   female   C        11   1       11          1    45      0    0  1
              12   1   100     male   B        12   1       12          1    100     1    1  0


2012/12/01                                                                                       13
サイバー系


     (参考)Rのglm.fitについて_2
  • glmの結果




  • glm.fitの結果             ほれ、同じ
                              結果




2012/12/01                         14
サイバー系


     (参考)JuliaのGLM_1
     #リンク関数のところ(ロジット関数のみ)
     type Link
        name::String      # name of the link
        linkFun::Function  # link function mu -> eta
        linkInv::Function # inverse link eta -> mu
        muEta::Function     # derivative eta -> d mu/d eta
     end

     logitLink =
           Link("logit",
           mu -> log(mu ./ (1. - mu)),
           eta -> 1. ./ (1. + exp(-eta)),
           eta -> (e = exp(-abs(eta)); f = 1. + e; e ./ (f .* f)))

     #ちょっと関数定義
     function logN0(x)
        ret = [x]
        ret[ret .> 0] = log(ret[ret .> 0])
        ret
     end
     y_log_y(y, mu) = y .* logN0(y ./ mu)

2012/12/01                                                               15
サイバー系


     (参考)JuliaのGLM_2
     #分布のところ(二項分布のみ)
     type Dist
        name::String          # the name of the distribution
        canonical::Link       # the canonical link for the distribution
        variance::Function      # variance function mu -> var
        devResid::Function       # vector of squared deviance residuals
        deviance::Function      # the scalar deviance
        mustart::Function       # derive a starting estimate for mu
     end

     BinomialDist =
        Dist(“Binomial",
           logitLink,
           mu -> max(eps(Float64), mu .* (1. - mu)),
           (y, mu, wt)-> 2 * wt .* (y_log_y(y, mu) + y_log_y(1. - y, 1. - mu)),
           (y, mu, wt)-> -2. * sum(y .* log(mu) + (1. - y) .* log(1. - mu)),
           (y, wt)-> (wt .* y + 0.5) ./ (wt + 1.)




2012/12/01                                                                            16
サイバー系


     (参考)JuliaのGLM_3
         #glmFit関数
         function glmFit(y::Vector{Float64}, X::Matrix{Float64}, dist::Dist, epsilon::Float64,
         maxit::Int32)
          offset = float64(fill(0, length(y)));
          weights = float64(fill(1, length(y)));
          mustart = ((weights .* y) + 0.5) ./ (weights + 1)
          eta = dist.canonical.linkFun(mustart)
          mu = dist.canonical.linkInv(eta)
          (m, n) = size(X);
          devold = sum(dist.devResid(y, mu, weights))
          coef = 1; beta = 1; Q =1; R = 1; w = 1; QRd = 1
          Qr = zeros(n,n)
          pvalue = float64(fill(1, n));
          for iter=1:maxit
            muEtaVal = dist.canonical.muEta(eta)
            z = (eta-offset) + (y - mu) ./ muEtaVal
            w = sqrt((weights .* muEtaVal.^2) ./ dist.variance(mu))
            (Q, R) = qr(diagmm(w, X));
            R1 = R[1:n, 1:n]; Q1 = Q[:, 1:n];
            beta = R1 ¥ (Q1' * (w .* z))
            eta = X * beta
            mu = dist.canonical.linkInv(eta)
            dev = sum(dist.devResid(y, mu, weights))
2012/12/01                                                                                           17
サイバー系


     (参考)JuliaのGLM_4
     #glmFit関数の続き
       if (abs(dev-devold)/(0.1+abs(dev)) < epsilon)
         coef = beta
         break
       else
         devold = dev
         coef=beta
       end
      end
      for i=1:n
       for j=1:n
         if(R[i,j]==0)
           Qr[i,j]=Q[i,j]
         else
           Qr[i,j]=R[i,j]
         end
       end
      end




2012/12/01                                                 18
サイバー系


     (参考)JuliaのGLM_5
     #glmFit関数の続き
      convmat = inv(Qr' * Qr)
      varCf = diag(convmat)
      sErr = sqrt(varCf)
      tvalue = coef./sErr                   p値の算出のために、JuliaからRの関数を使用しています
      _jl_libRmath = dlopen("libRmath")
      for i=1:length(tvalue)
        pvalue[i] = -2 * ccall(dlsym(_jl_libRmath,:pt),Float64,(Float64, Float64), abs(tvalue[i]),
     100000000000)
      end
      nulldev = sum(dist.devResid(y, sum(weighs .* y) ./ sum(weights), weights))
      resdf = m – n; nulldf = m - 1
      aicSeeds = float64(fill(0, m))       AICの算出のために、JuliaからRの関数を使用しています
      for i=1:length(aicSeeds)
        aicSeeds[i] = (weights[i] / weights[i]) * ccall(dlsym(_jl_libRmath,:dbinom), Float64,
     (Float64, Float64, Float64, Int32), round(weights[i]*(y[i])), round(weights[i]), mu[i], 1)
      end
      aic = -2 * sum(aicSeeds) + 2 * n
      (beta, sErr, tvalue, pvalue, dev, resdf, nulldev, nulldf, aic)
     end
            ※注)正規分布関数からの確率値を返すRのpnorm関数がJuliaから呼べなかった(未実装)ため、
                  t分布関数からの確率値を返すRのpt関数を自由度1e+10で呼んで、正規分布からの
                  確率値とほぼ同値を得るようにしています。

2012/12/01                                                                                       19
サイバー系


     初めての、JuliaでのGLM
     最初の動作確認は「Rのglm.fit」説明時に使用した謎のデータ
     • R




     • Julia
             load(“myGlm.jl”)                  #自作GLM関数を読み込む
             y = csvread(“smpl_y.csv”)         #yを読み込む(ただしmatrixになっちゃう)
             y = y[:, 1]                       #yをRでいうvectorに
             X = csvread(“smpl_X.csv”)         #X(model.matrix型)を読み込む
             _jl_libRmath=dlopen(“libRmath”)   #JuliaからRを使うための宣言
             glmFit(y, X, BinomialDist)        #いざGLM
             • 実行結果は次ページ
2012/12/01                                                                20
サイバー系


     初めての、JuliaでのGLM
     動作確認は「Rのglm.fit」説明時に使用した謎のデータ
     • Julia実行結果画面




                                 *結果の整形してなくてすいません。
                                 coef, standardErr, tvalue, pvalue,
               よし、(見にくいけど)       deviance, df, nulldeviance, nulldf,
                                 AICの順に数値が出てます
              Rと同じ結果が得られた!



2012/12/01                                                             21
サイバー系


     デカいデータをJuliaでGLMするための準備
     • 前述の通り、JuliaはRでいうformulaが使えない。
             • 元データフレームからmodel.matrixを作成してJuliaのGLMに突っ込む
             • Juliaよくわかんないから、↑この作業はRでやった

  作業イメージ
   airline <- read.csv(“airline.csv”)
   formula <- Cancelled ~ Year + Month + DayOfWeek + CRSElapsedTime + Distance
   X <- model.matrix(object=formula, data=airline)
   y <- mf$y

   write.table(X, file=“X.csv”, sep=“,”, col.names=FALSE, row.names=FALSE, quote=FALSE)
   write.table(y, file=“y.csv”, sep=“,”, col.names=FALSE, row.names=FALSE, quote=FALSE)




 *注)実際に上記のようにやるとこの段階で既にRが爆死するので、本当はsedとかawkとかcatとか駆使してX.csvは作成してます




2012/12/01                                                                                22
サイバー系


     念願の、Rで爆死するデータ量をJuliaでGLM
     • Rだと爆死する様
             • データはもちろん皆さん大好きairline.csv
               (をmodel.matrixに変換したX.csv)




                                           はい爆死
2012/12/01                                        23
サイバー系


     念願の、Rで爆死するデータ量をJuliaでGLM
     • Juliaだと...




                    メモリエラー.だ ..と...




   (゚∇゚ ;)エッ!?←イマココ
2012/12/01                                24
サイバー系


     まとめ

1. Juliaという素敵な言語があるよ
2. 公開されてたGLMがエラってどうしようも
   無かったので実装したよ
3. Rと違って、matrixでm行 * n列<2^31の
   制約がないからメモリの許す限りのデータ量
   でGLMができる(はずだった)よ
4. 日々精力的に開発がされているため、
   関数名とか頻繁に変わっちゃって
   昨日まで動いていたものが動かなく
   なっちゃったりもして爆死頻度高いよ




2012/12/01                          25
サイバー系


     参考文献

  Julia Lang
       http://julialang.org/
  RとJuliaの言語比較一覧表
        http://www.johnmyleswhite.com/notebook/2012/04/09
        /comparing-julia-and-rs-vocabularies/
  JuliaでのGLM実装(自分には動かせなかった)
        https://github.com/dmbates/Glm
  JuliaからRの関数を使う
   http://dmbates.blogspot.jp/2012/03/julia-functions-for-
 rmath-library.html




2012/12/01                                                   26

More Related Content

Similar to JuliaでGLM

明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
kimukou_26 Kimukou
 
Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用
Nobuaki Oshiro
 

Similar to JuliaでGLM (13)

セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門
セキュリティ・ネクストキャンプ2022 オンライン [N9] バイナリ生物学入門
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
 
DXRubyとスプライトエディタ
DXRubyとスプライトエディタDXRubyとスプライトエディタ
DXRubyとスプライトエディタ
 
Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用
 
Eclipse ADTとAndroidStudio両方で動かせる開発環境構築
Eclipse ADTとAndroidStudio両方で動かせる開発環境構築Eclipse ADTとAndroidStudio両方で動かせる開発環境構築
Eclipse ADTとAndroidStudio両方で動かせる開発環境構築
 
ggplot2 110129
ggplot2 110129ggplot2 110129
ggplot2 110129
 
㉒初期プロジェクトを改造!
㉒初期プロジェクトを改造!㉒初期プロジェクトを改造!
㉒初期プロジェクトを改造!
 
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)
 
Force.com Developer Group Japan Meetup#2
Force.com Developer Group Japan Meetup#2Force.com Developer Group Japan Meetup#2
Force.com Developer Group Japan Meetup#2
 
Tokyo r50 beginner_2
Tokyo r50 beginner_2Tokyo r50 beginner_2
Tokyo r50 beginner_2
 
Tokyo r30 beginner
Tokyo r30 beginnerTokyo r30 beginner
Tokyo r30 beginner
 

More from Kazuya Wada

RのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたRのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみた
Kazuya Wada
 

More from Kazuya Wada (15)

DeployR使ってみた話
DeployR使ってみた話DeployR使ってみた話
DeployR使ってみた話
 
道玄坂Lt#2 wdkz
道玄坂Lt#2 wdkz道玄坂Lt#2 wdkz
道玄坂Lt#2 wdkz
 
ハイレゾの話
ハイレゾの話ハイレゾの話
ハイレゾの話
 
Shiny-Serverあれこれ
Shiny-ServerあれこれShiny-Serverあれこれ
Shiny-Serverあれこれ
 
R-3.0.0でGLM
R-3.0.0でGLMR-3.0.0でGLM
R-3.0.0でGLM
 
はじめてのShiny
はじめてのShinyはじめてのShiny
はじめてのShiny
 
Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...
 
そろそろRStudioの話
そろそろRStudioの話そろそろRStudioの話
そろそろRStudioの話
 
RでつくるWebアプリ~rApache編~
RでつくるWebアプリ~rApache編~RでつくるWebアプリ~rApache編~
RでつくるWebアプリ~rApache編~
 
Rでウォーリを探してみた
Rでウォーリを探してみたRでウォーリを探してみた
Rでウォーリを探してみた
 
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
 
RのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたRのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみた
 
RでGPU使ってみた
RでGPU使ってみたRでGPU使ってみた
RでGPU使ってみた
 
Tokyo.R#16 wdkz
Tokyo.R#16 wdkzTokyo.R#16 wdkz
Tokyo.R#16 wdkz
 

JuliaでGLM

  • 1. OH My Julia ~JuliaでGLM編~ 2012/12/01 Japan.R#3 和田 計也 サイバー系
  • 2. サイバー系 はじめに ※この発表は個人の 見解であり、所属す る組織の公式見解で はありません。 2012/12/01 1
  • 3. サイバー系 自己紹介  和田 計也(@wdkz)  静岡県袋井市出身  サイバー系企業でデータマイニングエンジニア職  最近DACを買いました  前職はバイオベンチャー  バイオマーカ探索してた  学生時代は枯草菌の研究 2012/12/01 2
  • 4. サイバー系 UseR! 2012行ってきました 2012/12/01 3
  • 5. サイバー系 パネルディスカッションより • Rユーザが知るべき第二言語は? Rcpp作者のDirkさん pymc作者のChrisさん lme4作者のDouglasさん C++ Python Julia じゅ、Juliaだってー!? 2012/12/01 4
  • 6. サイバー系 Julia 何かよくわからんけど ・速くて ・数値計算できる ・64bitOSだと64bit のメモリ空間使えるか らRの2^31-1問題と サヨナラできる ⇒Rの替わりに 使えんかのう疑惑 (特に大規模データ) 2012/12/01 5
  • 7. サイバー系 Juliaのビルド #CentOSの話ですいません git clone git://github.com/JuliaLang/julia.git cd julia make #CentOS6系ならたぶん上記↑ので大丈夫なはずです #CentOS5系は激しく苦労します #yumでgcc44をインストール #ソースからgcc version 4.7.xを #インストール #まずgcc version 4.7.xでmakeします #(julia自体のビルドは成功するのですが、LAPACKのビルドに失敗します。) #次にgcc44で(make cleanとかせずに)makeを再開します。 #コンパイラの指定はjulia/Make.incで行います。 #これで無事ビルドが最後まで行われます。 #尚、VirtualBox上のCentOS5, CentOS6, Ubuntu12でjuliaのmakeを #したらインスタンスごと落ちた... 求められるビルドセンス 2012/12/01 6
  • 8. サイバー系 ちなみに... 先週CentOS版のバイナリが出たっぽいのでこれで すんなりインストールできるんじゃないかと思う 2012/12/01 7
  • 9. サイバー系 初めてのJulia ん、何故Windows環境なんだ?とか言わない 2012/12/01 8
  • 10. サイバー系 大規模データをJuliaでGLMしたい • Juliaの標準関数にはGLMが含まれていない • ググる • ふむふむ、githubにGLMのJulia実装をあげてる人がいるのね~ • ってlme4作者のDouglas Batesさんじゃん! 2012/12/01 9
  • 11. サイバー系 JuliaでGLMしたかった  だが、実行してみるとどうしてもエラーになります... 記述通りJulia でGLMしようと してもエラー になるって本 当かい!? ※注)今はもう直ってて動くかもしれません 2012/12/01 10
  • 12. サイバー系 作って JuliaのGLMは みた 2012/12/01 11
  • 13. サイバー系 作ったGLMの制約 • ロジスティック回帰のみの例示です • Rでいうfamily=binomial(“logit”) • もちろん、リンク関数と分布を定義すれば“一般化”できます • いろいろ不完全です • 現状、分布とlink関数が分離できていません • weights, offsetパラメータ実装してません • glmというよりはglm.fitの実装です glm.fitの詳細は次ページ • JuliaにはRでいうformulaがない • JuliaにはRでいうdata.frameがない • つまり、glm(y~x, data=smpl.data)みたいな引数を渡す作りにす るわけにはいかない!! 2012/12/01 12
  • 14. サイバー系 (参考)Rのglm.fitについて • Rのglm関数はdata.frameとformulaからmodel.matrixを作成 してglm.fit関数を呼び出している • glm(formula=y~x1+x2+x3, data=smpl.df, family=binomial(“logit”)) 内部でこうなってます X <- model.matrix(formula, data) • glm.fit(x=X, y=y, family=binomial(link=“logit”)) smpl.df y X(これがmodel.matrix型) y X1 X2 X3 y (Intercept) X1 X2male X3B X3C 1 0 60 male A 1 0 1 1 60 1 0 0 2 0 50 female B 2 0 2 1 50 0 1 0 3 0 80 male C 3 0 3 1 80 1 0 1 4 0 60 male B 4 0 4 1 60 1 1 0 5 0 75 male B 5 0 5 1 75 1 1 0 6 0 70 male A 6 0 6 1 70 1 0 0 7 1 90 male A 7 1 7 1 90 1 0 0 8 1 80 female C 8 1 8 1 80 0 0 1 9 1 72 female B 9 1 9 1 72 0 1 0 10 1 65 male C 10 1 10 1 65 1 0 1 11 1 45 female C 11 1 11 1 45 0 0 1 12 1 100 male B 12 1 12 1 100 1 1 0 2012/12/01 13
  • 15. サイバー系 (参考)Rのglm.fitについて_2 • glmの結果 • glm.fitの結果 ほれ、同じ 結果 2012/12/01 14
  • 16. サイバー系 (参考)JuliaのGLM_1 #リンク関数のところ(ロジット関数のみ) type Link name::String # name of the link linkFun::Function # link function mu -> eta linkInv::Function # inverse link eta -> mu muEta::Function # derivative eta -> d mu/d eta end logitLink = Link("logit", mu -> log(mu ./ (1. - mu)), eta -> 1. ./ (1. + exp(-eta)), eta -> (e = exp(-abs(eta)); f = 1. + e; e ./ (f .* f))) #ちょっと関数定義 function logN0(x) ret = [x] ret[ret .> 0] = log(ret[ret .> 0]) ret end y_log_y(y, mu) = y .* logN0(y ./ mu) 2012/12/01 15
  • 17. サイバー系 (参考)JuliaのGLM_2 #分布のところ(二項分布のみ) type Dist name::String # the name of the distribution canonical::Link # the canonical link for the distribution variance::Function # variance function mu -> var devResid::Function # vector of squared deviance residuals deviance::Function # the scalar deviance mustart::Function # derive a starting estimate for mu end BinomialDist = Dist(“Binomial", logitLink, mu -> max(eps(Float64), mu .* (1. - mu)), (y, mu, wt)-> 2 * wt .* (y_log_y(y, mu) + y_log_y(1. - y, 1. - mu)), (y, mu, wt)-> -2. * sum(y .* log(mu) + (1. - y) .* log(1. - mu)), (y, wt)-> (wt .* y + 0.5) ./ (wt + 1.) 2012/12/01 16
  • 18. サイバー系 (参考)JuliaのGLM_3 #glmFit関数 function glmFit(y::Vector{Float64}, X::Matrix{Float64}, dist::Dist, epsilon::Float64, maxit::Int32) offset = float64(fill(0, length(y))); weights = float64(fill(1, length(y))); mustart = ((weights .* y) + 0.5) ./ (weights + 1) eta = dist.canonical.linkFun(mustart) mu = dist.canonical.linkInv(eta) (m, n) = size(X); devold = sum(dist.devResid(y, mu, weights)) coef = 1; beta = 1; Q =1; R = 1; w = 1; QRd = 1 Qr = zeros(n,n) pvalue = float64(fill(1, n)); for iter=1:maxit muEtaVal = dist.canonical.muEta(eta) z = (eta-offset) + (y - mu) ./ muEtaVal w = sqrt((weights .* muEtaVal.^2) ./ dist.variance(mu)) (Q, R) = qr(diagmm(w, X)); R1 = R[1:n, 1:n]; Q1 = Q[:, 1:n]; beta = R1 ¥ (Q1' * (w .* z)) eta = X * beta mu = dist.canonical.linkInv(eta) dev = sum(dist.devResid(y, mu, weights)) 2012/12/01 17
  • 19. サイバー系 (参考)JuliaのGLM_4 #glmFit関数の続き if (abs(dev-devold)/(0.1+abs(dev)) < epsilon) coef = beta break else devold = dev coef=beta end end for i=1:n for j=1:n if(R[i,j]==0) Qr[i,j]=Q[i,j] else Qr[i,j]=R[i,j] end end end 2012/12/01 18
  • 20. サイバー系 (参考)JuliaのGLM_5 #glmFit関数の続き convmat = inv(Qr' * Qr) varCf = diag(convmat) sErr = sqrt(varCf) tvalue = coef./sErr p値の算出のために、JuliaからRの関数を使用しています _jl_libRmath = dlopen("libRmath") for i=1:length(tvalue) pvalue[i] = -2 * ccall(dlsym(_jl_libRmath,:pt),Float64,(Float64, Float64), abs(tvalue[i]), 100000000000) end nulldev = sum(dist.devResid(y, sum(weighs .* y) ./ sum(weights), weights)) resdf = m – n; nulldf = m - 1 aicSeeds = float64(fill(0, m)) AICの算出のために、JuliaからRの関数を使用しています for i=1:length(aicSeeds) aicSeeds[i] = (weights[i] / weights[i]) * ccall(dlsym(_jl_libRmath,:dbinom), Float64, (Float64, Float64, Float64, Int32), round(weights[i]*(y[i])), round(weights[i]), mu[i], 1) end aic = -2 * sum(aicSeeds) + 2 * n (beta, sErr, tvalue, pvalue, dev, resdf, nulldev, nulldf, aic) end ※注)正規分布関数からの確率値を返すRのpnorm関数がJuliaから呼べなかった(未実装)ため、 t分布関数からの確率値を返すRのpt関数を自由度1e+10で呼んで、正規分布からの 確率値とほぼ同値を得るようにしています。 2012/12/01 19
  • 21. サイバー系 初めての、JuliaでのGLM 最初の動作確認は「Rのglm.fit」説明時に使用した謎のデータ • R • Julia load(“myGlm.jl”) #自作GLM関数を読み込む y = csvread(“smpl_y.csv”) #yを読み込む(ただしmatrixになっちゃう) y = y[:, 1] #yをRでいうvectorに X = csvread(“smpl_X.csv”) #X(model.matrix型)を読み込む _jl_libRmath=dlopen(“libRmath”) #JuliaからRを使うための宣言 glmFit(y, X, BinomialDist) #いざGLM • 実行結果は次ページ 2012/12/01 20
  • 22. サイバー系 初めての、JuliaでのGLM 動作確認は「Rのglm.fit」説明時に使用した謎のデータ • Julia実行結果画面 *結果の整形してなくてすいません。 coef, standardErr, tvalue, pvalue, よし、(見にくいけど) deviance, df, nulldeviance, nulldf, AICの順に数値が出てます Rと同じ結果が得られた! 2012/12/01 21
  • 23. サイバー系 デカいデータをJuliaでGLMするための準備 • 前述の通り、JuliaはRでいうformulaが使えない。 • 元データフレームからmodel.matrixを作成してJuliaのGLMに突っ込む • Juliaよくわかんないから、↑この作業はRでやった 作業イメージ airline <- read.csv(“airline.csv”) formula <- Cancelled ~ Year + Month + DayOfWeek + CRSElapsedTime + Distance X <- model.matrix(object=formula, data=airline) y <- mf$y write.table(X, file=“X.csv”, sep=“,”, col.names=FALSE, row.names=FALSE, quote=FALSE) write.table(y, file=“y.csv”, sep=“,”, col.names=FALSE, row.names=FALSE, quote=FALSE) *注)実際に上記のようにやるとこの段階で既にRが爆死するので、本当はsedとかawkとかcatとか駆使してX.csvは作成してます 2012/12/01 22
  • 24. サイバー系 念願の、Rで爆死するデータ量をJuliaでGLM • Rだと爆死する様 • データはもちろん皆さん大好きairline.csv (をmodel.matrixに変換したX.csv) はい爆死 2012/12/01 23
  • 25. サイバー系 念願の、Rで爆死するデータ量をJuliaでGLM • Juliaだと... メモリエラー.だ ..と... (゚∇゚ ;)エッ!?←イマココ 2012/12/01 24
  • 26. サイバー系 まとめ 1. Juliaという素敵な言語があるよ 2. 公開されてたGLMがエラってどうしようも 無かったので実装したよ 3. Rと違って、matrixでm行 * n列<2^31の 制約がないからメモリの許す限りのデータ量 でGLMができる(はずだった)よ 4. 日々精力的に開発がされているため、 関数名とか頻繁に変わっちゃって 昨日まで動いていたものが動かなく なっちゃったりもして爆死頻度高いよ 2012/12/01 25
  • 27. サイバー系 参考文献  Julia Lang http://julialang.org/  RとJuliaの言語比較一覧表 http://www.johnmyleswhite.com/notebook/2012/04/09 /comparing-julia-and-rs-vocabularies/  JuliaでのGLM実装(自分には動かせなかった) https://github.com/dmbates/Glm  JuliaからRの関数を使う http://dmbates.blogspot.jp/2012/03/julia-functions-for- rmath-library.html 2012/12/01 26