2: 2019-04-08 (月) 04:43:50 njf[4] [5] [6] | 現: 2019-04-08 (月) 23:56:47 njf[4] [7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | *はじめに [#w162d0c4] | ||
Pythonでは正規分布(ガウス分布)に従う乱数を発生させる方法が標準で提供されています。 | Pythonでは正規分布(ガウス分布)に従う乱数を発生させる方法が標準で提供されています。 | ||
Line 10: | Line 11: | ||
&font(u){注意};:Pythonの正規分布の上側確率などを求める方法は[[Python/標準正規分布]]で紹介しています。 | &font(u){注意};:Pythonの正規分布の上側確率などを求める方法は[[Python/標準正規分布]]で紹介しています。 | ||
+ | |||
+ | *random.gauss [#y3cda487] | ||
生成するにはrandom.gaussを使います。 | 生成するにはrandom.gaussを使います。 | ||
Line 15: | Line 18: | ||
import random | import random | ||
+ | |||
print(random.gauss(0,1)) | print(random.gauss(0,1)) | ||
Line 34: | Line 37: | ||
import random | import random | ||
+ | |||
dataCnt = {} | dataCnt = {} | ||
for i in range(100000): | for i in range(100000): | ||
Line 42: | Line 45: | ||
else: | else: | ||
dataCnt[d] = 1 | dataCnt[d] = 1 | ||
+ | |||
sortedData = sorted(dataCnt.items()) | sortedData = sorted(dataCnt.items()) | ||
+ | |||
for k in sortedData: | for k in sortedData: | ||
print("%.2f\t%d" % (k[0],k[1])) | print("%.2f\t%d" % (k[0],k[1])) | ||
Line 57: | Line 60: | ||
詳しくは[[こちらのドキュメント:https://docs.python.org/ja/3/library/random.html]]で。 | 詳しくは[[こちらのドキュメント:https://docs.python.org/ja/3/library/random.html]]で。 | ||
+ | |||
+ | *おまけ:中心極限定理と一様分布から標準正規分布に従うランダムな数を生成する [#ue41f4eb] | ||
+ | |||
+ | 計算コストが高くて実用性はないのですが、一様分布と中心極限定理から標準正規分布に従うランダムな数を生成してみます。 | ||
+ | |||
+ | 中心極限定理とは、母集団の分布が何であれそこから抽出された無作為標本の平均値は正規分布に従い、平均値は母集団と同じになり、標本の分散は母集団の分散の標本の大きさの平方根分の一となるというものです。 | ||
+ | |||
+ | [[Wikipedia 中心極限定理:https://ja.wikipedia.org/wiki/%E4%B8%AD%E5%BF%83%E6%A5%B5%E9%99%90%E5%AE%9A%E7%90%86]] | ||
+ | |||
+ | そこで、たいていのプログラミング言語に実装されているランダムな一様分布を使って標準正規分布を導くことを考えてみます。 | ||
+ | |||
+ | 区間(a,b)の一様分布の平均は(b-a)/2、分散は(b-a)^2/12と分かっていますから、これと中心極限定理を使います。nを標本の大きさとして、平均0、分散1の標準正規分布となるようにa,bについての連立方程式を解くと、a=b=sqrt(3n)と求まります。 | ||
+ | |||
+ | nを100として、標準正規分布に従うランダムな数を返す関数を作ると以下のようになります。 | ||
+ | |||
+ | def cltRandom(): | ||
+ | n = 100 | ||
+ | sqr3 = 2 * math.sqrt(3*n) | ||
+ | x = 0 | ||
+ | for i in range(n): | ||
+ | x += (random.random() - 0.5) * sqr3 | ||
+ | |||
+ | return x / n | ||
+ | |||
+ | これを前節と同じように100,000回実行して小数第二位で四捨五入し、度数を数えてグラフを描くと以下のようになりました。 | ||
+ | |||
+ | &ref(chartClt.png,mw:480,mh:360); | ||
+ | |||
+ | 前節のグラフとほぼ同じになり、予想通り標準正規分布に従っていることが分かります。 | ||
+ | |||
+ | この関数は、100回も乱数を生成するので実行速度はかなり遅く実用性はありません。 | ||
+ | |||
+ | しかし、中心極限定理を実際に確かめられる簡単な例となっており、統計での正規分布の重要性を理解できると思います。 |
(This host) = https://njf.jp