天天看點

python機率密度函數參數估計_python – 如何估算密度函數并計算其峰值?

我認為您需要區分非參數密度(scipy.stats.kde中實作的密度)與參數密度(您提到的

StackOverflow question中的密度).為了說明這兩者之間的差別,請嘗試以下代碼.

import pandas as pd

import numpy as np

import scipy.stats as stats

import matplotlib.pyplot as plt

np.random.seed(0)

gaussian1 = -6 + 3 * np.random.randn(1700)

gaussian2 = 4 + 1.5 * np.random.randn(300)

gaussian_mixture = np.hstack([gaussian1, gaussian2])

df = pd.DataFrame(gaussian_mixture, columns=['data'])

# non-parametric pdf

nparam_density = stats.kde.gaussian_kde(df.values.ravel())

x = np.linspace(-20, 10, 200)

nparam_density = nparam_density(x)

# parametric fit: assume normal distribution

loc_param, scale_param = stats.norm.fit(df)

param_density = stats.norm.pdf(x, loc=loc_param, scale=scale_param)

fig, ax = plt.subplots(figsize=(10, 6))

ax.hist(df.values, bins=30, normed=True)

ax.plot(x, nparam_density, 'r-', label='non-parametric density (smoothed by Gaussian kernel)')

ax.plot(x, param_density, 'k--', label='parametric density')

ax.set_ylim([0, 0.15])

ax.legend(loc='best')

從圖中我們可以看出,非參數密度隻不過是直方圖的平滑版本.在直方圖中,對于特定觀察x = x0,我們使用條形來表示它(将所有機率品質放在該單個點x = x0而在其他地方為零),而在非參數密度估計中,我們使用鐘形曲線(高斯核心)代表那個點(在其鄰域上傳播).結果是平滑的密度曲線.這個内部高斯核心與您對基礎資料x的分布式假設無關.它的唯一目的是平滑.

為了獲得非參數密度模式,我們需要進行詳盡的搜尋,因為密度不能保證具有單模.如上例所示,如果準牛頓優化算法在[5,10]之間開始,則很可能最終得到局部最優點而不是全局點.

# get mode: exhastive search

x[np.argsort(nparam_density)[-1]]