Python中基于拉丁超立方采样(LHS)生成分类变量组合样本
基于拉丁超立方采样生成分类变量组合样本
需求说明
我有3个包含分类值的列表,希望用**拉丁超立方采样(LHS)**生成10组由这三个列表值组合而成的样本数组,无需全因子组合,仅通过LHS随机选取。列表如下:
list_1 = ['a', 'b', 'c', 'd', 'e'] list_2 = [2001, 2002, 2003, 2004] list_3 = ['red', 'green', 'blue', 'yellow']
期望生成类似如下格式的数组:
array([['a', 2001, 'red'], ['b', 2002, 'green'], ['c', 2003, 'blue'], ...])
实现方案
针对分类变量的拉丁超立方采样,可通过将分类值映射为索引区间,再用LHS采样索引的方式实现。以下是Python代码实现:
代码示例
from scipy.stats import qmc import numpy as np # 定义分类列表 list_1 = ['a', 'b', 'c', 'd', 'e'] list_2 = [2001, 2002, 2003, 2004] list_3 = ['red', 'green', 'blue', 'yellow'] # 获取各列表长度 len1, len2, len3 = len(list_1), len(list_2), len(list_3) # 初始化3维度拉丁超立方采样器 sampler = qmc.LatinHypercube(d=3) # 生成10个0-1区间的样本 sample = sampler.random(n=10) # 将采样值映射为对应列表的索引 idx1 = (sample[:, 0] * len1).astype(int) idx2 = (sample[:, 1] * len2).astype(int) idx3 = (sample[:, 2] * len3).astype(int) # 组合成最终样本数组 result = np.array([ [list_1[i], list_2[j], list_3[k]] for i, j, k in zip(idx1, idx2, idx3) ]) # 输出结果 print("生成的LHS样本数组:") print(result)
代码说明
- 借助
scipy.stats.qmc.LatinHypercube生成0-1区间的LHS样本,确保每个维度的采样值均匀覆盖区间,符合拉丁超立方的分层特性。 - 将每个维度的采样值乘以对应分类列表的长度,取整后得到分类值的索引,保证每个分类被选中的概率均匀。
- 通过列表推导式根据索引取出对应分类值,组合成目标格式的数组。
内容的提问来源于stack exchange,提问作者bahar
相关产品推荐
相关产品推荐

