- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法让贝叶斯线性回归与 Tensorflow Probability 一起使用。这是我的代码:
!pip install tensorflow==2.0.0-rc1
!pip install tensorflow-probability==0.8.0rc0
import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
tfd = tfp.distributions
N = 20
std = 1
m = np.random.normal(0, scale=5, size=1).astype(np.float32)
b = np.random.normal(0, scale=5, size=1).astype(np.float32)
x = np.linspace(0, 100, N).astype(np.float32)
y = m*x+b+ np.random.normal(loc=0, scale=std, size=N).astype(np.float32)
num_results = 10000
num_burnin_steps = 5000
def joint_log_prob(x, y, m, b, std):
rv_m = tfd.Normal(loc=0, scale=5)
rv_b = tfd.Normal(loc=0, scale=5)
rv_std = tfd.HalfCauchy(loc=0., scale=2.)
y_mu = m*x+b
rv_y = tfd.Normal(loc=y_mu, scale=std)
return (rv_m.log_prob(m) + rv_b.log_prob(b) + rv_std.log_prob(std)
+ tf.reduce_sum(rv_y.log_prob(y)))
# Define a closure over our joint_log_prob.
def target_log_prob_fn(m, b, std):
return joint_log_prob(x, y, m, b, std)
@tf.function(autograph=False)
def do_sampling():
kernel=tfp.mcmc.HamiltonianMonteCarlo(
target_log_prob_fn=target_log_prob_fn,
step_size=0.05,
num_leapfrog_steps=3)
kernel = tfp.mcmc.SimpleStepSizeAdaptation(
inner_kernel=kernel, num_adaptation_steps=int(num_burnin_steps * 0.8))
return tfp.mcmc.sample_chain(
num_results=num_results,
num_burnin_steps=num_burnin_steps,
current_state=[
0.01 * tf.ones([], name='init_m', dtype=tf.float32),
0.01 * tf.ones([], name='init_b', dtype=tf.float32),
1 * tf.ones([], name='init_std', dtype=tf.float32)
],
kernel=kernel,
trace_fn=lambda _, pkr: [pkr.inner_results.accepted_results.step_size,
pkr.inner_results.log_accept_ratio])
samples, [step_size, log_accept_ratio] = do_sampling()
m_posterior, b_posterior, std_posterior = samples
p_accept = tf.reduce_mean(tf.exp(tf.minimum(log_accept_ratio, 0.)))
print('Acceptance rate: {}'.format(p_accept))
n_v = len(samples)
true_values = [m, b, std]
plt.figure()
plt.title('Training data')
plt.plot(x, y)
plt.figure()
plt.title('Visualizing trace and posterior distributions')
for i, (sample, true_value) in enumerate(zip(samples, true_values)):
plt.subplot(2*n_v, 2, 2*i+1)
plt.plot(sample)
plt.subplot(2*n_v, 2, 2*i+2)
plt.hist(sample)
plt.axvline(x=true_value)
>>> Acceptance rate: 0.006775229703634977
有什么想法吗?
最佳答案
令人惊讶的是,这样一个简单的问题竟然如此困难!原始 HMC 在设置推理时可能对相对较小的细节极其敏感。像 Stan 这样的系统尝试通过为您进行大量调整来解决这个问题,但 TFP 的自动调整目前更加基础。
我发现一些更改似乎使推理在这里运行良好。简而言之,它们是:
DualAveragingStepSizeAdaptation
而不是 SimpleStepSizeAdaptation
。第一个技巧是使用 TransformedTransitionKernel
重新参数化,以便比例参数位于不受约束的空间中。例如,我们可以使用 Exp
双射器来定义对数刻度参数:
tfb = tfp.bijectors
kernel = tfp.mcmc.TransformedTransitionKernel(
inner_kernel=kernel,
bijector=[tfb.Identity(), tfb.Identity(), tfb.Exp()]
)
这确保推理仅考虑比例的正值,因此不必拒绝比例低于零的每一个移动。当我这样做时,接受率会大幅上升,尽管混合效果仍然不是很好。
第二个变化是对三个变量使用非均匀步长(这相当于对角线预处理)。看起来这个模型中的后验条件是病态的:二十个数据点确定的斜率比确定截距或尺度更精确。 TFP 中的“步长自适应”只是找到一个步长,以便接受指定百分比的样本,这通常由后验最严格约束的组件控制:如果其他组件具有更宽的后验,小步长将阻止防止它们混合。估计合理步长的一种方法是使用变分推理的标准差和因子正态代理后验:
surrogate_posterior = tfp.experimental.vi.build_factored_surrogate_posterior(
event_shape=[[], [], []],
constraining_bijectors=[None, None, tfb.Exp()])
losses = tfp.vi.fit_surrogate_posterior(
target_log_prob_fn, surrogate_posterior,
optimizer=tf.optimizers.Adam(
learning_rate=0.1,
# Decay second-moment estimates to aid optimizing scale parameters.
beta_2=0.9),
num_steps=1000)
approximate_posterior_stddevs = [np.std(x) for x in surrogate_posterior.sample(50)]
另一个通用技巧是增加蛙跳步数。考虑 HMC 的一种方法是,在蛙跳积分器中,它类似于具有动量的优化器,但每次停止接受/拒绝时,它都会失去动量(通过重新采样)。因此,在极端情况下,我们每一步都这样做(num_leapfrog_steps=1
,即朗之万动力学),没有任何动量,并且增加蛙跳步数往往会提高导航棘手几何图形的能力,类似于动量如何改进优化器。我没有严格调整任何内容,但设置 num_leapfrog_steps=16
而不是 3 似乎在这里有很大帮助。
这是我对您的代码的修改版本,其中包含了这些技巧。它似乎在大多数执行中都混合得很好(尽管我确信它并不完美):
!pip install tensorflow==2.0.0-rc1
!pip install tensorflow-probability==0.8.0rc0
import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
tfd = tfp.distributions
tfb = tfp.bijectors
N = 20
std = 1
m = np.random.normal(0, scale=5, size=1).astype(np.float32)
b = np.random.normal(0, scale=5, size=1).astype(np.float32)
x = np.linspace(0, 100, N).astype(np.float32)
y = m*x+b+ np.random.normal(loc=0, scale=std, size=N).astype(np.float32)
num_results = 1000
num_burnin_steps = 500
def joint_log_prob(x, y, m, b, std):
rv_m = tfd.Normal(loc=0, scale=5)
rv_b = tfd.Normal(loc=0, scale=5)
rv_std = tfd.HalfCauchy(0., scale=1.)
y_mu = m*x+b
rv_y = tfd.Normal(loc=y_mu, scale=rv_std[..., None])
return (rv_m.log_prob(m) + rv_b.log_prob(b)
+ rv_std.log_prob(std)
+ tf.reduce_sum(rv_y.log_prob(y)))
# Define a closure over our joint_log_prob.
def target_log_prob_fn(m, b, std):
return joint_log_prob(x, y, m, b, std)
# Run variational inference to initialize per-variable step sizes.
surrogate_posterior = tfp.experimental.vi.build_factored_surrogate_posterior(
event_shape=[[], [], []],
constraining_bijectors=[None, None, tfb.Exp()])
losses = tfp.vi.fit_surrogate_posterior(
target_log_prob_fn,
surrogate_posterior,
optimizer=tf.optimizers.Adam(
learning_rate=0.1,
# Decay second-moment estimates to aid optimizing scale parameters.
beta_2=0.9),
num_steps=1000)
approximate_posterior_stddevs = [np.std(z) for z in surrogate_posterior.sample(50)]
@tf.function(autograph=False)
def do_sampling():
kernel=tfp.mcmc.HamiltonianMonteCarlo(
target_log_prob_fn=target_log_prob_fn,
step_size=approximate_posterior_stddevs,
num_leapfrog_steps=16)
kernel = tfp.mcmc.TransformedTransitionKernel(
inner_kernel=kernel,
bijector=[tfb.Identity(),
tfb.Identity(),
tfb.Exp()]
)
kernel = tfp.mcmc.DualAveragingStepSizeAdaptation(
inner_kernel=kernel,
num_adaptation_steps=int(num_burnin_steps * 0.8))
return tfp.mcmc.sample_chain(
num_results=num_results,
num_burnin_steps=num_burnin_steps,
current_state=[
0.01 * tf.ones([], name='init_m', dtype=tf.float32),
0.01 * tf.ones([], name='init_b', dtype=tf.float32),
1. * tf.ones([], name='init_std', dtype=tf.float32)
],
kernel=kernel,
trace_fn=lambda _, pkr: [pkr.inner_results.inner_results.accepted_results.step_size,
pkr.inner_results.inner_results.log_accept_ratio])
samples, [step_size, log_accept_ratio] = do_sampling()
m_posterior, b_posterior, std_posterior = samples
p_accept = tf.reduce_mean(tf.exp(tf.minimum(log_accept_ratio, 0.)))
print('Acceptance rate: {}'.format(p_accept))
n_v = len(samples)
true_values = [m, b, std]
plt.figure(figsize=(12, 12))
plt.title('Visualizing trace and posterior distributions')
for i, (sample, true_value) in enumerate(zip(samples, true_values)):
plt.subplot(2*n_v, 2, 2*i+1)
plt.plot(sample)
plt.subplot(2*n_v, 2, 2*i+2)
plt.hist(sample.numpy())
plt.axvline(x=true_value)
关于python - 具有 tensorflow 概率的贝叶斯线性回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59371283/
这是代码片段。 请说出这种用小内存存储大数据的算法是什么。 public static void main(String[] args) { long longValue = 21474836
所以我使用 imap 从 gmail 和 outlook 接收电子邮件。 Gmail 像这样编码 =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpb
很久以前就学会了 C 代码;想用 Scheme 尝试一些新的和不同的东西。我正在尝试制作一个接受两个参数并返回两者中较大者的过程,例如 (define (larger x y) (if (> x
Azure 恢复服务保管库有两个备份配置选项 - LRS 与 GRS 这是一个有关 Azure 恢复服务保管库的问题。 当其驻留区域发生故障时,如何处理启用异地冗余的恢复服务保管库?如果未为恢复服务启
说,我有以下实体: @Entity public class A { @Id @GeneratedValue private Long id; @Embedded private
我有下一个问题。 我有下一个标准: criteria.add(Restrictions.in("entity.otherEntity", getOtherEntitiesList())); 如果我的
如果这是任何类型的重复,我会提前申请,但我找不到任何可以解决我的具体问题的内容。 这是我的程序: import java.util.Random; public class CarnivalGame{
我目前正在使用golang创建一个聚合管道,在其中使用“$ or”运算符查询文档。 结果是一堆需要分组的未分组文档,这样我就可以进入下一阶段,找到两个数据集之间的交集。 然后将其用于在单独的集合中进行
是否可以在正则表达式中创建 OR 条件。 我正在尝试查找包含此类模式的文件名列表的匹配项 第一个案例 xxxxx-hello.file 或者案例二 xxxx-hello-unasigned.file
该程序只是在用户输入行数时创建菱形的形状,因此它有 6 个 for 循环; 3 个循环创建第一个三角形,3 个循环创建另一个三角形,通过这 2 个三角形和 6 个循环,我们得到了一个菱形,这是整个程序
我有一个像这样的查询字符串 www.google.com?Department=Education & Finance&Department=Health 我有这些 li 标签,它们的查询字符串是这样
我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我
我正在寻找一个可以容纳多个键的容器,如果我为其中一个键值输入保留值(例如 0),它会被视为“或”搜索。 map, int > myContainer; myContainer.insert(make_
我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。 作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属
(1) =>CREATE TABLE T1(id BIGSERIAL PRIMARY KEY, name TEXT); CREATE TABLE (2) =>INSERT INTO T1 (name)
我不确定在使用别名时如何解决不明确的列引用。 假设有两个表,a 和 b,它们都有一个 name 列。如果我加入这两个表并为结果添加别名,我不知道如何为这两个表引用 name 列。我已经尝试了一些变体,
我的查询是: select * from table where id IN (1,5,4,3,2) 我想要的与这个顺序完全相同,不是从1...5,而是从1,5,4,3,2。我怎样才能做到这一点? 最
我正在使用 C# 代码执行动态生成的 MySQL 查询。抛出异常: CREATE TABLE dump ("@employee_OID" VARCHAR(50)); "{"You have an er
我有日期 2016-03-30T23:59:59.000000+0000。我可以知道它的格式是什么吗?因为如果我使用 yyyy-MM-dd'T'HH:mm:ss.SSS,它会抛出异常 最佳答案 Sim
我有一个示例模式,它的 SQL Fiddle 如下: http://sqlfiddle.com/#!2/6816b/2 这个 fiddle 只是根据 where 子句中的条件查询示例数据库,如下所示:
我是一名优秀的程序员,十分优秀!