ThinkStats (16)
現実トウヒ。なんとなく練習問題 4-1 なソレが微妙だったので。
図 4-1 に λ が 2 の場合の CDF を描画したものが付いてるので手元で描画してみることに。以下で良いのかどうか。
import random import Cdf import myplot cdf = Cdf.MakeCdfFromList([random.expovariate(2) for i in range(44)]) myplot.Cdf(cdf) myplot.Show()
ちょっとこれだと粗いですね。1000 くらいで以下なカンジ。
んで、今度はこれを
myplot.Cdf(cdf, transform='exponential')
ってしてみるとどうなるか。
やはりこうなるのか。
うーん、でも CCDF って 1-CDF(x) という記述があって、Cdf な手続きで以下な記述になってるですよね。
if complement: ps = [1.0-p for p in ps]
うーん、xscale と yscale を指定していないのが悪いのかな。あ、違うや。transform='exponential' だと以下な処理をしてるんでした。
if transform == 'exponential': complement = True scale['yscale'] = 'log'
これで y 軸が対数目盛になってくれていない、という事なんすよね、多分。
もう少し確認
何かがおかしい。そもそも手続きの先頭で
scale = dict(xscale='linear', yscale='linear')
辞書を作って引数の値に沿って中身を云々して戻してるだけなんすよね。
line = pyplot.plot(xs, ps, label=cdf.name, **options) return scale
で、中身を眺めてみるに Config という手続きがある事を確認。これかな。つうか Show の定義が以下だ。
def Show(**options): """Shows the plot. For options, see Config. options: keyword args used to invoke various pyplot functions """ # TODO: figure out how to show more than one plot Config(**options) pyplot.show()
この options ってどうやって渡せば良いのか。
むむ
によると ** 付けて渡せば良いの?
>>> scale = myplot.Cdf(cdf, transform='exponential') >>> myplot.Show(**scale)
と、いうことは
練習問題 4-1 も
>>> cdf = Cdf.MakeCdfFromList([random.expovariate(1/32.6) for i in range(44)]) >>> scale = myplot.Cdf(cdf, transform='exponential') >>> myplot.Show(**scale)
で以下な出力です。
ツールの使い方がテキストと微妙に違うあたりがアレですね。
練習問題 4-3 を追記の方向ですがとりあえずエントリ投入。
練習問題 4-3
絶賛現実トウヒなうだな。とりあえず手続きを作る前にグラフを描画してみます。
>>> cdf = Cdf.MakeCdfFromList([0.5 * random.paretovariate(1) for i in range(500)]) >>> scale = myplot.Cdf(cdf) >>> myplot.Show(**scale)
これでいいのだろうか。
wrapper は以下なカンジになるのかな。
import ramdom def paretovariate(alpha, xm): return xm * ramdom.paretovariate(alpha)
試験は略。上の CCDF も確認。
>>> scale = myplot.Cdf(cdf, transform='pareto') >>> myplot.Show(**scale)
演習問題 4-4
MemoryError になるな。回避する方法は無いものか。
xrange() 使え、というナニを見たので確認。
>>> cdf = Cdf.MakeCdfFromList([100 * random.paretovariate(1.7) for i in xrange(6000000000)]) Killed
loadave が 30 超えたのは確認しました (emacs 上なのでアレ)。もっと簡単な方法で何とかならんかな。
>>> import random >>> import Cdf >>> import myplot >>> l = [] >>> i = 0 >>> while i < 6000000000: ... l.append(100*random.paretovariate(1.7)) ... i += 1 ... Killed
やっぱ 60 億ってソレが無理なのかなぁ。
演習問題 4-6
ええと 1 - CDF(x) の対数をとって -1 をかけたものについて、さらに両辺の対数を、が解なのかどうか。-k(logx - logλ) ってカンジなのかな。
この対数が云々、というあたりから復習しないと、なあたりが微妙。