Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Rユーザのための?

Julia入門
(10分では分からない)

@Nikoriks
2013/11/9@TokyoR
誰だっけ?
•
•
•
•
•
•
•
•

紀(きの)信邦-紀貫之と先祖が同一←進化論的に
TokyoRでは参加したほとんど至るところの回で最年長
1976年プログラミングを始める、三菱総合研究所を経て
1981年(株)アイザック(設立時シニ...
誰がなぜ作ったか
誰がなぜ作ったか
•

I'm a data scientist and applied mathematician.
I've previously worked at Akamai, Citrix Online,
Jeff Bezanson...
なぜJuliaを調べるのか
• Homoiconicな(同図像性という訳語があるらしい、同表象性ではどう?)
– プログラムの表現がデータと同じ
– Lisp,Prolog,Curl,Julia
• LLVM( Low Level Virtua...
性能

http://julialang.org/ より
OpenBLAS
•
•
•
•
•

Basic Linear Algebra Subprograms
行列とベクトルの高速演算
GotoBLAS:後藤和茂氏が開発(非営利、再配布不可)
2010年後藤氏のMicrosoft‘s Techni...
そして
•

かなり美人で気立てが良い、または、相当な男前で嘘はつかない

•

Rのように中身がぐちゃぐちゃでなく、
Rubyのように遅くなく、
Lispのように原始的またはエレファントでなく、
Prologのように変態的なところはなく、
S...
1日目
•
•

$ apt-get install julia → v0.1.2がインストールされた
練習のために8-Queensでも書いてみよう
– FORTRAN以外のちゃんとした言語(Algol)で初めて書いたプログラム

•
•

L...
2日目
• Permutations()が動いたので、generate & testで8-Queensを書く

• ソースの解説
qs=reshape(1:n,n)
p = permutations(qs)
state = start(p)
w...
繰り返しの一般形
state = start(I)
while !done(I, state)
(i, state) = next(I, state)
# body
end

for i = … もこういう風に実行される
•

Range, T...
3日目
•

Prolog風のバックトラックを動かすために、Var型とUnificationを導入す
る
–
–
–
–

たくさんの試行錯誤
Unifierは、Varと任意の型を扱う
TupleとArray (x,y,z) [1,3,5]
U...
4日目
• もっとちゃんとしたQueensを書く
• Unificationの威力で解けることを証明
– クイーンの効きを加減算で求めるようではunificationはなくて良い

board={{(Var(),Var(),Var()) for...
(v, v, v) (v, v, v) (v, v, v) (v, v, v)
(v, v, v) (v, v, v) (v, v, v) (v, v, v)

(v, v, v) (v, v, v) (v, v, v) (v, v, v)
(...
ちょっと性能を見る
8Queens

10Queens

12Queens

13Queens

Generate&
test

0.016

1.6

-

-

普通のやつ

0.018

0.46

14.6

85.7

事前
Unif...
5日目
• モジュールにする→デバッグやや不便
• 制約ソルバーを書いてみたい
• 性能評価

• 並列計算
• はらわたを調べたい

• 「Rユーザーのための入門」と言ってみたが、どうしよう?
Exprとeval()とquote
はらわたを調べるために

type Expr
head::Symbol
args::Array{Any,1}
typ
End
Var type について
valueof(v::Any) = deref(v)
...
Anonymous function
julia> f = cell(3)
3-element Array{Any,1}:
julia> f[2]=()->rand()
(anonymous function)

julia> f[2]()
0...
Rとの違い
•
•
•
•
•
•

代入は <- ではなく、=
Vectorは c(1,2,3) ではなく [1,2,3]
if の条件式に () は要らない
use size(M, 1) for nrow(M)
3 と (3) と [3] ...
[いくつかの例]
julia> mapreduce(x->x^2, +, [1:2:9])
165

Iterableなら何でも書ける
というような所がRと違う

Range 1:2:9 -> 1, 3, 5, 7, 9
Map X^2 -> ...
今のところの結論
• きれいで筋が良い有望な言語である

• 関数型かオブジェクト指向の経験があれば難しくない
• 数値や行列の演算が豊富に用意されている
• 統計関係はまだ量が少ない
– これはチャンスだ!

• ビッグデータ関係もまだ少ない...
質問の時間
Upcoming SlideShare
Loading in …5
×

Julia入門

8,299 views

Published on

Julia入門

  1. 1. Rユーザのための? Julia入門 (10分では分からない) @Nikoriks 2013/11/9@TokyoR
  2. 2. 誰だっけ? • • • • • • • • 紀(きの)信邦-紀貫之と先祖が同一←進化論的に TokyoRでは参加したほとんど至るところの回で最年長 1976年プログラミングを始める、三菱総合研究所を経て 1981年(株)アイザック(設立時シニック)を創業 1983年K-Prolog言語処理系を発表(国産初のUNIX商用) 1988年S言語をベル研究所より導入販売 1995年上記製品をLinux対応 2000年(株)ケイエルエス研究所を設立、現在に至る (他に、(株)ゆめみ取締役、SESSAME監事、日本エンジェルズロッヂ代表など) この間、情報規格調査会 SC22 Prolog WG委員、Prolog言語JIS原案作成委員、 東京農工大学客員教授、未踏ソフトウェア創造事業PM、日本ソフトウェア科学 会理事、Linux Business Initiative理事等 • Nikoriks@Facebook,Twitter
  3. 3. 誰がなぜ作ったか
  4. 4. 誰がなぜ作ったか • I'm a data scientist and applied mathematician. I've previously worked at Akamai, Citrix Online, Jeff Bezanson, Stefan Karpinski, Viral Shah, Alan Edelman and Etsy. • Matlabユーザ、Lispハッカー、Rの描画 • We want the speed of C with the dynamism of Ruby • Cのように速く、Pythonのように使えるやつで、Rubyのように易し く…Perl…MatLab… • We want to write A*B and launch a thousand computations on a thousand machines, calculating a vast matrix product together • http://julialang.org/blog/2012/02/why-we-created-julia/
  5. 5. なぜJuliaを調べるのか • Homoiconicな(同図像性という訳語があるらしい、同表象性ではどう?) – プログラムの表現がデータと同じ – Lisp,Prolog,Curl,Julia • LLVM( Low Level Virtual Machine)上の64bitであり、BLASが使える (つまり、速くて大きいらしい) • 関数型言語で結構柔軟な型システムを持ち – (弱い動的な型付) • 豊富な数値計算のための仕掛けがあって • 並列計算やネットワークもできる • MITライセンス
  6. 6. 性能 http://julialang.org/ より
  7. 7. OpenBLAS • • • • • Basic Linear Algebra Subprograms 行列とベクトルの高速演算 GotoBLAS:後藤和茂氏が開発(非営利、再配布不可) 2010年後藤氏のMicrosoft‘s Technical Computing Group移籍 GotoBLAS2: BSDライセンスに変更 • OpenBLAS is an optimized BLAS library based on GotoBLAS2 BSDライセンス
  8. 8. そして • かなり美人で気立てが良い、または、相当な男前で嘘はつかない • Rのように中身がぐちゃぐちゃでなく、 Rubyのように遅くなく、 Lispのように原始的またはエレファントでなく、 Prologのように変態的なところはなく、 ScalaやClojureについては Javaのように硬すぎることはなく、 言わないでおくこと Haskellのように抽象的すぎない ほどよい言語である • Fortranに対するS、{C,COBOL}に対するJava、Prologに対するErlangが、 Rに対するJuliaである • ドキュメントは不備でソース見ないと解らないことも多い(見てもわか らないことも、後述)
  9. 9. 1日目 • • $ apt-get install julia → v0.1.2がインストールされた 練習のために8-Queensでも書いてみよう – FORTRAN以外のちゃんとした言語(Algol)で初めて書いたプログラム • • Listではなく、ArrayとTupleが底にあるのか ををっ、permutations()があるぞ、ところが julia> permutations([1,2,3]) ERROR: permutations not defined • • • • ソースを見にゆく→定義されている Importなどが不足しているのか? ソースの近くにある他の関数を試す→動く おかしいなぁと、あれこれ丸一日考える ソースもドキュメントも0.2.0-rc1-prerelease対応であった
  10. 10. 2日目 • Permutations()が動いたので、generate & testで8-Queensを書く • ソースの解説 qs=reshape(1:n,n) p = permutations(qs) state = start(p) while !done(p, state) (q, state) = next(p, state) if (safe(q)) count += 1 pp(q,count) end end Permutations()はiteratorを返す q は[1,2,3,4,5,6,7,8]の置換を順に得る Safe()はクイーン達が置けてるかど うか
  11. 11. 繰り返しの一般形 state = start(I) while !done(I, state) (i, state) = next(I, state) # body end for i = … もこういう風に実行される • Range, Tuple, AbstractArray,String, Set,Dict などで使える 1:n (1,2,3) *1,2,3.0+ “abc” set hash table
  12. 12. 3日目 • Prolog風のバックトラックを動かすために、Var型とUnificationを導入す る – – – – たくさんの試行錯誤 Unifierは、Varと任意の型を扱う TupleとArray (x,y,z) [1,3,5] Undo() バックトラックをして変数の値を元に戻す type Var value::Union(String,Number,Any) Var() = (v = new(); v.value = v) End import Base.show function show(io::IO,v::Var) v = deref(v) show(io,isUndef(v)? :Var:v) end • 8-Queensの最初のバックトラック版 Union型が使える (この例では実は不要) コンストラクタをここ に書く 値の表示はshow()の追加 で
  13. 13. 4日目 • もっとちゃんとしたQueensを書く • Unificationの威力で解けることを証明 – クイーンの効きを加減算で求めるようではunificationはなくて良い board={{(Var(),Var(),Var()) for i=1:n} for j=1:n} for j=1:n if unify(board[i][j],(i,i,i)) 3つの変数のtupleから成るn*nの配 列
  14. 14. (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) (v, v, v) ここに(3,3,3)を試すと 赤い線の上のvはすべて 3になる Unificationって凄い (この例は簡単なので他の 言語でも同じように書け ることは言わないでおく)
  15. 15. ちょっと性能を見る 8Queens 10Queens 12Queens 13Queens Generate& test 0.016 1.6 - - 普通のやつ 0.018 0.46 14.6 85.7 事前 Unification 0.032 0.67 18.7 114.2 Juliaは数値演算が速いからこうなる? Time マクロを見てみること
  16. 16. 5日目 • モジュールにする→デバッグやや不便 • 制約ソルバーを書いてみたい • 性能評価 • 並列計算 • はらわたを調べたい • 「Rユーザーのための入門」と言ってみたが、どうしよう?
  17. 17. Exprとeval()とquote はらわたを調べるために type Expr head::Symbol args::Array{Any,1} typ End Var type について valueof(v::Any) = deref(v) +(v::Var) = valueof(v) julia> q=Var();e=:(1+2*+q) :(+(1,*(2,+(q)))) julia> e.head :call julia> e.args[1] :+ qはシンボルであり、実体で julia> e.args[2] はない。eval時に解決される 1 julia> e.args[3].args[3] :(+(q)) julia> unify(q,3) true julia> eval(e) 7
  18. 18. Anonymous function julia> f = cell(3) 3-element Array{Any,1}: julia> f[2]=()->rand() (anonymous function) julia> f[2]() 0.9816352797118642 julia> f[2]() 0.38877690284117694 ちょっとどきっとする書き方 Functionやlambdaや括弧が要らない
  19. 19. Rとの違い • • • • • • 代入は <- ではなく、= Vectorは c(1,2,3) ではなく [1,2,3] if の条件式に () は要らない use size(M, 1) for nrow(M) 3 と (3) と [3] は違う。 c.f 1 と c(1) Tuple , (1,2,3) を使う、listではなく • 自分用の Type が作りやすい! • かなりきちんとした関数型の仕掛け 関数型言語としての抽象化がうまくいっているので、 Rのようにvectorに変換してから、というような制約が少ない
  20. 20. [いくつかの例] julia> mapreduce(x->x^2, +, [1:2:9]) 165 Iterableなら何でも書ける というような所がRと違う Range 1:2:9 -> 1, 3, 5, 7, 9 Map X^2 -> 1, 9,25,49,81 Reduce + -> 1+9+25+49+81 • ただし、Comprehension(内包式)はまだ弱い – [ 0.25*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1 ] は書けるが – Filterがまだ書けない、多分そのうち書けるようになる
  21. 21. 今のところの結論 • きれいで筋が良い有望な言語である • 関数型かオブジェクト指向の経験があれば難しくない • 数値や行列の演算が豊富に用意されている • 統計関係はまだ量が少ない – これはチャンスだ! • ビッグデータ関係もまだ少ない – チャンスかも • 実用アプリケーションを(覚悟なしに)書き始めてはいけない – ドキュメント弱いし
  22. 22. 質問の時間

×