声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1442|回复: 0

[共享资源] 基于聚类的RBF 网设计算法

[复制链接]
发表于 2006-11-6 23:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

  6. % 根据目标函数获得样本输入输出
  7. rand('state',sum(100*clock))
  8. NoiseVar = 0.1;
  9. Noise = NoiseVar*randn(1,SamNum);
  10. SamIn = 8*rand(1,SamNum)-4;
  11. SamOutNoNoise = 1.1*(1-SamIn+2*SamIn.^2).*exp(-SamIn.^2/2);
  12. SamOut = SamOutNoNoise + Noise;

  13. TestSamIn = -4:0.08:4;
  14. TestSamOut = 1.1*(1-TestSamIn+2*TestSamIn.^2).*exp(-TestSamIn.^2/2);

  15. figure
  16. hold on
  17. grid
  18. plot(SamIn,SamOut,'k+')
  19. plot(TestSamIn,TestSamOut,'k--')
  20. xlabel('Input x');
  21. ylabel('Output y');

  22. Centers = SamIn(:,1:ClusterNum);

  23. NumberInClusters = zeros(ClusterNum,1); % 各类中的样本数,初始化为零
  24. IndexInClusters = zeros(ClusterNum,SamNum); % 各类所含样本的索引号
  25. while 1,
  26. NumberInClusters = zeros(ClusterNum,1); % 各类中的样本数,初始化为零
  27. IndexInClusters = zeros(ClusterNum,SamNum); % 各类所含样本的索引号

  28. % 按最小距离原则对所有样本进行分类
  29. for i = 1:SamNum
  30. AllDistance = dist(Centers',SamIn(:,i));
  31. [MinDist,Pos] = min(AllDistance);
  32. NumberInClusters(Pos) = NumberInClusters(Pos) + 1;
  33. IndexInClusters(Pos,NumberInClusters(Pos)) = i;
  34. end
  35. % 保存旧的聚类中心
  36. OldCenters = Centers;

  37. for i = 1:ClusterNum
  38. Index = IndexInClusters(i,1:NumberInClusters(i));
  39. Centers(:,i) = mean(SamIn(:,Index)')';
  40. end
  41. % 判断新旧聚类中心是否一致,是则结束聚类
  42. EqualNum = sum(sum(Centers==OldCenters));
  43. if EqualNum == InDim*ClusterNum,
  44. break,
  45. end
  46. end

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

  54. % 计算各隐节点的输出权值
  55. Distance = dist(Centers',SamIn); % 计算各样本输入离各数据中心的距离
  56. SpreadsMat = repmat(Spreads,1,SamNum);
  57. HiddenUnitOut = radbas(Distance./SpreadsMat); % 计算隐节点输出阵
  58. HiddenUnitOutEx = [HiddenUnitOut' ones(SamNum,1)]'; % 考虑偏移
  59. W2Ex = SamOut*pinv(HiddenUnitOutEx); % 求广义输出权值
  60. W2 = W2Ex(:,1:ClusterNum); % 输出权值
  61. B2 = W2Ex(:,ClusterNum+1); % 偏移

  62. % 测试
  63. TestDistance = dist(Centers',TestSamIn);
  64. TestSpreadsMat = repmat(Spreads,1,TestSamNum);
  65. TestHiddenUnitOut = radbas(TestDistance./TestSpreadsMat);
  66. TestNNOut = W2*TestHiddenUnitOut+B2;
  67. plot(TestSamIn,TestNNOut,'k-')
  68. W2
  69. B2
复制代码

评分

1

查看全部评分

回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-19 20:32 , Processed in 0.066461 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表