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
 

Recently uploaded

TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
YukiTerazawa
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
koheioishi1
 

Recently uploaded (7)

TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
 

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