質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

3187閲覧

Python:numpyのnp.random.seed(1)の記述場所によって実行結果が変化してしまう事象について

SK.12914232

総合スコア9

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/24 14:30

前提・実現したいこと

np.random.seed()の使い方について

下記のプログラムでは、np.random.seedを計3回読み込んでいます。
3回目のnp.random.seedを追加するかどうかによって、2つ目のプログラムの結果が変わってしまいます。
(プログラムは①サンプルサイズを変えた時の標本平均の分布を比べる、②サンプルサイズを変えた時の
標準偏差の変化を比べる)という2つを実行しており、実行結果をグラフでそれぞれplt.show()で2回表示しています。

3回もnp.random.seed(1)を読み込まずとも最初に1回読み込めば乱数シードは固定されてその後の結果は
変わらないと思っていましたが、なぜ3個目のnp.random.seed(1)を記述しなければ、②のプログラムの結果が
変わってしまうのか知りたいです。

発生している問題・エラーメッセージ

3つ目のnp.random.seed(1)の記述の有無によって、②のプログラムの実行結果が変化してしまう。

該当のソースコード

import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
%precision 3

population = stats.norm(loc=4, scale=0.8)

np.random.seed(1)

def calc_sample_mean(size, n_trial):
sample_mean_array = np.zeros(n_trial)
for i in range(0, n_trial):
sample = population.rvs(size=size)
sample_mean_array[i] = np.mean(sample)
return(sample_mean_array)

np.random.seed(1)

size_10 = calc_sample_mean(10, 10000)
size_10_df = pd.DataFrame({
"sample_mean":size_10,
"size":np.tile("size_10", 10000)
})

sns.violinplot(x="size", y="sample_mean", data=size_10_df, color="gray")
plt.show()

size_array = np.arange(start = 2, stop = 102, step = 2)

np.random.seed(1) #今回問題となっている箇所
sample_mean_std_array = np.zeros(len(size_array))
for i in range(0, len(size_array)):
sample_mean = calc_sample_mean(size=size_array[i], n_trial=100)
sample_mean_std_array[i] = np.std(sample_mean, ddof=1)
plt.plot(size_array, sample_mean_std_array, color="black")
plt.xlabel("sample size")
plt.ylabel("mean_std value")
plt.show()

試したこと

np.random.seed(1)の記述を追加、削除する等して試しましたが、結果は上記のとおりでした。

補足情報(FW/ツールのバージョンなど)

特にありません。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2020/05/25 02:01

コードはインデントが崩れるため、マークダウン記法を使ってください
guest

回答1

0

そもそも、seedは乱数の種を設定する関数なので何度も実行するようなもんではないです
seedは実行すると乱数の種がその値に設定されるので、そりゃ実行する位置が変われば結果は変わります

投稿2020/05/24 14:49

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SK.12914232

2020/05/24 15:16

ご回答、ありがとうございます。 何度も実行するようなものではないという点は、認識しております。今回はseed(1)から乱数シードを設定したので、私の認識では2つ目のプログラムでもseed(1)に対応した乱数による結果が出力されるものだと思っていました。 しかし、3つ目のseed(1)を記述しなかったところ、結果が私が見ているテキストの結果と異なる結果となり、記述するとテキストの結果通りとなりました。 ここから、本来乱数シードが1であれば最初に1回書いておけば後の結果には影響を及ぼさないはずが、3つ目のseed(1)の記述の有無によって変わってしまうのは何故なのだろうか、というのが今回の私の疑問点です。
y_waiwai

2020/05/24 22:42

seedは、乱数をリセットする、と考えれば分かるのでは。 2番めのseedから3番めの間に実行されるrandがあれば、3番めの有無で以降の乱数が変わってしまいますよね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問