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

0 件のコメント :

コメントを投稿