神经网络(1):感知器

来源:互联网 发布:怎么关淘宝店铺 编辑:程序博客网 时间:2024/06/05 20:31

人工神经网络入门:

感知器是神经网络中最简单的一种模型,是通过加权求和函数计算,之后根据结果实现二分类


感知器算法的实现:(实现二分类)

先输入两类样本,后对数据进行增广化,以及符号规范化,然后训练样本并调整权值,训练完毕后保存权值。

如:二维样本(0,1),前两个数字为二维输入。

增广化:将(0,1),变为(0,1,1),即隐含输入1。

符号规范化:如(0,1),(0,0)属于1类,(1,0),(1,1)属于2类,则增广化后分别为(0,1,1),(0,0,1),(1,0,1),(1,1,1),

规范化就是将某一类的值都乘以-1,比如2类样本乘以-1,即(0,1,1),(0,0,1),(-1,0,-1),(-1,-1,-1)。


代码实现:

定义全局变量:

#define MAX_SAMPLE_NUM   100     // 最大样本个数#define MAX_NUM       1000    // 最大训练次数double RATE = 0.6;               // 学习率int SAMPLE_NUM = 0;              // 样本个数int NUMBER = 2;                  // 维数double **SAMPLE;                 // 样本集double *SAMPLE_Y;                // 真实结果集double *WEIGHT;                  // 权值集
训练样本过程:
// 训练void train2(){int i,j,k,fal;WEIGHT = new double[NUMBER+1];  //初始化权值集for (i = 0; i<NUMBER+1; i++){WEIGHT[i] = 1;}cout << "\n开始训练!!!\n\n";k=0;  //迭代次数while(true){fal=0;  //划分错误的次数for(i=0; i<SAMPLE_NUM; i++){cout << "第" << ++k << "步迭代:";if(out(SAMPLE[i]) > 0)  //正确划分{for(j=0; j<NUMBER+1; j++){cout << WEIGHT[j] << " ";}}else  //调整权值{fal++;for(j=0; j<NUMBER+1; j++){WEIGHT[j] += RATE * SAMPLE[i][j];cout << WEIGHT[j] << " ";}cout << "  样本" << i+1 << "错分";}cout << endl;if(k==MAX_NUM){cout << "已达到最大训练次数!" <<endl;return;}}cout << "第" << k/SAMPLE_NUM << "轮迭代尚被错分的数量:" << fal <<"\n\n";if(fal==0)break;}}
保存权值:

// 保存权值void saveWeight(char *filename){int i;ofstream file;file.open(filename);if (file.fail())  //文件打开失败{cout << "Can't open file!\n";return;}for(i=0; i<NUMBER+1; i++){file << WEIGHT[i] << " ";}file.close();cout << "\n权值保存在文件" << filename << "中!\n";}


不足:
感知器模型虽然简单,但是约束很大。感知器只能对线性可分的样本进行分类,对非线性的样本无效,而且只能分两类。不过,感知器也可以通过两两线性分类实现多分类。感知器只是入门的基础,对于其他分类问题,应使用其他神经网络算法实现。
0 0