解决问题方向:对于n个自变量,m个因变量的建模问题。
原理:首先在自变量集中提出第一主成分u1(PCA,x1…xn的线性组合),同时在因变量中集中提出第一主成分v1,并要求u1,v1的相关程度达到最大。然后建立有y1…ym对u1的回归,如果回归方程已达到满意的精度则算法终止,否则继续第二主成分的提取,直到能达到满意的精度为止。
若最终对自变量提取了r个成分,u1…ur,PLSR将通过建立y1…ym与u1…ur的回归式,然后再表示成y1…ym与原自变量的回归方程式,即最小二乘回归方程式。
板子以及说明:(问题背景详情见司守奎的《数学建模算法与应用》对应章节)
matlab代码:
clc,clear
ab0 = load('pz.txt');
mu = mean(ab0);%均值
sig = std(ab0);% 标准差
rr = corrcoef(ab0) %相关系数矩阵
ab = zscore(ab0); %数据标准化
a = ab(:,[1:3]); %标准化的X
b = ab(:,[4:end]); %标准化的Y
% pls命令需要标准化变量
[XL,YL,XS,YS,BETA,PCTVAR,MSE,stats] = plsregress(a,b)
contr = cumsum(PCTVAR,2) %每行累计求和,即计算累计贡献率
xw = a\XS %自变量提出主成分系数,每列对应一个成分,这个就是stats.W
yw = b\YS %因变量提出的主成分系数
ncomp = input('输入主成分个数')
[XL2,YL2,XS2,YS2,BETA2,PCTVAR2,MSE2,stats2] = plsregress(a,b,ncomp)
n = size(a,2);% n是自变量个数
m = size(b,2);
%求原始数据回归方程常数项
beta3(1,:) = mu(n+1:end) - mu(1:n)./sig(1:n)*BETA2([2:end],:).*sig(n+1:end);
%求原始数据x1,x2...xn的系数,每一列是一个回归方程
beta3([2:n+1],:) = (1./sig(1:n))'*sig(n+1:end).*BETA2([2:end],:)
bar(BETA2','k') %画直方图
yhat=repmat(beta3(1,:),[size(a,1),1])+ab0(:,[1:n])*beta3([2:end],:) %求y1,y2...ym的预测值
ymax=max([yhat;ab0(:,[n+1:end])]); %求预测值和观测值的最大值
%下面画y1,y2,y3的预测图,并画直线y=x
figure, subplot(2,2,1)
plot(yhat(:,1),ab0(:,n+1),'*',[0:ymax(1)],[0:ymax(1)],'Color','k')
%legend('单杠成绩预测图',2)
subplot(2,2,2)
plot(yhat(:,2),ab0(:,n+2),'O',[0:ymax(2)],[0:ymax(2)],'Color','k')
%legend('弯曲成绩预测图',2)
subplot(2,2,3)
plot(yhat(:,3),ab0(:,n+3),'H',[0:ymax(3)],[0:ymax(3)],'Color','k')
%legend('跳高成绩预测图',2)
%如果预测图上,所有点都能在图的对角线附近均匀分布,则方程的拟合值与原值差异很小哦这个方程的拟合效果就是令人满意的,否则主成分个数再+1
pz.txt文本说明:前3列为自变量,后3列为因变量;一行为一个样本
191 36 50 5 162 60
189 37 52 2 110 60
193 38 58 12 101 101
162 35 62 12 105 37
189 35 46 13 155 58
182 36 56 4 101 42
211 38 56 8 101 38
167 34 60 6 125 40
176 31 74 15 200 40
154 33 56 17 251 250
169 34 50 17 120 38
166 33 52 13 210 115
154 34 64 14 215 105
247 46 50 1 50 50
193 36 46 6 70 31
202 37 62 12 210 120
176 37 54 4 60 25
157 32 52 11 230 80
156 33 54 15 225 73
138 33 68 2 110 43