偏最小二乘法PLS(matlab自带代码)

  1. 偏最小二乘法(NIPALS经典实现--未简化)
  2. 偏最小二乘法 基本性质推导
  3. 偏最小二乘法(SIMPLS---未简化)

 

前面讲了许多PLS的性质,这里介绍一下PLS的matlab自带的PLS代码,对PLS有一个全面的认识

matlab自带的plsregress函数实现了SIMPLS算法,主要是对X0和Y0的协方差矩阵不断做正交分解

function [Xloadings,Yloadings,Xscores,Yscores, ...
                    beta,pctVar,mse,stats] = plsregress(X,Y,ncomp,varargin)
%PLSREGRESS Partial least squares regression.


....
% Center both predictors and response, and do PLS
%对X,Y进行中心化,在模型中去掉截距项
meanX = mean(X,1);
meanY = mean(Y,1);
X0 = bsxfun(@minus, X, meanX);
Y0 = bsxfun(@minus, Y, meanY);

% 根据输出的需要,返回不同的参数,下面重点关注SIMPLS,
%这是Dejone在九几年提出的,matlab用这个算法来实现PLS
,可见这个算法的意义。
if nargout <= 2
    [Xloadings,Yloadings] = simpls(X0,Y0,ncomp);
    
elseif nargout <= 4
    [Xloadings,Yloadings,Xscores,Yscores] = simpls(X0,Y0,ncomp);
....
end


%------------------------------------------------------------------------------
%SIMPLS Basic SIMPLS.  Performs no error checking.
function [Xloadings,Yloadings,Xscores,Yscores,Weights] = simpls(X0,Y0,ncomp)

[n,dx] = size(X0);
dy = size(Y0,2);

% An orthonormal basis for the span of the X loadings, to make the successive
% deflation X0'*Y0 simple - each new basis vector can be removed from Cov
% separately.

%计算协方差矩阵

Cov = X0'*Y0;
for i = 1:ncomp
    % Find unit length ti=X0*ri and ui=Y0*ci whose covariance, ri'*X0'*Y0*ci, is
    % jointly maximized, subject to ti'*tj=0 for j=1:(i-1).
    %计算协方差的主成分方向   
    [ri,si,ci] = svd(Cov,'econ');
    ri = ri(:,1); ci = ci(:,1); si = si(1);
    %计算得分
    ti = X0*ri;
    normti = norm(ti); ti = ti ./ normti; % ti'*ti == 1
    %计算载荷
    Xloadings(:,i) = X0'*ti;
    
    qi = si*ci/normti; % = Y0'*ti
    Yloadings(:,i) = qi;
    
    if nargout > 2
        Xscores(:,i) = ti;
        Yscores(:,i) = Y0*qi; % = Y0*(Y0'*ti), and proportional to Y0*ci
        if nargout > 4
            Weights(:,i) = ri ./ normti; % rescaled to make ri'*X0'*X0*ri == ti'*ti == 1
        end
    end

    % Update the orthonormal basis with modified Gram Schmidt (more stable),
    % repeated twice (ditto).
    vi = Xloadings(:,i);
    for repeat = 1:2
        for j = 1:i-1
            vj = V(:,j);
            vi = vi - (vj'*vi)*vj;
        end
    end
    vi = vi ./ norm(vi);
    V(:,i) = vi;

    % Deflate Cov, i.e. project onto the ortho-complement of the X loadings.
    % First remove projections along the current basis vector, then remove any
    % component along previous basis vectors that's crept in as noise from
    % previous deflations.
%更新协方差矩阵
    Cov = Cov - vi*(vi'*Cov);
    Vi = V(:,1:i);
    Cov = Cov - Vi*(Vi'*Cov);
end

if nargout > 2
    % By convention, orthogonalize the Y scores w.r.t. the preceding Xscores,
    % i.e. XSCORES'*YSCORES will be lower triangular.  This gives, in effect, only
    % the "new" contribution to the Y scores for each PLS component.  It is also
    % consistent with the PLS-1/PLS-2 algorithms, where the Y scores are computed
    % as linear combinations of a successively-deflated Y0.  Use modified
    % Gram-Schmidt, repeated twice.
    for i = 1:ncomp
        ui = Yscores(:,i);
        for repeat = 1:2
            for j = 1:i-1
                tj = Xscores(:,j);
                ui = ui - (tj'*ui)*tj;
            end
        end
        Yscores(:,i) = ui;
    end
end


%------------------------------------------------------------------------------
%PLSCV Efficient cross-validation for X and Y mean squared error in PLS.
function mse = plscv(X,Y,ncomp,cvp,mcreps,ParOptions)

[n,dx] = size(X);

% Return error for as many components as asked for; some columns may be NaN
% if ncomp is too large for CV.
mse = NaN(2,ncomp+1);

% The CV training sets are smaller than the full data; may not be able to fit as
% many PLS components.  Do the best we can.
if isa(cvp,'cvpartition')
    cvpType = 'partition';
    maxncomp = min(min(cvp.TrainSize)-1,dx);
    nTest = sum(cvp.TestSize);
else
    cvpType = 'Kfold';
%    maxncomp = min(min( floor((n*(cvp-1)/cvp)-1), dx));
    maxncomp = min( floor((n*(cvp-1)/cvp)-1), dx);
    nTest = n;
end
if ncomp > maxncomp
    warning(message('stats:plsregress:MaxComponentsCV', maxncomp));
    ncomp = maxncomp;
end

% Cross-validate sum of squared errors for models with 1:ncomp components,
% simultaneously.  Sum the SSEs over CV sets, and compute the mean squared
% error
CVfun = @(Xtr,Ytr,Xtst,Ytst) sseCV(Xtr,Ytr,Xtst,Ytst,ncomp);
sumsqerr = crossval(CVfun,X,Y,cvpType,cvp,'mcreps',mcreps,'options',ParOptions);
mse(:,1:ncomp+1) = reshape(sum(sumsqerr,1)/(nTest*mcreps), [2,ncomp+1]);


%------------------------------------------------------------------------------
%SSECV Sum of squared errors for cross-validation
function sumsqerr = sseCV(Xtrain,Ytrain,Xtest,Ytest,ncomp)

XmeanTrain = mean(Xtrain);
YmeanTrain = mean(Ytrain);
X0train = bsxfun(@minus, Xtrain, XmeanTrain);
Y0train = bsxfun(@minus, Ytrain, YmeanTrain);

% Get and center the test data
X0test = bsxfun(@minus, Xtest, XmeanTrain);
Y0test = bsxfun(@minus, Ytest, YmeanTrain);

% Fit the full model, models with 1:(ncomp-1) components are nested within
[Xloadings,Yloadings,~,~,Weights] = simpls(X0train,Y0train,ncomp);
XscoresTest = X0test * Weights;

% Return error for as many components as the asked for.
outClass = superiorfloat(Xtrain,Ytrain);
sumsqerr = zeros(2,ncomp+1,outClass); % this will get reshaped to a row by CROSSVAL

% Sum of squared errors for the null model
sumsqerr(1,1) = sum(sum(abs(X0test).^2, 2));
sumsqerr(2,1) = sum(sum(abs(Y0test).^2, 2));

% Compute sum of squared errors for models with 1:ncomp components
for i = 1:ncomp
    X0reconstructed = XscoresTest(:,1:i) * Xloadings(:,1:i)';
    sumsqerr(1,i+1) = sum(sum(abs(X0test - X0reconstructed).^2, 2));

    Y0reconstructed = XscoresTest(:,1:i) * Yloadings(:,1:i)';
    sumsqerr(2,i+1) = sum(sum(abs(Y0test - Y0reconstructed).^2, 2));
end

 

  • 3
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 偏最小二乘法(Partial Least Squares, PLS)是一种统计建模方法,常用于处理多元线性回归问题自变量(X变量)和因变量(Y变量)之间存在高度相关性和多重共线性的情况。 在MATLAB,可以使用plsregress函数来进行PLS建模。请注意,此函数需要安装统计和机器学习工具箱(Statistics and Machine Learning Toolbox)。 下面是一个示例代码,演示如何使用PLS建模: ```matlab % 假设X和Y是已经定义好的自变量和因变量数据 % 选择PLS的成分个数 numComponents = 2; % 执行PLS建模 [XL, YL, XS, YS, BETA, PCTVAR, MSE, stats] = plsregress(X, Y, numComponents); % 输出结果 disp('PLS建模结果:'); disp(' '); disp(['模型R方(拟合优度):', num2str(stats(1))]); disp(['预测R方:', num2str(stats(2))]); disp(['回归系数:']); disp(BETA); % 绘制预测结果图像(可选) Ypred = [ones(size(X,1),1) X]*BETA; scatter(Y,Ypred); hold on; plot(min(Y):max(Y), min(Y):max(Y), 'r'); xlabel('真实值'); ylabel('预测值'); title('PLS预测结果'); ``` 在上述代码,我们首先定义了自变量矩阵X和因变量向量Y。然后,通过调用plsregress函数执行PLS建模,将得到的相关输出存储在不同的变量。我们可以通过printf函数将结果打印出来,也可以可选地绘制预测结果图像。 以上就是使用PLS建模的MATLAB代码示例,希望对你有帮助。如果需要更详细的解释或有其他问题,请随时提问。 ### 回答2: 偏最小二乘(Partial Least Squares, PLS)是一种多元回归分析方法,它可以用于研究多个自变量与一个或多个因变量之间的关系。在MATLAB,我们可以使用PLS建模工具箱来进行PLS建模。 首先,我们需要导入数据并将其划分为自变量矩阵X和因变量矩阵Y。然后,我们可以通过以下步骤在MATLAB进行PLS建模: 1. 导入PLS工具箱:首先,我们需要导入PLS工具箱。可以通过在MATLAB命令窗口输入"pls"来检查是否已安装PLS工具箱。如果结果显示为“MATLAB has no pls command”,则表示需要安装PLS工具箱。 2. 拟合PLS模型:使用plsregress函数可以拟合PLS模型。语法是:[Xloadings,Yloadings,Xscores,Yscores,beta] = plsregress(X,Y,nLVs),其X是自变量矩阵,Y是因变量矩阵,nLVs是选择的潜变量个数。 3. 输出结果:在拟合模型后,可以使用Xloadings,Yloadings,Xscores,Yscores和beta来获取PLS模型的相关结果。Xloadings和Yloadings表示自变量和因变量在潜变量空间的载荷,Xscores和Yscores表示样本在潜变量空间的得分,而beta是PLS回归系数。 通过以上步骤,我们可以使用PLS方法建立一个多元回归模型,并使用MATLABPLS工具箱快速实现。 ### 回答3: 偏最小二乘法(Partial Least Squares, PLS)是一种多元线性回归分析方法,它可以用于建立输入变量与输出变量之间的预测模型。在MatlabPLS方法可以通过“plsregress”函数进行建模。 在使用plsregress函数时,输入变量和输出变量需要被整理成矩阵形式,其每一行表示一个样本,每一列表示一个特征。函数的基本语法如下: ```matlab [Xloadings, Yloadings, Xscores, Yscores, betas, r2X, r2Y, Xresiduals, Yresiduals, stats] = plsregress(X, Y, ncomp) ``` 其, - X表示输入变量的矩阵; - Y表示输出变量的矩阵; - ncomp表示想要提取的PLS成分数。 函数的输出结果包括: - Xloadings和Yloadings表示输入和输出变量在PLS成分上的加载权重; - Xscores和Yscores表示输入和输出变量在PLS成分上的得分; - betas表示回归系数矩阵; - r2X和r2Y表示X和Y的模型方差解释比例; - Xresiduals和Yresiduals表示输入和输出变量的残差矩阵; - stats是一个包含其它统计量的结构。 使用PLS建模的一个简单示例: ```matlab % 准备数据 X = rand(100, 5); % 输入变量矩阵 Y = rand(100, 1); % 输出变量矩阵 % 使用PLS建模 ncomp = 2; % 提取2个PLS成分 [Xloadings, Yloadings, Xscores, Yscores, betas, r2X, r2Y, Xresiduals, Yresiduals, stats] = plsregress(X, Y, ncomp); % 输出模型结果 disp('模型方差解释比例:'); disp(['X解释方差: ', num2str(r2X)]); disp(['Y解释方差: ', num2str(r2Y)]); disp('回归系数矩阵:'); disp(betas); ``` 这是一个简单的PLS建模示例,你可以根据实际需求调整数据和参数,并根据输出结果进一步分析和解释模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值