偏最小二乘回歸(基於MATLAB)

2021-09-18 03:16:15 字數 2775 閱讀 6209

clc

clear all

% 匯入資料

load('data.mat')

s_data = data(:,[1:27,29]);

n = 27; % n 是自變數的個數

m = 1; % m 是因變數的個數

% 讀取訓練資料

train_num = 1600; %訓練樣本數

train_data = s_data(1:train_num,:);

mu = mean(train_data);sig = std(train_data); %求均值和標準差

ab = zscore(train_data); %資料標準化

a = ab(1:train_num,1:n);b = ab(1:train_num,n+1:end);

[xl,yl,xs,ys,beta,pctvar,mse,stats] =plsregress(a,b);

xw=a\xs; %求自變數提出成分係數,每列對應乙個成分,這裡xw等於stats.w

% yw=b\ys; %求因變數提出成分的係數

a_0=pctvar(1,:);%b_0=pctvar(2,:);

a_1=cumsum(a_0);%b_1=cumsum(b_0);

i=1;%賦初始值

%判斷提出成分對的個數

while ((a_1(i)<0.9)&(a_0(i)>0.05))%&(b_1(i)<0.9)&(b_0(i)>0.05))

i=i+1;

endncomp=i;

fprintf('%d對成分分別為:\n',ncomp);

for i=1:ncomp

fprintf('第%d對成分:\n',i);

fprintf('u%d=',i);

for k=1:n%此處為變數x的個數

fprintf('+(%f*x_%d)',xw(k,i),k);

endfprintf('\n');

endtic;% **計時開始

[xl,yl,xs,ys,beta,pctvar,mse,stats] = plsregress(a,b,ncomp);

contr =cumsum(pctvar,2);

beta2(1,:)=mu(n+1:end)+mu(1:n)./sig(1:n)*beta(2:end,:).*sig(n+1:end); %原始資料回歸方程的常數項

beta2(2:n+1,:)=(1./sig(1:n))'*sig(n+1:end).*beta(2:end,:); %計算原始變數x1,...,xn的係數,每一列是乙個回歸方程

% 訓練資料

train_data = [ones(train_num,1),s_data(1:train_num,1:n)]';

toc; % **計時結束

% 訓練資料誤差

pls_train_output = beta2' * train_data;

train_output = s_data(1:train_num,n+1:end)';

train_err = train_output - pls_train_output;

n1 = length(pls_train_output);

train_rmse = sqrt(sum((train_err).^2)/n1);

% 測試資料的**結果

%讀取測試資料

test_output = s_data(train_num+1:end,n+1:end);

test_input = [ones(length(test_output),1),s_data(train_num+1:end,1:n)];

pls_test_output = [ones(size(s_data(train_num+1:end,1:n),1),1) s_data(train_num+1:end,1:n)]*beta;

%測試資料誤差

pls_test_output = beta2' * test_input';

test_err = test_output' - pls_test_output;

n2 = length(pls_test_output);

test_rmse = sqrt(sum((test_err).^2)/n2);

% **結果視覺化

figure(4); % 繪製圖1

subplot(2,1,1); % 圖1包含2行1列個子圖形,首先繪製子圖1

plot(pls_test_output,':og'); % 用綠色的o繪製測試資料的**輸出值

hold on;

plot(test_output','-*b'); % 用藍色的*繪製測試資料的期望輸出值

legend('**輸出','期望輸出'); % 子圖1的注釋

title('偏最小二乘法s含量**結果','fontsize',12) %子圖1的標題

ylabel('s含量','fontsize',12); % y軸

xlabel('樣本','fontsize',12); % x軸

subplot(2,1,2); % 繪製子圖2

plot(abs(test_output' - pls_test_output),'-*'); % 輸出測試資料的**誤差

title('偏最小二乘法s含量**誤差','fontsize',12) %子圖2的標題

ylabel('誤差','fontsize',12); % y軸

xlabel('樣本','fontsize',12); % x軸

MATLAB 偏最小二乘回歸演算法

設有q個因變數和p個自變數。為了研究因變數和自變數的統計關係,觀測n個樣本點,構成了自變數與因變數的資料表x 1 兩個成分盡可能多的攜帶他們各自資料表的變異資訊。2 兩個成分的相關程度達到最大。也就是說,他們能夠盡可能好地代表各自的資料表,同時自變數成分 在第乙個成分被成功提取後,分別實施x對 該m...

python 偏最小二乘回歸實現

import pandas as pd import numpy as np from sklearn.cross decomposition import plsregression from sklearn.model selection import gridsearchcv from skl...

最小二乘 加權最小二乘 matlab實現

最小二乘 最小二乘法 又稱最小平方法 是一種數學優化技術。它通過最小化誤差的平方和尋找資料的最佳函式匹配。利用最小二乘法可以簡便地求得未知的資料,並使得這些求得的資料與實際資料之間誤差的平方和為最小 最小二乘法還可用於曲線擬合,其他一些優化問題也可通過最小化能量或最大化熵用最小二乘法來表達。加權最小...