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

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

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

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

NumPy

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

Python

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

Q&A

解決済

1回答

11465閲覧

matplotlibで正規分布を描きたい

oitjep

総合スコア1

Matplotlib

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

NumPy

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

Python

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

0グッド

0クリップ

投稿2020/09/01 12:13

前提・実現したいこと

matplotlibでデータの分布を混合正規分布を用いてモデル化したいのですが、mlabという関数が使用できなく困っております。
mlabの関数の内容としては、

def normpdf(x, *args): "Return the normal pdf evaluated at *x*; args provides *mu*, *sigma*" mu, sigma = args return 1./(np.sqrt(2*np.pi)*sigma)*np.exp(-0.5 * (1./sigma*(x - mu))**2)

という内容なので、一度関数mlabを使用しているnormを求めるところを書き換えたのですが、上手くいきませんでした。
大変厚かましいですが、解決法をご教授頂きたいです。
よろしくお願いいたします。

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

AttributeError: 'Rectangle' object has no property 'normed'

該当のソースコード

import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab import math def draw_hist(xs, bins): plt.hist(xs, bins=bins, normed=True, alpha=0.5) def predict(data): mu = np.mean(data) var = np.var(data, ddof=1) return mu, var def main(): mu = 3.0 v = 2.0 std = math.sqrt(v) N = 10000 data = np.random.normal(mu, std, N) mu_predicted, var_predicted = predict(data) std_predicted = math.sqrt(var_predicted) print("original: mu={0}, var={1}".format(mu, v)) print(" predict: mu={0}, var={1}".format(mu_predicted, var_predicted)) draw_hist(data, bins=40) xs = np.linspace(min(data), max(data), 200) norm = mlab.normpdf(xs, mu_predicted, std_predicted) plt.plot(xs, norm, color="red") plt.xlim(min(xs), max(xs)) plt.xlabel("x") plt.ylabel("Probability") plt.show() if __name__ == '__main__': main()

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

matplotlib 3.3.0
python 3.8

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

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

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

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

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

guest

回答1

0

ベストアンサー

正規分布の確率密度関数の計算は scipy.stats.norm を使えばよいです。

ヒストグラムの正規化は density=True

diff

1- plt.hist(xs, bins=bins, normed=True, alpha=0.5) 2+ plt.hist(xs, bins=bins, density=True, alpha=0.5)

正規分布の確率密度関数の値の計算は scipy.stats.norm.pdf に置き換え

パラメータの指定方法 scipy.stats.norm(x, loc=μ, scale=σ)

diff

1- norm = mlab.normpdf(xs, mu_predicted, std_predicted) 2- plt.plot(xs, norm, color="red") 3+ ys = norm.pdf(xs, loc=mu_predicted, scale=std_predicted) 4+ plt.plot(xs, ys, color="red")

修正後のコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3from scipy.stats import norm 4import math 5 6 7def draw_hist(xs, bins): 8 plt.hist(xs, bins=bins, density=True, alpha=0.5) 9 10 11def predict(data): 12 mu = np.mean(data) 13 var = np.var(data, ddof=1) 14 return mu, var 15 16 17def main(): 18 mu = 3.0 19 v = 2.0 20 std = math.sqrt(v) 21 N = 10000 22 data = np.random.normal(mu, std, N) 23 mu_predicted, var_predicted = predict(data) 24 std_predicted = math.sqrt(var_predicted) 25 print("original: mu={0}, var={1}".format(mu, v)) 26 print(" predict: mu={0}, var={1}".format(mu_predicted, var_predicted)) 27 28 draw_hist(data, bins=40) 29 xs = np.linspace(min(data), max(data), 200) 30 31 ys = norm.pdf(xs, loc=mu_predicted, scale=std_predicted) 32 plt.plot(xs, ys, color="red") 33 plt.xlim(min(xs), max(xs)) 34 plt.xlabel("x") 35 plt.ylabel("Probability") 36 plt.show() 37 38 39if __name__ == "__main__": 40 main()

イメージ説明

投稿2020/09/01 12:39

編集2020/09/01 12:43
tiitoi

総合スコア21956

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

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

oitjep

2020/09/02 06:22

scipyを利用すればよいのですね...よくわかりました。 教えて頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問