ブログ

【Julia入門】Juliaの制御構文① Juliaの条件評価 〜if-else〜

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaの条件評価の使い方について取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

条件評価

if-else

条件評価を行うにあたってJuliaに限らず様々なプログラムで用いられるのがif-elseです。Juliaではif-elseは下記のように用いることができます。

x = 3; y = 2

if x < y
    println("x is less than y")
elseif x > y
    println("x is greater than y")
else
    println("x is equal to y")
end

・実行結果

x is greater than y

三項演算子

if-else構文を$1$行で表すにあたって用いられるのが三項演算子です。Juliaにおける三項演算子は下記のように用いることができます。

x = 100
println(x > 100 ? true : false)
println(x > 100 ? "x > 100" : "x >= 100")

・実行結果

false
x >= 100

andとor

条件評価を行う際に$2$つの条件のandorを取り扱うことは多いです。Juliaではand条件を&&を用いて表すことができます。

println(true && true)
println(true && false)
println(false && false)

・実行結果

true
false
false

同様にor条件は||を用いることで表すことができます。

println(true || true)
println(true || false)
println(false || false)

・実行結果

true
true
false

上記はBool型のtruefalseを用いて表しましたが、下記のように実際の不等号に対しても&&||を用いることができます。

println(1>0 && 2<1)
println(1>0 || 2<1)

・実行結果

false
true

and条件とor条件は数学の集合における「積集合」と「和集合」と対応させて抑えておくと良いと思います。

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

【Julia入門】Juliaの基本事項⑧ Juliaにおける正規表現の取り扱い

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaにおける正規表現の取り扱いについて取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

正規表現

正規表現の概要

正規表現は文字列の検索などの際に用いられる表現方法で、たとえば「Jで始まりgで終わる文字列」のように文字列のパターンを表す目的で用いられます。

正規表現の定義

Jで始まりgで終わる文字列」の正規表現は下記のように作成できます。

regex = r"J.*g"
println(regex)
println(typeof(regex))

・実行結果

r"J.*g"
Regex

match関数

正規表現を用いて文字列のパターンマッチングを行うにあたっては、下記のようにmatch関数を用いれば良いです。

regex = r"J.*g"
m = match(regex, "JuliaLang is the best")
println(m)

・実行結果

RegexMatch("JuliaLang")

ここでmatch関数の戻り値はRegexMatch型のオブジェクトで得られ、RegexMatch型のオブジェクトは下記のようにmatchoffsetメソッドを実行できることも合わせて抑えておくと良いです。

regex = r"J.*g"
m = match(regex, "JuliaLang is the best")
println(typeof(m))
println(m.match)
println(m.offset)

・実行結果

RegexMatch
JuliaLang
1

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

【Julia入門】Juliaの基本事項⑦ Juliaの文字列の関数

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaにおける文字列の関数について取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

文字列の関数

文字列の長さ

文字列の長さはlength関数を用いることで得ることができます。

s = "Julia"
println(length(s))

・実行結果

5

文字列の繰り返し

文字列の繰り返しはrepeat関数を用いることで下記のように行うことができます。

s = "Julia "
println(repeat(s, 2))

・実行結果

Julia Julia 

文字列の置換

文字列の置換はreplace関数を用いることで行うことができます。

s = "study English"
s = replace(s, "English" => "Math")
println(s)

・実行結果

study Math

文字列の分割

文字列の分割はsplit関数を用いることで下記のように実行することができます。

s = split("Julia-Lang","-")
println(s)
println(s[1])

・実行結果

SubString{String}["Julia", "Lang"]
Julia

文字列の判定

文字列の判定はstartswith関数やendswith関数を用いることで行うことができます。

startswith

judge1 = startswith("JuliaLang", "Julia")
judge2 = startswith("JuliaLang", "Python")
judge3 = startswith("JuliaLang", "Jul")

println(judge1)
println(judge2)
println(judge3)

・実行結果

true
false
true

endswith

judge1 = endswith("JuliaLang", "Julia")
judge2 = endswith("JuliaLang", "Lang")

println(judge1)
println(judge2)

・実行結果

false
true

配列の連結

配列の連結はjoin関数を用いることで実行できます。

s = join(["Julia", "Lang"], "-")
println(s)

・実行結果

Julia-Lang

文字列の検索

文字列の検索はfindfirst関数などを抑えておくと良いです。

idx = findfirst("Julia", "JuliaLang")
println(idx)

・実行結果

1:5

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

Ch.19 「行列のランク」の演習問題の解答例 〜統計学のための数学入門30講(朝倉書店)〜

当記事は「統計学のための数学入門$30$講(朝倉書店)」の読解サポートにあたってChapter.$19$の「行列のランク」の章末問題の解答の作成を行いました。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は購入の上ご確認ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・書籍解答まとめ
https://www.hello-statisticians.com/answer_textbook_math#math_stat

本章のまとめ

演習問題解答

問題$19.1$

・$[1]$
$$
\large
\begin{align}
A = \left(\begin{array}{ccc} 1 & -1 & 2 \\ 2 & -2 & 4 \end{array} \right)
\end{align}
$$

上記に対し、$A^{\mathrm{T}}$を下記のように定める。
$$
\large
\begin{align}
A^{\mathrm{T}} = \left(\begin{array}{cc} 1 & 2 \\ -1 & -2 \\ 2 & 4 \end{array} \right) = \left(\begin{array}{cc} \mathbf{a}_{1} & \mathbf{a}_{2} \end{array} \right)
\end{align}
$$

上記では$\mathbf{a}_{2} = 2 \mathbf{a}_{1}$が成立するので、$\mathrm{rank}(A^{\mathrm{T}})=1$であり、$M(A^{\mathrm{T}})$は下記のように表せる。
$$
\large
\begin{align}
M(A^{\mathrm{T}}) = \left\{ y : y=c_1 \mathbf{a}_{1} = c_1 \left(\begin{array}{c} 1 \\ -1 \\ 2 \end{array} \right) = \left(\begin{array}{c} c_1 \\ -c_1 \\ 2c_1 \end{array} \right) \right\}
\end{align}
$$

また、$\dim{M(A^{\mathrm{T}})}=1$であり、$M(A^{\mathrm{T}})$は$\mathbb{R}^{3}$で原点を通る$\displaystyle \left(\begin{array}{c} 1 \\ -1 \\ 2 \end{array} \right)$に平行な直線である。

・$[2]$
$$
\large
\begin{align}
A = \left(\begin{array}{ccc} 1 & 1 & 3 \\ 2 & -1 & 3 \end{array} \right)
\end{align}
$$

上記に対し、$A^{\mathrm{T}}$を下記のように定める。
$$
\large
\begin{align}
A^{\mathrm{T}} = \left(\begin{array}{cc} 1 & 2 \\ 1 & -1 \\ 3 & 3 \end{array} \right) = \left(\begin{array}{cc} \mathbf{a}_{1} & \mathbf{a}_{2} \end{array} \right)
\end{align}
$$

上記では$\mathbf{a}_{2} \neq c \mathbf{a}_{1}$であるので、$\mathrm{rank}(A^{\mathrm{T}})=2$であり、$M(A^{\mathrm{T}})$は下記のように表せる。
$$
\large
\begin{align}
M(A^{\mathrm{T}}) = \left\{ y : y=c_1 \mathbf{a}_{1} + c_2 \mathbf{a}_{2} = c_1 \left(\begin{array}{c} 1 \\ 1 \\ 3 \end{array} \right) + c_2 \left(\begin{array}{c} 2 \\ -1 \\ 3 \end{array} \right) = \left(\begin{array}{c} c_1+2c_2 \\ c_1-c_2 \\ 3c_1+3c_2 \end{array} \right) \right\}
\end{align}
$$

また、$\dim{M(A^{\mathrm{T}})}=2$であり、$M(A^{\mathrm{T}})$は$\mathbb{R}^{3}$で原点を通る$\displaystyle \left(\begin{array}{c} 1 \\ 1 \\ 3 \end{array} \right)$と$\displaystyle \left(\begin{array}{c} 2 \\ -1 \\ 3 \end{array} \right)$が張る平面である。

問題$19.2$

【Julia入門】Juliaの基本事項⑥ 文字列・Unicode文字列

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaにおける文字列の取り扱いについて取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

文字列

文字列の基本的な取り扱い

Juliaで文字列を取り扱うにあたっては下記のように""を用います。

s = "Hello Julia"
println(s)
println(typeof(s))

・実行結果

Hello Julia
String

上記のtypeof関数の出力により、文字列を取り扱う際の型はString型であることが確認できます。文字列の取り扱いにあたっては下記のようにインデックスを指定することで文字を取り出すこともできます。

s = "Hello Julia"
println(s[1])
println(typeof(s[1]))

・実行結果

H
Char

上記の出力結果より、文字を取り扱う際の型がChar型であることも確認できます。また、インデックスには数字だけでなく最後の文字を表すendや、1文字目〜5文字目までを表す1:5のような表現も用いることができます。

s = "Hello Julia"
println(s[end])
println(s[1:5])

・実行結果

a
Hello

文字列の連結

Juliaでは下記のようにstringを用いることで文字列の連結を行うことができます。

s1 = "Hello"
s2 = "Julia"
s = string(s1, " ", s2)

println(s1)
println(s2)
println(s)

・実行結果

Hello
Julia
Hello Julia

文字列の連結にあたってはstringと同様に*演算子を用いることもできます。

s1 = "Hello"
s2 = "Julia"
s = s1 * " " * s2)

println(s1)
println(s2)
println(s)

・実行結果

Hello
Julia
Hello Julia

文字列の補間

print文やprintln文の中で変数に格納された値を用いることを文字列の補間(string interpolation)と言います。たとえば下記を実行することで前項と同様なHello Juliaの出力を得ることができます。

s1 = "Hello"
s2 = "Julia"
println("$s1 $s2")

・実行結果

Hello Julia

Unicode文字列

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

【Julia入門】Juliaの基本事項⑤ Juliaにおける複素数の取り扱い

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaにおける複素数の取り扱いについて取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

複素数の基本的な取り扱い

虚数単位の表現

Juliaにおける虚数単位の表現にあたってはimを用います。imは下記のように用いることができます。

z = 1 + 2im
println(z)

・実行結果

1 + 2im

複素数の基本演算

複素数の基本的な演算は下記のように行うことができます。

z1 = 1 + 2im
z2 = 2 - 3im

println(z1+z2)
println(z1-z2)
println(z1*z2)

・実行結果

3 - 1im
-1 + 5im
8 + 1im

複素数の乗算に関しては合わせてド・モアブルの定理なども抑えておくと良いと思います。

実部・虚部の取得

Juliaでの複素数の取り扱いにあたっては下記のようにrealimagを用いることで複素数の実部と虚部の取得を行うことができます。

z = 1 + 2im
println(real(z))
println(imag(z))

・実行結果

1
2

複素共役と絶対値の取り扱い

複素共役の取得

複素共役は下記のようにconjを用いることで取得できます。

z = 1 + 2im
println(conj(z))

・実行結果

1 - 2im

絶対値の取得

複素数の絶対値はabsを用いることで下記のように取得できます。

z = 1 + 2im
println(abs(z))

・実行結果

2.23606797749979

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

統計学を学ぶにあたって最低限抑えておきたい数学 〜確率・期待値〜

当記事では「統計学を学ぶにあたって最低限抑えておきたい数学」の中から「確率・期待値」に関して取り扱います。確率・期待値は統計学を学ぶにあたっての主要トピックである確率分布を取り扱うにあたって必須の内容なので、一通り理解しておくと良いと思います。
取りまとめにあたっては数学の解説に関してはなるべくシンプルに取り扱いますが、統計学への応用に関連した複雑な内容に関しては目次に「*」をつけました。「*」がついているものはやや難しいので、読み飛ばしても問題ありません。

・基本数学まとめ
https://www.hello-statisticians.com/math_basic

確率

確率の定義

全事象$U$の事象の起こる確率がどれも「同様に確からしい」場合、全事象$U$の場合の数を$n(U)$、事象$A$の場合の数を$n(A)$とおく。このとき事象$A$が起こる確率$P(A)$は下記のように定義できる。
$$
\large
\begin{align}
P(A) = \frac{n(A)}{n(U)}
\end{align}
$$

和の法則

条件付き確率

期待値

「確率」の統計学への応用

確率分布

Ch.7 「関数の展開」の演習問題の解答例 〜統計学のための数学入門30講〜

当記事は「統計学のための数学入門$30$講(朝倉書店)」の読解サポートにあたってChapter.$7$の「関数の展開」の章末問題の解答の作成を行いました。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は購入の上ご確認ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・書籍解答まとめ
https://www.hello-statisticians.com/answer_textbook_math#math_stat

本章のまとめ

演習問題解答

問題$7.1$

$\displaystyle f(x) = \frac{1}{x+a} = (x+a)^{-1}$の導関数は下記のように計算できる。
$$
\large
\begin{align}
f'(x) &= -(x+a)^{-2} \\
f^{”}(x) &= 2!(x+a)^{-3} \\
f^{(3)}(x) &= -3!(x+a)^{-4} \\
f^{(4)}(x) &= 4!(x+a)^{-5} \\
f^{(5)}(x) &= -5!(x+a)^{-6} \\
& \vdots
\end{align}
$$

よって$\displaystyle f(x) = \frac{1}{x+a} = (x+a)^{-1}$のテイラー展開は下記のように得られる。
$$
\large
\begin{align}
f(x) &= f(0) + \frac{f'(0)}{1!}x + \frac{f^{”}(0)}{2!}x^2 + \frac{f^{(3)}(0)}{3!}x^3 \cdots \\
&= a^{-1} + \frac{-a^{-2}}{1!}x + \frac{2!a^{-3}}{2!}x^2 + \frac{-3!a^{-4}}{3!}x^3 \cdots \\
&= \frac{1}{a} – \frac{1}{a^2}x + \frac{1}{a^3}x^2 – \frac{1}{a^4}x^3 \cdots , \quad |x|<|a|
\end{align}
$$

問題$7.2$

下記のような結果が得られる。

$x$ 真値第$2$項まで第$3$項まで第$4$項まで
$0.5$ $0.66666667$$0.5$$0.75$$0.625$
$0.3$ $0.76923077$$0.7$$0.79$$0.763$
$0.1$ $0.9090909$$0.9$$0.91$$0.909$
$0.05$ $0.95238095$$0.95$$0.9525$$0.952375$
$0.01$ $0.9900990$$0.99$$0.9901$$0.990099$
$0$ $1$$1$$1$$1$

詳しい計算やグラフの描画は下記を実行することで行うことができる。

import numpy as np
import matplotlib.pyplot as plt

x = np.array([0.5, 0.3, 0.1, 0.05, 0.01, 0.])
a = 1.
f_x = np.zeros([6,4])

f_x[:,0] = 1/(x+a)

f_x[:,1] = 1/a - x/a**2
f_x[:,2] = 1/a - x/a**2 + x**2/a**3
f_x[:,3] = 1/a - x/a**2 + x**2/a**3 - x**3/a**4

print(f_x)

label_line = ["origin", "2nd_order", "3rd_order", "4th_order"]

for i in range(f_x.shape[1]):
    plt.plot(x, f_x[:,i], label=label_line[i])

plt.legend()
plt.show()

・実行結果

[[ 0.66666667  0.5         0.75        0.625     ]
 [ 0.76923077  0.7         0.79        0.763     ]
 [ 0.90909091  0.9         0.91        0.909     ]
 [ 0.95238095  0.95        0.9525      0.952375  ]
 [ 0.99009901  0.99        0.9901      0.990099  ]]

【Julia入門】Juliaの基本事項④ 基本的な演算子・更新演算子

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaの基本的な演算子と更新演算子について取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

基本的な演算子

基本的な演算子まとめ

四則演算のような基本的な計算は下記のような演算子を用いることで実行できます。

演算子 概要
x + y 加算
x - y 減算
x * y 乗算
x / y 除算
x^y べき乗
x % y 除算の余り

等号・不等号が成立するかの確認や論理演算は下記のような演算子を用いることで実行できます。

演算子 概要
x == y 等価演算子
x != y 不等価演算子
x > y 大なり演算子
x >= y 大なりイコール演算子
x & y and
x | y or
!x 否定

基本的な演算子の使用例

四則演算に関する演算子は下記のように計算を行うことができます。

x = 5
y = 2

println(x+y)
println(x-y)
println(x*y)
println(x/y)
println(x^y)
println(x%y)

・実行結果

7
3
10
2.5
25
1

等号・不等号に関する演算子は下記のように使用することができます。

x = 5
y = 2

println(x == y)
println(x != y)
println(x > y)
println(x >= y)
println(!(x > y))

・実行結果

false
true
true
true
false

更新演算子

更新演算子まとめ

Juliaには下記のような更新演算子があります。

演算子 概要
+= 加算
-=減算
*= 乗算
/= 除算
^= べき乗
%= 除算の余り

更新演算子を用いたx += 1x = x+1と同様の処理を行います。

更新演算子の使用例

更新演算子を用いることで下記のような計算を行うことができます。

x = 1
println(x)

x += 1
println(x)

・実行結果

1
2

更新演算子はfor文やwhile文などのループ処理などで用いられることが多いことも合わせて抑えておくと良いと思います。

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

【Julia入門】Juliaの基本事項③ Juliaの定数の定義と予め定義された定数

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaの定数について取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

定数の定義

Juliaにおける定数の定義は下記のようにconstを用いることで行うことができます。

const c1 = 1.0
println(c1)

・実行結果

1.0

変数では一度定めた値を変更できますが、定数の場合は基本的には更新できないことに注意が必要です。

const c2 = 1.0
c2 = 2.0

・実行結果

WARNING: redefinition of constant c2. This may fail, cause incorrect answers, or produce other errors.

予め定義された定数

円周率を表すpiは予め定義されているので、三角関数などの計算の際は用いると良いです。

println(pi/3)
println(cos(pi/3))

・実行結果

1.0471975511965976
0.5000000000000001

また、VERSIONにはJuliaのバージョンが格納されていることも抑えておくと良いと思います。

println(VERSION)

・実行結果

1.8.0

バージョンに関してはインストールされたJuliaのバージョンが出力されるので、インストールのタイミングによって結果が異なることにご注意ください。

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/