寻求Python中tms-NET采样实现及数据采样适配问题解决方案
问题解决方案
关于(t,m,s)-Nets的Python实现
目前Python生态里没有广泛维护的(t,m,s)-Nets现成实现,但可以基于其核心逻辑用现有工具替代或简化实现:
- 优先考虑用
scipy.stats.qmc中的Sobol序列——它属于(t,m,s)-Nets的特例,能满足高维数据下提升样本代表性的需求,且官方维护稳定性强。 - 两种使用方式的示例代码:
- 直接生成匹配数据尺度的低差异样本
import numpy as np from scipy.stats import qmc # 假设剩余数据X形状为(n_samples, 100) X_remaining = np.random.uniform(0, 1000, size=(1000, 100)) num_sample = 50 # 计划采样数量 # 初始化采样器,维度匹配embedding_dimensions=100 sampler = qmc.Sobol(d=100, scramble=True) # 生成[0,1)范围样本后,缩放至你的数据区间[0,1000] sobol_samples = sampler.random(n=num_sample) * 1000- 从现有剩余数据中筛选最接近低差异点的样本(保留真实数据分布)
from sklearn.neighbors import KDTree # 基于上面生成的sobol_samples,用KDTree快速查找近邻 tree = KDTree(X_remaining) _, indices = tree.query(sobol_samples, k=1) selected_samples = X_remaining[indices.flatten()]
解决pyDOE2 LHS采样尺度不匹配问题
pyDOE2的lhs函数默认输出[0,1)范围的样本,必须手动缩放至你的数据区间[0,1000]:
from pyDOE2 import lhs # 生成100维、50个样本的LHS数据 lhs_raw = lhs(100, samples=50) # 缩放至目标尺度 scaled_lhs = lhs_raw * 1000
如果缩放后仍集中在0附近,先检查原始数据X是否本身在0区域分布密集。若原始数据分布不均,可先对数据做分位数转换(映射到均匀分布),再做LHS采样,最后映射回原尺度。
采样流程思路验证
你的流程逻辑是合理的:
- 剩余数据为空时,训练集即为完整数据,符合代表性要求;
- 有剩余数据时,用(t,m,s)-Nets这类低差异序列补充采样,在100维高维场景下,能比随机采样更均匀覆盖数据空间,有效提升样本代表性。
- 补充建议:如果需求是从现有数据中选样本而非生成新数据,用低差异序列的点作为锚点查找近邻的方式,既能利用低差异序列的均匀性,又能保留原始数据的真实分布特征。
内容的提问来源于stack exchange,提问作者Nuntea7
相关产品推荐
相关产品推荐

