ブログ

単射・全射・全単射と逆写像(inverse mapping)の性質

線形写像(linear mapping)を取り扱う際に、全単射と逆写像(inverse mapping)は重要なトピックです。当記事では全単射を構成する単射・全射や逆写像に関して、概要の取りまとめや演習を通した具体例の確認を行いました。
作成にあたっては「チャート式シリーズ 大学教養 線形代数」の第$6.1$節「線形写像」を主に参考にしました。

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

線形写像の概要

単射

任意の$x \in X, \, x’ \in X$に対し『$x \neq x’ \implies f(x) \neq f(x’)$』が成立するとき、写像$f: X \longrightarrow Y$は単射である。単射は『$1$対$1$の写像である』と解釈すれば良い。

全射

任意の$y \in Y$に対し、$y=f(x)$となる$x \in X$が少なくとも$1$つ存在するとき、写像$f: X \longrightarrow Y$は全射である。全射は「$Y$のいかなる要素も$X$のなんらかの要素の像であること」や「写像$f$の値域と終域が一致する」のように言い換えることもできる。

全単射と逆写像

写像$f: X \longrightarrow Y$が単射かつ全射であるとき、写像$f$は全単射である。『写像$f$が全単射である $\iff$ 写像$f$が逆写像を持つ』が成立する。関数$y=f(x)=x+1$のような逆関数を持つ関数を元に直感的に理解しておくとよく、写像$f$が全単射であるときは$X$の要素$x \in X$と$Y$の要素$y \in Y$がそれぞれ$1$対$1$対応する。

また、写像$f: X \longrightarrow Y$と$g: Y \longrightarrow X$について下記が成立するとき写像$g$は写像$f$の逆写像$f^{-1}$である。
$$
\large
\begin{align}
g \circ f &= \mathrm{id}_{X} \\
f \circ g &= \mathrm{id}_{Y}
\end{align}
$$

具体例の確認

以下、「チャート式シリーズ 大学教養 線形代数」の例題の確認を行う。

基本例題$104$

基本例題$105$

基本例題$106$

写像$g: Y \longrightarrow X$が写像$f: X \longrightarrow Y$の逆写像であるとき、下記が成立する。
$$
\large
\begin{align}
g \circ f &= \mathrm{id}_{X} \\
f \circ g &= \mathrm{id}_{Y}
\end{align}
$$

上記より写像$f: X \longrightarrow Y$は写像$g: Y \longrightarrow X$の逆写像である。

線形写像(linear mapping)であるかの判定と行列写像の取得

線形写像(linear mapping)は関数を一般化した概念であり、線形代数の主要なトピックの一つです。当記事では線形写像の定義・判定や行列写像の取得について、概要の取りまとめや演習を通した具体例の確認を行いました。
作成にあたっては「チャート式シリーズ 大学教養 線形代数」の第$6.1$節「線形写像」を主に参考にしました。

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

線形写像の概要

線形写像の定義

$K$上のベクトル空間$V, W$における写像$f: V \to W$に関して下記が成立するとき、写像$f$は$K$上の線形写像である。
$[1] \,$ 任意の$\mathbf{v}_1 \in V, \, \mathbf{v}_2 \in V$に対して$f(\mathbf{v}_1 + \mathbf{v}_2) = f(\mathbf{v}_1) + f(\mathbf{v}_2)$
$[2] \,$ 任意の$\mathbf{v} \in V, \, a \in K$に対して$f(a \mathbf{v}) = a f(\mathbf{v})$

上記の$K$は基本的には実数体$\mathbb{R}$もしくは複素数体$\mathbb{C}$に対応し、$[2]$では任意のスカラー$a$を表すにあたって用いた。

線形写像であるかの判定

線形写像であるかの判定にあたっては前項「線形写像の定義」の$[1]$と$[2]$が成立するかを確認すれば良い。

行列写像

$n$次元数ベクトル空間$K^{n}$から$m$次元数ベクトル空間$K^{m}$への写像$f_{A}:K^{n} \to K^{m}$を$f_{A}(\mathbf{v})=A\mathbf{v}, \, \mathbf{v} \in K^{n}$で定義できるとき、$f_{A}$は「行列写像」である。

具体例の確認

以下、「チャート式シリーズ 大学教養 線形代数」の例題の確認を行う。

基本例題$107$

$[1]$
$$
\large
\begin{align}
f(x) = -3x
\end{align}
$$

$x_1 \in \mathbb{R}, x_2 \in \mathbb{R}$に対し、下記が成立する。
$$
\large
\begin{align}
f(x_1 + x_2) &= -3(x_1 + x_2) \\
&= -3x_1 – 3x_2 \\
&= f(x_1) + f(x_2)
\end{align}
$$

また、$x \in \mathbb{R}, a \in \mathbb{R}$に対し、下記が成立する。
$$
\large
\begin{align}
f(ax) &= -3ax \\
&= a \cdot -3x \\
&= a f(x)
\end{align}
$$

上記より写像$f$は線形写像である。

$[2]$
$$
\large
\begin{align}
f(x) = x+1
\end{align}
$$

$x_1=1, x_2=1$のとき、下記が成立する。
$$
\large
\begin{align}
f(x_1+x_2) &= f(1+1) = (1+1) + 1 = 3 \\
f(x_1) + f(x_2) &= f(1) + f(1) = 1+1 + 1+1 = 4
\end{align}
$$

上記より$x_1=1, x_2=1$のとき$f(x_1+x_2) \neq f(x_1)+f(x_2)$であるので、写像$f$は線形写像ではない。

$[3]$
$$
\large
\begin{align}
f(x) = x^2
\end{align}
$$

$x_1=1, x_2=1$のとき、下記が成立する。
$$
\large
\begin{align}
f(x_1+x_2) &= f(1+1) = (1+1)^2 = 4 \\
f(x_1) + f(x_2) &= f(1) + f(1) = 1^2 + 1^2 = 2
\end{align}
$$

上記より$x_1=1, x_2=1$のとき$f(x_1+x_2) \neq f(x_1)+f(x_2)$であるので、写像$f$は線形写像ではない。

$[4]$
$$
\large
\begin{align}
f(x) = 2^{x}
\end{align}
$$

$x_1=0, x_2=0$のとき、下記が成立する。
$$
\large
\begin{align}
f(x_1+x_2) &= f(0+0) = 2^{0} = 1 \\
f(x_1) + f(x_2) &= f(1) + f(1) = 2^0 + 2^0 = 2
\end{align}
$$

上記より$x_1=0, x_2=0$のとき$f(x_1+x_2) \neq f(x_1)+f(x_2)$であるので、写像$f$は線形写像ではない。

・参考
この問題における写像は$f:\mathbb{R} \to \mathbb{R}$のように表せる。

基本例題$108$

$[1]$
$$
\large
\begin{align}
f \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right) = \left[ \begin{array}{c} x+2y \\ y \end{array} \right]
\end{align}
$$

$\displaystyle \mathbf{v}_1 = \left[ \begin{array}{c} x_1 \\ y_1 \end{array} \right] \in \mathbb{R}^{2}, x_2 = \left[ \begin{array}{c} x_2 \\ y_2 \end{array} \right] \in \mathbb{R}^{2}$に対し、下記が成立する。
$$
\large
\begin{align}
f(\mathbf{v}_1 + \mathbf{v}_2) &= f \left( \left[ \begin{array}{c} x_1+x_2 \\ y_1+y_2 \end{array} \right] \right) \\
&= \left[ \begin{array}{c} (x_1+x_2)+2(y_1+y_2) \\ y_1+y_2 \end{array} \right] \\
&= \left[ \begin{array}{c} x_1+2y_1 \\ y_1 \end{array} \right] + \left[ \begin{array}{c} x_2+2y_2 \\ y_2 \end{array} \right] = f(\mathbf{v}_1) + f(\mathbf{v}_2)
\end{align}
$$

また、$\mathbf{v} = \left[ \begin{array}{c} x \\ y \end{array} \right] \in \mathbb{R}^{2}, a \in \mathbb{R}$に対し、下記が成立する。
$$
\large
\begin{align}
f(a \mathbf{v}) &= f \left( \left[ \begin{array}{c} a x \\ a y \end{array} \right] \right) \\
&= \left[ \begin{array}{c} ax+2ay \\ ay \end{array} \right] \\
&= a \left[ \begin{array}{c} x+2y \\ y \end{array} \right] = a f(\mathbf{v})
\end{align}
$$

上記より写像$f:\mathbb{R}^{2} \to \mathbb{R}^{2}$は線形写像である。

$[2]$
$$
\large
\begin{align}
f \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right) = \left[ \begin{array}{c} 2x+1 \\ 2x \end{array} \right]
\end{align}
$$

$x_1=1, x_2=1$のとき、下記が成立する。
$$
\large
\begin{align}
f \left( \left[ \begin{array}{c} x_1 \\ y_1 \end{array} \right] + \left[ \begin{array}{c} x_2 \\ y_2 \end{array} \right] \right) &= f \left( \left[ \begin{array}{c} 1+1 \\ y_1+y_2 \end{array} \right] \right) = \left[ \begin{array}{c} 2 \cdot 2 + 1 \\ 2 \cdot 2 \end{array} \right] = \left[ \begin{array}{c} 5 \\ 4 \end{array} \right] \\
f \left( \left[ \begin{array}{c} x_1 \\ y_1 \end{array} \right] \right) + f \left( \left[ \begin{array}{c} x_2 \\ y_2 \end{array} \right] \right) &= f \left( \left[ \begin{array}{c} 1 \\ y_1 \end{array} \right] \right) + f \left( \left[ \begin{array}{c} 1 \\ y_2 \end{array} \right] \right) = \left[ \begin{array}{c} 2 \cdot 1 + 1 \\ 2 \cdot 1 \end{array} \right] + \left[ \begin{array}{c} 2 \cdot 1 + 1 \\ 2 \cdot 1 \end{array} \right] = \left[ \begin{array}{c} 6 \\ 4 \end{array} \right]
\end{align}
$$

上記より$x_1=1, x_2=1$のとき$\displaystyle f \left( \left[ \begin{array}{c} x_1 \\ y_1 \end{array} \right] + \left[ \begin{array}{c} x_2 \\ y_2 \end{array} \right] \right) \neq f \left( \left[ \begin{array}{c} x_1 \\ y_1 \end{array} \right] \right) + f \left( \left[ \begin{array}{c} x_2 \\ y_2 \end{array} \right] \right)$であるので、写像$f:\mathbb{R}^{2} \to \mathbb{R}^{2}$は線形写像ではない。

$[3]$
$$
\large
\begin{align}
f \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right) = \left[ \begin{array}{c} 1 \\ x \end{array} \right]
\end{align}
$$

$x=1$のとき、$a \in \mathbb{R}$について下記が成立する。
$$
\large
\begin{align}
f \left( a \left[ \begin{array}{c} x \\ y \end{array} \right] \right) &= f \left( \left[ \begin{array}{c} ax \\ ay \end{array} \right] \right) = \left[ \begin{array}{c} 1 \\ ax \end{array} \right] \\
af \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right) &= a \left[ \begin{array}{c} 1 \\ x \end{array} \right] = \left[ \begin{array}{c} a \\ ax \end{array} \right]
\end{align}
$$

上記より$x=1$のとき$\displaystyle f \left( a \left[ \begin{array}{c} x \\ y \end{array} \right] \right) \neq a f \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right)$であるので、写像$f:\mathbb{R}^{2} \to \mathbb{R}^{2}$は線形写像ではない。

$[4]$
$$
\large
\begin{align}
f \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right) = \left[ \begin{array}{c} 0 \\ y \end{array} \right]
\end{align}
$$

$\displaystyle \mathbf{v}_1 = \left[ \begin{array}{c} x_1 \\ y_1 \end{array} \right] \in \mathbb{R}^{2}, x_2 = \left[ \begin{array}{c} x_2 \\ y_2 \end{array} \right] \in \mathbb{R}^{2}$に対し、下記が成立する。
$$
\large
\begin{align}
f(\mathbf{v}_1 + \mathbf{v}_2) &= f \left( \left[ \begin{array}{c} x_1+x_2 \\ y_1+y_2 \end{array} \right] \right) \\
&= \left[ \begin{array}{c} 0 \\ y_1+y_2 \end{array} \right] \\
&= \left[ \begin{array}{c} 0 \\ y_1 \end{array} \right] + \left[ \begin{array}{c} 0 \\ y_2 \end{array} \right] = f(\mathbf{v}_1) + f(\mathbf{v}_2)
\end{align}
$$

また、$\mathbf{v} = \left[ \begin{array}{c} x \\ y \end{array} \right] \in \mathbb{R}^{2}, a \in \mathbb{R}$に対し、下記が成立する。
$$
\large
\begin{align}
f(a \mathbf{v}) &= f \left( \left[ \begin{array}{c} a x \\ a y \end{array} \right] \right) \\
&= \left[ \begin{array}{c} 0 \\ ay \end{array} \right] \\
&= a \left[ \begin{array}{c} 0 \\ y \end{array} \right] = a f(\mathbf{v})
\end{align}
$$

上記より写像$f:\mathbb{R}^{2} \to \mathbb{R}^{2}$は線形写像である。

基本例題$111$

前項で取り扱った基本例題$108$の解答より、線形写像は$[1], [4]$であるので、以下では$[1]$と$[4]$の行列写像に対応する$2$次正方行列$A$を表す。

$[1]$
$$
\large
\begin{align}
f \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right) = \left[ \begin{array}{c} x+2y \\ y \end{array} \right]
\end{align}
$$

写像$f$は下記のように表せる。
$$
\large
\begin{align}
f \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right) &= \left[ \begin{array}{c} x+2y \\ y \end{array} \right] \\
&= \left[ \begin{array}{c} 1 & 2 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{c} x \\ y \end{array} \right]
\end{align}
$$

よって行列写像に対応する$2$次正方行列$A$は下記のように表せる。
$$
\large
\begin{align}
A = \left[ \begin{array}{c} 1 & 2 \\ 0 & 1 \end{array} \right]
\end{align}
$$

$[4]$
$$
\large
\begin{align}
f \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right) = \left[ \begin{array}{c} 0 \\ y \end{array} \right]
\end{align}
$$

写像$f$は下記のように表せる。
$$
\large
\begin{align}
f \left( \left[ \begin{array}{c} x \\ y \end{array} \right] \right) &= \left[ \begin{array}{c} 0 \\ y \end{array} \right] \\
&= \left[ \begin{array}{c} 0 & 0 \\ 0 & 1 \end{array} \right] \left[ \begin{array}{c} x \\ y \end{array} \right]
\end{align}
$$

よって行列写像に対応する$2$次正方行列$A$は下記のように表せる。
$$
\large
\begin{align}
A = \left[ \begin{array}{c} 0 & 0 \\ 0 & 1 \end{array} \right]
\end{align}
$$

【Julia入門】Juliaのコレクション⑤ 共通の関数とイテレーション

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

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

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

共通の関数

関数の一覧

関数 概要
isempty 要素があるかないかの判定
empty! 要素を取り除く
length 要素の数を出力
eltype 要素の型を出力

実行例

isempty関数は下記のように用いることができます。

x = []
println(x)
println(isempty(x))

println("===")

push!(x, 1)
println(x)
println(isempty(x))

・実行結果

Any[]
true
===
Any[1]
false

上記では空のリストに要素を追加するとisemptyの結果がfalseになることが確認できます。ここでempty!関数を実行するとisemptytrueになることも合わせて確認しておくと良いです。

x = [1, 2, 3]
println(x)
println(isempty(x))

println("===")

empty!(x)
println(x)
println(isempty(x))

・実行結果

[1, 2, 3]
false
===
Int64[]
true

また、length関数やeltype関数はそれぞれ下記のように実行することができます。

x = [1, 2]
println(x)
println(length(x))

println("===")

push!(x, 3)
println(x)
println(length(x))

println(eltype(x))

・実行結果

[1, 2]
2
===
[1, 2, 3]
3
Int64

イテレーション

for文にリストを用いることで下記のようにイテレーション(繰り返し処理)を行うことができます。

x = [1, 3, 5, 7, 9]

for i in x
    println(i)
end

・実行結果

1
3
5
7
9

同様に下記のように辞書を用いて繰り返し処理を実行することができます。

d = Dict("x" => 1, "y" => 2, "z" => 3)

for (key, value) in d
    println("key: $key, value: $value")
end

・実行結果

key: x, value: 1
key: z, value: 3
key: y, value: 2

参考

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

【Julia入門】Juliaのコレクション④ 集合型オブジェクト

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

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

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

集合型オブジェクト

辞書型オブジェクトの概要

集合は『キー(key)』のみを保持する辞書です。重複する要素を格納することができないので、ユニークな要素の取り扱いの際によく用いられます。

辞書の初期化・値の追加

集合の初期化は下記のようにSetを用いることで行うことができます。

s = Set([1, 2])
println(s)
println(typeof(s))

・実行結果

Set([2, 1])
Set{Int64}

集合への値の追加はpush!関数を用いて下記のように行うことが可能です。

s = Set([1, 2])

push!(s, 3)
println(s)

push!(s, 3)
println(s)

・実行結果

Set([2, 3, 1])
Set([2, 3, 1])

push!(s, 3)の実行は二度行いましたが、集合に格納される値はユニークであることから二度目の操作によって集合の要素が変化しないことを確認しておくと良いです。

和集合・積集合

集合の和集合はunion、積集合はintersectを用いて下記のように得ることができます。

s1 = Set([1, 2, 3, 4, 5])
s2 = Set([1, 3, 5, 7, 9])

println(s1)
println(s2)
println("===")
println(union(s1, s2))
println(intersect(s1, s2))

・実行結果

Set([5, 4, 2, 3, 1])
Set([5, 7, 9, 3, 1])
===
Set([5, 4, 7, 2, 9, 3, 1])
Set([5, 3, 1])

参考

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

JSダイバージェンス(Jensen-Shannon divergence)の定義と対称性

KLダイバージェンス(Kullback-Leibler divergence)は確率分布の類似度を取り扱う指標である一方で、KLダイバージェンスには対称性が成立しません。そこで当記事ではKLダイバージェンスと類似の指標かつ対称性の成立するJSダイバージェンス(Jensen-Shannon divergence)について取りまとめました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

JSダイバージェンスの定義

KLダイバージェンスの式の確認

$2$つの確率分布$P(X=x)$と$Q(X=x)$について$P$から見た$Q$のKLダイバージェンスを$KL(P||Q)$とおくと、$KL(P||Q)$の式は下記のように表される。
$$
\large
\begin{align}
KL(P||Q) &= – \int P(X=x) \ln{Q(X=x)} dx – \left[ – \int P(X=x) \ln{P(X=x)} dx \right] \\
&= – \int P(X=x) \ln{\frac{Q(X=x)}{P(X=x)}} dx
\end{align}
$$

JSダイバージェンスの式定義

$2$つの確率分布$P(X=x)$と$Q(X=x)$についてJSダイバージェンスを$JS(P||Q)$とおくと、$JS(P||Q)$の式は下記のように表される。
$$
\large
\begin{align}
JS(P||Q) &= \frac{1}{2} (KL(P||R) + KL(Q||R)) \\
R(X=x) &= \frac{1}{2}(P(X=x) + Q(X=x))
\end{align}
$$

JSダイバージェンスの対称性

KLダイバージェンスでは$KL(P||Q) \neq KL(Q||P)$であり、対称性は成立しないが、JSダイバージェンスでは下記のように対称性が成立する。
$$
\large
\begin{align}
JS(P||Q) &= \frac{1}{2} (KL(P||R) + KL(Q||R)) \\
&= \frac{1}{2} (KL(P||(P+Q)/2) + KL(Q||(P+Q)/2)) \\
&= \frac{1}{2} (KL(Q||(P+Q)/2) + KL(P||(P+Q)/2)) \\
&= \frac{1}{2} (KL(Q||R) + KL(P||R)) \\
&= JS(Q||P)
\end{align}
$$

参考

【Julia入門】Juliaのコレクション③ 辞書型オブジェクト

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

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

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

辞書型オブジェクト

辞書型オブジェクトの概要

辞書(dictionary)は『キー(key)』と『値(value)』の二つをセットで格納する形式です。辞書の基本的な使い方は『キーを検索し値を取得を行う』と抑えておくと良いです。

辞書の初期化・値の追加・値の取得

辞書の初期化は下記のようにDict{String, Int}()を用いることで行うことができます。

d = Dict{String, Int}()
println(d)
println(typeof(d))

・実行結果

Dict{String, Int64}()
Dict{String, Int64}

辞書への値の追加と値の取得は下記のように行うことが可能です。

d = Dict{String, Int}()

d["apple"] = 1
d["orange"] = 2
d["grape"] = 3

println(d)
println(d["apple"])

・実行結果

Dict("orange" => 2, "apple" => 1, "grape" => 3)
1

キーの検索・判定

辞書の活用にあたっては『キーが辞書に含まれる場合に値を返し、含まれない場合は別の処理を返す』ような処理がよく用いられます。この際に『キーが辞書に含まれるかの判定』はhaskey関数を用いることで行うことができます。

d = Dict{String, Int}()

d["Python"] = 1
d["R"] = 2
d["Julia"] = 3

println(haskey(d, "Julia"))
if haskey(d, "Julia")
    println("Found")
else
    println("Not Found")
end

・実行結果

true
Found

参考

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

【Julia入門】Juliaのコレクション② リスト型オブジェクト

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

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

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

リスト

リストの生成

リストは下記のように[]の中に数字を区切って要素を配置することで定義できます。

list = [1, 2]
println(list)

・実行結果

[1, 2]

また、下記のように要素がないリストを定義することも可能です。

list = []
println(list)

・実行結果

Any[]

リストの要素の追加と削除

リストにの末尾に要素を加えるときは下記のようにpush!、取り出す場合はpop!を用いれば良いです。

list1 = [1, 2]
println(list1)

push!(list1, 3)
println(list1)

pop!(list1)
println(list1)

・実行結果

[1, 2]
[1, 2, 3]
[1, 2]

push!pop!はどちらもリストの末尾への操作ですが、pushfirst!popfirst!を用いることで先頭への操作が可能です。

list1 = [1, 2]
println(list1)

pushfirst!(list1, 3)
println(list1)

popfirst!(list1)
println(list1)

・実行結果

[1, 2]
[3, 1, 2]
[1, 2]

また、i番目に要素を挿入する場合はinsert!i番目の要素を削除する場合はdeleteat!を実行すれば良いです。

list2 = [1, 2]
println(list2)

insert!(list2, 2, 5)
println(list2)

deleteat!(list2, 1)
println(list2)

・実行結果

[1, 2]
[1, 5, 2]
[5, 2]

参考

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

Ch.4 「極限」の演習問題の解答例 〜統計学のための数学入門30講(朝倉書店)〜

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

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

本章のまとめ

演習問題解答

問題$4.1$

・$[1]$
ロピタルの定理に基づいて下記のように導出を行える。
$$
\large
\begin{align}
\lim_{x \to 0+0} \frac{\log{(1+x)}}{x} &= \lim_{x \to 0+0} \frac{1/(1+x)}{1} \\
&= \frac{1}{1+0} = 1
\end{align}
$$

・$[2]$
ロピタルの定理に基づいて下記のように導出できる。
$$
\large
\begin{align}
\lim_{x \to 0+0} \frac{e^{x}-(1+x)}{x^2} &= \lim_{x \to 0+0} \frac{e^{x}-1}{2x} \\
&= \lim_{x \to 0+0} \frac{e^{x}}{2} \\
&= \frac{e^{0}}{2} = \frac{1}{2}
\end{align}
$$

問題$4.2$

【Julia入門】JuliaのLinearAlgebraライブラリ② 特殊な行列の作成・行列分解

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

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

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

特殊な行列の作成

Juliaでサポートされる特殊な行列

Juliaでは下記のように対称行列・対角行列のような特殊な行列の取り扱いが用意されており、行列の作成にあたって用いることが可能です。

概要
Symmetric 対称行列
Hermitian エルミート行列
UpperTriangular 上三角行列
LowerTriangular 下三角行列
Diagonal 対角行列

実行例

以下では対称行列を取り扱うSymmetricの実行例について確認を行いました。

using LinearAlgebra

A = [1 2 3; 4 5 6; 7 8 9]
println(A)
println("===")

Symmetric(A)

・実行結果

[1 2 3; 4 5 6; 7 8 9]
===

3×3 Symmetric{Int64, Matrix{Int64}}:
 1  2  3
 2  5  6
 3  6  9

上記では対角成分より上側にある成分を元に対称行列が作成されたことが確認できます。同様にSymmetric(A, :L)を実行することで下記のように対角成分から下側にある成分を元に対称行列を作成することもできます。

Symmetric(A, :L)

・実行結果

3×3 Symmetric{Int64, Matrix{Int64}}:
 1  4  7
 4  5  8
 7  8  9

対角行列の作成にあたっては下記のようにDiagonalを実行すれば良いです。

Diagonal(A)

・実行結果

3×3 Diagonal{Int64, Vector{Int64}}:
 1  ⋅  ⋅
 ⋅  5  ⋅
 ⋅  ⋅  9

行列分解

主要な行列分解の関数

主要な行列分解はそれぞれ下記を実行することで得ることができます。

関数 概要
cholesky Cholesky分解
lu LU分解
qr QR分解
hessenberg Hessenberg分解
eigen スペクトル分解
svd 特異値分解

行列分解の原理などについては下記などで取り扱いました。

実行例

QR分解は下記のようにqr関数を実行することで行うことができます。

using LinearAlgebra

A = [1 2 3; 4 1 6; 7 8 1]

・実行結果

3×3 Matrix{Int64}:
 1  2  3
 4  1  6
 7  8  1
res = qr(A)

res

・実行結果

LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q factor:
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}:
 -0.123091   0.323368  -0.938233
 -0.492366  -0.840757  -0.225176
 -0.86164    0.434237   0.262705
R factor:
3×3 Matrix{Float64}:
 -8.12404  -7.63167  -4.18511
  0.0       3.27987  -3.6402
  0.0       0.0      -3.90305

上記のQR分解は下記のようにQRの行列の積を確認することで結果が妥当であるかどうかの確認を行うことができます。

res.Q * res.R

・実行結果

3×3 Matrix{Float64}:
 1.0  2.0  3.0
 4.0  1.0  6.0
 7.0  8.0  1.0

参考

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

【SciPy 一問一答】統計学を学ぶにあたって知っておくと良いSciPyの用法

SciPyNumPyに基づくライブラリであり、統計学に関するプログラムでは乱数生成の際などによく用います。使用方法の詳細に関しては都度調べれば十分である一方で基本的な用法に関しては抑えておくと良いので、当記事ではSciPyの抑えておきたい用法について一問一答形式でまとめました。

・プログラム集まとめ
https://www.hello-statisticians.com/stat_program

基本事項の確認

NumPyによる行列の取り扱い

下記で詳しく取り扱った。

ライブラリの読み込み

解答$1$つ$1$つでライブラリの読み込みを行うと冗長であるので、以下を実行した上でそれぞれの解答のプログラムを実行する必要がある。

import numpy as np
from scipy import stats

乱数の固定

乱数は「漸化式」のような考え方に基づいて生成することから、初期値の値に基づいてその後の値が決まる。逆に考えると、初期値を固定することで再現性のある結果を得ることができる。乱数の固定は下記のように行うことができる。

np.random.rand(0)

上記ではseed0を用いたが、値を定めて結果が再現できれば12など、他の数字を用いても良い。統計学の検証の際に乱数を用いる際は結果が再現できる必要があるので、乱数の固定は必須である。

一問一答

乱数の生成

Q.1-1-1 標準正規分布$\mathcal{N}(0,1)$に基づく乱数の生成

標準正規分布$\mathcal{N}(0,1)$に従う乱数を$20$個生成し、変数xに格納せよ。また、xNumPyの形式で定められることを確認せよ。

・解答

np.random.seed(0)

x = stats.norm.rvs(size=20)
print(type(x))
print(x)

・実行結果

<type 'numpy.ndarray'>
[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799 -0.97727788
  0.95008842 -0.15135721 -0.10321885  0.4105985   0.14404357  1.45427351
  0.76103773  0.12167502  0.44386323  0.33367433  1.49407907 -0.20515826
  0.3130677  -0.85409574]

Q.1-1-2 標準正規分布$\mathcal{N}(\mu,\sigma^2)$に基づく乱数の生成

stats.norm.rvsを用いて$\mu=2, \sigma=3$の正規分布$\mathcal{N}(\mu,\sigma^2)$に従う乱数を$20$個生成し、変数xに格納せよ。

・解答

np.random.seed(0)

x = stats.norm.rvs(loc=2, scale=3, size=20)
print(x)

・実行結果

[ 7.29215704  3.20047163  4.93621395  8.7226796   7.60267397 -0.93183364
  4.85026525  1.54592838  1.69034344  3.23179551  2.43213071  6.36282052
  4.28311318  2.36502505  3.3315897   3.00102298  6.48223722  1.38452521
  2.9392031  -0.56228722]

Q.1-1-3 一様分布$\mathrm{Uniform}(0,1)$に基づく乱数の生成

stats.uniform.rvsを用いて一様分布$\mathrm{Uniform}(0,1)$に従う乱数を$20$個生成し、変数xに格納せよ。

・解答

np.random.seed(0)

x = stats.uniform.rvs(size=20)
print(x)

・実行結果

[ 0.5488135   0.71518937  0.60276338  0.54488318  0.4236548   0.64589411
  0.43758721  0.891773    0.96366276  0.38344152  0.79172504  0.52889492
  0.56804456  0.92559664  0.07103606  0.0871293   0.0202184   0.83261985
  0.77815675  0.87001215]

解説
np.random.rand(20)でも同様の結果が得られることも合わせて抑えておくと良いです。

np.random.seed(0)
x = np.random.rand(20)
print(x)

・実行結果

[ 0.5488135   0.71518937  0.60276338  0.54488318  0.4236548   0.64589411
  0.43758721  0.891773    0.96366276  0.38344152  0.79172504  0.52889492
  0.56804456  0.92559664  0.07103606  0.0871293   0.0202184   0.83261985
  0.77815675  0.87001215]