Your SlideShare is downloading. ×
0
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
JuliaでGLM
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

JuliaでGLM

2,274

Published on

第3回Japan.Rでの発表資料です

第3回Japan.Rでの発表資料です

Published in: Education
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,274
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
7
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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 02012/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 end2012/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.html2012/12/01 26

×