CPN神经网络学习

来源:互联网 发布:org.apache.http jar 编辑:程序博客网 时间:2024/05/16 09:19

CPN神经网络的一些资料:

http://wenku.baidu.com/link?url=JIhrQ5tpegz_KfBEV6TT9nPL6SYBq-Msc8GzHJYgAi2rM462hTZy2QU4G7qUQYXlOdVxxHKn-FRKS5Ok9Jkc02gM2B72ySRrf9SM-mqZrT7

CPN神经网络设计步骤如下:


C代码如下:(本代码按照步骤完成,同时也对照MATLAB代码修改,但是并没有预测功能,只能判断已输入的样本属于哪一类。贴出代码,希望大牛能帮帮忙)

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#include "vector"
using namespace std;


#define INF 99999
#define dimIn 4   //输入样本维数
#define dimOut 1  //期望输出样本维数 
#define competeNum 40  //竞争神经元数
#define maxLoop  6000   //训练次数
#define alpha 0.41    //输入层到竞争层的学习率
#define delta 0.32     //竞争层到输出层的学习率


typedef vector<double> doubleVector;


vector<doubleVector> dataIn;   //输入训练样本
vector<doubleVector> dataOut;  //期望输出样本
vector<doubleVector> W;     //输入层到竞争层的权值
vector<doubleVector> V;     //竞争层到输出层的权值
doubleVector B;  //二值输出向量
vector<doubleVector> Y;  //输出层输出向量


void getFileData(char *File1, char *File2);   //获取样本
double EucDistance(doubleVector X);   //计算欧式距离
void NormalizationX();   //输入样本归一化
void NormalizationW();   //连接权值归一化
void NormalizationV();   //输出层权值归一化
void Initialize();     //初始化权值
void CPN_Train();      //开始训练
int chooseWg(doubleVector X);  //选择权重与X距离最近的向量
void Use_CPN();  //使用CPN网络
doubleVector round(doubleVector src);   //四舍五入


//主函数
void main()
{
int i, j;
char *File1 = "in.txt";
char *File2 = "out.txt";


getFileData(File1, File2);  //获取样本


NormalizationX();  //输入样本归一化


srand(time(NULL));
Initialize();   //初始化权值


CPN_Train();      //开始训练

Use_CPN(); //使用CPN网络
 
}




//使用CPN网络
void Use_CPN()
{
int i, g;
double num, dis;
doubleVector test;
doubleVector out_sam;


while(1)
{
test.clear();
out_sam.clear();


printf("输入测试样本:\n");
for(i=0; i<dimIn; i++)
{
scanf("%lf", &num);
test.push_back(num);
}


dis = EucDistance(test);
for(i=0; i<dimIn; i++)
test[i] = test[i]/dis;


g = chooseWg(test);


for(i=0; i<dimOut; i++)
out_sam.push_back(V[i][g]);


out_sam = round(out_sam);   //四舍五入


printf("测试结果:\n");
for(i=0; i<out_sam.size(); i++)
printf("%lf  ", out_sam[i]);


printf("\n\n");


}


}




//开始训练
void CPN_Train()
{
int i, g, k;
int t=0;  //计步器


double dis;


Y = dataOut;
  while(t<maxLoop)
  {
for(i=0; i<dataIn.size(); i++)
{
NormalizationW();
g = chooseWg(dataIn[i]);  //选择权值


//权值修正W
for(k=0; k<dataIn[i].size(); k++)
W[g][k] = W[g][k]+alpha*(dataIn[i][k]-W[g][k]);


//归一化
dis = EucDistance(W[g]);
for(k=0; k<dimIn; k++)
W[g][k] = W[g][k]/dis;




//修正权重V
for(k=0; k<dimOut; k++)
V[k][g] = V[k][g]+delta*(dataOut[i][k]-V[k][g]);


}


  t++;  //计步器加1
  }


}




//四舍五入
doubleVector round(doubleVector src)
{
int i;
doubleVector dst;


for(i=0; i<src.size(); i++)
{
if(src[i]-(int)src[i]>=0.5)
dst.push_back((int)src[i]+1);
else
dst.push_back((int)src[i]);


}

return dst;
}




//选择权重与X距离最近的向量
int chooseWg(doubleVector X)
{
int i, j, label;
double sum, max=0;


label = 0;
for(i=0; i<competeNum; i++)
{
sum = 0;
for(j=0; j<dimIn; j++)
sum += X[j]*W[i][j];


if(sum>max)
{
max = sum;
label = i;
}
}


return label;
}




//初始化权值
void Initialize()
{
int i, j;
doubleVector temp;


//输入层到竞争层的权值
for(i=0; i<competeNum; i++)
{
temp.clear();
for(j=0; j<dimIn; j++)
temp.push_back((double)(rand()%RAND_MAX)/RAND_MAX);
W.push_back(temp);
}


//竞争层到输出层的权值
for(i=0; i<dimOut; i++)
{
temp.clear();
for(j=0; j<competeNum; j++)
temp.push_back((double)(rand()%RAND_MAX)/RAND_MAX);
V.push_back(temp);
}
}




//连接权值归一化
void NormalizationW()
{
int i, j;
double dis;

for(i=0; i<competeNum; i++)
{
dis = EucDistance(W[i]);
for(j=0; j<dimIn; j++)
W[i][j] = W[i][j]/dis;
}


}




//计算欧式距离
double EucDistance(doubleVector X)
{
int i;
double sum=0;


for(i=0; i<X.size(); i++)
sum += X[i]*X[i];


sum = sqrtf(sum);


return sum;
}




//输入样本归一化
void NormalizationX()
{
int i, j;
double dis;


for(i=0; i<dataIn.size(); i++)
{
dis = EucDistance(dataIn[i]);
for(j=0; j<dimIn; j++)
dataIn[i][j] = dataIn[i][j]/dis;
}


}




//获取样本
void getFileData(char *File1, char *File2)
{
int i;
double num;


FILE *fp1 = fopen(File1, "r");
FILE *fp2 = fopen(File2, "r");


if(fp1==NULL || fp2==NULL)
{
printf("Open file error!!!\n");
exit(0);
}


doubleVector temp;


//输入的样本
i = 1;
temp.clear();
while(fscanf(fp1, "%lf", &num)!=EOF)
{
temp.push_back(num);
if(i%dimIn==0)
{
dataIn.push_back(temp);
temp.clear();
}
i++;
}


//输出的样本
i = 1;
temp.clear();
while(fscanf(fp2, "%lf", &num)!=EOF)
{
temp.push_back(num);
if(i%dimOut==0)
{
dataOut.push_back(temp);
temp.clear();
}
i++;
}
}

0 0
原创粉丝点击