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