<p>好的,我提供这个作为起点,但是估计密度是一个非常广泛的话题。对于涉及序列中字符数量的情况,我们可以从一个直接的频率学家的角度,使用<em>经验概率</em>对其进行建模。在这里,概率本质上是百分率概念的推广。在我们的模型中,样本空间是离散的,并且都是正整数。好吧,然后你只需计算发生的次数,除以事件总数,就可以得到概率的估计值。在任何观测值为零的地方,我们对概率的估计为零。</p>
<pre><code>>>> samples = [1,1,2,3,2,2,7,8,3,4,1,1,2,6,5,4,8,9,4,3]
>>> from collections import Counter
>>> counts = Counter(samples)
>>> counts
Counter({1: 4, 2: 4, 3: 3, 4: 3, 8: 2, 5: 1, 6: 1, 7: 1, 9: 1})
>>> total = sum(counts.values())
>>> total
20
>>> probability_mass = {k:v/total for k,v in counts.items()}
>>> probability_mass
{1: 0.2, 2: 0.2, 3: 0.15, 4: 0.15, 5: 0.05, 6: 0.05, 7: 0.05, 8: 0.1, 9: 0.05}
>>> probability_mass.get(2,0)
0.2
>>> probability_mass.get(12,0)
0
</code></pre>
<p>现在,对于计时数据,将其建模为连续分布更为自然。不要使用参数化方法假设数据具有某种分布,然后将该分布与数据匹配,而应采用非参数化方法。一个简单的方法是使用<a href="https://en.wikipedia.org/wiki/Kernel_density_estimation" rel="nofollow">kernel density estimate</a>。您可以简单地将其视为平滑直方图的一种方法,以提供连续的概率密度函数。有几个可用的库。对于单变量数据,最直接的方法可能是scipy:</p>
<pre><code>>>> import scipy.stats
>>> kde = scipy.stats.gaussian_kde(samples)
>>> kde.pdf(2)
array([ 0.15086911])
</code></pre>
<p>要获取某个时间间隔内的观测概率:</p>
<pre><code>>>> kde.integrate_box_1d(1,2)
0.13855869478828692
</code></pre>