linspace函数pythonpython概率密度函数参数估计_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 = fit(df)
param_density = 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]]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论