眠気.jl

投稿=不定期

SciPyJapan2019振り返り(1/2)

動機

最近こんな記事を見かけて、自分もSciPy Japan 2019を見に行ったので感想等書いてみたくなったので書いてみました gihyo.jp
公開されているチュートリアルのURLをすべて含んだ良い記事だと思うのでこんな記事読まずに↑こちらの記事読んだほうがいいかもしれないです
この記事で触れられてないところに触れていければと思います

参加費

学生:50$

知ったきっかけ

去年辺りからEnthoutのYoutubeチャンネルを見ていたのでSciPyの存在は知っていた
自分は特にUMAPとJupyternotebookでのシミュレーション環境構築の動画が好きだった www.youtube.com

進行スケジュール

進行は予定通りだった(4/23, 4/24共に) www.scipyjapan2019.scipy.org 初日は

9:00-12:30 チュートリアル

Tensorflow, Josh Gordon, Google
Advanced Numpy, Juan Nunuz-Iglesias, Monash University.
の2つから一つ選ぶ
自分はTensorflowを選びました
GoogleのJosh Gordon氏によると
1. TF2.0はさらにNumpyライクになった
2. Beginnerにとってはあまり大きな変化はない
3. Expertなcode styleはかっこよく書ける
リンク参照→https://storage.googleapis.com/applied-dl/SciPy_Tokyo.pdf
4. TF2.0の例はうまくいかないのもサイトにのっけちゃってる

12:30-1:30 昼食

ビュッフェ形式でした
会場がマンダリンオリエンタル東京だったので,すごい豪華なご飯でした
卑しい人間なので、この1食で元取ったなと思ってしまいました

1:45-2:30 Keynote: f(x)=a+bi

Your (x) future, f, depends on Atoms (real and bits (imaginary: cyber)
Mitsunobu Koshiba, President and CEO, JSR
AI使ってる企業事例の紹介等がありました

2:30-3:00 Apache Arrow, Kouhei Sutou, ClearCode Inc.

Apache Arrowの紹介

C,C++,C#,Go,Java,JavaScript, MATLAB, Python,R,Ruby,Rust,様々な言語で使える
インメモリーデータ向け多言語対応開発プラットフォーム
効率的なシリアライズができる
データを直接扱うことでコピーコスト, パースコストを失くしている

3:00-3:30 Chainer: A Deep Learning Framework for Fast Research and Applications, Crissman Loomis, Preferred Networks

NumPy/CuPy風のChainerX, Chainer CV, RLの紹介

3:30-3:45 休憩

すごい美味しいマカロンが出ました

3:45-4:15 Scaling your Python Interactive Applications with Jupyter, Luciano Resende, IBM

k8sでjupyter notebook立てまくって多言語対応
jupyter notebookでのデータフロー

4:15-4:45 CuPy: A NumPy-compatible Library for High Performance Computing with GPU,Masayuki Takagi, Preferred Networks

cuPyはSciPyの疎行列、FFT、特殊関数、線形代数等をサポートしてる

4:45-5:15 Rapids: GPU Accelerated Data Science, Akira Naruse, NVIDIA

一番衝撃的だった
特にcuDFがpandasライクだがかなり高速になっていた
RAPIDSについては下記のリンクが分かりやすかった
機械学習のすべてをGPUで行おうとしている壮大なプロジェクト

www.slideshare.net

qiita.com

5:15-6:00 ポスター発表及びジョブフェア

JSRさんとEnthoughtさんが展示をされてました
オライリージャパンさんがエレガントなSciPyを無償配布していたのでいただきました,しかも著者のJuan Nunez-Iglesiasがサインもしてくれました

6:00-7:30 レセプション

美味しい食ry

初日の振り返り

マンダリンオリエンタル東京が豪華過ぎて圧倒されました
セッションがこすぎて圧倒されました

juliaの設定.juliaをdotfilesに追加して管理したら便利だった

動機

Juliaのパッケージとかどこにあるんだろう、と思ったらhomeに.juliaがあったのでこれはdotfilesに足すしか無いと思った

やっていく

> cp .julia [dotfiles/homeの場所]

setup.shに追記

#!/bin/bash

DOT_FILES=(.bashrc .bash_profile .vim .vimrc .tmux.conf
.bash_logout .xonshrc .julia)

for file in ${DOT_FILES[@]}
do
  ln -s $HOME/dotfiles/home/$file $HOME/$file
done

.juliaの中身をちょっとみてみる

ls -a .julia
.       compiled  dev           packages
..      conda     environments  prefs
clones  config    logs          registries

それぞれのファイルには大体想像どおりのものがあった

今の所の便利さ

git pullすればstartup.jl反映される, packagesに一回入れたパッケージが残ってる

おまけ

.julia/repl_history.jl に,REPLで打ったコマンドが全て残ってます人によっては(少なくとも私にとっては)黒歴史なのでpublicなdotfilesに置くときは消去するといいかもしれません

https://www.mathwithjulia.com/

JuliaでKullback-Leibler Divergence 1/2

目標

発生させた正規分布に従う乱数同士のKLdivergenceを計算してみる

X\sim N\left(0, 1\right), Y\sim N\left(0.5, 1\right), Z\sim N\left(0, 1.5\right)
使うライブラリ
StatsBase.jl
Distributions.jl

kldivergenceとは

 \begin{array}{l}{q(x), p(x) : p . d . f \text { on } R^{N}} \newline
{K(q | p) :=\int q(x) \log \frac{q(x)}{p(x)} d x}\end{array}
で定義され,p.d.f.同士の差異の大きさを反映している
(distanceとは(私は)呼ばない、対称性がないので)

乱数の生成

julia>

julia> x = rand(Normal(0, 1), 100)

julia> y = rand(Normal(0.5, 1), 100)

julia> z = rand(Normal(0, 1.5), 100)

正規分布同士のkldivergence

2つの正規分布同士の場合、少し頑張ると公式が出せる
2つの正規分布を考える
 N\left(\mu, \sigma^{2}\right), N\left(\xi, \tau^{2}\right)
kldivergenceを計算していくと....?

次回

正規分布同士のkldivergenceの公式
StatsBase.jlのkldivergenceを使ってみる

参考書籍

情報量統計学

Juliaで標準正規分布のプロット(Gadfly.jl)

目標

JuliaでN(0,1)をプロットする(Gadfly.jl)
i.e.
 f(x)=\frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp \left(-\frac{(x-\mu)^{2}}{2 \sigma^{2}}\right) \quad(x \in \mathbb{R})
をプロットする(xは[-5,5]に制限します)

動機

Data Science with Julia
で見たプロットがかっこよかったので、やりたくなった

作業環境

前回同様

やってみる

(v1.1) pkg> activate 0402
(0402) > add FFTW Gadfly Cairo
shell> vim uni.jl

uni.jlを書いていく

using Pkg
Pkg.activate("0402")

using Gadfly, Cairo

Gadfly.push_theme(:dark)
#なぜなら、かっこいいから. 自分で色を設定して、themeとして登録もできる詳しくは  
#http://gadflyjl.org/v0.6.3/man/themes.html#Named-themes-1

f(x, μ, σ) = (1/(√(2*π*σ^2)))*exp(-(x-μ^2)^2/2σ^2)
#正規分布作る  
x = collect(-5:0.1:5)
#numpyならnp.arange(-5,5,0.1)

Standard_Normal_dist = [f(x, 0, 1) for x in x]

p = plot(x=x, y=Standard_Normal_dist)
display(p)

実行してみる

shell> julia uni.jl

ブラウザが開いて,こんな感じになる

できた!

Gadfly.jlの挙動について(おまけ)(3パターン)

ipynbの場合
plot(y=[1,2,3])  

下のセルに出る

p = plot(y=[1,2,3])
display(p)  

ブラウザが開いて出る

.jlを作って,julia .jlで呼ぶ場合
plot(y=[1,2,3])

何も出ない

p = plot(y=[1,2,3])
display(p)

ブラウザが開いて出る

REPLの場合
plot(y=[1,2,3])

ブラウザ開いて出る

注意
  1. plot()はy軸指定だけでも描画されるが、その場合xは0からスタートする
  2. 正規分布は自分で決めなくても,Distributions.jl使えば問題ない
    (私はTeXっぽい書き方が好きなので書いた,合理性はない)

感想

matplotlibのようで、慣れやすいと思った

参考書籍,URL

Data Science with Julia Gadfly公式

Juliaのpkgモード,REPLモード,shellモード,help?のコマンドまとめ

動機

自分がよく忘れたり、?でJuliaに聞いたりするので備忘録

目標

思い出しやすいように書く

作業環境

今回の環境=前回同様

REPL

julia >

ターミナルでjuliaと打ったとき入るモード
ここから
; ? ]
で3つのモードに行ける
pkg,REPLで?を入力してからEnterを押すと詳細な解説が出る,ありがたい

pkg

REPLで ] を打ったら入るモード

(v1.1) pkg > 

(or(自分がつけた環境名)+pkg)
と表示されている

よく使うコマンド

activate (自分で作った環境に入れる、なければ作られる)
add (パッケージを足す)
remove (パッケージを消す)
status (入れたパッケージ一覧などが出る、Pkg.installed()的)

shell

REPLモードで;を打つと入るモード,大体コマンドプロンプトと同じコマンドが打てる
私はよくここでtmuxを起動している(どうでもいい)

shell > 

と表示されている

help?モード

REPLで ? を打つと入るモード

help?>

と表示されている
対話的なヘルプ,自分が決めた関数や,最初からある関数を調べてくれる
例)
+の挙動が知りたいとき

help?> +
search: +

  +(x, y...)

  Addition operator. x+y+z+... calls this function with all arguments, i.e. +(x, y, z, ...).

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> 1 + 20 + 4
  25
  
  julia> +(1, 20, 4)
  25
  ...

自分で決めた関数の場合,次のようになる

julia > foo() = println("foo")
foo (generic function with 1 method)
help?> foo
search: foo floor pointer_from_objref OverflowError

  No documentation found.

  foo is a Function.

  # 1 method for generic function "foo":
  [1] foo() in Main at none:1

感想

備忘録的な記事になってしまったので,有意義な記事書きます(いずれ)

参考にしたURL,書籍

Julia Programming Projects: Learn Julia 1.x by building apps for data analysis, visualization, machine learning, and the web (English Edition)

startup.jlにJulia起動時にやりたいことを書いていく

動機

Juliaが好きだから

目標

setup.jlを書くとJulia起動時に実行したいことを設定できるらしいので,やってみる

作業環境

前回同様,グラボ無い方のpc
ターミナルで作業(HOME)

やってみる

setup.jlはJulia本によると
.julia/configに書くものらしいので場所を探します,ターミナルで

> cd .julia/
.julia> mkdir config
.julia> cd config
.julia/config> touch startup.jl //startup.jlを作成
.julia/config> vim startup.jl //vimで編集する

startup.jlをこんな感じに書き換える

const g = 9.80665
#=
constのが早いらしいので
ちなみにJuliaはconstで決めたものでも変更は可能です
ただしWARNINGは出ます
=#

atreplinit() do(f)
  println("初期値gを9.80665にしておきました")
end

#=
atreplinit()
はREPLの初期化が終わった時に時間指定出来る関数(at REPL init)
=#

保存してから,ターミナルで

julia>

f:id:julialangisthebestlang:20190319225546j:plain
startup.jl
できた!!

感想

よく使う定数や関数はstartup.jlに書いてしまうのもいいかもしれないですね
DockerでJulia動かすときとか便利そうです

参考にしたURL,書籍

Julia Programming Projects: Learn Julia 1.x by building apps for data analysis, visualization, machine learning, and the web (English Edition)

Makie.jlで遊んでみる(インストールと画像、動画出力)

動機

Juliaで画像とか動画とか作ってみたかったから

目標

1 test Makieでエラー吐かないようにする
2 画像出力(.jpg)
3 動画出力(.mp4)

作業環境

重いらしいのでゲーミングPCの方でやってみる

julia> versioninfo()
Julia Version 1.1.0
Commit 80516ca202 (2019-01-21 21:24 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, skylake)
Environment:
  JULIA_EDITOR = atom -a
  JULIA_NUM_THREADS = 6

ffmpeg等必要なので、次をターミナルで走らせておく

sudo apt-get install ffmpeg cmake xorg-dev

やってみる

julia>
(v1.1) pkg> activate Makie-env
(Makie-env) pkg> add AbstractPlotting Makie GLMakie FileIO CodecZlib GDAL
julia> using Pkg
julia> Pkg.installed()
Dict{String,Union{Nothing, VersionNumber}} with 6 entries:
  "CodecZlib"        => v"0.5.2"
  "FileIO"           => v"1.0.5"
  "Makie"            => v"0.9.3"
  "AbstractPlotting" => v"0.9.6"
  "GDAL"             => v"0.2.0"
  "GLMakie"          => v"0.0.5"
julia> Pkg.build("CodecZlib")
julia> Pkg.build("GDAL")
julia> exit()
Julia has exited. Press Enter to start a new session.
julia>
(v1,1) pkg> activate Makie-env
(Makie-env) > test Makie
...
Test Summary:         | Pass  Total
Reference Image Tests |  185    185
   Testing Makie tests passed
julia> edit("first_scatter.jl")

散布図を書く(first_scatter.jlを編集)
色も配置もランダムにプロットする(チュートリアルそのまま)

using Makie

 x = rand(10)
 y = rand(10)
 colors = rand(10)

 scene = scatter(x, y, color = colors)

 Makie.save("scatterplot.jpg", scene)

REPLに戻って

shell> julia first_scatter.jl
scatterplot.jpg

f:id:julialangisthebestlang:20190312101131j:plain
scatterplot.jpg
できた!
動画もやってみる

julia> edit("video.jl")

video.jlを編集

using Makie

 scene = Scene()

 f(t, v, s) = (sin(v + t) * s, cos(v + t) * s, (cos(v + t) + sin(v)) * s)
 t = Node(Base.time())
 limits = FRect3D(Vec3f0(-1.5, -1.5, -3), Vec3f0(3, 3, 6)) #np.linspace的な、描画する範囲の指定
 p1 = meshscatter!(scene, lift(t-> f.(t, range(0, stop = 2pi, length = 50), 1), t), markersize = 0.1, color = RGBAf0(0.2, 0.9, 0.2, 0.3))[end]
 p2 = meshscatter!(scene, lift(t-> f.(t * 2.0, range(0, stop = 2pi, length = 50), 1.5), t), markersize = 0.1, color = RGBAf0(0.9, 0.2, 0.4, 1))[end]
#RGBAf0でカラー指定してみた
 lines = lift(p1[1], p2[1]) do pos1, pos2
     map((a, b)-> (a, b), pos1, pos2)
 end
 linesegments!(scene, lines, linestyle = :dot, limits = limits)
 N = 150 #動画のコマ数指定
 record(scene, "/置きたいpath/first_video.mp4", 1:N) do i #record関数でmp4出力
     push!(t, Base.time())
end

REPLに戻って

shell> julia first_video
julia>

できた!(.mp4の場合は結果はREPLには出ませんでした)

感想

楽しかった!!
surfaceに矢印をプロットする関数もあるようなので,微分幾何をやり直しつつ,可視化もしてみたいです!!!

参考にしたURL,書籍

Julia Programming Projects: Learn Julia 1.x by building apps for data analysis, visualization, machine learning, and the web (English Edition) Makie.jl公式レポジトリ
Makie.jl公式ドキュメント