LoginSignup
17
16

More than 3 years have passed since last update.

NumPyで乱数を扱う

Posted at

乱数を扱う

乱数と一言で言うけども、色々な種類の乱数があるので、いくつかNumPyを使って作ってみる
乱数生成だけでなくランダムチョイス等も見ていく
つまり numpy.random モジュールについて

一様乱数

特定の範囲の実数が均等な確率で発生する、まさに一様に発生する乱数
範囲の指定をしないものはデフォルトで 0以上1未満 で生成される

1次元の一様乱数

numpy.random.rand(要素数)で作れる
image.png
random.randとなるのが若干ややこしいな

2次元の一様乱数

もはやパターンかなと思いきや、タプルで指定ではなく、第1、2引数
image.png

範囲指定の一様乱数

numpy.random.uniformで作れる
image.png
uniform(3, 5, 10)3以上5未満で10個を表す

2次元も同様に
image.png
この場合はお決まりのタプルで渡す必要があるのか、注意

整数乱数

名前がすべてだが、特定の範囲の整数が同じ確率で発生する乱数
一様乱数と同様の部分は端折る

整数乱数

numpy.random.randintで作れる
引数については一様乱数と同様
image.png

ランダムなリスト操作

ランダムに洗濯

洗濯じゃない選択(洗濯はランダムにしない)
choiceを使う

  • 指定回数選択
    image.png
    numpy.random.choice(targets, 4)でtargetsリストから4つ選択(回数は問わない)

  • 1度だけ選択
    1度だけ選択される(リスト内で重複があれば当然重複もする)
    image.png
    replace=Falseで1度しか出現しなくなる

ランダムに並び替え

長くないリストであれば、 choice(targets, 3, replace=False) で1度だけ選択するより
この並び替えを使うと良い
長いリストの場合はchoiceする方が効率は良い

  • 並び替えた新しいリストを生成
    permutationを使う
    並び替えてもtargetsは変更されない
    image.png

  • 元のリストを並び替え
    shuffleを使う(うん、わかりやすい名前)
    元のリストを並び替える つまり破壊的メソッド
    image.png
    戻り値はないので targets で確認している

その他様々な分布の乱数

標準正規乱数

numpy.random.randnで作れる
image.png
デフォルトだと、平均が0 標準偏差1の正規分布になる
標準偏差については詳しくはWebでだが、散らばりの度合いを示したもの

正規乱数

numpy.random.normal で作れる
image.png
平均が50 標準偏差10 の乱数10個
つまり正規分布? 本格的に統計学(?)、分布とかの勉強しないと理解に苦しむなぁ。。。
多次元も
image.png

ベータ乱数

numpy.random.beta で作れる

  • ベータ分布
    • 軽く読んだけどマジムリ...
    • 軽くじゃダメそうなので、ちゃんとそれ用に時間を取って理解した方が良さげ

image.png
α = 1 β = 2 のベータ乱数10個 😢

二項乱数

numpy.random.binomial で作れる

  • 二項分布  (これはまだわかる!)
    • 成功か失敗の結果を持つ試行をn回繰り返した時の分布
    • 成功率pは一定とする

image.png
この場合は、 成功率 p = 0.4 の試行を10回やった時の成功回数、を 10個

ポアソン乱数

numpy.random.poisson
調べてみたけどよくわからない系の分布でした・・・
単位時間あたり平均でλ回発生する事象の発生回数の分布
どういう時に使われるかだけあげておくと、

  • 交番の事故の件数
  • 30分に平均2回電話がかかって来るコールセンターで、1時間に6回電話がかかって来る確率

だそうです
image.png
λ = 0.8 のポアソン乱数10個
↑これ何!!!

わからなすぎるので一旦保留だな

多次元正規乱数

numpy.random.multivariate_normal で作れる
正規乱数並みの難易度かと思いきや...
image.png
平均が[0, 0] 共分散行列が [[1, 0.5], [0.5, 1]] の多次元正規乱数

もはや調べるのも無駄な抵抗なので、いつかちゃんとやる

乱数の再現性

numpyなどで生成される乱数は全て擬似乱数と言って、必ずシードを元に生成される
シードは実行環境の初回実行時の時刻等で初期化される
なので、明示的にシードの指定をしなくても乱数が発生させられる
(個人的なイメージ: ビンゴカードのようなもの? 初回実行時に新しいビンゴカードが配られる)
何度実行しても同じ乱数が出ることを再現性があるという

  • 再現性のある乱数を発生させる方法
    • 最初にシードを指定 (同じビンゴカードを使う)
    • 状態を取得して、再現したいときに状態を設定 (状況に応じてビンゴカードの数字を変えちゃう?)

シード指定

image.png
seed(0) で固定しているので、何度実行しても同じになる

状態設定

get_state/set_state で取得、設定する
image.png
3行は常に同じだが、実行するたびに値は変わる

ファイルに保存

image.png
ファイルに保存して、それを読み込むことでも、再現性があると言える

感想

様々な乱数を見てきたけど、分布、統計という前提条件の壁がかなり高いことがわかってしまった
実践とまで言わずとも、自分で何かやってみようという段階になるまでには
まだまだ長い道のりになりそうだー

17
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
16