2019年4月26日金曜日

[Julia] ベクトルと行列の演算

ベクトルと行列の演算例をREPLを使って行う際のメモです.

1次元配列は要素をカンマ(,)で区切ります.また,1次元配列は列ベクトルに相当します.
julia> col = [1.0, 2.0]    # Column vector
2-element Array{Float64,1}:
 1.0
 2.0

行ベクトルは行の数が1つの2次元配列で表現します.行ベクトルは2次元配列なので,行ベクトルリテラルは,列ベクトルの ","の代わりに空白区切り" "で要素を並べます.
julia> row = [3.0 4.0]     # Row vector
1×2 Array{Float64,2}:
 3.0  4.0

行ベクトルと列ベクトルの積は以下のように記述します.
julia> row * col           # 3.0 * 1.0 + 4.0 * 2.0
1-element Array{Float64,1}:
 11.0

列ベクトルと行ベクトルの積は以下のように記述します.
julia> col * row           # [1.0*3.0 1.0*4.0; 2.0*3.0 2.0*4.0]
2×2 Array{Float64,2}:
 3.0  4.0
 6.0  8.0

行列は2次元配列で表現します.行列リテラルは,空白区切り" "の要素で表される行をセミコロン";",もしくは改行で区切って表現します.
セミコロン";"で区切る場合は以下のようになります.
julia> A = [1.0 3.0; 2.0 4.0] # 2x2 Matrix
2×2 Array{Float64,2}:
 1.0  3.0
 2.0  4.0
改行で区切る場合は以下のようになります.
julia> A = [1.0 3.0
            2.0 4.0] # Same as above Matrix A
2×2 Array{Float64,2}:
 1.0  3.0
 2.0  4.0

行ベクトル,行列,および列ベクトルの積は以下のようになります.
julia> row * A * col
1-element Array{Float64,1}:
 61.0

上記の例のJupyter Notebookファイルは,GitHubJulia_Beginner_03.ipynbの"5 Vector and matrix operations"で見ることができます.

2019年4月25日木曜日

[Julia] REPLにおけるギリシャ文字表示

JuliaのREPLではLaTeX表記でタブ補完することで,以下のような表示が可能です.
julia> α β γ δ ϵ ζ η θ ι κ λ μ ν ξ ø π ρ σ τ υ ϕ χ ψ ω

入力は
\alpha + tab, \beta + tab, \gamma + tab, \delta + tab, \epsilon + tab, \zeta + tab, \eta + tab, \theta + tab, \iota + tab, \kappa + tab, \lambda + tab, \mu + tab, \nu + tab, \xi + tab, \o + tab, \pi + tab, \rho + tab, \sigma + tab, \tau + tab, \upsilon + tab, \phi + tab, \chi + tab, \psi + tab, \omega + tab
とします.

2019年4月24日水曜日

[Julia] -q オプション

Juliaを対話的実行で使用する際には,以下のようにターミナルから"julia"コマンドを実行します.
すると,以下のようにJuliaのロゴと共にREPLが起動します.
$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.1.0 (2019-01-21)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> exit()

Juliaのロゴを表示したくない場合は,以下の例のように"-q"オプションを渡して起動します.
$ julia -q
julia> 

julia> exit()

2019年4月23日火曜日

[Julia] 平均の計算

Juliaで平均の計算を行ってみた際のメモです.実行例はREPLで行なった結果です.

まずは相加平均(算術平均)についてです.
$ \mu = \frac{1}{n} \sum\limits_{i=1}^n x_i $
1〜10までの整数の和の平均を求めてみます.
総和は`sum()`関数を用いて求めます.
julia> x1 = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
10-element Array{Float64,1}:
  1.0
  2.0
  3.0
  4.0
  5.0
  6.0
  7.0
  8.0
  9.0
 10.0

julia> n = length(x1)
10

julia> mu_a = sum(x1) / n
5.5

続いて幾何平均についてです.
$ ( \prod\limits_{i=1}^{n} x_i ) ^ \frac {1} {n} $
1〜10の幾何平均を求めてみます.
総乗は`prod()`関数を用いて求めます.
julia> x2 = [1.0, 2.0, 3.0, 4.0, 5.0]
5-element Array{Float64,1}:
 1.0
 2.0
 3.0
 4.0
 5.0

julia> n = length(x2)
5

julia> mu_g = prod(x2) ^ (1 / n)
2.605171084697352

Python3で確認のための計算を行なってみると以下のようになります.
>>> import scipy.stats.mstats as mstats
>>> mstats.gmean(x2)
2.6051710846973517

幾何平均(対数)- log-average -についてです.
$ \exp \left( \cfrac{1}{n} \sum_{i=1}^n \ln {x_i} \right)$
この平均は,元のデータの数値 $a_{i}$ を対数*に変換して相加(算術)平均を求め、指数関数*を適用して元の数値の幾何平均を得ます.
log-averageを対数平均(logarithmic mean )と混同しないように注意が必要です.
julia> x3 = [1.0, 2.0, 3.0, 4.0, 5.0]
5-element Array{Float64,1}:
 1.0
 2.0
 3.0
 4.0
 5.0

julia> x4 = map(a -> log(a), x3)
5-element Array{Float64,1}:
 0.0               
 0.6931471805599453
 1.0986122886681098
 1.3862943611198906
 1.6094379124341003

julia> n = length(x3)
5

julia> mu_g_ln = exp((1 / n) * sum(x4))
2.605171084697352

Python3で確認のための計算を行なってみると,以下のようになります.
>>> import numpy as np
>>> from statistics import mean
>>> x3 = [1.0, 2.0, 3.0, 4.0, 5.0]
>>> np.exp(mean (np.log(x3)))
2.6051710846973517

なお,上記の例のJupyter Notebookファイルは,GitHubMean.ipynbというファイルで見ることができます.

* `ln`は自然対数で,`e`を底とする対数です.`exp`は`e`を底とする指数関数です.`exp`は`log`と逆の意味になるので,`log(x)`を`exp`すると元の値に戻し,`exp(x)`を`log`しても元に戻ります.
julia> exp(log(pi))
3.141592653589793

julia> log(exp(pi))
3.141592653589793

2019年4月22日月曜日

[Python vs Julia] 二項分布

以前に,Pythonで二項分布のグラフをプロットする投稿をしました.今回は,同様の内容をJuliaで行ってみます.
二項分布の確率質量関数は

$\mathrm{Bin}(m | M, \mu) = {}_M C_m \mu^{m} (1 - \mu)^{M - m}$

です.
実装は以下のようになります.実装例はREPLで行った結果です.
julia> using Statistics

julia> using Distributions

julia> using StatsPlots

julia> M = 50
50

julia> mu = 0.5
0.5

julia> m = Binomial(M, mu)
Binomial{Float64}(n=50, p=0.5)

julia> scatter(m, leg=false, xlims = (0,50))



以下のようなグラフが描かれます.
この図を保存するには,以下のコマンドを実行します(この例ではファイル名をplot1として.png形式のファイルで保存)
julia> savefig("plot1.png")

また,参考までに平均と分散を求めると以下のようになります.

定義に基づいて計算した平均

julia> println("mean = ", M*mu)            
mean = 25.0



Statics.mean()関数を用いて計算した平均
julia> println("mean = ", Statistics.mean(m))
mean = 25.0

定義に基づいて計算した分散

julia> println("variance = ", M*mu*(1-mu))         
variance = 12.5



Statics.var()関数を用いて計算した平均
julia> println("variance = ", Statistics.var(m))   # Calculate using function
variance = 12.5



なお,上記の例のJupyter Notebookファイルは,GitHubBinomialDistribution.ipynbというファイルで見ることができます.

2019年4月21日日曜日

[Python vs Julia] 順列・組合せ

以前に,順列・組合せに関する計算をPythonで行う投稿をしました.
今回は,それをJuliaで行ってみます.計算例はREPLで行なったものです.

順列
1, 2, 3の3つの数字の並べ方は $3! = 3 \times 2 \times 1 = 6$ 通りです.
階乗を求めるには factorial() 関数を使用します.
julia> factorial(3)
6

順列
${}_n P _r = \cfrac{n!}{(n - r)!}$
を表示するには,以下のように permutations()  関数を使用します.

1, 2, 3, 4, 5 から3つを選ぶ並べ方は,${}_5 P _3=5 \times 4 \times 3 = 60$ 通りとなります.
何通りあるかだけを知りたい場合には,以下のようにして求めます.
julia> binomial(5, 3) * factorial(3)
60

順列の並びを表示させるには,permutations() 関数を用いて,第一引数に対象とする配列,第二引数に選ぶ数を指定します.
julia> using Combinatorics


julia> seq = (1, 2, 3)
(1, 2, 3)

julia> collect(permutations(seq))
6-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [1, 3, 2]
 [2, 1, 3]
 [2, 3, 1]
 [3, 1, 2]
 [3, 2, 1]
順列,組合せを扱うには,Combinatorics パッケージ*を使用します.
なお,collect は,配列を展開して表示するためのコマンドです.

上記のように特に配列(seq)を定義しなくても実行可能です.

julia> collect(permutations([1, 2, 3]))
6-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [1, 3, 2]
 [2, 1, 3]
 [2, 3, 1]
 [3, 1, 2]
 [3, 2, 1]


julia> collect(permutations([1, 2, 3, 4, 5], 3))
60-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 2]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 2]
 [1, 4, 3]
 [1, 4, 5]
 [1, 5, 2]
 [1, 5, 3]
 [1, 5, 4]
 [2, 1, 3]
 [2, 1, 4]
 [2, 1, 5]
 [2, 3, 1]
 [2, 3, 4]
 [2, 3, 5]
 [2, 4, 1]
 [2, 4, 3]
 [2, 4, 5]
 ⋮        
 [4, 2, 1]
 [4, 2, 3]
 [4, 2, 5]
 [4, 3, 1]
 [4, 3, 2]
 [4, 3, 5]
 [4, 5, 1]
 [4, 5, 2]
 [4, 5, 3]
 [5, 1, 2]
 [5, 1, 3]
 [5, 1, 4]
 [5, 2, 1]
 [5, 2, 3]
 [5, 2, 4]
 [5, 3, 1]
 [5, 3, 2]
 [5, 3, 4]
 [5, 4, 1]
 [5, 4, 2]
 [5, 4, 3]

組合せ
1, 2, 3, 4, 5 から3つを選ぶ組合せは,${}_5 C _3= \frac{{}_5 P_3}{3!} = 10$ 通りとなります.
何通りあるかを知りたい場合には以下のようにします.
julia> binomial(5, 3)
10


組合せ

${}_n C _r= \cfrac{{}_n P_r}{r!} = \cfrac{n!}{r! (n - r)!}$

を表示するには,以下のように combinations() 関数を用いて,第一引数に対象とする配列,第二引数に選ぶ数を指定します.
julia> seq2 = (1, 2, 3, 4, 5)
(1, 2, 3, 4, 5)

julia> collect(combinations(seq2, 3))
10-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 5]
 [2, 3, 4]
 [2, 3, 5]
 [2, 4, 5]
 [3, 4, 5]

順列の例と同様に,配列を事前に定義せずに,第一引数に記載しても同様な結果が得られます.

なお,上記の例のJupyter Notebookファイルは,GitHubDiscreteProbabilityCombinationというファイルで見ることができます.

* Combinatorics パッケージを追加する際には,パッケージモードで " add Combinatorics "と入力します.すると以下のようにインストールが行われます.
(v1.1) pkg> add Combinatorics
 Resolving package versions...
 Installed Combinatorics ─ v0.7.0
 Installed Polynomials ─── v0.5.2
  Updating `~/.julia/environments/v1.1/Project.toml`
  [861a8166] + Combinatorics v0.7.0
  Updating `~/.julia/environments/v1.1/Manifest.toml`
  [861a8166] + Combinatorics v0.7.0
  [f27b6e38] + Polynomials v0.5.2


2019年4月20日土曜日

[Python vs Julia] 整数の乱数を発生させる

過去にPythonを用いて整数の乱数を発生させるコード例を投稿しました.

その中では,20回サイコロを振ることを想定して,整数の乱数を発生させるために,Pythonで以下のように書きました.
>>> import numpy as np
>>> np.random.choice(np.arange(1, 7), 20)
array([4, 2, 5, 1, 6, 5, 5, 3, 1, 5, 4, 4, 3, 4, 1, 5, 2, 1, 2, 2])

これをJuliaで行う場合には,以下のように書けば良いようです.
julia> rand(1:6, 20) # rand(start:stop, times)
20-element Array{Int64,1}:
 4
 3
 5
 5
 2
 3
 2
 2
 5
 3
 3
 1
 4
 4
 6
 5
 4
 4
 2
 5
上記のREPLの例にもコメントしてありますが,関数rand()の使い方は以下のようになります.
rand(start:stop, times)

上記の例は復元抽出なので,非復元抽出を行う場合はPythonで以下のように書きました.
>>> np.random.choice(np.arange(1, 7), 6, replace = False)
array([5, 3, 4, 6, 1, 2])

これをJuliaで行う場合には,StatsBaseパッケージを用いて,以下のように書けば良いようです.
julia> using StatsBase

julia> sample(1:6, 6, replace=false)
6-element Array{Int64,1}:
 6
 4
 1
 3
 2
 5
関数sample()の使い方は以下のようになります.
sample(start:stop, times, replace = "true" or "false")

なので,最初のコードと同じことを実行するためには,以下のように書いても良いようです.
julia> sample(1:6, 20, replace=true)
20-element Array{Int64,1}:
 4
 1
 6
 4
 1
 5
 5
 6
 4
 2
 6
 3
 2
 1
 1
 6
 2
 1
 5
 1

なお,上記の例のJupyter Notebookファイルは,GitHubPython_vs_Julia_Julia_03というファイルで見ることができます.

2019年4月19日金曜日

[Julia] パッケージのインストール

Juliaにおいてパッケージをインストールした際のメモです.

現時点ではバージョン1.1ですが,Julia 1.0以降では"pkgモード"が作られています.
REPLを起動して"]"を入力するとプロンプトが "(v1.1)pkg>"と変わります.
この状態で
    add "Package Name"
とするとインストールが始まります.以下は,"StatsBase"パッケージをインストールした際の例です.

(v1.1) pkg> add StatsBase
  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
 Installed Missings ─────────── v0.4.0
 Installed SortingAlgorithms ── v0.3.1
 Installed DataStructures ───── v0.15.0
 Installed StatsBase ────────── v0.30.0
 Installed OrderedCollections ─ v1.1.0
  Updating `~/.julia/environments/v1.1/Project.toml`
  [2913bbd2] + StatsBase v0.30.0
  Updating `~/.julia/environments/v1.1/Manifest.toml`
  [864edb3b] + DataStructures v0.15.0
  [e1d29d7a] + Missings v0.4.0
  [bac558e1] + OrderedCollections v1.1.0
  [a2af1166] + SortingAlgorithms v0.3.1
  [2913bbd2] + StatsBase v0.30.0

(v1.1) pkg> 

pkgモードからは,"delete"を押すか,Ctr+Cで抜けることができます.

2019年4月18日木曜日

[Julia] Plotのインストールと描画

Juliaでは,Pythonのmatplotlibのように描画用のパッケージが固定されておらず,現段階では色々と選ぶことができるようです.

描画用パッケージとして,とりあえずPlotをインストールしてみることにしました.以下はその際のメモです.
REPLを起動します.その後プロンプトが"julia> "となっている状態で"]'を入力すると,プロンプトが"(v1.1) pkg>"となるので,その状態で以下のように"add Plots"と入力します.

julia> # input ]

(v1.1) pkg> add Plots

処理には多少時間がかかる場合があります*が,終われば終了で,REPLを終了させます.

その後にPlotパッケージの読み込みを行います.
julia> using Plots

julia> gr()
Plots.GRBackend()

これで,これでフロントエンドにPlots,バックエンドにGRという組み合わせで実行できるようになるようです(現段階では,正直なところフロントエンド,バックエンドという仕組みはよく理解できていません...).

試しに乱数データをプロットして描画してみます.
julia> plot(randn(30,1))

julia> savefig("plot1.png")
とすると,描画された後に,以下のようなpngファイルが保存されます.

もう一つ似たようなプロット,描画を行なってみます.
julia> plot(randn(50,5))

julia> savefig("plot2.png")
すると,描画された後に,以下のようなpngファイルが保存されます.


散布図は以下のようなコマンドでプロット,描画が可能です.
julia> plot(randn(50,5), st=:scatter)

julia> savefig("plot3.png")

.pngファイルはあまりキレイではありませんが,.pdfファイルで保存するとキレイな図を得ることができます..pdfファイルに保存する際には,以下のようなコマンドを入力します.
julia> p = plot(randn(50, 3), st=:scatter)

julia> savefig(p, "plot3.pdf")

なお,上記の例のJupyter Notebookファイルは,GitHubJulia_Beginner_02というファイルで見ることができます.

* Plotsパッケージのインストールの際には,以下のように表示されます.
  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
 Installed Measures ────────── v0.3.0
 Installed Showoff ─────────── v0.2.1
 Installed SortingAlgorithms ─ v0.3.1
 Installed RecipesBase ─────── v0.6.0
 Installed StatsBase ───────── v0.29.0
 Installed Plots ───────────── v0.24.0
 Installed PlotUtils ───────── v0.5.8
 Installed Contour ─────────── v0.5.1
 Installed PlotThemes ──────── v0.3.0
 Installed NaNMath ─────────── v0.3.2
 Installed Missings ────────── v0.4.0
 Installed StaticArrays ────── v0.10.3
 Installed GR ──────────────── v0.39.1
  Updating `~/.julia/environments/v1.1/Project.toml`
  [91a5bcdd] + Plots v0.24.0
  Updating `~/.julia/environments/v1.1/Manifest.toml`
  [d38c429a] + Contour v0.5.1
  [28b8d3ca] + GR v0.39.1
  [442fdcdd] + Measures v0.3.0
  [e1d29d7a] + Missings v0.4.0
  [77ba4419] + NaNMath v0.3.2
  [ccf2f8ad] + PlotThemes v0.3.0
  [995b91a9] + PlotUtils v0.5.8
  [91a5bcdd] + Plots v0.24.0
  [3cdcf5f2] + RecipesBase v0.6.0
  [992d4aef] + Showoff v0.2.1
  [a2af1166] + SortingAlgorithms v0.3.1
  [90137ffa] + StaticArrays v0.10.3
  [2913bbd2] + StatsBase v0.29.0
  Building GR ───→ `~/.julia/packages/GR/KGODl/deps/build.log`
  Building Plots → `~/.julia/packages/Plots/47Tik/deps/build.log`

(v1.1) pkg>