1. 程式人生 > >matlab偏最小二乘法

matlab偏最小二乘法

偏最小二乘是建立表到表的線性擬合關係,然後預測的方法(處理高維資料),比如在光譜分析中,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