You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python是否有Matlab lhsnorm函数的等效实现?需生成正态分布分层随机样本

Python中实现Matlab lhsnorm的等效分层正态抽样

当然有啦!在Python里,你可以通过几种方式实现和Matlab中lhsnorm完全等效的分层正态抽样功能,下面给你两种实用方案:

方案一:使用pyDOE2库(简单高效)

pyDOE2是专门用于试验设计的Python库,其中的lhs函数可以生成均匀分布的拉丁超立方样本,我们只需要将其转换为正态分布即可,逻辑和Matlab的lhsnorm完全一致。

步骤:

  1. 先安装pyDOE2:
pip install pyDOE2
  1. 实现等效函数(支持独立变量和协方差矩阵两种场景):
import numpy as np
from scipy.stats import norm
from scipy.linalg import cholesky
from pyDOE2 import lhs

def lhsnorm(mu, sigma_or_cov, n):
    dim = len(mu)
    # 生成均匀分布的拉丁超立方样本
    lhs_uniform = lhs(dim, samples=n)
    # 转换为标准正态样本
    lhs_standard = norm.ppf(lhs_uniform)
    
    # 判断输入是标准差向量还是协方差矩阵
    if sigma_or_cov.ndim == 1:
        # 独立变量,直接缩放+平移
        lhs_normal = mu + lhs_standard * sigma_or_cov
    else:
        # 协方差矩阵,通过Cholesky分解转换
        L = cholesky(sigma_or_cov, lower=True)
        lhs_normal = mu + lhs_standard @ L.T
    
    return lhs_normal

# 示例1:独立变量场景
mu = np.array([0, 2])
sigma = np.array([1, 3])
n_samples = 10
sample_independent = lhsnorm(mu, sigma, n_samples)
print("独立变量分层正态样本:\n", sample_independent)

# 示例2:带协方差矩阵的场景
cov_matrix = np.array([[1, 0.4], [0.4, 2]])
sample_cov = lhsnorm(mu, cov_matrix, n_samples)
print("带协方差的分层正态样本:\n", sample_cov)

方案二:手动实现(无需额外第三方库)

如果你不想安装额外库,可以手动实现拉丁超立方抽样的逻辑,再转换为正态分布:

import numpy as np
from scipy.stats import norm
from scipy.linalg import cholesky

def lhsnorm_manual(mu, cov_matrix, n):
    dim = len(mu)
    lhs_uniform = np.zeros((n, dim))
    
    # 生成拉丁超立方均匀样本
    for idx in range(dim):
        # 将[0,1]区间分成n个等宽分块
        bin_edges = np.linspace(0, 1, n + 1)
        # 每个分块内随机取一个点
        lhs_uniform[:, idx] = np.random.uniform(bin_edges[:-1], bin_edges[1:], size=n)
        # 打乱该列数据,保证拉丁超立方的"每层仅取一个样本"特性
        np.random.shuffle(lhs_uniform[:, idx])
    
    # 转换为标准正态分布样本
    lhs_standard = norm.ppf(lhs_uniform)
    # 通过Cholesky分解将标准正态转换为指定协方差的正态分布
    L = cholesky(cov_matrix, lower=True)
    lhs_normal = mu + lhs_standard @ L.T
    
    return lhs_normal

# 示例使用
mu = np.array([1, -1])
cov = np.array([[2, 0.5], [0.5, 1]])
n = 8
sample = lhsnorm_manual(mu, cov, n)
print("手动实现的分层正态样本:\n", sample)

补充说明

Matlab的lhsnorm核心逻辑就是先生成拉丁超立方的均匀分布样本,再通过正态分布的逆累积分布函数(PPF)转换为正态样本,最后处理协方差结构,上面的两种方案完全遵循这个逻辑,和Matlab的输出特性一致。

内容的提问来源于stack exchange,提问作者OKJN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:04:33