眠気.jl

投稿=不定期

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公式ドキュメント

Juliaでirisを読み込んでCSVでreadしたりwriteしたり

動機

CSV.jlを使ってみたかったから

目標

1.RDatasetsからirisのデータセットを取得
2.irisを確認
3.csvにwriteしてreadする
4.csvを確認

作業環境

今回の環境(前回同様)

やってみる

(v1,1) pkg> activate todayblog
(todayblog) pkg> add RDatasets
julia> using RDatasets
julia> using CSV
julia> iris = dataset("datasets", "iris")
julia> iris //irisが読み込めてるか確認
julia> CSV.write("iris.csv", iris)
julia> CSV.read("iris.csv") //irisが入ってるか確認

感想

次回はby()で絞り込んで,Gadfly.jlでプロットして流行りのデータサイエンティストっぽい記事を書こうと思います!

参考にしたURL,書籍

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