我正在寻找一个允许我计算随机微积分的python库,比如我将定义扩散的随机过程的(条件)期望.我看了一下simpy(simpy.sourceforge.net),但它似乎并不能满足我的需求.
这是为了快速原型设计和实验.在java中,我使用了一些成功的(现在不活动的)http://martingale.berlios.de/Martingale.html库.
这个问题本身并不困难,但是有许多非常重要的需要做的事情(有效的内存使用,可变减少技术等等).
理想情况下,我可以写这样的东西(只是说明性的):
def my_diffusion(t, dt, past_values, world, **kwargs): W1, W2 = world.correlated_brownians_pair(correlation=kwargs['rho']) X = past_values[-1] sigma_1 = kwargs['sigma1'] sigma_2 = kwargs['sigma2'] dX = kwargs['mu'] * X * dt + sigma_1 * W1 * X * math.sqrt(dt) + sigma_2 * W2 * X * X * math.sqrt(dt) return X + dX X = RandomProcess(diffusion=my_diffusion, x0 = 1.0) print X.expectancy(T=252, dt = 1./252., N_simul= 50000, world=World(random_generator='sobol'), sigma1 = 0.3, sigma2 = 0.01, rho=-0.1)
有人知道别的东西,而不是例如在numpy中重新实现它吗?
是否有一种理智的单元测试随机过程的方法?例如,假设您已为特定系统模型编写了模拟器.模拟器基于rng的种子随机工作,因此无法预测系统的状态,并且如果每次测试都可以在系统尝试测试任何类的方法之前将系统置于特定状态.有一个更好的方法吗?
我想生成一个泊松过程.如果到时间t的到达次数是N(t)并且我有一个带参数λ的泊松分布,我该如何产生N(t)?我将如何在C++中执行此操作?
我原本想用泊松分布生成过程.但是,我对我需要的过程中的参数感到困惑; 我以为我可以使用N(t),但是它告诉我在间隔(0,t)上发生了多少到达,这不是我想要的.所以,我认为我可以使用N(t2)-N(t1) )获得区间[t1,t2]上的到达次数.由于N(t)〜泊松(tx lambda),我可以使用Poisson(t2 x lambda)-Poisson(t1 x lambda)但我不希望一个区间内的到达人数.
相反,我想生成到达时出现的明确时间.
我可以通过使间隔[t2,t1]足够小以使每个间隔只有一个到达(发生为| t2-t1 | - > 0)来做到这一点.
我是PyMC的新手,并尝试使用最大后验估计来拟合我的非齐次泊松过程和分段恒定速率函数.
我的过程描述了一天中的一些事件.因此,我将一天分成24小时,这意味着,我的速率函数中有24个常数(分段常数).
结合以下思路:
我提出了以下一段代码,这是不满意的(结果明智,我确定这是错的):
import numpy as np
import pymc
eventCounter = np.zeros(24) # will be filled with real counts before going on
alpha = 1.0 / eventCounter.mean()
a0 = pymc.Exponential('a0', alpha)
a1 = pymc.Exponential('a1', alpha)
a2 = pymc.Exponential('a2', alpha)
a3 = pymc.Exponential('a3', alpha)
a4 = pymc.Exponential('a4', alpha)
a5 = pymc.Exponential('a5', alpha)
a6 = pymc.Exponential('a6', alpha)
a7 = pymc.Exponential('a7', alpha)
a8 = pymc.Exponential('a8', alpha)
a9 = pymc.Exponential('a9', alpha)
a10 = pymc.Exponential('a10', alpha) …
Run Code Online (Sandbox Code Playgroud) 我有一个随机模型描述了一个过程(Y)在空间和时间的演变.Ds和Dt是空间中的域(具有x和y轴的2D)和时间(具有t轴的1D).该模型通常称为混合效应模型或变异组件模型
我目前正在开发Y如下:
%# Time parameters
T=1:1:20; % input
nT=numel(T);
%# Grid and model parameters
nRow=100;
nCol=100;
[Grid.Nx,Grid.Ny,Grid.Nt] = meshgrid(1:1:nCol,1:1:nRow,T);
xPower=0.1;
tPower=1;
noisePower=1;
detConstant=1;
deterministic_mu = detConstant.*(((Grid.Nt).^tPower)./((Grid.Nx).^xPower));
beta_s = randn(nRow,nCol); % mean-zero random effect representing location specific variability common to all times
gammaTemp = randn(nT,1);
for t = 1:nT
gamma_t(:,:,t) = repmat(gammaTemp(t),nRow,nCol); % mean-zero random effect representing time specific variability common to all locations
end
var=0.1;% noise has variance = 0.1
for t=1:nT
kappa_st(:,:,t) = sqrt(var)*randn(nRow,nCol);
end
for t=1:nT …
Run Code Online (Sandbox Code Playgroud) 问题: 我偶然发现了Fenwick树(二元索引树),它们可以轻松计算累积总和.但是,我只发现了leeves(summands)数量不变的实现(但它们的值可以改变).有没有类似于广义Fenwick树的东西,允许改变leeves(summands)的数量,即具有可变大小?
背景 我正在编写一些随机模拟代码(用C++编写):在一个瓮中有球,每个球我有一定的概率p_i被绘制.在绘图事件中,球被绘制(并被移除)并被具有新概率的两个新球替换(并且相应地重新调整所有概率;我已经有效地"重新缩放",因此不要打扰它).在某些时候,我开始移除球,使得球的数量围绕恒定值(之前已知)波动.为了有效地进行绘图,我想使用二叉树.标准的Fenwick树完全符合我的要求,只是它不允许更改urn中的球数.
典型的数字 从10个球开始,添加球并且一旦有大约1000个就开始移除球,使得在球中有900到1100个球(即球被添加和移除使得数量保持在1000左右).
到目前为止的解决方法 估计所需的最大球数(具有一些安全范围,比如1200个球),并使大小的恒定大小的Fenwick树具有最大概率为0的大部分球被绘制并连续更新.
非常感谢您的帮助!马蒂亚斯
这个问题在参考时是对代码 - 高尔夫挑战的观察.
提交的R解决方案是一个有效的解决方案,但是我们中的一些人(可能只是我)似乎对为什么需要进行初始X=m
重新分配感到茫然.
代码由@Giuseppe高调一点,所以我会给读者写一些评论.
function(m){
X=m
# Re-assign input m as X
while(any(X-(X=X%*%m))) 0
# Instead of doing the meat of the calculation in the code block after `while`
# OP exploited its infinite looping properties to perform the
# calculations within the condition check.
# `-` here is an abuse of inequality check and relies on `any` to coerce
# the numeric to logical. See `as.logical(.Machine$double.xmin)`
# The code basically multiplies the matrix …
Run Code Online (Sandbox Code Playgroud) floating-point r matrix-multiplication stochastic-process stochastic
一头牛正站在无限的篱笆前.另一边是草.奶牛想要去这草.沿着这个栅栏的某个地方是一个洞,母牛可以通过这个洞到达另一侧.从母牛到洞的距离d具有与其相关的概率分布f(d),即孔距离母牛k步的概率由f(k)给出.请注意,我们认为所有距离都是离散的,即它们总是根据母牛所采取的步骤来测量.母牛可以采取负整数步骤以及正整数步骤,即分别向左和向右步进k步.此外,我们知道Σ(k =-∞)^∞| k |⋅f(k)<∞.我们想要描述一种能够找到概率为1的洞的算法.
问题1算法能够以概率1找到孔的充分条件是什么?问题2描述这样的算法.
我读过一些关于使用其他分布对强化学习中的随机策略进行建模的文章。通常我们使用高斯分布,但有些使用 Beta 分布:https://en.wikipedia.org/wiki/Beta_distribution
Tensorflow内部已经有一个Beta分布类,允许人们将其用作Tensor。但对于某些策略梯度方法,他们使用 Kullback Leiber Divergence 对优化过程进行约束。
公式中包含已在 Tensorflow 中实现的 digamma 函数。但我在 Tensorflow 中找不到 beta 函数(也找不到 gamma 函数,因为它们是链接的)。仅记录伽玛或不完整伽玛。我无法使用 scipy.special.beta 函数,因为它无法操纵张量(因为我的 alpha 和 beta 参数是由神经网络生成的)
我在这个领域不够专业,也许我的问题很愚蠢,但我真的很想要一个解释。
多谢
algorithm ×3
c++ ×2
python ×2
random ×2
simulation ×2
geospatial ×1
graph ×1
matlab ×1
mcmc ×1
noise ×1
poisson ×1
probability ×1
pymc ×1
r ×1
statistics ×1
stochastic ×1
stock ×1
temporal ×1
tensorflow ×1
tree ×1
unit-testing ×1