无正态分布假设下如何从给定序列模拟新值?
问题描述
我有如下序列:
series=[0.6, 4.1, 0.6, 6.7, 9.2, 7.6, 5.5, 0.9, 3.8, 8.4]
该序列的mean为4.74,np.std为3.101。
我原本想基于此序列生成1000个观测值,用了以下方法:
>>> series_1000=np.random.normal(4.74, 3.101, size=(1000)) >>> series_1000 >>> array([ 3.43395217, 6.60462489, 5.27316166, 4.20429521, 4.76772334, 8.04441319, -0.6967243 , 0.53378519, 2.1736758 , 9.96333279....
但这个方法基于序列服从正态分布的假设,而我需要一种无需对原序列做任何分布假设的模拟新值的方法。
无分布假设的模拟方法
1. 自助法(Bootstrap)重采样
直接从原序列中有放回地随机抽取样本,完全保留原数据的分布特征,不需要任何分布假设。
代码示例:
import numpy as np series = np.array([0.6, 4.1, 0.6, 6.7, 9.2, 7.6, 5.5, 0.9, 3.8, 8.4]) # 有放回抽取1000个样本 series_1000 = np.random.choice(series, size=1000, replace=True)
- 优点:简单直接,完全复刻原数据的离散分布
- 缺点:生成的新值只能是原序列中已有的数值
2. 核密度估计(KDE)采样
通过核密度估计拟合原序列的概率密度函数,再从这个拟合出的分布中采样,可以生成原序列范围外的新值,同时保留原数据的分布形态。
代码示例:
import numpy as np from scipy.stats import gaussian_kde series = np.array([0.6, 4.1, 0.6, 6.7, 9.2, 7.6, 5.5, 0.9, 3.8, 8.4]) # 拟合核密度模型 kde = gaussian_kde(series) # 生成1000个样本 series_1000 = kde.resample(1000).flatten()
- 优点:可以生成连续的新值,更贴近真实的潜在分布
- 缺点:需选择合适的核函数(默认高斯核适配多数场景),结果受原样本量影响较大
内容的提问来源于stack exchange,提问作者Khaled DELLAL
相关产品推荐
相关产品推荐

