% RBF算法用于压力传感器
clc
clear
close all
PP=[-0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 0 0 0 0 0 0 0 0 0 0 0 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5;
0.2391 0.3066 0.4323 0.5688 0.6976 0.8233 0.9475 1.0717 1.1943 1.3277 1.4519 0.2238 0.2821 0.4123 0.5351 0.6608 0.7851 0.9123 1.0288 1.1560 1.2772 1.3799 0.1931 0.2545 0.3756 0.4921 0.6178 0.7374 0.8616 0.9766 1.0916 1.2127 1.3216 0.1625 0.2192 0.3342 0.4522 0.5672 0.6838 0.8018 0.9153 1.0272 1.1422 1.2572 0.1441 0.1993 0.3112 0.4216 0.5335 0.6424 0.7535 0.8647 0.9782 1.0809 1.1913 0.1334 0.1840 0.2898 0.3925 0.4937 0.5995 0.7053 0.8065 0.9092 1.0119 1.1100 0.1104 0.1595 0.2545 0.3496 0.4416 0.5366 0.6347 0.7283 0.8157 0.9046 0.9981];
TT=[0 0.1 0.3 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 0 0.1 0.3 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 0 0.1 0.3 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 0 0.1 0.3 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 0 0.1 0.3 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 0 0.1 0.3 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9 0 0.1 0.3 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9];
[InDim,SamNum] = size(PP);
[OutDim,SamNum] = size(TT);
p=InDim; %样本输入数
SamIn=PP;
SamOut=TT;
TestSamIn=[-0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 -0.1 0 0 0 0 0 0 0 0 0 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ;
0.3725 0.5013 0.6270 0.7666 0.8846 1.0199 1.1391 1.2618 1.3967 0.3480 0.4738 0.5995 0.7221 0.8494 0.9690 1.0932 1.2143 1.3293 0.3143 0.4323 0.5565 0.6746 0.8003 0.9168 1.0333 1.1575 1.2664 0.2790 0.3940 0.5136 0.6255 0.7420 0.8570 0.9751 1.0870 1.2066 0.2575 0.3664 0.4768 0.5887 0.7022 0.8110 0.9168 1.0273 1.1315 0.2361 0.3404 0.4446 0.5474 0.6485 0.7543 0.8555 0.9598 1.0594 0.2070 0.3005 0.3956 0.4906 0.5888 0.6823 0.7743 0.8586 0.9506 ];
TestSamOut=[0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8];
HiddenUnitNum=15; %HiddenUnitNum为隐层节点个数,即聚类样本数
MaxEpoch =10000; % ????????????????????最大训练次数如何选择
E0 = 0.0001; % 目标误差
Center =2*rand(InDim,HiddenUnitNum); % 隐节点数据中心,每个隐节点有一个数据中心
SP = 0.2*rand(1,HiddenUnitNum)+0.1; % 隐节点扩展常数1行55列
W =0.2*rand(1,HiddenUnitNum)-0.1; % 隐节点输出权值,10个
lrCent = 0.006; % 隐节点数据中心学习系数
lrSP = 0.006 ;% 隐节点扩展常数学习系数
lrW = 0.008;%08; % 隐节点输出权值学习系数
ErrHistory = []; % 用于记录每次参数调整后的训练误差
%开始训练
k=0;
for epoch = 1:MaxEpoch
AllDist = dist(Center',SamIn);
%AllDist= repmat(AllDist,2,1);
SPMat = repmat(SP',1,SamNum);%sp转置后为55行1列,%77
UnitOut = radbas(AllDist./SPMat);%隐层节点输出
NetOut = W*UnitOut;%1*55实际输出
%SamOut=[SamOut zeros(1,44)];
%SamOut=repmat(SamOut,1,6);
%NetOut=[NetOut zeros(1,1)];%可以不加的,随上面的改动
%SamOut=SamOut(:,1:55);
Error = SamOut-NetOut;
%Error=Error(:,1:55);
%停止学习判断
SSE = sumsqr(Error) %2%平方和误差公式,平方square,书中的原公式有除以2
% 记录每次权值调整后的训练误差
ErrHistory = [ErrHistory SSE];
if SSE<E0, break, end
%带有遗忘因子的扩展权值的计算
for i = 1:HiddenUnitNum
%Error=repmat(Error,10,1);
CentGrad = (SamIn-repmat(Center(:,i),1,SamNum))...%77
*(Error.*UnitOut(i,:)*W(i)/(SP(i)^2))';%Center(:,i)为一列的怎么理解.*
SPGrad = AllDist(i,:).^2*(Error.*UnitOut(i,:)*W(i)/(SP(i)^3))';
WGrad = Error*UnitOut(i,:)';
Center(:,i) = Center(:,i) + lrCent*CentGrad;
SP(i) = SP(i) + lrSP*SPGrad;
W(i) = W(i) + lrW*WGrad;
end
%disp(sprintf(迭代次数%d),)
k=k+1;
end
k;
[xx,Num]=size(ErrHistory);
% figure
% hold on
% plot(1:Num,ErrHistory,'k-');%纵坐标为SSE的初值,k为画图时的实线
% title('训练误差')
%测试
TestDistance = dist(Center',TestSamIn);
TestSpreadsMat = repmat(SP',1,63);%7*9,一维的测试样本数
TestHiddenUnitOut = radbas(TestDistance./TestSpreadsMat);
TestNNOut = W*TestHiddenUnitOut;
%TestNNOut
YYt=TestNNOut';
NNt=TestSamOut';
Ye=TestNNOut-TestSamOut; %求拟合的误差
Emax=max(abs(Ye)) %最大误差
%Emin=min(Ye) %最小误差
e2=zeros(63);
for i=1:63
e2=(TestNNOut(i)-TestSamOut(i))^2;
end
e3=mean(e2);
RMSE=sqrt(e3) %求平均误差
%画图
figure
hold on
MMt=[0.3725 0.5013 0.6270 0.7666 0.8846 1.0199 1.1391 1.2618 1.3967 0.3480 0.4738 0.5995 0.7221 0.8494 0.9690 1.0932 1.2143 1.3293 0.3143 0.4323 0.5565 0.6746 0.8003 0.9168 1.0333 1.1575 1.2664 0.2790 0.3940 0.5136 0.6255 0.7420 0.8570 0.9751 1.0870 1.2066 0.2575 0.3664 0.4768 0.5887 0.7022 0.8110 0.9168 1.0273 1.1315 0.2361 0.3404 0.4446 0.5474 0.6485 0.7543 0.8555 0.9598 1.0594 0.2070 0.3005 0.3956 0.4906 0.5888 0.6823 0.7743 0.8586 0.9506 ];
%NNt=[0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18];
MMMt=MMt*100;
plot(MMMt,NNt,'r+')
hold on;
plot(MMMt,YYt,'b+')