如何调整scipy.stats.randint的步长以生成更大步进的离散均匀分布
步长大于1的冻结离散均匀分布scipy实现方案
可以通过scipy直接实现该需求,效果和hyperopt的hp.uniformint完全匹配,兼容scipy原生stats.randint的使用习惯。
实现原理
hp.uniformint的本质是生成取值为 low, low+q, low+2q,... ≤high的等概率离散值,我们可以对scipy的stats.randint做线性变换实现该逻辑,同时支持冻结分布操作。
代码示例
以生成步长为2、取值范围为[2,10](取值为2、4、6、8、10)的冻结分布为例:
from scipy.stats import randint # 自定义参数 low = 2 # 最小值 high = 10 # 最大值 q = 2 # 步长 # 计算映射用的randint区间长度 n = int((high - low) / q) + 1 # 生成冻结分布 frozen_qrandint = low + q * randint(0, n)
功能验证
生成的冻结分布支持scipy分布的所有原生API,符合使用预期:
- 生成随机样本:调用
frozen_qrandint.rvs(10)可生成10个符合分布的随机值,所有值均为目标区间内步长对齐的整数,且各取值概率均等 - 计算概率质量:调用
frozen_qrandint.pmf(4)返回值为0.2,对应5个取值各20%的概率 - 计算累计分布:调用
frozen_qrandint.cdf(6)返回值为0.6,对应小于等于6的取值共3个,占总取值数的60%
注意事项
- 需确保
(high - low)可以被步长q整除,避免出现无法取到high边界值的情况,若不能整除可自行调整high为区间内最大符合步长对齐规则的值 - 该实现完全兼容scipy冻结分布的所有接口,和原生
stats.randint用法一致,无需额外适配
内容的提问来源于stack exchange,提问作者abdelgha4
相关产品推荐
相关产品推荐

