📄 mlvq.cpp
字号:
//该函数用改进的LVQ实现对prototype部分的训练
/* 输入参数包括:
prototype -- 指向prototype部分的指针
N -- prototype部分的结点个数
TrainNum -- 训练样本的个数
L -- 训练样本的维数
Train -- 训练样本集合
*/
#include <iostream.h>
#include <stdio.h>
#include "FuzzyNN.h"
#include "feedfoward.h"
#include "tools.h"
void mlvq(ProtoNode *prototype,int N,int TrainNum,int L,FuzzyNum **Train)
{
double alpha0;
int T;
int i,j,t,k;
double alpha;
int c;
double D;
double *s;
double *w;
s=new double[N+1];
mcheck(s);
w=new double[N+1];
mcheck(w);
cout<<"==================================="<<endl;
cout<<"现在开始对神经网络进行第一趟的训练."<<endl;
cout<<"请输入初始学习速率的大小:"<<endl;
cin>>alpha0;
T=10;
//初始化prototype部分
for(j=1;j<=N;j++)
{
for(i=1;i<=L;i++)
{
(prototype[j].w)[i].w1=frand(0.45,0.55);
(prototype[j].w)[i].w2=(prototype[j].w)[i].w1;//frand(0.45,0.55);
(prototype[j].w)[i].a=frand(0.45,0.55);
(prototype[j].w)[i].b=frand(0.45,0.55);
}
for(i=1;i<=N;i++)
if(i==j)(prototype[j].g)[i]=1;
else (prototype[j].g)[i]=0;
}
//对结点的权值进行调整
for(t=0;t<T;t++)
{
alpha=alpha0*(1-(double)t/T);
for(k=1;k<=TrainNum;k++)
{
c=feedforward(prototype,N,NULL,0,Train[k],L);
for(j=1;j<=N;j++)
{
s[j]=0;
for(i=1;i<=L;i++)
s[j]+=(coa(Train[k][i])-coa((prototype[j].w)[i]))*(coa(Train[k][i])-coa((prototype[j].w)[i]));
}
D=0;
for(j=1;j<=N;j++)
D+=s[j];
w[c]=1-s[c]/D+s[c]*s[c]/(2*D*D);
for(j=1;j<=N;j++)
if(j!=c)w[j]=s[c]*s[c]/(2*D*D);
for(j=1;j<=N;j++)
{
for(i=1;i<=L;i++)
{
(prototype[j].w)[i].w1+=alpha*w[j]*(Train[k][i].w1-(prototype[j].w)[i].w2);
(prototype[j].w)[i].w2+=alpha*w[j]*(Train[k][i].w2-(prototype[j].w)[i].w1);
(prototype[j].w)[i].a+=alpha*w[j]*(Train[k][i].a+(prototype[j].w)[i].b);
(prototype[j].w)[i].b+=alpha*w[j]*(Train[k][i].b+(prototype[j].w)[i].a);
}
}
}
}
cout<<"神经网络第一趟训练完毕."<<endl;
cout<<"==================================="<<endl;
delete []s;
delete []w;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -