【MATLAB第56期】#源碼分享 | 基于MATLAB的機器學(xué)習(xí)算法單輸入多輸出分類預(yù)測模型思路(回歸改分類)
針對單輸入多輸出分類預(yù)測,可采用回歸的方式進行預(yù)測。
本文采用BP神經(jīng)網(wǎng)絡(luò)進行演示。
一、導(dǎo)入數(shù)據(jù)
數(shù)據(jù)為1輸入,5輸出,總共482個樣本。
輸出分為五個指標,每個指標共4個評分維度,即【0 10 20 30】
%% 導(dǎo)入數(shù)據(jù)
load data
二、數(shù)據(jù)樣本劃分
保持樣本均勻多樣性,可將數(shù)據(jù)打亂。
temp = randperm(size(data,1));%打亂數(shù)據(jù)順序
若不需要打亂,上面代碼改成:
temp = 1:size(data,1):;%不打亂數(shù)據(jù)
訓(xùn)練樣本數(shù)量可自行設(shè)置 ,本文設(shè)置為422。
代碼如下:
%% 劃分訓(xùn)練集和測試集
temp = randperm(size(data,1));%打亂數(shù)據(jù)順序
NN=422;%訓(xùn)練數(shù)量
P_train = data(temp(1: NN), 6 )';%422個數(shù)據(jù)為訓(xùn)練,剩余為測試,第6列y為輸入
T_train = data(temp(1: NN), 1: 5)';%x為輸出
M = size(P_train, 2);
P_test = data(temp(NN+1: end), 6 )';
T_test = data(temp(NN+1: end), 1: 5)';
N = size(P_test, 2);
三、歸一化設(shè)置
常用歸一化有兩種,即最大最小值歸一化及標準值歸一化。
method=@mapminmax;%最大最小值歸一化
method=@mapstd;%標準值歸一化
歸一化區(qū)間可自行設(shè)置,默認[-1,1],本文采用[0,1]
%% 數(shù)據(jù)歸一化
method=@mapstd;
[p_train, ps_input] = method(P_train, 0, 1);
p_test = method('apply', P_test, ps_input);
[t_train, ps_output] = method(T_train, 0, 1);
t_test = method('apply', T_test, ps_output);
四、模型創(chuàng)建及預(yù)測
熟悉的BP網(wǎng)絡(luò)建模過程,不多介紹。
若涉及多隱含層,可修改[20,20,5]中的數(shù)字。前2個20代表兩層隱含層的神經(jīng)元數(shù) ,后面的5為輸出節(jié)點,根據(jù)本案例數(shù)據(jù)設(shè)置。
若增加或者減少隱含層,需要更改后面對應(yīng)的激活函數(shù)。
net = newff(minmax(p_train), [20,20,5],{'logsig','logsig','purelin'});
代碼如下:
%% 創(chuàng)建網(wǎng)絡(luò)
%net = newff(minmax(p_train), t_train, 10);
net = newff(minmax(p_train), [20,20,5],{'logsig','logsig','purelin'});
%% 設(shè)置訓(xùn)練參數(shù)
net.trainParam.epochs = 2000; % 迭代次數(shù)
net.trainParam.goal = 1e-7; % 誤差閾值
net.trainParam.lr = 0.01; % 學(xué)習(xí)率
net.trainFcn = 'trainlm';
%% 訓(xùn)練網(wǎng)絡(luò)
net = train(net, p_train, t_train);
%% 仿真測試
t_sim1 = sim(net, p_train);
t_sim2 = sim(net, p_test );
%% 數(shù)據(jù)反歸一化
T_sim1 = method('reverse', t_sim1, ps_output);
T_sim2 = method('reverse', t_sim2, ps_output);
五、分類預(yù)測結(jié)果
因上一步驟進行了正常的回歸預(yù)測,輸出一般為小數(shù)點,且不是限定標簽的數(shù)值。所以需要通過find函數(shù),將回歸預(yù)測的輸出結(jié)果進行分段賦值。
根據(jù)四舍五入的思路,如數(shù)據(jù)如果在5以下,則賦值為0,
如果為[5,15),賦值為10…
依次進行賦值。
for i = 1: 5
[m1,n1]=find(T_sim(i,:)<5);T_sim1(i,n1)=0;
[m2,n2]=find(T_sim(i,:)<15 & T_sim1(i,:)>=5);T_sim1(i,n2)=10;
end
六、評價指標及繪圖
%% 繪圖
figure
subplot(2, 1, 1)
plot(1: M, T_train(i, :), 'r-*', 1: M, T_sim1(i, :), 'b-o', 'LineWidth', 1)
legend(['x' num2str(i) '真實值'],['x' num2str(i) '預(yù)測值'])
xlabel('預(yù)測樣本')
ylabel('預(yù)測結(jié)果')
string = {'訓(xùn)練集預(yù)測結(jié)果對比'; ['準確率acc=' num2str(acc1(i, :))]};
title(string)
xlim([1, M])
grid
subplot(2, 1, 2)
plot(1: N, T_test(i, :), 'r-*', 1: N, T_sim2(i, :), 'b-o', 'LineWidth', 1)
legend(['x' num2str(i) '真實值'],['x' num2str(i) '預(yù)測值'])
xlabel('預(yù)測樣本')
ylabel('預(yù)測結(jié)果')
string = {'測試集預(yù)測結(jié)果對比';['準確率acc=' num2str(acc2(i, :))]};
title(string)
xlim([1, N])
grid
%% 分割線
disp('**************************')
disp(['下列是輸出', num2str(i)])
disp('**************************')
end
七、測試新數(shù)據(jù)
若輸入為一個新值,則預(yù)測結(jié)果參考下列代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-580392.html
%% 測試新數(shù)據(jù)
p_newtest=21.6;% 輸入新數(shù)據(jù)
p_newtest1 = method('apply',p_newtest, ps_input);
t_simnew = sim(net, p_newtest1);
T_simnew = method('reverse', t_simnew , ps_output);
T_simnew
八、代碼獲取
后臺私信回復(fù)“56期”,可獲取下載鏈接。文章來源地址http://www.zghlxwxcb.cn/news/detail-580392.html
到了這里,關(guān)于【MATLAB第56期】#源碼分享 | 基于MATLAB的機器學(xué)習(xí)算法單輸入多輸出分類預(yù)測模型思路(回歸改分類)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!