matlab偏最小二乘法
阿新 • • 發佈:2019-01-06
偏最小二乘是建立表到表的線性擬合關係,然後預測的方法(處理高維資料),比如在光譜分析中,X是某物質的光譜樣本構成的訓練集,Y是對應的成分資料,x是要預測成分的光譜資料
function [y5,S] = pls2(X,Y,x)
%[y5,S] = pls2(X,Y,x)【參考自司守奎教材 偏最小而成迴歸章節程式碼】
% X、Y 為模型生成樣本,x為需要預測物件,y5是預測結果
% S.sol為模型的矩陣
S.name = char({'係數矩陣:S(第一行為常數項)';
'相對誤差:relativeError'; '均方根誤差:RootMSE';
'標準誤差:StandardError' ; '擬合優度:R2'
});
pz = [X,Y];%通過這裡注意資料組織形式,一行為一個數據
mu = mean(pz);sig = std(pz);
mu=mean(pz);sig=std(pz); %求均值和標準差
rr=corrcoef(pz); %求相關係數矩陣
data=zscore(pz); %資料標準化
n=size(X,2);m=size(Y,2); %n 是自變數的個數,m 是因變數的個數
x0=pz(:,1:n);y0=pz(:,n+1:end);
e0=data(:,1:n);f0=data(:,n+1:end);
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');
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)); %求誤差平方和
%以下計算 press(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; %求殘差向量
press_i(j)=sum(cancha.^2);
end
press(i)=sum(press_i);
if i>1
Q_h2(i)=1-press(i)/ss(i-1);
else
Q_h2(1)=1;
end
if Q_h2(i)<0.0975
fprintf('提出的成分個數 r=%d',i);
r=i;
break
end
end
beta_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); %計算原始資料的迴歸方程的常數項
end
for i=1:m
xish(:,i)=xishu(:,i)./sig_x'*sig_y(i); %計算原始資料的迴歸方程的係數,每一列是一個迴歸方程
end
sol=[ch0;xish]; %顯示迴歸方程的係數,每一列是一個方程,每一列的第一個數是常數項
%% 用模型進行預測
y5= x*xish;
for i=1:size(y5,2)
y5(:,i)= y5(:,i)+ch0(i);
end
%% 求模型的誤差以及擬合優度
yy=X*xish;y = Y;
for i=1:size(yy,2)
yy(:,i)= yy(:,i)+ch0(i);
end
e2 = abs((yy-y)./y);%求模型的相對誤差
S.relativeError = e2;
for i=1:size(yy,2)
c1(i) = sqrt( sum( (yy(:,i)-y(:,i)).^2 ) ./ size(yy,1) );%求模型的均方根誤差
c2(i) = sqrt( sum((yy(:,i)-mean(y(:,i))).^2)./size(yy,1) );%標準誤差
[~,~,~,~,temp] = regress(yy(:,i),[ones(size(y,1),1),y(:,i)]);
c3(i) = temp(1);%擬合優度
end
S.RootMSE = c1;S.StandardError = c2;S.R2 = c3;
end