如何生成指定范围内偏向特定点的数值序列?
生成集中在指定点的非均匀数值序列
要生成指定范围内(如0-10)、集中在某点(端点或中间值)的N个数值,linspace和logspace这类生成等间隔序列的工具并不适用——前者是线性均匀分布,后者是对数尺度均匀分布,都无法实现“集中在某点”的需求。你可以通过随机分布采样或对均匀序列做非线性变换来实现,以下是具体方案:
1. 集中在端点(以靠近10为例)
方法一:指数分布反转缩放
指数分布天然偏向小值,反转后可让数值集中在大值端,再缩放至目标范围:
import numpy as np N = 1000 # 生成指数分布样本,反转后缩放至0-10,过滤负数 samples = 10 - np.random.exponential(scale=1, size=N) samples = samples[samples >= 0]
方法二:Beta分布调整参数
Beta分布的输出范围是0-1,通过调整参数a和b控制偏向性:a > b时偏向0,a < b时偏向1,再缩放至目标范围:
# 生成偏向10的样本(Beta(a=1, b=5)偏向1,乘10后靠近10) samples = 10 * np.random.beta(a=1, b=5, size=N)
2. 集中在中间指定点(以8.5为例)
方法一:正态分布截断
正态分布的数值会集中在均值附近,设置均值为目标点,配合小标准差,再截断到0-10范围:
mean = 8.5 std_dev = 1 # 标准差越小,数值越集中 samples = np.random.normal(loc=mean, scale=std_dev, size=N) # 把超出0-10的数值截断到区间内 samples = np.clip(samples, 0, 10)
方法二:拉普拉斯分布
拉普拉斯分布比正态分布的峰值更尖锐,数值会更集中在均值附近:
samples = np.random.laplace(loc=mean, scale=0.5, size=N) samples = np.clip(samples, 0, 10)
3. 确定性非均匀序列(非随机)
如果需要固定的非均匀序列(不是随机样本),可以对linspace生成的均匀序列做非线性变换,让数值集中在目标点:
# 生成0-1的均匀序列,通过变换让数值集中在10附近 uniform = np.linspace(0, 1, N) # (1 - uniform)**2会让数值偏向0,取1减去后再乘10就偏向10 samples = 10 * (1 - (1 - uniform)**2)
关于logspace的补充
logspace(a, b, N)生成的是对数尺度上的均匀序列,所以np.log10(np.logspace(0,10,N))会得到均匀分布,这是它的设计特性,适合生成跨越多个数量级的数值,但无法直接用来生成集中在某点的分布。
内容的提问来源于stack exchange,提问作者sage
相关产品推荐
相关产品推荐

