一个以用户为中心的可微概率推理python包

brancher的Python项目详细描述


brancher:一个以用户为中心的可微概率推理python包

brancher允许使用随机变分推理设计和训练可微贝叶斯模型。Brancher基于深度学习框架Pythorch。

建立概率模型

概率模型的定义是象征性的。随机变量可以创建如下:

a=NormalVariable(loc=0.,scale=1.,name='a')b=NormalVariable(loc=0.,scale=1.,name='b')

通过使用算术和数学函数可以将随机变量连在一起:

c=NormalVariable(loc=a**2+BF.sin(b),scale=BF.exp(b),name='a')

这样,就有可能建立任意的复杂概率模型。还可以使用pytorch的所有深度学习工具来定义具有深度神经网络的概率模型。

示例:自回归建模

概率模型

概率模型的定义是象征性的:

T=20driving_noise=1.measure_noise=0.3x0=NormalVariable(0.,driving_noise,'x0')y0=NormalVariable(x0,measure_noise,'x0')b=LogitNormalVariable(0.5,1.,'b')x=[x0]y=[y0]x_names=["x0"]y_names=["y0"]fortinrange(1,T):x_names.append("x{}".format(t))y_names.append("y{}".format(t))x.append(NormalVariable(b*x[t-1],driving_noise,x_names[t]))y.append(NormalVariable(x[t],measure_noise,y_names[t]))AR_model=ProbabilisticModel(x+y)

观察数据

一旦定义了概率模型,我们就可以决定观察到哪个变量:

[yt.observe(data[yt][:,0,:])forytiny]

自回归变分分布

变分分布可以具有任意结构:

Qb=LogitNormalVariable(0.5,0.5,"b",learnable=True)logit_b_post=DeterministicVariable(0.,'logit_b_post',learnable=True)Qx=[NormalVariable(0.,1.,'x0',learnable=True)]Qx_mean=[DeterministicVariable(0.,'x0_mean',learnable=True)]fortinrange(1,T):Qx_mean.append(DeterministicVariable(0.,x_names[t]+"_mean",learnable=True))Qx.append(NormalVariable(BF.sigmoid(logit_b_post)*Qx[t-1]+Qx_mean[t],1.,x_names[t],learnable=True))variational_posterior=ProbabilisticModel([Qb]+Qx)model.set_posterior_model(variational_posterior)

推断

现在,我们指定了模型,我们可以使用随机梯度下降进行近似推理:

inference.perform_inference(AR_model,number_iterations=500,number_samples=300,optimizer="SGD",lr=0.001)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java连接在一个屏幕上成功下载,在第二个屏幕上用几乎相同的代码获得错误   java调用super。超级的方法,跳过超级。方法   使用Web服务连接到sharepoint 2013的Java应用程序   java我无法正确呈现editText   httpurlconnection如何在java中检查url连接状态   java Spring Security可以为同一用户接受多个密码吗?   java如何在PreparedStatement中使用自动生成的@Id?   java每个数组表示一个位模式   java我不确定如何记录鼠标在某个区域被点击的次数   spring如何解决:java。lang.NoSuchMethodError:javax。坚持不懈实体管理器。createStoredProcedureQuery(Ljava/lang/String;)   java如何为blackberry中listfield项内的不同字段触发事件   安卓使用Proguard混淆java代码   java在grails 2中与多个数据源有一个和一个域关联。十、   java在尝试在单击按钮时返回combobox值时一直出错   java我可以在setter中使用@Resource注释而不是字段吗?   java Eclipse调试步进不工作   java比较相同对象的两个表并选择不同的表