用RBF网络实现单输入单输出非线性函数的拟合

用RBF网络实现单输入单输出非线性函数的拟合。100个输入输出训练样本给定,101个输入输出测试样本给定。要求:
使用1-10-1的RBF网络结构,输出节点有阈值;
使用KNN K-means聚类算法求出10个聚类中心和方差,聚类中心的初始值为训练样本的前10个数值,并由用最小二乘算法求出隐层到输出层权值。
给出10个聚类后的类中心的具体数值,以及11个(包含阈值)的隐层到输出层的权值。

画出训练样本曲线,并画出测试样本的测试结果曲线。


按照网上搜索的改的和要求一样。

SamNum = 100; % 总样本数
TestSamNum = 101; % 测试样本数
InDim = 1; % 样本输入维数
ClusterNum = 10; % 隐节点数,即聚类样本数
Overlap = 1.0; % 隐节点重叠系数

% 获得样本输入输出

SamIn =[
   -3.6606   -3.4284    0.1732   -3.2262    2.5452    2.5404    1.7795   -2.8011    1.2768    0.1488 ...
    3.7838    1.1919    2.4026   -0.3696   -0.5409    2.6025   -3.3322   -2.9346   -2.6129   -0.8725 ...
    2.6510    2.4269   -3.5162   -0.8059    0.2150   -0.6656    1.2549    1.0238   -1.6641   -0.5468 ...
   -3.8761    3.8725   -2.6627   -3.1503   -1.0207   -2.4151   -0.0825   -1.2841    3.6130    3.3627 ...
   -3.5786    1.9029   -1.8470   -0.6173    0.3830    3.5419   -0.6580    3.8644   -1.5884    1.6088 ...
    1.3307    0.3130    1.5848    1.3322   -2.5749   -2.9759    3.9926   -2.6310   -3.7392    0.4896 ...
    3.0549    1.3534   -2.4765   -1.0487   -0.3142    3.8531   -2.7488    2.8442    1.1581   -0.9898 ...
   -2.4726   -0.5740   -0.1438   -3.0351    0.7161   -2.1905   -0.9230    0.6639   -1.9856   -1.6765 ...
    0.9367   -1.8778    2.5950    3.8613    1.8420   -1.2490    0.6726   -3.1378    3.2505    3.0372 ...
    2.5421   -1.9142    0.7549   -3.8199   -0.5979   -1.4982   -2.7081   -2.5699   -0.6169   -3.2462];
SamOut =[
    0.0216    0.1487    0.9793    0.0484    0.5870    0.5269    1.2677    0.4757    1.4787    0.8801 ...
    0.0059    1.4177    0.5691    1.8560    1.9327    0.3960    0.0421    0.1965    0.6061    2.5249 ...
    0.5593    0.5742   -0.0399    2.6287    1.0666    2.2262    1.2983    1.3054    2.2439    2.0592 ...
   -0.0051    0.0609    0.6059    0.0597    2.5869    0.8239    1.1508    2.6602    0.0391   -0.2248 ...
    0.0093    1.2649    1.8254    2.2567    0.9656    0.0439    2.2542   -0.1395    2.3701    1.5378 ...
    1.4669    0.9289    1.3173    1.4541    0.6960    0.3275   -0.0263    0.5798    0.2355    0.7400 ...
    0.3948    1.4908    0.9066    2.5300    1.5237   -0.0102    0.5168    0.1092    1.4672    2.5405 ...
    0.8189    2.1484    1.3230    0.3551    1.2152    1.2120    2.6315    0.9800    1.5334    2.3314 ...
    1.2897    1.8681    0.5416    0.0766    1.2337    2.8323    1.1740    0.2147    0.0364    0.1141 ...
    0.6139    1.6425    1.1432   -0.1695    2.2298    2.5882    0.5167    0.6722    1.9140    0.2016];


TestSamIn =[
   -4.0000   -3.9200   -3.8400   -3.7600   -3.6800   -3.6000   -3.5200   -3.4400   -3.3600   -3.2800 ...
   -3.2000   -3.1200   -3.0400   -2.9600   -2.8800   -2.8000   -2.7200   -2.6400   -2.5600   -2.4800 ...
   -2.4000   -2.3200   -2.2400   -2.1600   -2.0800   -2.0000   -1.9200   -1.8400   -1.7600   -1.6800 ...
   -1.6000   -1.5200   -1.4400   -1.3600   -1.2800   -1.2000   -1.1200   -1.0400   -0.9600   -0.8800 ...
   -0.8000   -0.7200   -0.6400   -0.5600   -0.4800   -0.4000   -0.3200   -0.2400   -0.1600   -0.0800 ...
         0    0.0800    0.1600    0.2400    0.3200    0.4000    0.4800    0.5600    0.6400    0.7200 ...
    0.8000    0.8800    0.9600    1.0400    1.1200    1.2000    1.2800    1.3600    1.4400    1.5200 ...
    1.6000    1.6800    1.7600    1.8400    1.9200    2.0000    2.0800    2.1600    2.2400    2.3200 ...
    2.4000    2.4800    2.5600    2.6400    2.7200    2.8000    2.8800    2.9600    3.0400    3.1200 ...
    3.2000    3.2800    3.3600    3.4400    3.5200    3.6000    3.6800    3.7600    3.8400    3.9200 ...
    4.0000];
 TestSamOut =[
    0.0137    0.0181    0.0237    0.0309    0.0401    0.0515    0.0657    0.0833    0.1048    0.1309 ...
    0.1622    0.1997    0.2439    0.2958    0.3559    0.4252    0.5040    0.5929    0.6921    0.8016 ...
    0.9213    1.0504    1.1882    1.3331    1.4836    1.6376    1.7924    1.9453    2.0933    2.2330 ...
    2.3611    2.4742    2.5693    2.6435    2.6943    2.7200    2.7194    2.6922    2.6389    2.5608 ...
    2.4602    2.3401    2.2042    2.0568    1.9026    1.7465    1.5936    1.4484    1.3154    1.1982 ...
    1.1000    1.0228    0.9679    0.9354    0.9247    0.9342    0.9615    1.0036    1.0569    1.1177 ...
    1.1822    1.2463    1.3067    1.3599    1.4034    1.4349    1.4530    1.4568    1.4460    1.4209 ...
    1.3824    1.3317    1.2705    1.2005    1.1237    1.0421    0.9576    0.8721    0.7872    0.7044 ...
    0.6249    0.5497    0.4795    0.4148    0.3559    0.3029    0.2558    0.2143    0.1781    0.1468 ...
    0.1202    0.0976    0.0786    0.0629    0.0499    0.0393    0.0308    0.0239    0.0184    0.0141 ...
    0.0107];


figure
hold on
grid

plot(SamIn,SamOut,'k+')
plot(TestSamIn,TestSamOut,'r--')
xlabel('Input x');
ylabel('Output y');
legend('训练','测试')

%初始化中心
Centers = SamIn(:,1:ClusterNum);
NumberInClusters = zeros(ClusterNum,1); 
IndexInClusters = zeros(ClusterNum,SamNum);

%迭代求解均值中心
while 1, 
    NumberInClusters = zeros(ClusterNum,1); % 各类中的样本数,初始化为零
    IndexInClusters = zeros(ClusterNum,SamNum); % 各类所含样本的索引号

    % 按最小距离原则对所有样本进行分类  计算样本点到中心的距离
    for i = 1:SamNum
        AllDistance = dist(Centers',SamIn(:,i));
        [MinDist,Pos] = min(AllDistance);
        NumberInClusters(Pos) = NumberInClusters(Pos) + 1;
        IndexInClusters(Pos,NumberInClusters(Pos)) = i;
    end

    % 保存旧的聚类中心
    OldCenters = Centers;
    %根据中心聚类,并得到新的类内均值
    for i = 1:ClusterNum
        Index = IndexInClusters(i,1:NumberInClusters(i));
        Centers(:,i) = mean(SamIn(:,Index)')';
    end

    % 判断新旧聚类中心是否一致,是则结束聚类   判断中心有没有变化
    EqualNum = sum(sum(Centers==OldCenters));
    if EqualNum == InDim*ClusterNum,
        break,
    end

end
Centers  %输出聚类中心

% 计算各隐节点的扩展常数(宽度)
AllDistances = dist(Centers',Centers); % 计算隐节点数据中心间的距离(矩阵)
Maximum = max(max(AllDistances)); % 找出其中最大的一个距离
for i = 1:ClusterNum % 将对角线上的0 替换为较大的值
    AllDistances(i,i) = Maximum+1;
end
Spreads = Overlap*min(AllDistances)'; % 以隐节点间的最小距离作为扩展常数

% 计算各隐节点的输出权值 用最小二乘法得到权值
Distance = dist(Centers',SamIn); % 计算各样本输入离各数据中心的距离
SpreadsMat = repmat(Spreads,1,SamNum);
HiddenUnitOut = radbas(Distance./SpreadsMat); % 计算隐节点输出阵
HiddenUnitOutEx = [HiddenUnitOut' ones(SamNum,1)]'; % 考虑偏移
W2Ex = SamOut*pinv(HiddenUnitOutEx); % 求广义输出权值
W2 = W2Ex(:,1:ClusterNum) % 输出权值
B2 = W2Ex(:,ClusterNum+1) 


% 测试  预测数据输出
TestDistance = dist(Centers',TestSamIn);
TestSpreadsMat = repmat(Spreads,1,TestSamNum);
TestHiddenUnitOut = radbas(TestDistance./TestSpreadsMat);
TestNNOut = W2*TestHiddenUnitOut+B2;


figure

plot(TestNNOut,'-k.');
hold on
plot(TestSamOut,'-g.');
grid on
legend('预测输出','实际输出')


%方差
 a=max(Centers);
 b=min(Centers);
 c=abs(a-b);
 d=c./sqrt(2*ClusterNum)
 
 d1=var(Centers)
        

如有侵权,立删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值