ますはらの日記(?)

無線通信の勉強をしてる学生のぼやき(?)

Pythonで数値解析〜確率や乱数に関するものに触ってみた〜

どうも。
今日は昨日話した通り、確率や乱数に関するものに触れてみようと思い、いろいろやってました。
それでは早速紹介したいと思います( ^ω^ )


Q. そもそも関数や乱数を扱うときはどのライブラリを使うの?
ここでは今までこのブログでも紹介した(主に数値解析のための環境導入の部分だけど…)scipyとnumpyを用います。scipyをインポートするだけではダメで、今回はscipy.statsモジュールを用います。このモジュールではある分布に従った確率密度関数を用いることが可能になります。また、ある分布に従った乱数を生成する際はnumpy.randomを用います。それでは正規分布に従うものを例にやってみましょう。

$python #今回はsympyを用いなかったため2系を用いました
>>>from pylab import * #scipy, numpyを用いるのを楽にするための操作、プロットも可能に。
>>>from scipy import stats #確率密度関数を扱うための操作。
>>>a = np.random.normal(size=10000) #1万個の正規分布に従う乱数を生成
>>>bins = linspace(-5, 5, 100) #-5から5までの範囲を100分割して値を順に要素とした配列としてbinsを定義
>>>histogram, bins = histogram(a, bins=bins, normed=True) #生成した乱数に関するヒストグラムを生成
>>>bins = 0.5 * (bins[1:] + bins[:-1]) #100分割したそれぞれの中点を順に要素とした配列にbinsの中身を変更
>>>b = stats.norm.pdf(bins) #正規分布に従った確率密度関数の値を要素とした配列としてbを定義
>>>plot(bins, histogram) #ヒストグラムを図示
>>>plot(bins, b) #確率密度関数を図示
>>>show() #グラフを表示

実際に得られたグラフが次の画像の1枚目になります。
f:id:mathharachan:20160308221222p:plainf:id:mathharachan:20160308221213p:plain

2枚目の画像については次の参考ページのサンプルプログラムを実際に動かしてみて得られたグラフになります。
【参考ページ】 → 1.5. Scipy: 高水準の科学技術計算 — Scipy lecture notes

参考ページのサンプルプログラムでは区間を30分割しているのに対し、今回の例では100分割することにしました。どういった違いが生じるか興味本位でやってみたのですが、あんまり区間を分けすぎると精度が逆に落ちてしまうんですね(⌒-⌒; )
もっと生成する乱数の個数を増やせば改善されそうですが処理時間などを考慮して検証はしないことにします…笑

ここで注意して欲しいのですが、仕様なのか詳しく見てないのでわかりませんが、binsは別の名前にせずbinsで進めていかないとどうやらダメみたいです。気持ち悪くてbinsとしていた部分を別の名前に変えたところエラーが出てしまったので(^◇^;)


他にもいろんな分布に従ったものを扱えます。以下の参考ページを見てみてください( ´ ▽ ` )

【乱数生成】 → Random sampling (numpy.random) — NumPy v1.10 Manual
確率密度関数】 → Statistical functions (scipy.stats) — SciPy v0.17.0 Reference Guide


今回、乱数や確率密度関数Pythonですぐに扱えることがわかったので、今までブログで紹介した内容を集約させれば無線通信に関するシミュレーションを行うためのプログラムをPythonで書ける希望が出てきました!

今後はPythonに関する内容でのブログ更新のペースは落ちると思いますが、もしPythonでシミュレーションを行うプログラムを書けた時にはブログで紹介したいと思います( ̄▽ ̄)


それでは、今日はこの辺で。