Daily Julia #9
John Myles White の Juliacon report が上がっている。
Arch Robinsonの発表に興味を持っているようで多くの行数を割いているが、これ読むと自分が Robinson の資料全然理解できてなかったことを思い知らされる…
Daily Julia #8
まるで読めていない。分かってないものを無理矢理読み込もうとしてもきつい気がするのでお勉強ブログに切り替えようか。
R の findInterval が欲しい(Closed) #7469
RFC: findInterval(x,vec) by floswald · Pull Request #7469 · JuliaLang/julia
アレな感じのプルリクで実際マージされなかったが丁寧にコメントが付いており参考になる。
readavailable を廃止 #7478
discontinue readavailable() by vtjnash · Pull Request #7478 · JuliaLang/julia
Daily Julia #7
JuliaCon 続き。
Simon Byrne — Distributions.jl
- 統計における分散を扱うパッケージ
- 例:カーネル密度推定が簡単に実装できるよ!
Rmath
をぶっとばせ- ポアソン密度関数を例に。式変形をうまくしないとオーバフローが起きたり桁落ち誤差が起きたり収束も遅かったり
log
を直接求めるのは安定しないのでテイラー展開➡わかる- テイラー展開は正負の項が交互に現れるので桁落ち誤差が起こる➡わかる
r = x / (x + 2)
と置けばすべて正の項になるので桁落ちがなくなる➡???- 桁落ちがなくなるのは分かるが
r
をどうやって思いついたのか見当がつかない - 数学能力が低過ぎて悲しい
- 解析の勉強真面目にやり直さな…うう…
- ちなみに
Rmath
は Horner 法で展開しているらしい➡IFPH でやったことあるやつだ! - 他にも様々なトピックがあるが曖昧な理解なのであまり触れるのやめておこう…
Dan Wlasiuk — A Brief History of TimeSeries
- 時系列分析パッケージの基本的な使い方
- パッケージのコードが少なめ。ミニマムな設計
- Apply 系の関数は早いが Merge 系の関数が遅い。プルリク歓迎とのこと
- 存在しないデータをどうするか。
DataFrames
と同様の問題に直面している TimeSeries
は存在しない値をなかったことにしている(NaNすら使わず単にテーブルが存在しない)TimeSeries
を利用しているいくつかのライブラリはこの対応に満足していない。Pandas のように NaN を詰めている(e.g.Quandl
)- R (quantmod) や Python (Pandas) との違いなど
Reid Atcheson — Rapidly Iterating from Prototype to Near-C Performance in Julia: A Finite Element Method Case Study
- 有限要素法 (FEM) を実装したよ!
- FEM の詳細には立ち入らずいかにして高速化したか
- 一時変数をなくし
ccall
に切り替え devectorize した - naive な Julia コードに比べて 5 倍の高速化
Avik Sengupta — Moving Julia into Production
仕事で使ったという話かな。話を聞かないと分からないタイプのスライドだと思う。
Arch Robison — Practical Vectorization in Julia
Intel の並列計算の人らしい。ひえー。
内容は SIMD 並列化の話。まだシンプルな例に対してしか動かない、@inbound
が必須、Float32
が最適、など種々の制限を抱えているが高速化はうまくいっているとのこと。
グラフィックスとマルチメディア
以下のセッションはマルチメディア・可視化関係なので感想だけ。
breakout session — package ecosystem (led by Iain Dunning)
パッケージ周りの状況。GitHub を中心にエコシステムが回ってるんですなー。pkg.julia.org
はソーシャル圧力なのか…
Yuri Vishnevsky — Generative Art with Julia
Stackoverflow で見つけた visualization ネタを Julia に移植した的な。これは見ないと分からないが奇麗。
Daniel C. Jones — Gadfly: native Julia plotting and visualization
Gadfly は Julia では有名どころのプロットライブラリ。D3.js ベース。いい感じの作例が多い。
Spencer Russell — Realtime Audio in Julia with AudioIO.jl
オーディオライブラリあるんですか。無茶しやがって…感が強い。
これでいまのところ公開されている資料はひとさらいした。残りは Julia Core 関連のセッションなのだがこれはまだ来ていない。Bezanson による Julia Internal 解説や Leah Hanson による TypeCheck, Keno Fischer による Debugger の実装など重要度が高いセッションばかりなので早く見たいのだがこればかりは待つしかない。
Daily Julia #6
Julia の初のカンファレンスとなる JuliaCon が開催されている。
なおスライドは以下に集められている。GitHub だと pdf 直接閲覧できないしリンクも貼りづらくありませんか…
とりあえずタイムテーブル順にざっと見てみる。全分野素人なので詳しくは突っ込めない。
Tim Holy — Image Representation and Analysis
拡張子 .odp
だと… open office 入ってないのでちょっとパス。一般的な話題っぽいし理解しやすそうと思っていたので残念。あとで気が向いたら確認する。
Pontus Stenetorp — Natural Language Processing with Julia
東大で自然言語を研究している人らしい。
- Recursive Neural Network を実装してみたけど Matlab 並みに遅かったよ!でも Hacker News で聞いたら
@inbound
マクロを教えてもらって C に肉薄する結果が出たよ! - I/O が Python より遅い。ディクショナリのアクセスも Python より遅い。立ち上がりも正規表現も遅い?
- transition-based な係り受け解析ライブラリの話 ninjin/allen
Iain Dunning / Joey Huchette — JuliaOpt - Optimization Packages for Julia
- constrained な数学的最適化問題に絞った発表
MathProgBase.jl
は Grobi, Clp/Cbc, GLPK, Mosek, lpopt などへのインターフェースを提供しているJuMP
は代数的モデリングにより最適化問題を表現することができる- 例題として数独や遅延制約によるTSPなど
Madeleine Udell — Convex Optimization in Julia
後で学ぼう…
Douglas Bates — Fitting Statistical Models with Julia
13 枚しかないけど 1 枚毎に詰め込みすぎていて文章みたいになってる。内容もがっつり統計という感じなのでちょっとパス.
John Myles White — Representing Data in Julia
DataFrames.jl
, DataArrays.jl
の開発者によるデータ構造の解説。存在しないデータをいかにして表現するか、テーブルの表現は列指向であるべきか行指向であるべきか、データはメモリに保持すべきかディスクに保持するべきか、という基本的な点を詳説しており非常にためになる。
短く簡潔なスライドなので直接読んだほうが早いが軽くまとめておく。
存在しない値を表現する方法を模索していたが既存の方法には問題があった。
- 番兵 - 分かりやすいが特定の型ごとに NA を表す値を決めてやらねばならず(しかもそれは規約的)非常に面倒
- Option 型 - いわゆる Maybe であり、いい解決法に見えるがこの型は BLAS などで扱える配列の形式に馴染まない
上の問題を避けるために、NA をシングルトン (NAtype
) として定義し、Array{T}
の値保持形式を Union{T, NAtype}
とすることで解決を図ったらしい。もっともこれは Option が使えない苦肉の策といった感じで、型が不安定であったりするなどの弊害もある。
なんとか Option 型を使えないかなーと画策しているらしいが BLAS compatible な実装を考えるのは難しい模様。
次。
テーブルの保持形式は行指向にするべきか列指向であるべきかという問題。それぞれ Pros & Cons があるが DataFrames
は列指向でやっている。
次。
データはメモリに保持すべきかディスクに保持すべきか。これは今のところ普通にメモリ上にロードしている。しかし今後はon-diskなデータの取り扱いもうまくできるようにしたいらしい。
発表初日分の資料も目を通せていないが今日はここまで。
Daily Julia #5
range がおかしい #7420
r=0:0.1:1 a=collect(r) a[1:5] # returns Float64[0.0, 0.1, 0.2, 0.3, 0.4] r[1:5] # returns 0.0:0.01:0.04
謎の挙動であるのは分かるが何を言っているのかちょっと理解できていない。
r=1:0.002:20 r[2:4] # returns 0.002004:4e-6:0.002012
以下で一応修正しているらしい。
Pkg.add
の挙動 #7325
Pkg.add installs wrong version · Issue #7325 · JuliaLang/julia
ぽつぽつとコメントが付いている模様。
Pkg.add
の第 2 引数には version
を指定できるのだが、以下のコードでは意図しないバージョンのパッケージがインストールされたように見える。
julia> Pkg.add("ArgParse",v"0.2.7") INFO: Installing ArgParse v0.2.8 INFO: Installing Options v0.2.2 INFO: Installing TextWrap v0.1.2 INFO: Package database updated
実は Pkg.add のバージョンは下界を定めているだけらしい(ドキュメント読んでも分かり辛いが、REQUIRE の書式 に倣うとのこと)。
またバージョン番号リテラルの書式は有用で、次のように指定できる。
julia> Pkg.add("ArgParse", v"0.2.7", v"0.2.8-")
Daily Julia #4
A & B & C
のパース #7368
:(A & B & C)
が 2 項演算子の式 Expr(:call, :&, Expr(:call, :&, A, B), C)
として扱われる。これは意図された動作だが、Julia は 3 項以上の条件演算をできるように定めていたはずなので Expr(:call, :&, :A, :B, :C)
として扱うほうが合理的である。
Daily Julia #3
最大/最小値関数周りのリネームに関する議論 #7327
RFC: Added find_extrema, ind_extrema by kmsquire · Pull Request #7327 · JuliaLang/julia
Julia
では Array
の最大最小値の情報を得るための関数がいくつも存在する。
まず
maximum
,minimum
という最大値と最小値のみをそれぞれ得る基本的な関数がある。また
extrema
という関数がある。これはArray
から最大値と最小値のタプルを返す関数である。さらに
indmax
,indmin
というArray
から最大値あるいは最小値のインデックスを取り出す関数がある。はたまた
findmax
,findmin
という関数もある。これは値とインデックスのタプルを返却する。
現在ある最大最小値系の関数を表にすると次のようになる。
value | (value, index) | index | |
---|---|---|---|
最小値 | minimum | findmin | indmin |
最大値 | maximum | findmax | indmax |
最大最小値 | extrema | - | - |
この Issue は「extrema
における ind_extrema
, find_extrema
を追加しよう」というものだった。だった、というのは途中から議論の方向が「そもそもこの辺りの名前があまりよくない」という風向きになってきたからである。
まず口火を切ったのは Karpinski で、indmin
, indmax
という名前が lousy in the first place (そもそも気に食わない)と言い、argmax
, argmin
にリネームすべきと述べた。
すると johnmyleswhite は、argmax
, argmin
にするのはいいがそれは基本的に数学におけるある関数 f の最大/最小値を意味する言葉なのでインデックスを表す言葉に使うのはいかがなものかとコメントしている。
それにさらに応えて kmsquire 曰くいやいや関数 f をインデックスを値にマッピングする関数として捉えれば問題ないよ云々。高度なことを言っているわけではないが自分が同じように言い返せるかというと無理ですわ。
さて、いくらかの議論ののち kmsquire がまとめたところによると最大/最小値関数周りのネーミングは次のように整理され書き直された。
value | (value, index) | index | |
---|---|---|---|
最小値 | minimum | findmin | argmin |
最大値 | maximum | findmax | argmax |
最大最小値 | extrema | findminmax | argminmax |
まだマージされていないがこれ以上あまり議論する余地もないだろうしそのうち取り入れられるだろう。
Git を Libgit2 に置き換える準備が整いつつある? #7339
WIP: andrioni's Libgit2 work by StefanKarpinski · Pull Request #7339 · JuliaLang/julia
Package のアップデートが遅いので (大量の git のシステムコールがボトルネック?) libgit2 で書き換えて高速化しようという案件。前回の Issue が2013 年の 8 月なのでとっくに終わったものと思っていたら、ようやく一里塚に漕ぎ着けたというところだったのか。
Reimplement Git using libgit2 · Issue #4158 · JuliaLang/julia
関数が属しているモジュールを取るリフレクション #7322
added reflection method by mauro3 · Pull Request #7322 · JuliaLang/julia
これは便利なんじゃなかろうか。
julia> Base.@binding_module sin Base julia> Base.@binding_module a ERROR: Symbol a is not bound in the current module Main and not exported in any 'used' module. in error at error.jl:21 in binding_module at reflection.jl:171 julia> a = 4 4 julia> Base.@binding_module a Main julia> Base.binding_module(:a) Main
Karpinski は REPL 上で属しているモジュール名を印字するようにすればいいんじゃねと言っている。
cumsum
のパフォーマンスが悪い #7342
To improve performance in cumsum · Issue #7342 · JuliaLang/julia
cumsum
は配列を類積和の配列にして返す関数。キャッシュを実装してないから遅い云々。どんなもんかなと実装見たらメタプログラミングされてて軽くビビった。