multinomial采样
时间: 2023-09-04 12:02:52 浏览: 441
多项式采样(Multinomial Sampling)是一种用来从多项式分布中进行随机抽样的方法。多项式分布是一种离散概率分布,用于描述多个不同类别的事件发生的概率分布情况。
多项式采样的过程如下:首先,确定待抽样的类别数量和每个类别的概率分布。然后,通过生成一个0到1之间的随机数来确定抽样的类别。随机数的生成可以使用各种随机数发生器,如均匀分布随机数发生器。根据随机数的大小与类别的累计概率比较,即可确定实际抽样的类别。
具体步骤如下:
1. 确定类别数量n和每个类别的概率分布。
2. 计算类别的累计概率分布。
3. 生成一个0到1之间的随机数r。
4. 依次比较随机数r与每个类别的累计概率,直到找到第一个比r大的类别对应的索引i。
5. 抽样结果即为第i个类别。
多项式采样广泛应用于机器学习、统计学和自然语言处理等领域。例如,在文本生成任务中,可以使用多项式采样来从一个词汇表中生成下一个单词,其中每个单词都具有一个对应的概率。多项式采样能够在一定程度上模拟真实情况下的随机性抽样,使得生成的结果更加多样化和逼真。
相关问题
counts = multinomial.Multinomial(10, fair_probs).sample((500,)) cum_counts = counts.cumsum(dim=0)
这是使用 PyTorch 中的 multinomial 函数生成 500 个样本,每个样本都是从一个大小为 10 的多项式分布中随机采样得到的。fair_probs 是一个包含每个类别出现概率的张量。cum_counts 是一个包含每个样本的累计计数的张量。在这个张量中,每一行的第 i 个元素表示前 i 个样本中第一个出现类别 j 的位置。
粒子滤波算法重采样方法
### 粒子滤波算法中的重采样方法
#### Multinomial Resampling 多项式重采样
多项式重采样的基本思想是从给定的概率分布中随机抽取样本。具体来说,该方法按照粒子的权重作为概率来抽选新的粒子集。这种方法简单易懂,但在某些情况下效率较低,因为可能会重复选取相同的高权重粒子。
```python
import numpy as np
def multinomial_resample(weights):
n = len(weights)
indices = np.random.choice(n, size=n, p=weights)
return indices
```
[^1]
#### Residual Resampling 剩余重采样
剩余重采样旨在提高效率并减少方差。它首先分配整数数量的新副本给每个粒子,基于其标准化后的权重向下取整的结果;然后对于剩下的部分通过随机抽样补充不足的数量。这种方式减少了完全依赖于随机性的成分。
```python
def residual_resample(weights):
n = len(weights)
new_indices = []
num_copies = (np.floor(n * weights)).astype(int)
for i in range(len(num_copies)):
new_indices.extend([i]*num_copies[i])
resampled_count = len(new_indices)
remaining_weights = weights - num_copies / float(n)
normalized_remaining_weights = remaining_weights / sum(remaining_weights)
additional_samples_needed = n - resampled_count
if additional_samples_needed > 0:
extra_indices = np.random.choice(
n,
size=int(additional_samples_needed),
replace=False,
p=normalized_remaining_weights
)
new_indices.extend(extra_indices.tolist())
return new_indices
```
#### Stratified Sampling 分层重采样
分层重采样将区间 `[0,1)` 划分成 N 个均匀的小段,在每一段内独立地按比例选择一个位置来进行采样。这样做的好处是可以保证所选出的样本更加均匀分布在原空间上,从而可能获得更好的估计精度。
```python
def stratified_sampling(weights):
n = len(weights)
positions = (np.arange(n) + np.random.uniform(size=n)) / n
cumulative_sum = np.cumsum(weights)
indexes = []
i, j = 0, 0
while i < n and j < n:
if positions[j] < cumulative_sum[i]:
indexes.append(i)
j += 1
else:
i += 1
return indexes or list(range(n))
```
#### Systematic Resampling 系统重采样
系统重采样类似于分层重采样,区别在于只生成单一起始点 U 并依次加上间隔 `1/N` 来决定各个区间的边界。这种做法不仅保持了分层的优点而且计算成本更低廉。
```python
def systematic_resample(weights):
n = len(weights)
u0 = np.random.rand() / n
u = [u0 + k/n for k in range(n)]
cdf = np.cumsum(weights)
indexes = []
for ui in u:
idx = next((j for j, v in enumerate(cdf) if v >= ui), None)
if idx is not None:
indexes.append(idx)
return indexes[:n]
```
阅读全文