我正在尝试实现一个变化率,我需要来自数组C
的T
个样本,但每个样本具有不同的权重p_t
。
我用的是这个:
import numpy as np
from scipy import stats
batch_size = 1
T = 3
C = np.array(['A', 'B', 'C'])
# p_batch_T dimensions: (batch, sample, class)
p_batch_T = np.array([[[0.01, 0.98, 0.01],
[0.3, 0.15, 0.55],
[0.85, 0.1, 0.05]]])
def variation_ratio(C, p_T):
# This function works only with one sample from the batch.
Y_T = np.array([np.random.choice(C, size=1, p=p_t) for p_t in p_T]) # vectorize this
C_mode, frecuency = stats.mode(Y_T)
T = len(Y_T)
return 1.0 - (f/T)
def variation_ratio_batch(C, p_batch_T):
return np.array([variation_ratio(C, p_T) for p_T in p_batch_T]) # and vectorize this
有没有办法用for来实现这些函数?
4条答案
按热度按时间r7knjye21#
我们可以在
[0,1]
之间均匀抽样,并将其与累积分布进行比较,而不是使用给定分布p_T
进行抽样:让我们从
Y_T
开始,比如说p_T = p_batch_T[0]
现在让我们来看看
variation_ratio_batch
:ozxc1zmp2#
你可以这样做:
首先,创建形状为
(T, len(C))
的二维权重数组,并取累计和:cum_weights
可能如下所示:接下来,我们可以将
cum_weights
与适当大小的np.random.rand
的输出进行比较。通过取argmin
,我们在生成的随机数大于累积权重的每一行中找到索引:然后,我们可以使用
indices
来索引形状为(n_cols,)
的值的数组,在您的原始示例中是len(C)
。o8x7eapl3#
np.vectorize
应该可以工作:然后
赠送
yeotifhr4#
以下是我对Quang‘s和Gmds解决方案的实施:
假设我们有一些东西
和一些权重/抽样概率。
我们想沿着每一行抽样2个元素。那我们就这么做
我们可以使用
np.take_along_axis
从stuff
中检索采样值:代码可以概括为沿着不同于上一个轴的轴进行采样,但我对广播感到困惑,所以应该有人尝试一下!