ブログ

【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]

【Julia入門】JuliaのLinearAlgebraライブラリ① ベクトル・行列の演算

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

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

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

ベクトルの演算

下記のようにLinearAlgebraライブラリを読み込むことで内積を計算するdot関数やクロス積を計算するcross関数を実行することができます。

using LinearAlgebra

println(dot([1, 2, 3], [1, 1, 1]))
println(cross([0, 1, 0], [0, 0, 1]))

・実行結果

6
[1, 0, 0]

LinearAlgebraライブラリではベクトルのノルムを計算するnorm関数やベクトルの正規化を行うnormalize関数などがあり、下記のように実行することができます。

using LinearAlgebra

v = [1, 2, 3]

println(norm(v, 1))
println(norm(v, 2))
println(norm(v, Inf))

println(normalize(v, 1))
println(normalize(v, 2))

・実行結果

6.0
3.7416573867739413
3.0
[0.16666666666666666, 0.3333333333333333, 0.5]
[0.2672612419124244, 0.5345224838248488, 0.8017837257372732]

行列の演算

LinearAlgebraライブラリには行列のトレースを計算するtr関数、行列式を計算するdet関数、逆行列を計算するinv関数が用意されており、それぞれ下記のように実行することができます。

using LinearAlgebra

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

println(tr(A))
println(det(A))
println(inv(A))

・実行結果

[1 2 3; 4 1 6; 7 8 1]
===
3
104.0
[-0.4519230769230769 0.2115384615384615 0.08653846153846155; 0.3653846153846154 -0.1923076923076923 0.057692307692307675; 0.24038461538461536 0.057692307692307696 -0.0673076923076923]

参考

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

【Julia入門】Juliaのモジュール② 新しいモジュールの定義

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

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

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

モジュールの定義

モジュールは下記のように定義することができます。

module Greeting1
hello(name) = println("Hello, $(name).")
end

Greeting1.hello("Julia")

・実行結果

Hello, Julia.

上記ではGreeting1モジュールにhello関数の定義を行いました。Greeting1.helloを実行することでhello関数を実行することができます。

モジュールの相対パス指定

前節ではモジュールの定義のみを行いましたが、Mainモジュールからの相対パスに基づいてモジュールを読み込むことができます。下記ではMainモジュールからの相対パス.Greeting2を用いることでGreeting2の読み込みを行いました。

module Greeting2
export hello
hello(name) = println("Hello, $(name).")
goodbye(name) = println("Goodbye, $(name).")
end

Greeting2.hello("Julia")
Greeting2.goodbye("Julia")

using .Greeting2
hello("Julia")
goodbye("Julia")

・実行結果

Hello, Julia.
Goodbye, Julia.
Hello, Julia.

UndefVarError: goodbye not defined

モジュールを読み込む際にモジュール定義の中でexportで指定した関数はモジュールを読み込むとそのまま使用することができます。上記の例ではexport helloがあるので、helloはそのまま実行できる一方でgoodbyeはそのまま実行できないことが確認できます。

参考

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

Ch.2 「確率分布と期待値」の章末問題の解答例 〜現代数理統計学の基礎(共立出版)〜

当記事は「現代数理統計学の基礎(共立出版)」の読解サポートにあたってChapter.$2$の「確率分布と期待値」の章末問題の解説について行います。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は購入の上ご確認ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・解答まとめ
https://www.hello-statisticians.com/answer_textbook_math_stat#basic

章末の演習問題について

問題2.1の解答例

$[1]$
$$
\large
\begin{align}
f(x) = Cx^3, \quad 0 < x < 2
\end{align}
$$

$f(x)$が確率密度関数であるとき、下記が成立する。
$$
\large
\begin{align}
\int_{0}^{2} f(x) dx = C \int_{0}^{2} x^3 dx &= 1 \\
\left[ \frac{C}{4}x^4 \right]_{0}^{2} &= 1 \\
\frac{C}{4} \cdot 2^{4} &= 1 \\
4 C &= 1 \\
C &= \frac{1}{4}
\end{align}
$$

また、累積分布関数$F(x)$は下記のように得られる。
$$
\large
\begin{align}
F(x) &= \int_{0}^{x} \frac{1}{4} u^3 du \\
&= \left[ \frac{1}{16}u^4 \right]_{0}^{x} \\
&= \frac{1}{16}x^4
\end{align}
$$

$[2]$
$$
\large
\begin{align}
f(x) = Ce^{-|x|}, \quad -\infty < x < \infty
\end{align}
$$

$f(x)$が確率密度関数であるとき、下記が成立する。
$$
\large
\begin{align}
\int_{-\infty}^{\infty} f(x) dx = C \int_{-\infty}^{\infty} e^{-|x|} dx &= 1 \\
2C \int_{0}^{\infty} e^{-x} dx &= 1 \\
2C \left[ -e^{-x} \right]_{0}^{\infty} &= 1 \\
2 C &= 1 \\
C &= \frac{1}{2}
\end{align}
$$

また、累積分布関数$F(x)$は下記のように得られる。
・$x \leq 0$のとき
$$
\large
\begin{align}
F(x) &= \int_{-\infty}^{x} \frac{1}{2} e^{u} du \\
&= \left[ \frac{1}{2}e^{u} \right]_{-\infty}^{x} \\
&= \frac{1}{2}e^{x}
\end{align}
$$

・$x > 0$のとき
$$
\large
\begin{align}
F(x) &= \int_{-\infty}^{0} \frac{1}{2} e^{u} du + \int_{0}^{x} \frac{1}{2} e^{-u} du \\
&= \frac{1}{2} + \left[ -\frac{1}{2}e^{-u} \right]_{0}^{x} \\
&= 1 – \frac{1}{2} e^{-x}
\end{align}
$$

問題2.2の解答例

問題2.3の解答例

問題2.4の解答例

問題2.5の解答例

問題2.6の解答例

問題2.7の解答例

問題2.8の解答例

問題2.9の解答例

問題2.10の解答例

問題2.11の解答例

問題2.12の解答例

問題2.13の解答例

問題2.14の解答例

問題2.15の解答例

問題2.16の解答例

問題2.17の解答例

まとめ

【Julia入門】Juliaのモジュール① モジュールの概要と読み込み

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

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

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

モジュールの概要

概要

モジュール(module)は何らかの機能を実現するソースコードを取りまとめたものです。当記事では以下、Juliaに標準で用意されたモジュールの活用などについて確認を行います。

Mainモジュール

Juliaを実行する際にデフォルトで使用されるのがMainモジュールです。Mainモジュールでは下記のgcdのように基本的な関数が含まれます。

println(@__MODULE__)

println(gcd(27,72))

・実行結果

Main
9

上記のgcd関数は2つの引数の最大公約数を計算する関数であり、上記では2772の最大公約数である9が出力されたことが確認できます。

using文と既存モジュールの利用

関数を指定した読み込み

using文は下記のように『using モジュール名: 関数名』を実行することでモジュールの読み込みを行います。

using Statistics: mean, std

x = [1, 2, 3, 4, 5]

println(mean(x))
println(std(x))
println(var(x))

・実行結果

3.0
1.5811388300841898

UndefVarError: var not defined

Statisticsモジュールには分散を計算するvar関数が実装されている一方で、上記ではvar関数の読み込みを行わなかったのでUndefVarErrorが出力されました。このように関数名を指定する場合は指定した関数名のみを読み込むことができます。

モジュール全体の読み込みと注意点

モジュール全体を読み込む場合は下記のように『using モジュール名』を実行すれば良いです。

using Statistics

x = [1, 2, 3, 4, 5]

println(mean(x))
println(std(x))
println(var(x))

・実行結果

3.0
1.5811388300841898
2.5

上記のようにusing文を用いてモジュールの読み込みを行う場合、意図しない関数を読みこむ場合が生じやすいです。たとえば上記のStatisticsモジュールのvarなどは他で名称を使用する可能性があり得ます。

このような意図しない関数名の読み込みを行わないようにするにあたっては、前項のusing Statistics: mean, stdように読み込む関数名を指定するか、下記のようにStatisticsモジュールを読み込むなどの方法があります。

using Statistics: Statistics

x = [1, 2, 3, 4, 5]

println(Statistics.mean(x))
println(Statistics.std(x))
println(Statistics.var(x))

・実行結果

3.0
1.5811388300841898
2.5

参考

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

『直感的に理解するTransformer』サポートページ【印刷版】

技術書典$14$で頒布を行った『直感的に理解するTransformer』の印刷版のサポートページです。主に誤植が見つかった場合の正誤表の作成やカラー画像の確認が行えるように作成を行いました。誤植につきましては見つかり次第都度追加いたしますので、お気づきの方は気軽にご指摘ください。

https://hello-stats.booth.pm/items/4781879

追加コンテンツ

Multi Head Attention

直感的に理解するTransformer」の$A.3$の「Multi Head Attention」の処理は正確には論文の内容と一致しないことにご注意ください。具体的には「単に分割」で表したところが「パラメータ行列を用いて線形写像での計算」に対応します。以下に論文の数式などをまとめました。

Transformer論文では下記のようにMulti Head Attentionが表されます。
$$
\large
\begin{align}
\mathrm{MultiHead} (Q,K,V) &= \mathrm{Concat}(\mathrm{head}_{1}, \cdots , \mathrm{head}_{h}) W^{O} \quad (1.1) \\
\mathrm{head}_{i} &= \mathrm{Attention}(QW_{i}^{Q}, KW_{i}^{K}, VW_{i}^{V}) \quad (1.2) \\
\mathrm{Attention}(Q, K, V) &= \mathrm{Softmax} \left( \frac{QK^{\mathrm{T}}}{\sqrt{d_{k}}} \right) \quad (1.3)
\end{align}
$$

Multi Head Attention処理の理解にあたって着目すべきは$(1.2)$式であり、$Q, K, V$にそれぞれ$W_{i}^{Q} \in \mathbb{R}^{d_{model} \times d_{k}}, W_{i}^{K} \in \mathbb{R}^{d_{model} \times d_{k}}, W_{i}^{V} \in \mathbb{R}^{d_{model} \times d_{v}}$をかけることでそれぞれの単語に対応する内部表現を$Q, K$については$d_k$次元、$V$については$d_v$次元にそれぞれ変換した上でDot Product Attention処理を行います。その後に$(1.1)$式で表されるように$h$個のヘッドを連結し、$W_{i}^{O} \in \mathbb{R}^{h d_v \times d_{model}}$を用いて再度パラメータ処理を行います。

Transformer論文ではヘッドの数を表す$h$を$h=8$、各単語の内部表現を$d_{model}=512$で表すのがデフォルトです。また、基本的には$h d_{k} = d_{model}, h d_{v} = d_{model}$であるので$d_{k}=d_{v}=64$がデフォルトになります。詳細の設定は論文のTable.$3$を参照すると良いです。

Transformer論文Table.$3$

上図の「base」がデフォルトのTransformerの構成、「big」がより大きなTransformerの構成にそれぞれ対応します。関連で総パラメータ数の概算についても下記で取り扱ったので合わせてご確認ください。

正誤表

初版第1刷

ページ・行数$\times$
P.57 l.19$P(\mathbf{X})=P(x_0,\cdots,x_7)$の確率が大変小さくなることで$P(\mathbf{X})=P(x_0,\cdots,x_7)$の確率が大変小さくなり
P.75 l.5単語のベクトルを分割してこれまでの処理を「並列で行う」と同義単語 のベクトルを分割してこれまでの処理を「並列で行う」ことに類似
P.83 l.4 教習ラベル教師ラベル

カラー画像の確認

第2章

図$2.1 \,$ 三角関数のグラフ
図$2.3 \,$ 行列の積とMLPの関係性

第3章

図$3.1 \,$ 東京メトロホームページより
図$3.4 \,$ $n=5, d=5$でノードに特徴量を割り当てた場合
図$3.8 \,$ A Comprehensive Survey on Graph Neural Networks. Fig.$2$b

第4章

図$4.1 \,$ Bag of Words
形態素解析の実行例

第5章

図$5.4 \,$ Transformer論文Fig.$1$を改変
図$5.5 \,$ TransformerとMPNN型GNNの各層における処理の概要

Appendix

図A.$7 \,$ 実行結果①
図A.$9 \,$ 実行結果③

Ch.1 「必要な数学知識」の例題・演習問題の解答例 〜言語処理のための機械学習入門〜

当記事は「言語処理のための機械学習入門(コロナ社)」の読解サポートにあたってChapter.$1$の「必要な数学知識」の章末問題の解説について行います。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は購入の上ご確認ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

例題解答

例題1.1の解答例

$$
\large
\begin{align}
\mathrm{Objective} : \quad & f(\mathbf{x}) = -x_1x_2 \, \rightarrow \, \mathrm{Maximize} \\
\mathrm{Constraint} : \quad & c_1(\mathbf{x}) = x_1-x_2-a = 0
\end{align}
$$

$x_1-x_2-a = 0$より$x_1=x_2+a$を$f(\mathbf{x}) = -x_1x_2$に代入すると下記が得られる。
$$
\large
\begin{align}
f(\mathbf{x}) &= -x_1x_2 \\
&= -x_2(x_2+a) \\
&= – \left( x_2 + \frac{1}{2}a \right)^{2} + \frac{1}{4}a^2
\end{align}
$$

よって$\displaystyle x_1 = \frac{1}{2}a, x_2=-\frac{1}{2}a$のとき$f(\mathbf{x})$は最大値を取る。

例題1.2の解答例

例題1.3の解答例

$$
\large
\begin{align}
f(x) = -x^2
\end{align}
$$

上記のように定義する$f(x)$に関して$0 \leq t \leq 1$である$t$と、$x_1<x_2$である$x_1,x_2$を用いて下記のような式変形が成立する。
$$
\large
\begin{align}
& f(tx_1 + (1-t)x_2) – \left[ tf(x_1) + (1-t)f(x_2) \right] \\
&= -(tx_1 + (1-t)x_2)^2 – \left[ -tx_1^2 – (1-t)x_2^2 \right] \\
&= -t^2x_1^2 – (1-t)^2x_2^2 – 2t(1-t)x_1x_2 + tx_1^2 + (1-t)x_2^2 \\
&= t(1-t)x_1^2 + (1-t)(1-(1-t))x_2^2 – 2t(1-t)x_1x_2 \\
&= t(1-t)x_1^2 + t(1-t)x_2^2 – 2t(1-t)x_1x_2 \\
&= t(1-t)(x_1^2 + x_2^2 – 2x_1x_2) \\
&= t(1-t)(x_1-x_2)^2 \geq 0
\end{align}
$$

上記より、$f(tx_1 + (1-t)x_2) \geq tf(x_1) + (1-t)f(x_2)$が成立するので$f(x)=-x^2$は上に凸の関数である。

例題1.4の解答例

例題1.5の解答例

例題1.6の解答例

例題1.7の解答例

$$
\large
\begin{align}
\mathrm{Objective} : \quad & f(\mathbf{x}) = -(x_1^2+x_2^2) \, \rightarrow \, \mathrm{Maximize} \\
\mathrm{Constraint} : \quad & c_1(\mathbf{x}) = x_1+x_2-1 = 0
\end{align}
$$

上記の制約付き最適化問題のラグランジュ関数を$L(x_1,x_2,\lambda)$とおくと、$L(x_1,x_2,\lambda)$は下記のように表せる。
$$
\large
\begin{align}
L(x_1,x_2,\lambda) &= f(\mathbf{x}) + \lambda c_1(\mathbf{x}) \\
&= -(x_1^2+x_2^2) + \lambda(x_1+x_2-1)
\end{align}
$$

ここでKKT条件より下記が得られる。
$$
\large
\begin{align}
\frac{\partial L}{\partial x_1} &= -2x_1+\lambda = 0 \quad (1) \\
\frac{\partial L}{\partial x_2} &= -2x_2+\lambda = 0 \quad (2) \\
\frac{\partial L}{\partial \lambda} &= x_1+x_2-1 = 0 \quad (3)
\end{align}
$$

$(1),(2)$式より$x_1=x_2$が得られるので、$(3)$式に代入して最適解$\displaystyle (x_1,x_2) = \left( \frac{1}{2},\frac{1}{2} \right)$が得られる。

・考察
目的関数の等高線や制約条件の直線、最適解における勾配ベクトル$\nabla f(\mathbf{x})$と$\lambda \nabla c_1(\mathbf{x})$の釣り合いは下記を実行することでそれぞれ確認することができる。

import numpy as np
import matplotlib.pyplot as plt

x_, y_ = np.arange(-2., 2.01, 0.01), np.arange(-1., 3.01, 0.01)
x, y = np.meshgrid(x_,y_)
z = -(x**2 + y**2)

levs = np.arange(-3.5,-0., 0.5)

plt.scatter(1/2., 1/2., marker="*", s=300, color="blue")
plt.quiver(1/2., 1/2., 1, 1, color="red", angles='xy', scale_units='xy', scale=1)
plt.quiver(1/2., 1/2., -1, -1, color="green", angles='xy', scale_units='xy', scale=1)

plt.plot(x_, -x_+1, "r--")
plt.contour(x,y,z,levels=levs,cmap="viridis")

plt.colorbar()
plt.show()

実行結果

例題1.8の解答例

例題1.9の解答例

例題1.10の解答例

$X^2$の期待値を$E[X^2]$とおくと、$E[X]$は下記のように計算できる。
$$
\large
\begin{align}
E[X^2] &= \sum_{k=1}^{6} k^2 P(X=k) \\
&= \frac{1}{6} \sum_{k=1}^{6} k^2 \\
&= \frac{1}{6} \times \frac{1}{6} \cdot 6 \cdot (6+1) \cdot (12+1) \\
&= \frac{91}{6} \\
& \simeq 15.17
\end{align}
$$

例題1.11の解答例

例題1.12の解答例

標本平均を$\bar{x}$とおくと、標本平均の定義に基づいて下記のように計算を行うことができる。
$$
\large
\begin{align}
\bar{x} &= \frac{1}{8} \sum_{i=1}^{8} x_i \\
&= \frac{1}{8} (3+6+5+5+2+4+5+2) \\
&= 4
\end{align}
$$

例題1.13の解答例

例題1.14の解答例

条件付き確率の定義に基づいて下記が成立する。
$$
\large
\begin{align}
P(x,y) &= P(y|x)P(x) \quad (1) \\
P(x,y) &= P(x|y)P(y) \quad (2)
\end{align}
$$

$(1),(2)$式より下記が成立する。
$$
\large
\begin{align}
P(y|x)P(x) &= P(x|y)P(y) \\
P(y|x) &= \frac{P(x|y)P(y)}{P(x)}
\end{align}
$$

例題1.15の解答例

$P(x_1,x_2,x_3)$は条件付き確率の定義式を元に下記のように表すことができる。
$$
\large
\begin{align}
P(x_1,x_2,x_3) &= P(x_1|x_2,x_3)P(x_2,x_3) \\
&= P(x_1|x_2,x_3)P(x_2|x_3)P(x_3) \quad (1)
\end{align}
$$

また、下記のようにも表すことができる。
$$
\large
\begin{align}
P(x_1,x_2,x_3) &= P(x_2|x_1,x_3)P(x_1,x_3) \\
&= P(x_2|x_1,x_3)P(x_1|x_3)P(x_3) \quad (2)
\end{align}
$$

$(1), (2)$式より下記が成立する。
$$
\large
\begin{align}
P(x_2|x_1,x_3)P(x_1|x_3) \cancel{P(x_3)} &= P(x_1|x_2,x_3)P(x_2|x_3) \cancel{P(x_3)} \\
P(x_2|x_1,x_3)P(x_1|x_3) &= P(x_1|x_2,x_3)P(x_2|x_3) \\
P(x_2|x_1,x_3) &= \frac{P(x_2|x_3)P(x_1|x_2,x_3)}{P(x_1|x_3)}
\end{align}
$$

例題1.16の解答例

$E[X]$は下記のように計算できる。
$$
\large
\begin{align}
E[X] &= 1 \cdot p + 0 \cdot (1-p) \\
&= p
\end{align}
$$

例題1.17の解答例

$X \sim \mathrm{Bin}(5,0.8)$である確率変数$X$に対し、下記のように$P(X=3)$を計算すれば良い。
$$
\large
\begin{align}
P(X=3) &= {}_{5} C_{3} \cdot 0.8^{3} \cdot 0.2^{2} \\
&= 10 \cdot 0.8^{3} \cdot 0.2^{2} \\
&= 0.2048
\end{align}
$$

例題1.18の解答例

観測値を$\mathbf{x}=(x_1,\cdots,x_6)$、$P$氏の確率を$P(\mathbf{x}|P)$、$N$氏の確率を$P(\mathbf{x}|N)$とおく。このとき$P(\mathbf{x}|P)$と$P(\mathbf{x}|N)$はそれぞれ下記のように計算できる。
$$
\large
\begin{align}
P(\mathbf{x}|P) &= \frac{6!}{2!1!1!2!} 0.4^{2} 0.1^{1} 0.3^{1} 0.2^{2} = 0.03456 \\
P(\mathbf{x}|N) &= \frac{6!}{2!1!1!2!} 0.1^{2} 0.4^{1} 0.2^{1} 0.3^{2} = 0.01296
\end{align}
$$

例題1.19の解答例

パラメータ$\mu$に関する尤度を$L(\mu)$とおくと、$L(\mu)$は下記のように得られる。
$$
\large
\begin{align}
L(\mu) &= P(D|\mu) \\
&= \prod_{i=1}^{N} \frac{\mu^{x^{(i)} e^{-\mu}}}{x^{(i)}!}
\end{align}
$$

上記に対し、対数尤度$\log{L(\mu)}$は下記のように得られる。
$$
\large
\begin{align}
\log{L(\mu)} &= \log{\left[ \prod_{i=1}^{N} \frac{\mu^{x^{(i)}} e^{-\mu}}{x^{(i)}!} \right]} \\
&= \sum_{i=1}^{N} \log{\left[ \frac{\mu^{x^{(i)}} e^{-\mu}}{x^{(i)}!} \right]} \\
&= \sum_{i=1}^{N} (x^{(i)}\log{\mu} – \mu -\log{x^{(i)}!})
\end{align}
$$

上記の$\mu$に関する微分は標本平均$\bar{x}$を用いて下記のように表せる。
$$
\large
\begin{align}
\frac{\partial \log{L(\mu)}}{\partial \mu} &= \sum_{i=1}^{N} \left[ \frac{x^{(i)}}{\mu} – 1 \right] \\
&= \frac{N \bar{x}}{\mu} – N \\
&= \frac{N(\bar{x}-\mu)}{\mu}
\end{align}
$$

上記より、対数尤度$\log{L(\mu)}$と尤度$L(\mu)$を最大にする$\mu$は$\mu=\bar{x}$であることが得られる。

例題1.20の解答例

$N=n_{\mathrm{good}}+n_{\mathrm{bad}}+n_{\mathrm{exciting}}+n_{\mathrm{boring}}=10$であるので、それぞれ下記が成立する。
$$
\large
\begin{align}
p_{\mathrm{good}} &= \frac{n_{\mathrm{good}}}{N} \\
&= \frac{5}{10} = 0.5 \\
p_{\mathrm{bad}} &= \frac{n_{\mathrm{bad}}}{N} \\
&= \frac{1}{10} = 0.1 \\
p_{\mathrm{exciting}} &= \frac{n_{\mathrm{exciting}}}{N} \\
&= \frac{4}{10} = 0.4 \\
p_{\mathrm{boring}} &= \frac{n_{\mathrm{boring}}}{N} \\
&= \frac{0}{10} = 0
\end{align}
$$

例題1.21の解答例

“Yes”の発言回数を確率変数$X$で表すと、$X \sim \mathrm{Bin}(5,p)$が成立する。このとき尤度$L(p)=P(X_1=2,X_2=3,X_3=3)$は下記のように表せる。
$$
\large
\begin{align}
L(p) &= P(X_1=2, X_2=3, X_3=3) \\
&= P(X_1=2)P(X_2=3)P(X_3=3) \\
&= {}_{5} C_{2} ({}_{5} C_{3})^{2} p^{8} (1-p)^{7}
\end{align}
$$

上記に対し、対数尤度$\log{L(p)}$は下記のように得られる。
$$
\large
\begin{align}
\log{L(p)} = 8 \log{p} + 7 \log{(1-p)}
\end{align}
$$

上記の$p$に関する微分は下記のように得られる。
$$
\large
\begin{align}
\frac{\partial \log{L(p)}}{\partial p} &= \frac{8}{p} – \frac{7}{1-p} \\
&= \frac{8(1-p)-7p}{p(1-p)} \\
&= \frac{8-15p}{p(1-p)}
\end{align}
$$

上記より最尤推定解は$\displaystyle p=\frac{8}{15}$である。

例題1.22の解答例

例題1.23の解答例

$P_{\mathrm{Bin}}(X=0), P_{\mathrm{Bin}}(X=1), P_{\mathrm{Bin}}(X=2), P_{\mathrm{Bin}}(X=3)$はそれぞれ下記のように表せる。
$$
\large
\begin{align}
P_{\mathrm{Bin}}(X=0) &= {}_{3} C_{0} \times 0.8^0 \times 0.2^3 = 0.2^3 \\
P_{\mathrm{Bin}}(X=1) &= {}_{3} C_{1} \times 0.8^1 \times 0.2^2 = 3 \times 0.8 \times 0.2^2 \\
P_{\mathrm{Bin}}(X=2) &= {}_{3} C_{2} \times 0.8^2 \times 0.2^1 = 3 \times 0.8^2 \times 0.2 \\
P_{\mathrm{Bin}}(X=3) &= {}_{3} C_{3} \times 0.8^3 \times 0.2^0 = 0.8^3
\end{align}
$$

上記を元にエントロピーの定義より$H(P_{\mathrm{Bin}})$は下記のように計算できる。
$$
\large
\begin{align}
H(P_{\mathrm{Bin}}) &= -\sum_{k=0}^{3} P_{\mathrm{Bin}}(X=k) \log{P_{\mathrm{Bin}}(X=k)} \\
&= -0.2^3 \log{0.2^3} – (3 \times 0.8 \times 0.2^2) \log{(3 \times 0.8 \times 0.2^2)} – (3 \times 0.8^2 \times 0.2) \log{(3 \times 0.8^2 \times 0.2)} – 0.8^3 \log{0.8^3} \\
&=
\end{align}
$$

例題1.24の解答例

例題1.25の解答例

演習問題解答

問題1.1の解答例

問題1.2の解答例

問題1.3の解答例

問題1.4の解答例

問題1.5の解答例

問題1.6の解答例

問題1.7の解答例

問題1.8の解答例

期待値を$E[X]$とおくと$E[X]$は下記のように計算できる。
$$
\large
\begin{align}
E[X] &= \frac{1}{6}(1+2+3+4+5+6) \\
&= \frac{21}{6} \\
&= \frac{7}{2}
\end{align}
$$

問題1.9の解答例

$P(x_1,x_2,x_3,x_4)$は条件付き確率の定義に基づいて下記のように表せる。
$$
\large
\begin{align}
P(x_1,x_2,x_3,x_4) = P(x_1,x_2|x_3,x_4)P(x_3,x_4) \quad (1)
\end{align}
$$

同様に条件付き確率の定義を用いることで下記のように表すこともできる。
$$
\large
\begin{align}
P(x_1,x_2,x_3,x_4) &= P(x_1|x_2,x_3,x_4)P(x_2,x_3,x_4) \\
&= P(x_1|x_2,x_3,x_4)P(x_2|x_3,x_4)P(x_3,x_4) \quad (2)
\end{align}
$$

$(1), (2)$式より下記が成立する。
$$
\large
\begin{align}
P(x_1,x_2|x_3,x_4) \cancel{P(x_3,x_4)} &= P(x_1|x_2,x_3,x_4) P(x_2|x_3,x_4) \cancel{P(x_3,x_4)} \\
P(x_1,x_2|x_3,x_4) &= P(x_1|x_2,x_3,x_4) P(x_2|x_3,x_4)
\end{align}
$$

上記より与式が示される。

問題1.10の解答例

$X \sim \mathrm{Bin}(5,0.8)$である確率変数$X$に対し、下記のように$P(X=3)+P(X=4)+P(X=5)$を計算すれば良い。
$$
\begin{align}
P(X=3) + P(X=4) + P(X=5) &= {}_{5} C_{3} \cdot 0.8^{3} \cdot 0.2^{2} + {}_{5} C_{4} \cdot 0.8^{4} \cdot 0.2^{1} + {}_{5} C_{5} \cdot 0.8^{5} \cdot 0.2^{0} \\
&= 10 \cdot 0.8^{3} \cdot 0.2^{2} + 5 \cdot 0.8^{4} \cdot 0.2^{1} + 0.8^{5} \cdot 0.2^{0} \\
&= 0.942 \cdots
\end{align}
$$

問題1.11の解答例

問題1.12の解答例

問題1.13の解答例

問題1.14の解答例

問題1.15の解答例

問題1.16の解答例

問題1.17の解答例

まとめ