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++;
}
}
- CPN神经网络学习
- 系统学习机器学习之神经网络(七) --CPN
- CPN神经网络C程序
- 对偶传播神经网络(CPN)
- 神经网络学习
- 神经网络学习
- 神经网络学习
- 神经网络学习
- 神经网络学习
- 神经网络:学习
- 神经网络学习
- 神经网络学习
- 神经网络学习 之 BP神经网络
- CPN Tools 入门(一)
- 神经网络 专家系统 机器学习
- 人工神经网络学习笔记
- 神经网络 专家系统 机器学习
- 神经网络 专家系统 机器学习
- MyEclipse中使用Junit--Test Case
- Target runtime Apache Tomcat v7.0 is not defined.
- 概念:CGI,FastCGI,PHP-CGI与PHP-FPM
- 仿 UIAlertView 弹出动画效果
- Struts2中Action的传值方式
- CPN神经网络学习
- php异常处理
- POJ2976 Dropping tests (分数规划)
- 可拖动可伸缩的div
- matlab 按颜色画网格bar3 不同于surf,pcolor(儿子的papa)
- 将下载下来的rpm包生成自己的yum源
- Content-Disposition的使用方法
- 在git 中修改之前的提交内容
- 子数组之和