web-dev-qa-db-ja.com

matplotlibを使用したサンプルによる確率密度関数のプロット

私が持っているサンプルに基づいて確率密度関数の近似値をプロットしたい。ヒストグラムの動作を模倣する曲線。必要なだけサンプルを作成できます。

20
Cupitor

分布をプロットしたい場合は、それを関数として定義し、次のようにプロットします。

import numpy as np
from matplotlib import pyplot as plt

def my_dist(x):
    return np.exp(-x ** 2)

x = np.arange(-100, 100)
p = my_dist(x)
plt.plot(x, p)
plt.show()

分析関数として正確な分布がない場合は、おそらく大きなサンプルを生成し、ヒストグラムを取得して、何らかの方法でデータを平滑化できます。

import numpy as np
from scipy.interpolate import UnivariateSpline
from matplotlib import pyplot as plt

N = 1000
n = N//10
s = np.random.normal(size=N)   # generate your data sample with N elements
p, x = np.histogram(s, bins=n) # bin it into n = N//10 bins
x = x[:-1] + (x[1] - x[0])/2   # convert bin edges to centers
f = UnivariateSpline(x, p, s=n)
plt.plot(x, f(x))
plt.show()

s関数呼び出し内でUnivariateSpline(平滑化係数)を増減して、平滑化を増減できます。たとえば、次の2つを使用すると: dist to func

31
askewchan

Scipy.stats.kdeパッケージのgaussian_kdeを使用する必要があります。

データが与えられると、次のようなことができます。

from scipy.stats.kde import gaussian_kde
from numpy import linspace
# create fake data
data = randn(1000)
# this create the kernel, given an array it will estimate the probability over that values
kde = gaussian_kde( data )
# these are the values over wich your kernel will be evaluated
dist_space = linspace( min(data), max(data), 100 )
# plot the results
plt.plot( dist_space, kde(dist_space) )

カーネル密度は自由に設定でき、N次元データを簡単に処理できます。また、askewchanによって与えられたプロットで見ることができるスプライン歪みを回避します。

enter image description here

23
EnricoGiampieri