SlideShare una empresa de Scribd logo
1 de 22
Rユーザのための?

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

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

紀(きの)信邦-紀貫之と先祖が同一←進化論的に
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
誰がなぜ作ったか
誰がなぜ作ったか
•

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/
なぜJuliaを調べるのか
• Homoiconicな(同図像性という訳語があるらしい、同表象性ではどう?)
– プログラムの表現がデータと同じ
– Lisp,Prolog,Curl,Julia
• LLVM( Low Level Virtual Machine)上の64bitであり、BLASが使える
(つまり、速くて大きいらしい)

• 関数型言語で結構柔軟な型システムを持ち
– (弱い動的な型付)

• 豊富な数値計算のための仕掛けがあって
• 並列計算やネットワークもできる
• MITライセンス
性能

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

Basic Linear Algebra Subprograms
行列とベクトルの高速演算
GotoBLAS:後藤和茂氏が開発(非営利、再配布不可)
2010年後藤氏のMicrosoft‘s Technical Computing Group移籍
GotoBLAS2: BSDライセンスに変更

• OpenBLAS is an optimized BLAS library based on GotoBLAS2
BSDライセンス
そして
•

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

•

Rのように中身がぐちゃぐちゃでなく、
Rubyのように遅くなく、
Lispのように原始的またはエレファントでなく、
Prologのように変態的なところはなく、
ScalaやClojureについては
Javaのように硬すぎることはなく、
言わないでおくこと
Haskellのように抽象的すぎない
ほどよい言語である

•

Fortranに対するS、{C,COBOL}に対するJava、Prologに対するErlangが、
Rに対するJuliaである

•

ドキュメントは不備でソース見ないと解らないことも多い(見てもわか
らないことも、後述)
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対応であった
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()はクイーン達が置けてるかど
うか
繰り返しの一般形
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
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()の追加
で
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の配
列
(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って凄い
(この例は簡単なので他の
言語でも同じように書け
ることは言わないでおく)
ちょっと性能を見る
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 マクロを見てみること
5日目
• モジュールにする→デバッグやや不便
• 制約ソルバーを書いてみたい
• 性能評価

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

• 「Rユーザーのための入門」と言ってみたが、どうしよう?
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
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や括弧が要らない
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に変換してから、というような制約が少ない
[いくつかの例]
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がまだ書けない、多分そのうち書けるようになる
今のところの結論
• きれいで筋が良い有望な言語である

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

• ビッグデータ関係もまだ少ない
– チャンスかも

• 実用アプリケーションを(覚悟なしに)書き始めてはいけない
– ドキュメント弱いし
質問の時間

Julia入門