ThinkStats (17)
CDF について。
累積分布関数 (CDF) は_任意の値を、その分布におけるパーセンタイル順位にマップする関数_という記述がテキストにあります。自分控えで書いておくとパーセンタイル順位というものは_自分の点数以下の点を取った人の人数を全体の人数で割ったもの_という記述がテキストにありますね。
これを踏まえつつ正規分布の 4.3 節を、と思ったんですが scipy.special とは何か。download した erf.py の中を見てみるに以下な記述があります。
import numpy import math from scipy.special import erf, erfinv
numpy は import できるんですが、scipy とか何スか。を、apt-cache search したらパケジがあるみたいですね。入れてみます。
$ sudo apt-get install -fy python-scipy
を、これで使える模様。と、いうことは演習問題 4-9 のソレは random.random() で取得した値を NormalCdf なフィルタに通した 6 つの数値リストを云々、ということなのかどうか。ちょっとヤッてみます。
ええと、Sample は以下なカンジで良いのかどうか。
import random import erf def Sample(): l = [erf.NormalCdf(random.random()) for i in range(6)] l.sort() return l
sort が値を戻さないのでアレでした。あと Samples は以下なのか。
def Samples(): l = [] i = 0 while i < 1000: l.append(Sample()) i += 1 return l
で、動作確認してみるに
>>> l = Samples() >>> ll = zip(*l) >>> def ave(l): ... sum = 0 ... for i in l: ... sum += i ... return sum/len(l) ... >>> ave(ll[0]) 0.55745589137088014
あら、違うな。ちょっと不調気味なのでいったんここで止めよう。
そういえば
wikipedia のワイブル分布のページを見たんですがワイブル分布の不信頼度は
k * log x - k * log λ
な模様。ちなみに myplot.py によると weibull なナニは以下な形になってます。
if transform == 'weibull': xs.pop() ps.pop() ps = [-math.log(1.0-p) for p in ps] scale['xscale'] = 'log' scale['yscale'] = 'log'
y 軸はダブル、ってのは理解できてるはず。つうかこれ、やっぱ諸々についてきちんと理解できてる方と一緒に云々、ってのは勉強になるんだろうなぁ。
追記
うーん、順序期待値な 6 つの値が以下とのことなんですが
{.1.2672, .0.6418, .0.2016, 0.2016, 0.6418, 1.2672}
上の実装だと 1 以上の値は出ないな。こうすれば良いのかな。
>>> import random >>> import erf >>> import Cdf >>> cdf = MakeNormalCdf()
で、Sample が以下?
def Sample(cdf): l = [cdf.Value(random.random()) for i in range(6)] l.sort() return l
Samples は上と同じで良いのか。
>>> list = Samples(cdf) >>> ret = zip(*list)
確認してみるとこうなりました。
-1.2482199999999994 >>> ave(ret[1]) -0.64199999999999979 >>> ave(ret[2]) -0.22651999999999986 >>> ave(ret[3]) 0.19332000000000005 >>> ave(ret[4]) 0.63114999999999932 >>> ave(ret[5]) 1.2653600000000003
こうして見るにナチュラルのカマシかたがアレに杉ますよね < わし