科学計算が得意な言語Juliaを試してみた


# Juliaとは
科学計算の用途を想定して作られた言語。
裏でBLASとか使っているので、速度は速いとうたっている。

[R と Julia - RjpWiki](http://www.okada.jp.org/RWiki/?R%20%A4%C8%20Julia)にもあるように、結構Rから乗り換える人が増えつつあるようだ。

# 最初にすること
http://julialang.org/downloads/
で、パッケージを落としきてインストールする。
後述のhomebrewとかで頑張らないほうが楽

miitonさんのこの[記事](http://qiita.com/miiton@github/items/33c2b62c4911216d5fdb)が一番わかり易い

# homebrewでjuliaをinstallする<del>(非推奨)</del>
https://github.com/staticfloat/homebrew-julia/

が、あるけど、

- 昔[gfortranをgcc時代に入れた人は、入れなおす必要がある](https://github.com/xianyi/OpenBLAS/issues/146)
- HEADで何とか入っても、GadflyがまともにIJuliaから動かない

ので、やめたほうが良い

__[2015/01/20 追記]__
現在では、homebrewで入れるのは問題ありません
詳しくは、[Julia環境構築 2014 ver. #julialang - once upon a time,](http://chezou.hatenablog.com/entry/2014/12/03/000500)を参照ください。

# IJulia+GadflyでPlotting

IJuliaはIPythonを使ってJuliaをブラウザベースでインタラクティブに動かすもの。
[Gadfly](http://dcjones.github.io/Gadfly.jl/)はD3.jsを使っておしゃれなグラフを描画できるようにするもの。
この2つの組み合わせがJuliaのplotで良さそう。matplotlibベースのPyPlotもあるにはある。


```bash
echo 'export PATH=$PATH:/Applications/Julia-0.2.0.app/Contents/Resources/julia/bin' >> ~/.bash_profile
source ~/.bash_profile
```

zshとかの人は適宜読み替えてください。

IPythonに必要なものをpipからインストール。virtualenvとか使いたい人は適宜使ってください。

```bash
pip install  pyzmq tornado IPython
```

なお、後述するIJuliaはIPython v 1.0.0以降じゃないといけない。古いIPythonは窓から投げ捨てるべし。

起動。

```bash
julia
```

IJuliaとPyPlot, Gadflyを入れておく(PyPlotいらないかも)

```julia
Pkg.add("IJulia")
Pkg.add("PyPlot")
Pkg.add("Gadfly")
```

IJuliaの起動

```bash
ipython notebook —profile julia
```

新しくnotebookを作って、そこで操作をする。

```julia

using Gadfly
set_default_plot_size(9inch, 9inch/golden);
plot(x=rand(10), y=rand(10))
```

今の行のコードをRunするのには、Shift+EnterでOK

すると、こんなplotが出る

![スクリーンショット 2014-02-15 23.53.40.png](https://qiita-image-store.s3.amazonaws.com/0/11143/e32a27d3-4476-c2b8-5323-4971b544ee05.png "スクリーンショット 2014-02-15 23.53.40.png")



# Rでいつもみるirisを

[The State of Statistics in Julia](http://www.johnmyleswhite.com/notebook/2012/12/02/the-state-of-statistics-in-julia/)
より

```julia
Pkg.add("RDatasets")
using RDatasets

iris = data("datasets", "iris")
```

headや、

```julia
head(iris)
```

tailなんかもできる。

```julia
tail(iris) 
```

```julia
using Gadfly
set_default_plot_size(9inch, 9inch/golden);

plot(iris, x = "SepalWidth", y = "SepalLength", color="Species")
```

![スクリーンショット 2014-02-15 23.57.15.png](https://qiita-image-store.s3.amazonaws.com/0/11143/e28b938b-90d7-a402-788d-b8caa0f9f8be.png "スクリーンショット 2014-02-15 23.57.15.png")



# k-meansを試してみる
```julia
Pkg.add("Clustering")
using Clustering
x = rand(100, 10000)
k = 50
result = kmeans(x, k; max_iter=50, display=:iter)
# Show Cluster ID
result.assignments
```

# SVM

v0.3系向けの記事を書きました
http://qiita.com/chezou/items/03e648f04a2f9bbdb74b

```julia
# https://github.com/JuliaStats/SVM.jl の READMEからほぼ引用
Pkg.add("SVM")
using SVM
using RDatasets

# Read iris data
iris = data("datasets", "iris")

# SVM format expects observations in columns and features in rows
X = matrix(iris[:, 1:4])’
p, n = size(X)

# SVM format expects positive and negative examples to +1/-1
Y = [species == "setosa" ? 1.0 : -1.0 for species in iris[:, "Species"]]

# Select a subset of the data for training, test on the rest.
train = randbool(n)

# We'll fit a model with all of the default parameters
model = svm(X[:,train], Y[train])

# And now evaluate that model on the testset
accuracy = nnz(predict(model, X[:,~train]) .== Y[~train])/nnz(~train)
```

# LogisticRegressoin


```julia
Pkg.add("Regression")
# 2014/02/15現在、Pkg.add(“Regression”)で入るバージョンは、バグが含まれている
Pkg.pin("Regression")
```

LogisticRegressionの[サンプルコード](https://github.com/lindahua/Regression.jl/blob/master/examples/logireg.jl)は、Winstonというパッケージで描画する前提なので、下記のexample code叩いたほうが速い(Gadflyで描画する方法を調べる)

```
julia ~/.julia/Regression/examples/logireg.jl
```
と、試してみたところで、Winstonで描画できないことに気づいた。。。

# 気をつけること
- IJulia使っている時に、`using PyPlot`と`using Gadfly`を混ぜると`plot()`が混ざって大変危険
- 名前空間がぶつかることが多々あるので、怪しくなったらKernel restartするのが良い
- パッケージでは、Documentと食い違いがあったりバグがあったりする。
  - `Pkg.add()`で入るものが古い(=バグがある)場合があるので、`Pkg.pin()`で必要に応じて最新版を
  - パッケージ最新版にしても、exampleコードがバグって動かない時もある

# 感想
- Pkg.add("hoge")でパッケージをほいほい入れられるのは楽
- Rから援用したDataFramesを利用するコードが好まれるなど、Rの文化が色濃くなりそうな感じ
- 速度的には真面目に計測していないのでなんとも言えないけど、遅い印象はあまりない
- globalな名前空間で衝突することがままある(`plot()`など)のがちょっとつらい

# 参考サイト
- [Juliaの開発環境を構築してみる(IJulia) - Qiita](http://qiita.com/miiton@github/items/33c2b62c4911216d5fdb)
- [IPython(Anaconda)とIJuliaが凄すぎる件 - アドファイブ日記](http://d.hatena.ne.jp/isobe1978/20131128/1385646377)
- [Learn julia in Y Minutes](http://learnxinyminutes.com/docs/julia/)
- [Julia Cheat-sheet](http://math.mit.edu/~stevenj/Julia-cheatsheet.pdf)
- [Available Packages — Julia Language 0.3.0-dev documentation](http://julia.readthedocs.org/en/latest/packages/packagelist/)