我認為您需要區分非參數密度(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]]