Julia の紹介 for <span>Unagi.py</span>
===
<!-- .element: style="font-size:330%" -->
2018/10/27 <span>Unagi.py</span> & Python東海 合同勉強会@豊橋
antimon2(後藤 俊介)
Note:
LTスライドですっ
----
## お品書き
+ お前誰よ?
+ 簡単なコミュニティ紹介
+ 簡単なJuliaの紹介
+ Python との比較
---
# お前誰よ?
----
## 自己紹介
+ 名前:後藤 俊介
+ 所属:**[有限会社 来栖川電算](https://www.kurusugawa.jp)**
+ コミュニティ:**[機械学習名古屋](https://machine-learning.connpass.com/)**, **[Python東海](https://connpass.com/series/292/)**, **[NGK2018B](https://ngk2018b.connpass.com/)**, Ruby東海, …
+ 言語:**[Julia](https://julialang.org)**, **Python**, Scala(勉強中), Ruby, …
+ ![Twitter](https://i.imgur.com/HqouMIg.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" --> [@antimon2](https://twitter.com/antimon2) / ![Facebook](https://i.imgur.com/01nPd37.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" --> [antimon2](https://www.facebook.com/antimon2)
+ ![Github](https://i.imgur.com/yBKtii5.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" --> [antimon2](https://github.com/antimon2/) / ![Qiita](https://i.imgur.com/FxHMi64.png)<!-- .element: class="plain" style="vertical-align:middle;background:transparent" --> [@antimon2](http://qiita.com/antimon2)
Note:
今日は(も?) Julia の話っ
----
[![有限会社来栖川電算](https://i.imgur.com/8Kuhfel.png)
https://www.kurusugawa.jp](https://www.kurusugawa.jp)
Note:
Python で仕事してますっ
----
### 2年ちょっと前
<!-- .element: style="font-size:1em" -->
[![Python で転職した話](https://i.imgur.com/njNGwPx.png)https://antimon2.github.io/PythonTokai201606/slides/JobChange.slides.html](https://antimon2.github.io/PythonTokai201606/slides/JobChange.slides.html)
<!-- .element: style="font-size:0.5em" -->
Note:
Python(で機械学習)できれば転職も出来るよっ!
---
# <small>簡単な</small><br><span>コミュニティ紹介<!-- .element: style="font-size: 1.0em" --></span>
Note:
主催 or スタッフしている主な勉強会コミュニティの紹介っ
----
## 機械学習名古屋
----
<!-- .slide: data-background="https://i.imgur.com/v8F7pzK.jpg" -->
Note:
前回の勉強会の様子
![前回の勉強会の様子](https://i.imgur.com/v8F7pzK.jpg)
----
[![https://machine-learning.connpass.com/](https://i.imgur.com/525HEJa.jpg)https://machine-learning.connpass.com/](https://machine-learning.connpass.com/)<!-- .element: style="font-size:0.7em" -->
Note:
主催(共催)している勉強会『機械学習名古屋』の connpass ページ
----
[![https://www.facebook.com/mlnagoya](https://i.imgur.com/Mxdm75S.jpg)https://www.facebook.com/mlnagoya](https://www.facebook.com/mlnagoya)<!-- .element: style="font-size:0.7em" -->
Note:
主催(共催)している勉強会『機械学習名古屋』の Facebook ページ
----
### 1年ちょっと前
<!-- .element: style="font-size:1em" -->
[![機械学習名古屋の紹介](https://i.imgur.com/qBHXb7A.png)https://hackmd.io/p/BkXCS5QzW](https://hackmd.io/p/BkXCS5QzW)
<!-- .element: style="font-size:0.7em" -->
Note:
過去のPython 東海でも(改めて)紹介してましたっ!
----
### 勉強会の内容
+ みんなで手を動かして何か作る
+ みんなやってることを発表する
Note:
難しくないよーこわくないよー
----
[![機械学習名古屋 第18回勉強会](https://i.imgur.com/citFLQh.png)
https://machine-learning.connpass.com/event/104440/](https://machine-learning.connpass.com/event/104440/)<!-- .element: style="font-size:0.7em" -->
Note:
次回は2018/12/01っ
主催&Juliaの発表(LT)予定っ
----
## NGK2018B
Note: 忘年会イベントの告知っ
----
[![https://ngk2018b.connpass.com/](https://i.imgur.com/hqGz8Ks.jpg)https://ngk2018b.connpass.com/](https://ngk2018b.connpass.com/)<!-- .element: style="font-size:0.7em" -->
Note:
毎年やっている忘年会イベント。
昨年からスタッフやってますっ
----
[![https://ngk2018b.connpass.com/event/104965/](https://i.imgur.com/pLaWMp3.jpg)https://ngk2018b.connpass.com/event/104965/](https://ngk2018b.connpass.com/event/104965/)<!-- .element: style="font-size:0.7em" -->
Note:
2018/12/22 〜19:00 昼の部はLT大会!
5分LT×30人くらいやります!
もちろん見に来るだけでも可!
----
[![https://ngk2018b.connpass.com/event/105836/](https://i.imgur.com/Jrep4qO.jpg)https://ngk2018b.connpass.com/event/105836/](https://ngk2018b.connpass.com/event/105836/)<!-- .element: style="font-size:0.7em" -->
Note:
2018/12/22 19:30〜 夜の部は大忘年会!
みんなで食べて飲んで盛り上がりますっ
ということでみんなお気軽に参加してねっ!
---
# <small>簡単な</small><br>Julia の紹介
Note:
やっと本題。Julia 良いよ Julia っ
----
[![Julia](https://upload.wikimedia.org/wikipedia/commons/6/69/Julia_prog_language.svg)<!-- .element: style="background:white;max-width:80%" -->](https://julialang.org)
----
## Julia とは?(1)
+ [The Julia Language](https://julialang.org)
+ 2018/08/08 に正式版 v1.0 がリリース!
+ 最新 v1.0.1(2018/09/29)
+ 科学技術計算に強い!
+ 動作が速い!(LLVM JIT コンパイル)
Note:
ググるときはなるべく [julialang](https://www.google.co.jp/search?q=julialang) で!
----
## Julia とは?(2)
> + Rのように中身がぐちゃぐちゃでなく、
> + Rubyのように遅くなく、
> + Lispのように原始的またはエレファントでなく、
> + Prologのように変態的なところはなく、
> + Javaのように硬すぎることはなく、
> + Haskellのように抽象的すぎない
>
> ほどよい言語である
<!-- .element: style="font-size:66%" -->
引用元:http://www.slideshare.net/Nikoriks/julia-28059489/8
<!-- .element: style="font-size:71%" -->
----
## Julia とは?(3)
> + C のように高速だけど、
Ruby のような動的型付言語である
> + Lisp のようにプログラムと同等に扱えるマクロがあって、しかも
Matlab のような直感的な数式表現もできる
> + Python のように総合的なプログラミングができて、
R のように統計処理も得意で、
Perl のように文字列処理もできて、
Matlab のように線形代数もできて、
shell のように複数のプログラムを組み合わせることもできる
> + 超初心者にも習得は簡単で、
超上級者の満足にも応えられる
> + インタラクティブにも動作して、コンパイルもできる
<!-- .element: style="font-size:50%" -->
([Why We Created Julia](http://julialang.org/blog/2012/02/why-we-created-julia) から抜粋・私訳)
<!-- .element: style="font-size:71%" -->
Note:
要するに、いろんな言語の「いいとこどり」言語!ってことでっ
----
## 主な機能
+ [多重ディスパッチ](https://ja.wikipedia.org/wiki/%E5%A4%9A%E9%87%8D%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81)
+ 動的型システム
+ [並行・並列処理](https://docs.julialang.org/en/v1/manual/parallel-computing/)、コルーチン
+ [組込パッケージマネージャ](https://docs.julialang.org/en/v1/stdlib/Pkg/)
Note:
今回は時間ないのでこの辺詳しくは解説しません。
----
<!-- .slide: data-background="https://i.imgur.com/yTZBdQM.jpg" -->
Note:
先週(2018/10/20)行われた Julia Tokyo #8 で発表してきましたっ
![Julia Tokyo #8](https://i.imgur.com/yTZBdQM.jpg)
----
## 文法・関数
Note:
以降、ほぼ過去スライドからのコピペ。すっ飛ばして先へ進んで戴いてもOKっ
----
### 基本的な演算
```julia
julia> 1 + 2 - 3 * 4 # 四則演算(除算以外)
-9
julia> 7 / 5 # `整数 / 整数` の結果は浮動小数
1.4
julia> 7 ÷ 5 # `整数 ÷ 整数` の結果は整数
1
julia> 2 ^ 10 # 冪乗は `^`
1024
julia> 123 & 234 | 345 # 論理積 / 論理和
376
julia> 123 ⊻ 234 # 排他的論理和(==`xor(123, 234)`)
145
```
<!-- .element: style="font-size:46%" -->
Note:
整数同士の除算は実数になりますっ
整数除算演算子 `÷` が別に存在します(Python の `//` 相当)っ
また冪乗も(`**` ではなく)`^` ですっ
`⊻` は `\veebar`+<kbd>Tab</kbd>で変換できますっ
ちなみに先ほどの `÷` も `\div`+<kbd>Tab</kbd>で(基本的に $\TeX$ の書式)っ
----
### 配列
```julia
julia> a = [1, 2, 3, 4, 5]
5-element Array{Int64,1}:
1
2
3
4
5
julia> a[1] # Julia は 1-origin
1
julia> println(a[2:3]) # 範囲指定は両端含む
[2, 3]
```
<!-- .element: style="font-size:50%" -->
Note:
1-origin であることに注意すればあとは普通の配列っ
あと `a:b` は範囲(`Range`)の記法。両端を含む(Ruby の `a..b` と同じ)っ
----
### 配列の内包表記 (1)
```julia
julia> a = [n^2 for n=1:5]
5-element Array{Int64,1}:
1
4
9
16
25
julia> A = [x+10y for y=1:3, x=1:3]
3×3 Array{Int64,2}:
11 12 13
21 22 23
31 32 33
```
<!-- .element: style="font-size:50%" -->
Note:
内包表記の記法は Python に類似っ
かつ、`for` にカンマ区切りで複数のイテレータを渡すことで2次元以上の配列も作成可能っ
----
### 配列の内包表記 (2)
```julia
julia> [(a,b,c) for c=1:15,b=1:15,a=1:15 if a^2+a*b+b^2==c^2]
6-element Array{Tuple{Int64,Int64,Int64},1}:
(3, 5, 7)
(5, 3, 7)
(6, 10, 14)
(7, 8, 13)
(8, 7, 13)
(10, 6, 14)
```
Note:
Python と同様に `if` で条件を指定することも可能っ
あと Python と同様、`[○ for ○=○]` を `(○ for ○=○)` と書くと配列ではなくて `Generator` が返りますっ
----
### ベクトル
```julia
julia> x = [1., 2., 3.]; y = [3., 1., 2.];
julia> x + y # `x .+ y` と書いても同じ(elementwise operation)
[4., 3., 5.]
julia> x .* y # これは `x * y` と書くとNG
[3., 2., 6.]
julia> using LinearAlgebra
julia> x ⋅ y # 内積(dot積、`dot(x, y)` と書いても同じ)
11.0
julia> x × y # 外積(cross積、`cross(x, y)` と書いても同じ)
[1., 7., -5.]
```
<!-- .element: style="font-size:50%" -->
Note:
Julia では実は1次元配列がベクトルの扱いっ
`⋅` は `\cdot`+<kbd>Tab</kbd>、`×` は `\times`+<kbd>Tab</kbd>(これらを利用するには `using LinearAlgebra` 必要)っ
あとこれらや先ほどの `÷` や `⊻` などのように、ASCIIの範囲を超えたUnicode文字の演算子(そのほとんどが $\TeX$ 由来)が Julia にはたくさんあります(他には例えば比較演算子の `≤` `≥` や、集合の要素 `∈` や包含関係 `⊆` などなど)
----
### 行列
```julia
julia> A = [1 2; 3 4] # この記法は MATLAB/Octave 由来
2×2 Array{Int64,2}:
1 2
3 4
julia> A' # `○'` は転置行列の記法(これも MATLAB/Octave 由来)
2×2 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
1 3
2 4
julia> transpose(A) # 正確には転置行列はこっち
2×2 LinearAlgebra.Transpose{Int64,Array{Int64,2}}:
1 3
2 4
```
<!-- .element: style="font-size:50%" -->
Note:
Julia では2次元配列が行列の扱いっ
あと `○.'` という書式は廃止されました(`transpose(A)` 使ってね)っ
----
### 行列の演算
```julia
julia> A = [1 2; 3 4]; B = [3 0; 0 6];
julia> A + B # A .+ B でも同様
2×2 Array{Int64,2}:
4 2
3 10
julia> A * B # matrix multiply
2×2 Array{Int64,2}:
3 12
9 24
julia> A .* B # elementwise multiply
2×2 Array{Int64,2}:
3 0
0 24
```
<!-- .element: style="font-size:48%" -->
Note:
行列は `*` で通常の行列積になりますっこれ便利っ
----
### ブロードキャスト
```julia
julia> sin(0.1)
0.09983341664682815
julia> sin.([0.1, 0.2, 0.3, 0.4])
4-element Array{Float64,1}:
0.0998334
0.198669
0.29552
0.389418
julia> [0.1, 0.2, 0.3, 0.4] .^ 2
# => [0.01, 0.04, 0.09, 0.16]
```
<!-- .element: style="font-size:50%" -->
Note:
関数名と `(` の間に `.` を置くと、普通の関数を配列に拡張してくれる(ブロードキャスト)っ
`.^` のように演算子の前に `.` を書いても同様(先ほど出た `.+` `.*` もブロードキャスト)っ
----
### 関数定義
```julia
julia> f(x) = x^2 + 2x - 1
f (generic function with 1 method)
julia> f(1)
2
julia> f.(1:5)
# => [2, 7, 14, 23, 34]
```
Note:
数学のように直感的な記述で関数を定義可能っ
`2x` は `2*x` の省略形、曖昧さがなければリテラルと他の識別子が続く場合などに勝手に乗算と解釈してくれるっ
またユーザ定義関数も `.` をつけて自動的にブロードキャスト対応っ
----
### 有理数・複素数
```julia
julia> 1//2 == 0.5
true
julia> 1//2 - 1//3
1//6
julia> 1im ^ 2 == -1
true
julia> (1.0 + 0.5im) * (2.0 - 3.0im)
3.5 - 2.0im
```
Note:
有理数・複素数を標準サポート。
`//` は有理数除算(結果は有理数)
`im` は虚数単位。
どちらも四則演算も普通に書けますっ
---
# <small>Python との</small><br>比較
----
## 高速性
Note: Julia は JIT コンパイルで動作高速!
----
### ex1. たらい回し関数
参照: [竹内関数(マッカーシー版)](https://ja.wikipedia.org/wiki/%E7%AB%B9%E5%86%85%E9%96%A2%E6%95%B0#.E3.83.9E.E3.83.83.E3.82.AB.E3.83.BC.E3.82.B7.E3.83.BC.E7.89.88)
Note:
フィボナッチ数列と並ぶ、再帰が適度に複雑なベンチマーク御用達関数っ
----
Python でのコード例:
```python=
# @numba.jit
def tak(x, y, z):
if x <= y:
return z
else:
return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
tak(22, 11, 0)
# => 11
```
----
Julia でのコード例:
```julia=
function tak(x, y, z)
if x <= y
z
else
tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
end
end
tak(22, 11, 0)
# => 11
```
----
#### 実行結果比較
実行時間(s)
| Julia | Python | Python+Numba | Numba(最適化) |
| ----: | -----: | ------: | ------: |
| 1.70 | 91 | 2.19 | 1.99 |
Note:
+ Julia(v1.0.1)は REPL 上で `@time` マクロを利用
+ Python(v3.6.3)は ipython 上で `%time` または `%timeit` マジックコメントを利用
----
### ex2. 数学問題
> $a^2 + b^2 = 100c + d$
> $c^2 + d^2 = 100a + b$
> を満たす2桁以下の正整数の組 (a, b, c, d) をすべて求めよ。
<!-- .element: style="text-align:left" -->
Note:
という処理をナイーブに組むとどうなるかというベンチマーク問題っ
----
Python でのコード例:
```python=
[(a,b,c,d) for a in range(1,100) for b in range(1,100) for c in range(1,100) for d in range(1,100) if (100*a+b==c**2+d**2 and 100*c+d==a**2+b**2)]
# => [(12, 33, 12, 33),
# (38, 69, 62, 5),
# (59, 65, 77, 6),
# (62, 5, 38, 69),
# (77, 6, 59, 65),
# (88, 33, 88, 33)]
```
----
Julia でのコード例:
```julia=
[(a,b,c,d) for d=1:99,c=1:99,b=1:99,a=1:99 if 100a+b==c^2+d^2&&100c+d==a^2+b^2]
# => 6-element Array{NTuple{4,Int64},1}:
# (12, 33, 12, 33)
# (38, 69, 62, 5)
# (59, 65, 77, 6)
# (62, 5, 38, 69)
# (77, 6, 59, 65)
# (88, 33, 88, 33)
```
----
#### 実行結果比較
実行時間(s)
| Julia | Python | Python+Numba(※) |
| ----: | -----: | ------: |
| 0.32 | 61 | 0.29 |
+ (※): 関数でラップして初回のみ計測
Note:
+ Julia(v1.0.1)は REPL 上で `@time` マクロを利用
+ Python(v3.6.3)は ipython 上で `%time` マジックコメントを利用
----
### 高速性のまとめ
+ Julia は普通に速いよっ
+ Python+Numba でも速くなるけれど一手間必要っ
----
## 機械学習
Note: Julia に機械学習ライブラリあるよ!
----
### Python 機械学習 F/W
+ [Keras](https://keras.io/)
+ [TensorFlow](https://www.tensorflow.org/)
+ [CNTK](https://github.com/Microsoft/cntk)
+ [Chainer](https://chainer.org/)
+ …
Note:
選択肢たくさんあるねっ
----
### Julia 機械学習 F/W
+ [Flux.jl](https://fluxml.ai/Flux.jl/)
+ [Knet.jl](https://denizyuret.github.io/Knet.jl/)
+ [PyCall](https://github.com/JuliaPy/PyCall.jl) + 《Python の F/W 利用》
+ …
Note:
他にもあるけれどまだまだ充実度低い…
----
[![FluxMNIST Sample (GitHub)](https://i.imgur.com/QKj822L.png)https://github.com/antimon2/FluxMNIST.jl](https://github.com/antimon2/FluxMNIST.jl)
Note:
私の作った Flux.jl による MNIST サンプル
----
<!-- .slide: data-background="https://i.imgur.com/o6IQaGV.png" -->
Note:
実行例:
![FluxMNIST Sample (Execution)](https://i.imgur.com/o6IQaGV.png)
----
### 機械学習のまとめ
+ Julia でも普通に機械学習(DeepLearning)できる(ようになってきた)よっ
+ Python の資産も利用できるよっ
---
# まとめ
----
+ Julia 良いよ!
+ 実際に触って Julia の良さを体験して欲しい!<!-- .element: class="fragment" -->
----
## あと
+ 機械学習名古屋もよろしくね
----
## あとあと
+ NGK2018Bもよろしくね
---
## 参考リンク
----
### Julia 全般
+ [The Julia Language](https://julialang.org/)
+ [Julia Documentation](https://docs.julialang.org)
---
ご清聴ありがとうございます。
{"metaMigratedAt":"2023-06-14T18:39:40.227Z","metaMigratedFrom":"YAML","title":"Julia の紹介 for <span>Unagi.py</span>","breaks":"true","slideOptions":"{\"transition\":\"slide\",\"theme\":\"league\"}","contributors":"[{\"id\":\"80062a4b-8dad-49ac-95bf-848ce0686e9e\",\"add\":25275,\"del\":12093}]"}