拉丁超立方抽样(Latin Hypercube Sampling, LHS)MATLAB实现

"超拉丁立方抽样"通常指拉丁超立方抽样(LHS) 或其高级变种(如正交拉丁超立方抽样)。LHS是一种高效的实验设计方法,通过分层抽样确保样本在空间中的均匀覆盖,适用于高维参数空间的抽样问题。以下是完整的MATLAB实现,包括基础LHS、优化变种(最大化最小距离、最小化相关性)、正交LHS及可视化分析。

一、基础拉丁超立方抽样(LHS)

1.1 核心原理

将每个维度的取值范围划分为n个等概率区间,在每个区间内随机抽取1个样本,再对各维度样本随机排列,确保样本点在空间中均匀分布。

1.2 基础实现代码

matlab 复制代码
function samples = lhs_basic(n, d, bounds)
    % 基础拉丁超立方抽样
    % 输入:
    %   n: 样本数量
    %   d: 维度
    %   bounds: 变量边界 (d×2矩阵,每行[min, max])
    % 输出:
    %   samples: n×d样本矩阵
    
    % 处理边界(默认[0,1])
    if nargin < 3, bounds = zeros(d,2) + [0,1]; end
    if size(bounds,1)==1, bounds = repmat(bounds, d, 1); end
    
    samples = zeros(n, d);
    for i = 1:d
        % 1. 将区间[0,1]分为n等份
        intervals = linspace(0, 1, n+1);
        % 2. 每个区间随机取1点
        points = intervals(1:end-1) + diff(intervals)/2 + (rand(1,n)-0.5)*diff(intervals);
        % 3. 随机排列
        samples(:,i) = points(randperm(n))';
        % 4. 缩放到实际边界
        samples(:,i) = bounds(i,1) + samples(:,i)*(bounds(i,2)-bounds(i,1));
    end
end

二、优化拉丁超立方抽样(OLHS)

2.1 最大化最小距离(Maximin LHS)

通过优化样本点布局,最大化任意两点间的最小欧氏距离,提升空间填充性。

matlab 复制代码
function samples = lhs_maximin(n, d, bounds, max_iter)
    % 最大化最小距离的LHS
    if nargin < 4, max_iter = 1000; end
    samples = lhs_basic(n, d, bounds);  % 初始样本
    [~, d_min] = min(pdist(samples));  % 初始最小距离
    
    for iter = 1:max_iter
        % 随机交换两个样本的某个维度值
        i1 = randi(n); i2 = randi(n); j = randi(d);
        temp = samples(i1,j);
        samples(i1,j) = samples(i2,j);
        samples(i2,j) = temp;
        
        % 计算新最小距离
        new_d_min = min(pdist(samples));
        if new_d_min > d_min
            d_min = new_d_min;  % 接受改进
        else
            % 恢复原样本
            samples(i2,j) = samples(i1,j);
            samples(i1,j) = temp;
        end
    end
end

2.2 最小化相关性(MinCorr LHS)

通过优化样本点布局,最小化各维度间的 Pearson 相关性,提升样本独立性。

matlab 复制代码
function samples = lhs_mincorr(n, d, bounds, max_iter)
    % 最小化相关性的LHS
    if nargin < 4, max_iter = 1000; end
    samples = lhs_basic(n, d, bounds);
    corr_init = mean(abs(corr(samples)-eye(d)), 'all');  % 初始相关性
    
    for iter = 1:max_iter
        i1 = randi(n); i2 = randi(n); j = randi(d);
        temp = samples(i1,j);
        samples(i1,j) = samples(i2,j);
        samples(i2,j) = temp;
        
        new_corr = mean(abs(corr(samples)-eye(d)), 'all');
        if new_corr < corr_init
            corr_init = new_corr;
        else
            samples(i2,j) = samples(i1,j);
            samples(i1,j) = temp;
        end
    end
end

2.3 正交拉丁超立方抽样(OLHS)

在LHS基础上引入正交性约束,确保样本点在各维度上的投影均匀且相互独立,适用于高维空间的高效抽样。

matlab 复制代码
function samples = lhs_orthogonal(n, d, bounds)
    % 正交拉丁超立方抽样(简化实现)
    % 基于Plackett-Burman设计的改进LHS
    if d < 2, error('维度至少为2'); end
    if n < d, error('样本数至少为维度'); end
    
    % 1. 生成基础LHS
    base_samples = lhs_basic(n, d, [0,1]);
    
    % 2. 正交化处理(Gram-Schmidt)
    ortho_samples = zeros(n, d);
    ortho_samples(:,1) = base_samples(:,1);
    for i = 2:d
        proj = ortho_samples(:,1:i-1) * (ortho_samples(:,1:i-1)' * base_samples(:,i)) / ...
               diag(ortho_samples(:,1:i-1)' * ortho_samples(:,1:i-1));
        ortho_samples(:,i) = base_samples(:,i) - proj;
    end
    
    % 3. 归一化并缩放到边界
    samples = ortho_samples ./ vecnorm(ortho_samples, 2, 2);  % 单位化
    for i = 1:d
        samples(:,i) = bounds(i,1) + (samples(:,i)+1)/2*(bounds(i,2)-bounds(i,1));
    end
end

三、可视化与评估

3.1 样本空间分布可视化

matlab 复制代码
function plot_lhs(samples, bounds, title_str)
    % 可视化2D/3D LHS样本
    [n, d] = size(samples);
    figure;
    if d == 2
        scatter(samples(:,1), samples(:,2), 50, 'filled');
        xlabel('维度1'); ylabel('维度2');
        title(title_str);
        grid on; axis equal;
        xlim(bounds(1,:)); ylim(bounds(2,:));
    elseif d == 3
        scatter3(samples(:,1), samples(:,2), samples(:,3), 50, 'filled');
        xlabel('维度1'); ylabel('维度2'); zlabel('维度3');
        title(title_str);
        grid on; axis equal;
    else
        % 高维:显示前2维+相关矩阵
        subplot(1,2,1);
        scatter(samples(:,1), samples(:,2), 50, 'filled');
        xlabel('维度1'); ylabel('维度2'); title('前2维分布');
        subplot(1,2,2);
        imagesc(corr(samples)); colorbar; title('维度相关性');
    end
end

3.2 抽样质量评估

matlab 复制代码
function evaluate_lhs(samples)
    % 评估LHS样本质量
    [n, d] = size(samples);
    metrics = struct();
    
    % 1. 最小距离(空间填充性)
    metrics.min_dist = min(pdist(samples));
    % 2. 平均距离
    metrics.mean_dist = mean(pdist(samples));
    % 3. 相关性(越小越好)
    metrics.corr = mean(abs(corr(samples)-eye(d)), 'all');
    % 4. 边际分布均匀性(K-S检验)
    metrics.ks_p = mean(cellfun(@(x) kstest(x), num2cell(samples,1)));
    
    disp('LHS质量评估:');
    disp(['最小距离: ', num2str(metrics.min_dist)]);
    disp(['平均距离: ', num2str(metrics.mean_dist)]);
    disp(['平均相关性: ', num2str(metrics.corr)]);
    disp(['K-S检验p值: ', num2str(metrics.ks_p)]);
end

参考代码 超拉丁立方抽样matlab-latin-sampling www.youwenfan.com/contentcst/160563.html

四、应用示例

4.1 基础LHS使用

matlab 复制代码
% 参数设置
n = 50;          % 样本数
d = 2;           % 维度
bounds = [0,10;   % 维度1范围
          0,5];   % 维度2范围

% 生成LHS样本
samples = lhs_basic(n, d, bounds);

% 可视化与评估
plot_lhs(samples, bounds, '基础LHS样本分布');
evaluate_lhs(samples);

4.2 优化LHS对比

matlab 复制代码
% 生成不同LHS样本
samples_basic = lhs_basic(n, d, bounds);
samples_maximin = lhs_maximin(n, d, bounds, 1000);
samples_mincorr = lhs_mincorr(n, d, bounds, 1000);
samples_olhs = lhs_orthogonal(n, d, bounds);

% 对比可视化
figure;
subplot(2,2,1); plot_lhs(samples_basic, bounds, '基础LHS');
subplot(2,2,2); plot_lhs(samples_maximin, bounds, 'Maximin LHS');
subplot(2,2,3); plot_lhs(samples_mincorr, bounds, 'MinCorr LHS');
subplot(2,2,4); plot_lhs(samples_olhs, bounds, '正交LHS');

4.3 高维LHS应用(5维参数空间)

matlab 复制代码
% 5维参数,100样本
n = 100; d = 5;
bounds = [0,1; 0,1; 0,1; 0,1; 0,1];  % 5维[0,1]边界
samples = lhs_orthogonal(n, d, bounds);

% 评估高维LHS
evaluate_lhs(samples);

五、关键优势与应用场景

  1. 高效性:用少量样本覆盖高维空间,优于随机抽样;
  2. 均匀性:通过分层抽样避免样本聚集;
  3. 灵活性:可结合优化准则(如Maximin、MinCorr)提升性能。

应用场景

  • 实验设计(DOE)、不确定性量化(UQ)、机器学习超参数调优、蒙特卡洛模拟等。
相关推荐
sycmancia7 小时前
Qt——Qt中的标准对话框
开发语言·qt
橙露7 小时前
Python 对接 API:自动化拉取、清洗、入库一站式教程
开发语言·python·自动化
Omigeq8 小时前
1.4 - 曲线生成轨迹优化算法(以BSpline和ReedsShepp为例) - Python运动规划库教程(Python Motion Planning)
开发语言·人工智能·python·算法·机器人
2301_808414388 小时前
自动化测试的实施
开发语言·python
波波0078 小时前
写出稳定C#系统的关键:不可变性思想解析
开发语言·c#·wpf
dr_yingli8 小时前
fMRI(3-1)报告(个体化报告)生成器说明
开发语言·matlab
hrhcode8 小时前
【java工程师快速上手go】一.Go语言基础
java·开发语言·golang
飞Link9 小时前
【AI大模型实战】万字长文肝透大语言模型(LLM):从底层原理解析到企业级Python项目落地
开发语言·人工智能·python·语言模型·自然语言处理
妙蛙种子3119 小时前
【Java设计模式 | 创建者模式】 原型模式
java·开发语言·后端·设计模式·原型模式