偏最小二乘法是一种数学优化技术,它通过最小化误差的平方和找到一组数据的最佳函数匹配。 用最简的办法求得一些相对不可知的真值,而令误差平方之和为最小。 很多其余的优化问题也可通过最小化能量或最大化熵用最小二乘模式表白。

%偏最小二乘法clc % 清屏clear all; % 删除workplace变量close all; % 关掉显示图形窗口format shortpz=[191 36  50  5   162 60189 37  52  2   110 60193 38  58  12  101 101162 35  62  12  105 37189 35  46  13  155 58182 36  56  4   101 42211 38  56  8   101 38167 34  60  6   125 40176 31  74  15  200 40154 33  56  17  251 250169 34  50  17  120 38166 33  52  13  210 115154 34  64  14  215 105247 46  50  1   50  50193 36  46  6   70  31202 37  62  12  210 120176 37  54  4   60  25157 32  52  11  230 80156 33  54  15  225 73138 33  68  2   110 43];%每一列为一个指标,每一行为一个样本mu=mean(pz); %求均值sig=std(pz); %求标准差rr=corrcoef(pz); %求相关系数矩阵data=zscore(pz); %数据标准化n=3; % n 是自变量的个数m=3; % m 是因变量的个数x0=pz(:,1:n);y0=pz(:,n+1:end);%定义自变量为前n列,因变量为n+1到m列e0=data(:,1:n);f0=data(:,n+1:end);%e0为自变量归一化值,f0为因变量归一化值num=size(e0,1);%求样本点的个数chg=eye(n); % w 到 w* 变换矩阵的初始化for i=1:n    %计算 w,w* 和t 的得分向量,    matrix=e0'*f0*f0'*e0;    [vec,val]=eig(matrix); %求特征值和特征向量    val=diag(val); %提出对角线元素,即特征值    [val,ind]=sort(val,'descend');%降序排列,ind为排序后原下标序号    w(:,i)=vec(:,ind(1)); %提出最大特征值对应的特征向量    w_star(:,i)=chg*w(:,i); %计算w*的取值    t(:,i)=e0*w(:,i); %计算成分ti 的得分    alpha=e0'*t(:,i)/(t(:,i)'*t(:,i)); %计算alpha_i    chg=chg*(eye(n)-w(:,i)*alpha'); %计算w 到w*的变换矩阵    e=e0-t(:,i)*alpha'; %计算残差矩阵    e0=e;%将残差矩阵带进下次循环    %计算ss(i)的值    beta=[t(:,1:i),ones(num,1)]\f0; %求回归方程的系数    beta(end,:)=[]; %删除回归剖析的常数项    cancha=f0-t(:,1:i)*beta; %求残差矩阵    ss(i)=sum(sum(cancha.^2)); %求误差平方和    %计算p(i)    for j=1:num        t1=t(:,1:i);f1=f0;        she_t=t1(j,:);she_f=f1(j,:); %把舍去的第j 个样本点保存起来        t1(j,:)=[];f1(j,:)=[]; %删除第j 个观测值        beta1=[t1,ones(num-1,1)]\f1; %求回归剖析的系数        beta1(end,:)=[]; %删除回归剖析的常数项        cancha=she_f-she_t*beta1; %求残差向量        p_i(j)=sum(cancha.^2);    end    p(i)=sum(p_i);    if i>1        Q_h2(i)=1-p(i)/ss(i-1);    else        Q_h2(1)=1;    end    if Q_h2(i)<0.0975        fprintf('提出的成分个数r=%d',i);        fprintf('   ');        fprintf('穿插的有效性=%f',Q_h2(i));        r=i;        break    endendbeta_z=[t(:,1:r),ones(num,1)]\f0; %求Y 对于t 的回归系数beta_z(end,:)=[]; %删除常数项xishu=w_star(:,1:r)*beta_z; %求Y 对于X 的回归系数,且是针对规范数据的回归系数,每一列是一个回归方程mu_x=mu(1:n);mu_y=mu(n+1:end);sig_x=sig(1:n);sig_y=sig(n+1:end);for i=1:m    ch0(i)=mu_y(i)-mu_x./sig_x*sig_y(i)*xishu(:,i); %计算原始数据的回归方程的常数项endfor i=1:m    xish(:,i)=xishu(:,i)./sig_x'*sig_y(i); %计算原始数据的回归方程的系数,每一列是一个回归方程enddisp('回归方程的系数,每一列是一个方程,每一列的第一个数是常数项,每一列为一个因变量与自变量们的回归方程')sol=[ch0;xish] %显示回归方程的系数,每一列是一个方程,每一列的第一个数是常数项,每一列为一个因变量与自变量们的回归方程%此为还原为原始变量后的方程%% 感觉用处不大,用到的时候再查问怎么应用save mydata x0 y0 num xishu ch0 xishw1=w(:,1)w2=w(:,2)wx1=w_star(:,1)wx2=w_star(:,2)tx1=t(:,1)'tx2=t(:,2)'disp('回归系数')beta_z %回归系数disp('系数矩阵,即未还原原始变量的系数,每一列为一个因变量与自变量的回归方程')xishu%系数矩阵,即未还原原始变量的系数,每一列为一个因变量与自变量的回归方程%% 用法:别离计算出第四列第五列第六列和前三列的线性回归关系,给出系数,系数以列的形式给出,%%sol别离为常数项系数,x1 x2 x3的系数%生成mydata数据,进行偏最小二乘测验format shortload('mydata.mat')%mydata为计算偏最小二乘保留的数据集,能够用于测验%% 更直观的解释各个自变量的作用figurebar(xishu')%别离画出三个自变量对三个因变量标准化后回归方程的系数的的长度图axis tighthold onannotation('textbox',[0.26 0.14 0.086 0.07],'String',{'单杠'},'FitBoxToText','off');annotation('textbox',[0.56 0.14 0.086 0.07],'String',{'蜿蜒'},'FitBoxToText','off');annotation('textbox',[0.76 0.14 0.086 0.07],'String',{'跳高'},'FitBoxToText','off');%在指定地位加正文%% 拟合成果的确定%所有点都在对角线左近均匀分布,则成果较好ch0=repmat(ch0,num,1);%repmat起复制矩阵组合为新矩阵的作用yhat=ch0+x0*xish; %计算y 的预测值y1max=max(yhat);y2max=max(y0);ymax=max([y1max;y2max]);cancha=yhat-y0; %计算残差figuresubplot(2,2,1)plot(0:ymax(1),0:ymax(1),yhat(:,1),y0(:,1),'*')title('单杠问题预测')subplot(2,2,2)plot(0:ymax(2),0:ymax(2),yhat(:,2),y0(:,2),'O')title('蜿蜒问题预测')subplot(2,1,2)plot(0:ymax(3),0:ymax(3),yhat(:,3),y0(:,3),'H')title('跳高问题预测')%% 绘制拟合效果图和权重比重图