Python 如何用指数核绘制泊松过程
我想在给定的时间窗口中模拟具有指数核的泊松过程的时间。我有下面的代码,它可以工作,但很可怕Python 如何用指数核绘制泊松过程,python,math,matplotlib,scipy,statsmodels,Python,Math,Matplotlib,Scipy,Statsmodels,我想在给定的时间窗口中模拟具有指数核的泊松过程的时间。我有下面的代码,它可以工作,但很可怕 # Attempt to simulate a Poisson process. import random import matplotlib.pyplot as plt t = 0 rate = 5 timeinterval = 100 t = int(100*random.expovariate(rate)) times=[] while (t < timeinterval): tim
# Attempt to simulate a Poisson process.
import random
import matplotlib.pyplot as plt
t = 0
rate = 5
timeinterval = 100
t = int(100*random.expovariate(rate))
times=[]
while (t < timeinterval):
times.append(t)
print t
t+= int(100*random.expovariate(rate))
print times
s = [0]*100
a=0.5
for i in xrange(len(s)):
s[i] = int(i-1 in times) + (1-a) * s[i-1]
plt.plot(s)
plt.show()
尝试模拟泊松过程。
随机输入
将matplotlib.pyplot作为plt导入
t=0
费率=5
时间间隔=100
t=int(100*随机指数变量(速率))
时间=[]
而(t<时间间隔):
倍。追加(t)
打印t
t+=int(100*随机指数变量(速率))
印刷时间
s=[0]*100
a=0.5
对于x范围内的i(len(s)):
s[i]=int(i-1倍)+(1-a)*s[i-1]
小幅图(s)
plt.show()
如何避免代码中的混乱
例如,我乘以100并使用int,这样我就可以绘制数据。理想情况下我不会那样做
在一个相关的注释中,我希望时间间隔是1而不是100(去掉了所有*100部分的代码),但是我看不到如何绘制结果
产生这些乱码的主要原因是通过对尖峰的时间进行采样来解决问题,但由于希望它们衰减,因此需要将它们强制放置在网格上 因此,我建议从一个网格开始,计算尖峰出现的概率。然后您可以同时衰减信号:
import random
import matplotlib.pyplot as plt
from numpy import linspace, exp
random.seed(123)
t0 = 0
t1 = 1
times = linspace(t0, t1, 1000)
dt = times[1] - times[0]
result = []
s = 0
decay = 0.01 # decay to 1/e after this time
lambd = 0.2 # expect roughly one spike each timeinterval lambd
n = 0
for t in times:
if random.random() > exp(-dt/lambd): # actually random.random() < 1 - exp(-dt/lambd)
s += 1.0
n += 1
s = s * exp(-dt/decay)
result.append(s)
print "number of observed spikes=%i expected mean=%f" % (n, (t1-t0)/lambd)
plt.figure(figsize=(6,4))
plt.plot(times, result)
plt.savefig("process.png")
plt.show()
这里我还交换了衰减和尖峰生成,所以它们从
1
开始,为什么要绘制衰减?你可以在特定的时间t使用vline。那么也没有理由将时间转换为整数网格。@user333700我想将延迟可视化。最后,我将在图表中添加其他内容,并查看它们如何与延迟相交。但是,可以使用任意规则间距的栅格,而不是整数栅格。例如,如果将次
四舍五入为2位小数,则可以在单位间隔0,0.01,…,1中构建一个包含100个时间点的网格。
rate = 1.0/lambd
tspike = t0 + random.expovariate(rate)
for t in times:
s = s * exp(-dt/decay)
if t > tspike:
s += 1.0
n += 1
tspike = t + random.expovariate(rate)
result.append(s)