在 Pyro 中,`pyro.sample` 函数用于在模型中进行随机抽样操作,它是构建概率模型的核心部分。当你想要从某个概率分布中抽样,或者当你想要定义模型中一个观测到的数据点时,你会使用到 `pyro.sample`。

以下是 `pyro.sample` 的一些基本用法:

1. **从先验分布抽样**:
   在贝叶斯模型中,你可能会从先验分布中抽样以定义模型的潜在变量。

```python
    # 假设我们有一个先验分布,例如标准正态分布
    z = pyro.sample("latent", dist.Normal(torch.zeros(10), torch.ones(10)))
    ```
  • 1.
  • 2.
  • 3.
  • 4.

2. **定义观测数据**:
   当数据是观测到的,并且你想要在模型中使用这些数据时,你可以使用 `pyro.sample` 并提供观测到的值。

```python
    # 假设 x 是我们观测到的数据
    x_obs = torch.tensor([...])  # 观测数据
    pyro.sample("obs", dist.Normal(z, torch.ones(10)), obs=x_obs)
    ```
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

3. **使用不同的分布**:
   你可以根据模型的需要使用不同的分布,例如伯努利分布、泊松分布等。

```python
    # 假设我们使用伯努利分布来建模二元数据
    pyro.sample("binary_data", dist.Bernoulli(torch.sigmoid(z)), obs=x_binary)
    ```
  • 1.
  • 2.
  • 3.
  • 4.

4. **使用 `pyro.plate` 进行批量处理**:
   当你处理一批数据时,可以使用 `pyro.plate` 来指示 Pyro 这些数据是条件独立的。

```python
    with pyro.plate("data", size=N):
        # 在这里抽样或定义观测数据,Pyro 将利用条件独立性
        pyro.sample("obs", dist.Normal(z, torch.ones(10)), obs=x_obs)
    ```
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

5. **变换分布的形状**:
   使用 `.to_event(1)` 可以改变分布的形状,使其适合多元分布的情况。

```python
    # 将分布视为具有依赖维度的多元分布
    pyro.sample("obs", dist.Normal(z, torch.ones(10)).to_event(1), obs=x_obs)
    ```
  • 1.
  • 2.
  • 3.
  • 4.

6. **使用自定义分布**:
   如果你有自定义的分布,也可以使用 `pyro.sample` 进行抽样。

```python
    class MyCustomDistribution(dist.Distribution):
        # 定义你的分布
        pass   # 实例化你的分布并抽样
    custom_dist = MyCustomDistribution(...)
    pyro.sample("custom", custom_dist)
    ```
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

请注意,`pyro.sample` 的第一个参数是样本点的名称,这有助于在模型中标识这个样本点。第二个参数是你要抽样的分布,第三个参数 `obs` 是可选的,当你有观测数据时提供。如果你不提供 `obs`,则 Pyro 会从分布中随机抽样。如果你提供了 `obs`,则 Pyro 会使用这个观测数据,并在计算对数概率时使用它。