Одна возможность получить более гладкие результаты - использовать больше образцов, используя 10^5 samples
и 100 bins
. Я получаю следующие изображения:
ws = norm.rvs(loc=4.0, scale=1.5, size=100000)
density, bins = np.histogram(ws, bins=100, normed=True, density=True)
![CDF POINTS histogram](https://i.stack.imgur.com/NaRiL.pngg)
В общем, вы можете использовать scipys
модуль интерполяции для сглаживания вашего CDF. Для 100 samples
и коэффициента сглаживания s=0.01
я получаю:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import splev, splrep
density1 = unity_density.cumsum()
x = bins[:-1]
y = density1
# Interpolation
spl = splrep(x, y, s=0.01, per=False)
x2 = np.linspace(x[0], x[-1], 200)
y2 = splev(x2, spl)
# Plotting
fig, ax = plt.subplots()
plt.plot(x, density1, 'o')
plt.plot(x2, y2, 'r-')
![CDF of Norm(loc=4, scale=1.5) interpolated](https://i.stack.imgur.com/mR80x.png)
Третья возможность состоит в аналитическом вычислении CDF. Если вы генерируете шум самостоятельно с помощью функции numpy
/ scipy
, большую часть времени уже есть доступная реализация CDF
, в противном случае вы должны найти ее в Википедии. Если ваши образцы взяты из измерений, это, конечно, другая история.
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.linspace(-2, 10)
y = norm(loc=4.0, scale=1.5).cdf(x)
ax.plot(x, y, 'bo-')
![CDF of Norm(loc=4, scale=1.5) analytically](https://i.stack.imgur.com/xZPvz.png)