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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

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

Python

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

Q&A

2回答

3925閲覧

ヒストグラムに折れ線グラフを追加して、近似曲線を描画するコード

akpqky

総合スコア29

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

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

Python

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

0グッド

0クリップ

投稿2020/09/13 05:10

np.random.seed(123) x=np.random.randn(1000) fig,ax=plt.subplots() counts,edges,patches=ax.hist(x,bins=25) #近似曲線に用いる点を求める(ヒストグラムのビンの中点) x_fit=(edges[:-1]+edges[1:])/2 #近似曲線をプロット y=1000*np.diff(edges)*np.exp(-x_fit**2/2)/np.sqrt(2*np.pi) ax.plot(x_fit,y) plt.show()

python資格試験取得のために勉強しているのですが、ヒストグラムに折れ線グラフを追加して、近似曲線を描画する上記のコードで、下から3番目のコードで質問があります。yの値を求めようとしていること、np.diff、np.exp、np.sqrt、np.pi各々の意味は理解しているのですが、全体として式が複雑で、式の意味が理解出来ません。どなたかご解説いただくことは可能でしょうか。

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

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

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

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

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

guest

回答2

0

np.exp(-(x_fit ** 2) / 2) / np.sqrt(2 * np.pi) の部分ですが、これは標準正規分布の確率密度関数の値を計算しています。

イメージ説明

コード全体を順番に説明していくと、

  1. x = np.random.randn(1000) で標準正規分布に従う観測値を1000個取得する

numpy.random.randn — NumPy v1.15 Manual

  1. counts, edges, patches = ax.hist(x, bins=25) でヒストグラムを計算する。

  2. np.exp(-(x_fit ** 2) / 2) / np.sqrt(2 * np.pi) で各ビンの中点における標準正規分布の確率密度関数の値を計算する。

  3. ヒストグラムは規格化 (Σ ビンiの幅 * ビンiの度数 = 1) されていないので、確率密度関数の値を 1000 * np.diff(edges) を乗算してヒストグラムのスケールに合わせる。

ヒストグラムの度数 (count) を規格化するには、

規格化された度数 = 度数 / (ビンの幅 * サンプル数)

で計算されるので、逆に確率密度関数の値を元のヒストグラムのスケールに合わせるには、

確率密度関数の値 * (ビンの幅 * サンプル数)

としてスケールすればよい。


コードにコメントを入れて整理しました。

このコードの趣旨は、ある分布に従う値をいくつかサンプルしてヒストグラムを作り、そこにその分布の確率密度関数を一緒に描画したら、ヒストグラムでその分布を近似できていることが確認できるという内容だと思います。

python

1import numpy as np 2from matplotlib import pyplot as plt 3 4# 乱数のシード初期化 5np.random.seed(123) 6 7# 標準正規分布に従う観測値を1000個取得する。 8x = np.random.randn(1000) 9 10fig, ax = plt.subplots() 11 12# ヒストグラムを作成する。 13counts, edges, patches = ax.hist(x, bins=25) 14 15# 各ビンの中点 16x_fit = (edges[:-1] + edges[1:]) / 2 17 18 19def pdf(x): 20 """標準正規分布の確率密度関数 21 """ 22 return np.exp(-(x ** 2) / 2) / np.sqrt(2 * np.pi) 23 24 25# 確率密度関数の値をヒストグラムに合わせてスケールする。 26y = 1000 * np.diff(edges) * pdf(x_fit) 27 28ax.plot(x_fit, y) 29plt.show()

投稿2020/09/13 05:49

編集2020/09/13 05:55
tiitoi

総合スコア21956

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

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

0

Python

1y=1000*np.diff(edges)*np.exp(-x_fit**2/2)/np.sqrt(2*np.pi)

1000: 図の大きさに合わせている
np.diff(edges): ヒストグラムの箱の幅を表している

np.exp(-x_fit**2/2)/np.sqrt(2np.pi):正規分布の確率密度関数を表している
ここ複雑ですが1つずつ追ってくとよく見る正規分布の確率密度関数の式ですね
数式だと前後逆転して
1/sqrt(2
π)*exp(-x^2/2)
な感じかと思いますが

c.f. Wikipedia:正規分布

投稿2020/09/13 05:45

aokikenichi

総合スコア2240

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問