% clc
% clear
%
% data=xlsread('data.xls');
% train=data(1:73,:);
% test=data(78:86,:);
SamNum=2688; %训练样本
TestSamNum=96; %
Overlap=2.0; %
% %输入输出矩阵
% %训练数据
% SamIn=train(:,1:12)';
% SamOut=train(:,13)'*2;
% %预测数据
% TestSamIn=test(:,1:12)';
% TestSamOut=test(:,13)'*2;
%输入输出矩阵
%训练数据
SamIn=input(1:2688,:)';
SamOut=output(1:2688,:)';
%预测数据
TestSamIn=input(2689:end,:)';
TestSamOut=output(2689:end,:)';
%节点数
InDim=12; %输入节点
ClusterNum=24; %隐含节点
%初始化中心
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
AllDistances=dist(Centers',Centers);
Maximun=max(max(AllDistance));
for i=1:ClusterNum
AllDistances(i,i)=Maximun+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);
[n2,m2]=size(TestSamOut);
for i=1:m2
TestNNOut(:,i)=W2*TestHiddenUnitOut(:,i)+B2;
end
R2_rbf = (96 * sum(TestNNOut.* TestSamOut) - sum(TestNNOut) * sum(TestSamOut))^2 / ((96* sum((TestNNOut).^2) - (sum(TestNNOut))^2) * (96 * sum((TestSamOut).^2) - (sum(TestSamOut))^2))
plot(TestNNOut,'-r*');
hold on
plot(TestSamOut,':go');
legend('预测输出','实际输出')
评论2