2019年4月30日火曜日

[Statistics] I 統計学の基礎 8. 確率論の基本

Pythonで学ぶあたらしい統計学の教科書のまとめやコードを実行してみた際のメモです.
集合
集合:客観的に範囲が規定されたモノの集まり

要素
あるモノaがAの要素である時に $a \in A$と書き,aがAに属すると呼ぶ.
あるモノaがAの要素である時に $a \notin A$と書き,aがAに属すると呼ぶ.

集合の2つの表記方法
0以上5以下の整数は
$A = {0, 1, 2, 3, 4, 5}$
$A = \{a; a \in Z $ かつ$ 0 ≦ a  5 \}$
と表記される.後者のような表記を内包的表記という.セミコロン ; (もしくは | )よりも右側が条件を表す.なお$Z$は整数の集合を表す.

部分集合
2つの集合AとBにおいて「$a \in A$ならば$a \in B$」である時,AをBの部分集合と呼び,$A \subset B$と表記する.

積集合と和集合
2つの集合AとBに対して,積集合$A \cap B$は以下のように定義される.
$A \cap B = \{ a; a \in A かつ a \in B\}$,AかつBの条件
2つの集合AとBに対して,積集合$A \cap B$は以下のように定義される.
$A \cup B = \{ a; a \in A または a \in B\}$,AまたはBの条件

差集合
2つの集合AとBに対して,差集合 A-B は以下のように定義される.
$A - B = \{a; a \in A かつ a \notin B\}$

空集合
空集合:要素を一つも含まない集まり.

全体集合
全体集合:ある集合Sがあり「Sの部分集合しか取り扱わない」と限定したとき,Sを全体集合と呼ぶ.

補集合
全体集合Sが定まっている時,Sの部分集合Aに対して,以下の関係が成り立つ$A^{C}$をAの補集合と呼ぶ.
$A^{C} = S - A$

標本点・標本空間・事象
標本点:起こりうる可能な結果.$\omega$と表記する.
標本空間:標本点の全体の集合.$\Omega$と表記する.
ここで標本空間は全体集合とみなされ,標本点はその要素となる.
事象:標本空間の部分集合として定義される.
事象も集合と同様に和事象や積事象が定義される.
根元事象:ただ一つの標本点からなり,これ以上分解できない事象.
複合事象:複数の標本点を含み,二つ以上の根元事象に分解できるもの.
空事象:標本点を一つも含まない事象.
  e.g. サイコロ投げ
        標本点:$\omega_{1} = 1, \omega_{2} = 2, \omega_{3} = 3, \omega_{4} = 4, \omega_{5} = 5, \omega_{6} = 6$
        標本空間:$\Omega = \{1, 2, 3, 4, 5, 6 \}$
        複合事象:偶数となる事象 $A = \{2, 4, 6 \}$
                            奇数となる事象 $B = \{ 1, 3, 5 \}$ など
        根元事象:1の目が出る事象 $C = \{ 1 \}$
                            2の目が出る事象 $D = \{ 2 \}$


排反事象
$A \cap B = \emptyset$である時(事象同士の重なりがない時),事象AとBは排反事象であるという.

確率の公理主義的定義
確率の公理主義的定義に基づくと,以下の三つの公理を満たすものを確率という.
  1. すべての事象 A に対して $0 \leq P(A) \leq 1$
  2. P ( \Omega ) = 1
  3. 排反な事象$A_{1}, A_{2}, \cdots,$ に対して$P ( A_{1} \cup A_{2} \cup \cdots ) = P(A_{1} + P(A_{2}) + \cdots$
1. は,確率が0以上1以下ということ.2. は,標本空間を対象にしたら,それが起こる確率は1になるということ.3. は重なりがない事象のどれかが起こる確率は,事象が起こる確率の和で計算ができるという事を表している.

頻度による確率の解釈
頻度主義に立った確率の解釈では,確率と相対度数の極限値と考える.

主観確率
確率を相対度数で定義した場合は,誰が計算しても同じ値が得られる(頻度主義).
一方の主観確率は,個人が主観的に確率を割り当てる(ベイズ主義).

確率の加法定理
確率の加法定理
$P (A \cup B) = P(A) P(B)$
事象同士が排反であるという条件を無くした確率の加法定理の一般的な形
$P(A \cup B) = P(A) + P(B) - P(A \cap B)$


条件付確率
条件付確率:事象Bが起こらなかったことがわかったという条件において,事象Aが発生する確率.
$P(A|B)$と表記して以下のように定義される.
$P(A|B) = \cfrac{P(A \cap B)}{P(B)}$
確率の乗法定理
確率の乗法定理:条件付確率の定義を式変形した以下の関係
$P(A \cup B) = P(B) \cdot P(A|B)$

独立
$P(A \cup B) = P(A) \cdot P(B)$が成り立つ時,事象A, Bは独立であるという.$P(A|B) = P(A)$と同じ意味.

Pythonで学ぶあたらしい統計学の教科書に関する過去の投稿は以下です.
I 統計学の基礎
 1. 統計学,2. 標本が得られるプロセス,3. 標本が得られるプロセスの抽象化4. 記述統計の基礎,6. 確率質量関数と確率密度関数,7. 統計量の計算確率論の基本

2019年4月29日月曜日

[Statistics] I 統計学の基礎 7. 統計量の計算

Pythonで学ぶあたらしい統計学の教科書のまとめやコードを実行してみた際のメモです.
7. 統計量の計算
標本
サンプルサイズをNとした時,標本は以下のように表記される.
$\{ x_{I} \} = \{ x_1, x_2, \cdots x_N \}$

平均値
標本の平均値$\mu$は以下のように計算できる.
$\mu = \cfrac{1}{N} \Sigma_{i = 1}^{N} x_{I}$
これは正確に言うと算術平均と呼ばれる平均値.

期待値
離散型の変数の場合,期待値$\mu$は 確率 $\times$ その時の値の合計値 として計算される.
$\mu = \Sigma_{i = 1}^{N} P(x_{I}) \cdot x_{I}$

母平均:母集団の平均値のこと.
標本平均:標本の平均値のこと.

本来は,母平均を推定したい所だが,これがわからないので標本平均で代用する.母平均と標本平均は少しズレていることが普通だが,偏りはない.言い換えるとプラスのズレとマイナスのズレがほぼ半々で起こるということである.

分散(標本平均)
分散は データが平均値(期待値)とどれだけ離れているか を表した指標.
$\sigma^{2} = \cfrac{1}{N} \Sigma_{i = 1}^{N} ( x_{i} - \mu)^{2}$
$(x_{I})$を偏差という.偏差の2乗和,すなわち$ \sigma_{i = 1}^{N} ( x_{i} - \mu)^{2}$を偏差平方和という.上式は,確率$P(x_{i})$を使うことで
$\sigma^{2} = \Sigma_{i = 1}^{N} P(x_{i}) \cdot ( x_{i} - \mu)^{2}$
のように表すこともできる.

期待値とデータが離れていれば離れているほど$(x_{i} - \mu)^{2}$は大きな値を取る.$(x_{i} - \mu)^{2}$は期待値とデータとの距離だと見做すことができる.そのため,分散はデータと期待値との距離の期待値であるとみなすことができる.

分散(不偏分散)
標本分散だと母集団の分散,すなわち母分散と比べて分散を過小評価してしまう偏りがある.これを修正したものを不偏分散という.
$ s^{2} = \cfrac{1}{N-1} \Sigma_{i = 1}^{N} (x_{i} - \mu)^{2}$
不偏分散は分母が$N-1$と少し小さくなるので,標本分散よりも大きな値となる.

標準偏差
分散の平方根をとったもので,分散としては不偏分散を使うことが一般的である.Standard Derivation を略してSDと呼ばれることもある.
$\sigma = \sqrt{\Sigma^{2}} = \sqrt{\cfrac{1}{N-1} \sigma ( x_{I} - \mu^{2})}$
2錠してから平方根を取るので,絶対値を使えば良いという見方もあるが,絶対値は四則演算だけでも止められないことと,微分できないことから絶対値は使わない.

Pythonで学ぶあたらしい統計学の教科書に関する過去の投稿は以下です.
I 統計学の基礎
 1. 統計学,2. 標本が得られるプロセス,3. 標本が得られるプロセスの抽象化4. 記述統計の基礎,6. 確率質量関数と確率密度関数,7. 統計量の計算

2019年4月28日日曜日

[Statistics] I 統計学の基礎 4. 記述統計の基礎,6. 確率質量関数と確率密度関数

Pythonで学ぶあたらしい統計学の教科書のまとめやコードを実行してみた際のメモです.
4. 記述統計の基礎
数値型の変数(量的データ):データが定量的な数値として得られるもの.
離散型の変数:数値型の変数の値.あたいは整数しかとらない.
連続型の変数:数値型の変数のうち,連続的に変化するもの.
カテゴリ型の変数:定量的な数値で表されないもの.
階数:数値型の変数において,それが取り得る値をいくつかの範囲に区切る時の区切りのこと.
度数分布:階級に対応する頻度の一覧のこと.
相対度数:全体を1とした時の度数の占める割合のこと.
累積度数:階数を小さいものから順番に並べて度数の累積値をとったもの.
累積相対度数:相対度数の累積値をとったもの.
ヒストグラム:度数分布を図示したもの.横軸に階数を,縦軸に度数をとったグラフになる.
統計量:データを集計した値のこと
平均値($\mu$):手持ちのデータ(標本)を代表する値.すなわち,代表値である.
期待値($\mu$):まだ手に入れていない道のデータであっても適用(予測)できる平均値のこと.
期待値の定義上,標本においては,平均値と期待値は全く同じになる.
分散($\sigma^{2}$):データが平均値(期待値)とどれだけ離れているかを表した指標.例えば,平均値(期待値)の近くにデータが集まって入れば,分散は小さい.逆にデータが平均値(期待値)から遠く離れているようであれば分散は大きくなる.

6. 確率質量関数と確率密度関数
確率質量関数:データを引数にとると確率が計算結果として出てくる関数.
確率密度:連続型の変数の値として対応した確率のようなもの.
確率密度関数:確率密度が計算結果として出てくる関数のこと.
正規分布の特徴
  1. $- \infty \ \sim \ \infty$の実数をとる.
  2. 平均値付近の確率密度が大きい(平均値の近くにデータが集まりやすい). 
  3. 平均値から離れるほど確率密度が小さくなる.
  4. 確率密度の大きさは,平均値を中心として左右対称.
母数:確率分布を特徴付ける値であり,確率分布のパラメタ(サンプルサイズとは異なる).

正規分布の母数は平均(期待値)$\mu$と分散$\sigma^{2}$の二つ.正規分布の確率分布の確率密度関数は確率変数を$x$とすると$N(x)$と表記される.$N(x)$を計算すると,ある確率変数における確率密度が得られる.

確率分布のパラメタを明示的に示して$N (x | \mu, \sigma^{2})$と表されることがある.

母集団の分布を推定するという行為は
  1. 分布の形を決める.
  2. 母数(確率分布のパラメタ)を決める.
という2つの作業で達成することができる.例えば,母集団の分布に正規分布を仮定すれば「母集団の分布の推定」という作業を「正規分布の母数の推定」という作業で置き換えることができる.
母数を推定する最も簡単なアイデアは「標本の統計量を母集団分布の回数だと考える」ことである.

母数を推定するアイデアとして「標本の統計量を母集団分布の母数だと考える」こと自体は間違っていない.しかし,標本の統計量と母数には(少しの)ズレがあるのが普通です.よって,推定された母数には推定誤差があることを認めなければならない.
推定誤差を加味した母数の推定を行う際は,区間推定などの考え方が用いられる.また,推定誤差があるなかで主張したいことがある時には,統計的仮説検定と行った枠組みを用いることがある.

Pythonで学ぶあたらしい統計学の教科書に関する過去の投稿は以下です.
I 統計学の基礎
 1. 統計学,2. 標本が得られるプロセス,3. 標本が得られるプロセスの抽象化4. 記述統計の基礎,6. 確率質量関数と確率密度関数

2019年4月27日土曜日

[Statistics] I 1. 統計学,2. 標本が得られるプロセス,3. 標本が得られるプロセスの抽象化

Pythonで学ぶあたらしい統計学の教科書のまとめやコードを実行してみた際のメモです.

1. 統計学
統計学の目的
記述統計の目的:手持ちのデータを整理・要約する.
推測統計の目的:まだ手に入れていない未知のデータを推測する.

標本と母集団
標本:手持ちのデータのこと
母集団:まだ手に入れていない未知のデータを含んだ全てのデータ.
標本という一部のデータのみを用いて,母集団という全体について議論することが推測統計学の目的.

2. 標本が得られるプロセス
確率変数:確率的な法則に従って変化する値.
サンプリング(標本抽出):母集団から標本を得ること.
実現値:確率変数における具体的な値のこと.
単純ランダムサンプリング(ランダムサンプリング):母集団の一つ一つの要素が無作為に選ばれる選び方のこと.
サンプルサイズ:標本の大きさ(手持ちのデータの個数).大きい,小さいで表現する.
全数調査:母集団全体を調べる調査のこと.
標本調査:母集団の一部のみを調べる調査のこと.

3. 標本が得られるプロセスの抽象化
確率は probability の頭文字を取って P と表記する.あるデータが得られる確率 P(データ) と表記する.
確率分布:確率変数とそれに付与された確率との対応を表したもの.単に分布と略されることもある.
あるデータが,ある確率分布と対応している時,確率分布に従うと呼称する.
母集団分布:母集団が従う確率分布のこと.
ある母集団から単純ランダムサンプリングにより標本を一つ得る行為を,母集団分布に従う確率変数を一つ取得することとみなす.
無限母集団:無限の大きさを持つ母集団のこと.
母集団のイメージかつきにくくても,母集団分布さえ分かれば,未知のデータの推測が可能となる.

Pythonで学ぶあたらしい統計学の教科書に関する過去の投稿は以下です.
I 統計学の基礎
 1. 統計学,2. 標本が得られるプロセス,3. 標本が得られるプロセスの抽象化

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というファイルで見ることができます.