目录
一、理论基础
一、算法介绍
基于模糊聚类和广义回归神经网络(FCM-GRNN)的数据预测算法是一种适用于非线性数据预测的方法。该算法首先使用模糊C均值(FCM)聚类算法将数据集划分为不同的类别,然后利用广义回归神经网络(GRNN)对每个类别进行预测。通过将FCM聚类和GRNN神经网络相结合,该算法能够有效地处理非线性数据,并具有较高的预测准确性。
二、算法原理
模糊C均值聚类算法
模糊C均值聚类算法是一种基于距离度量的非监督学习方法。该算法的目标是将数据集划分为k个不同的类别,其中每个数据可以属于多个类别,每个类别对应一个聚类中心。模糊C均值聚类算法的数学模型可以表示为:
$$\mathbf{J}=\sum_{i=1}^{n}\sum_{j=1}^{k}w_{ij}^m||\mathbf{x_i}-\mathbf{v_j}||^2$$
其中,$n$表示数据集中样本的数量,$k$表示聚类中心的数量,$m$是模糊指数,$w_{ij}$表示样本$\mathbf{x_i}$属于聚类中心$\mathbf{v_j}$的隶属度,$\mathbf{J}$是目标函数。模糊C均值聚类算法的核心是通过最小化目标函数$\mathbf{J}$来求解聚类中心和样本的隶属度。
广义回归神经网络
广义回归神经网络是一种基于模板匹配的神经网络模型。该模型利用高斯径向基函数对样本空间进行建模,并通过学习模板库中的模板来进行数据分类和预测。广义回归神经网络的数学模型可以表示为:
$$y(\mathbf{x})=\frac{\sum_{i=1}^{n}w_ih_i(\mathbf{x})}{\sum_{i=1}^{n}w_i}$$
其中,$y(\mathbf{x})$表示在输入$\mathbf{x}$的条件下输出的预测值,$h_i(\mathbf{x})$是第$i$个高斯径向基函数,$w_i$是第$i$个高斯径向基函数的权重,$n$是高斯径向基函数的数量。广义回归神经网络的核心是通过学习权重和高斯径向基函数来对样本进行建模,并利用学习到的模型对新的输入数据进行预测。
FCM-GRNN算法
FCM-GRNN算法的核心思想是将模糊C均值聚类算法和广义回归神经网络相结合,利用聚类算法将数据集划分为不同的类别,并利用回归神经网络对每个类别进行预测。具体的算法流程如下:
(1)输入数据集
输入数据集${\mathbf{x_i},y_i}$,其中$\mathbf{x_i}$表示第$i$个样本的特征向量,$y_i$表示第$i$个样本的目标值。
(2)FCM聚类
使用模糊C均值聚类算法将数据集划分为$k$个不同的类别,其中每个类别对应一个聚类中心。
(3)GRNN预测
对于每个类别,利用广义回归神经网络对其进行预测。对于输入$\mathbf{x}$,GRNN的预测结果可以表示为:
$$y(\mathbf{x})=\frac{\sum_{i=1}^{n_j}w_{ij}h_i(\mathbf{x})}{\sum_{i=1}^{n_j}w_{ij}}$$
其中,$n_j$表示第$j$个类别中的样本数量,$w_{ij}$表示样本$\mathbf{x_i}$属于类别$j$的隶属度,$h_i(\mathbf{x})$是第$i$个高斯径向基函数。
(4)输出预测结果
将每个类别的预测结果进行加权平均,得到最终的预测结果:
$$\hat{y}(\mathbf{x})=\frac{\sum_{j=1}^{k}w_jy_j(\mathbf{x})}{\sum_{j=1}^{k}w_j}$$
其中,$\hat{y}(\mathbf{x})$表示输入$\mathbf{x}$的预测结果,$y_j(\mathbf{x})$表示对于类别$j$的预测结果,$w_j$表示类别$j$的权重。
三、算法实现
在MATLAB中,可以使用以下步骤实现基于FCM-GRNN的数据预测算法:
导入数据
首先,从文件或其他数据源中导入数据集,包括特征向量和目标值。
FCM聚类
使用MATLAB中的fcm函数进行模糊C均值聚类。该函数可以根据输入的数据集和聚类中心的数量$k$,返回每个样本属于不同聚类中心的隶属度$w_{ij}$,以及每个聚类中心的坐标。
GRNN预测
对于每个类别$j$,使用MATLAB中的newgrnn函数训练一个广义回归神经网络。对于每个输入$\mathbf{x}$,使用该函数预测输出$y_j(\mathbf{x})$。
输出预测结果
将每个类别的预测结果$y_j(\mathbf{x})$与其对应的权重$w_j$相乘,并将结果相加,得到最终的预测结果$\hat{y}(\mathbf{x})$。
二、核心程序
%% 模糊聚类
data=P1;
[center,U,obj_fcn] = fcm(data,5);
for i=1:R1
[value,idx]=max(U(:,i));
a1(i)=idx;
end
%% 模糊聚类结果分析
Confusion_Matrix_FCM=zeros(6,6);
Confusion_Matrix_FCM(1,:)=[0:5];
Confusion_Matrix_FCM(:,1)=[0:5]';
for nf=1:5
for nc=1:5
Confusion_Matrix_FCM(nf+1,nc+1)=length(find(a1(find(T1==nf))==nc));
end
end
%% 网络训练样本提取
cent1=P1(find(a1==1),:);cent1=mean(cent1);
cent2=P1(find(a1==2),:);cent2=mean(cent2);
cent3=P1(find(a1==3),:);cent3=mean(cent3);
cent4=P1(find(a1==4),:);cent4=mean(cent4);
cent5=P1(find(a1==5),:);cent5=mean(cent5);
%提取范数最小为训练样本
for n=1:R1;
ecent1(n)=norm(P1(n,:)-cent1);
ecent2(n)=norm(P1(n,:)-cent2);
ecent3(n)=norm(P1(n,:)-cent3);
ecent4(n)=norm(P1(n,:)-cent4);
ecent5(n)=norm(P1(n,:)-cent5);
end
for n=1:csum
[va me1]=min(ecent1);
[va me2]=min(ecent2);
[va me3]=min(ecent3);
[va me4]=min(ecent4);
[va me5]=min(ecent5);
ecnt1(n,:)=P1(me1(1),:);ecent1(me1(1))=[];tcl(n)=1;
ecnt2(n,:)=P1(me2(1),:);ecent2(me2(1))=[];tc2(n)=2;
ecnt3(n,:)=P1(me3(1),:);ecent3(me3(1))=[];tc3(n)=3;
ecnt4(n,:)=P1(me4(1),:);ecent4(me4(1))=[];tc4(n)=4;
ecnt5(n,:)=P1(me5(1),:);ecent5(me5(1))=[];tc5(n)=5;
end
P2=[ecnt1;ecnt2;ecnt3;ecnt4;ecnt5];T2=[tcl,tc2,tc3,tc4,tc5];
k=0;
%% 迭代计算
for nit=1:10%开始迭代
%% 广义神经网络聚类
net = newgrnn(P2',T2,50); %训练广义网络
a2=sim(net,P1') ; %预测结果
%输出标准化(根据输出来分类)
a2(find(a2<=1.5))=1;
a2(find(a2>1.5&a2<=2.5))=2;
a2(find(a2>2.5&a2<=3.5))=3;
a2(find(a2>3.5&a2<=4.5))=4;
a2(find(a2>4.5))=5;
%% 网络训练数据再次提取
cent1=P1(find(a2==1),:);cent1=mean(cent1);
cent2=P1(find(a2==2),:);cent2=mean(cent2);
cent3=P1(find(a2==3),:);cent3=mean(cent3);
cent4=P1(find(a2==4),:);cent4=mean(cent4);
cent5=P1(find(a2==5),:);cent5=mean(cent5);
for n=1:R1%计算样本到各个中心的距离
ecent1(n)=norm(P1(n,:)-cent1);
ecent2(n)=norm(P1(n,:)-cent2);
ecent3(n)=norm(P1(n,:)-cent3);
ecent4(n)=norm(P1(n,:)-cent4);
ecent5(n)=norm(P1(n,:)-cent5);
end
%选择离每类中心最近的csum个样本
for n=1:csum
[va me1]=min(ecent1);
[va me2]=min(ecent2);
[va me3]=min(ecent3);
[va me4]=min(ecent4);
[va me5]=min(ecent5);
ecnt1(n,:)=P1(me1(1),:);ecent1(me1(1))=[];tc1(n)=1;
ecnt2(n,:)=P1(me2(1),:);ecent2(me2(1))=[];tc2(n)=2;
ecnt3(n,:)=P1(me3(1),:);ecent3(me3(1))=[];tc3(n)=3;
ecnt4(n,:)=P1(me4(1),:);ecent4(me4(1))=[];tc4(n)=4;
ecnt5(n,:)=P1(me5(1),:);ecent5(me5(1))=[];tc5(n)=5;
end
p2=[ecnt1;ecnt2;ecnt3;ecnt4;ecnt5];T2=[tc1,tc2,tc3,tc4,tc5];
%统计分类结果
Confusion_Matrix_GRNN=zeros(6,6);
Confusion_Matrix_GRNN(1,:)=[0:5];
Confusion_Matrix_GRNN(:,1)=[0:5]';
for nf=1:5
for nc=1:5
Confusion_Matrix_GRNN(nf+1,nc+1)=length(find(a2(find(T1==nf))==nc));
end
end
pre2=0;
for n=2:6;
pre2=pre2+max(Confusion_Matrix_GRNN(n,:));
end
pre2=pre2/R1*100;
end
up2128