参考:
人工神经网络算法是模拟人的神经网络的一种算法.
该算法像人一样,具有一定的学习能力。人工神经网络可以学会它所能表达的任何东西.
该算法在模拟人类抽象思维方面较传统的算法具有优势,如图像识别 (人脸识别,车牌识别), 声音识别方面已经有成熟的运用。
举个简单的例子可以说明人工神经网络和传统算法的差别所在 (等会也要实现):
假设要解决这个问题: 写一个程序, 判断 0, 1, 2, 3 ... 9 这10个数的奇偶性
1. 如果是传统算法, 则是模拟人的逻辑思维,对这个问题进行形式化和逻辑化 :
if (input 模 2 == 零) {
input 是 偶数
} else {
input 是 奇数
}
2. 如果是ANN算法,则要提供一组正确的数据对处理这个问题的神经网络ANN进行训练 :
未进行训练的神经网络,就像刚出生的婴儿一样,什么都不懂。这个时候, 你要教他 0 是偶数, 1是奇数....,
教完之后问ANN懂了没有,懂了则停止训练 (网络已经形成),不懂则继续训练.
while (1) {
训练;
if (测试通过) {
跳出循环;
}
}
训练完之后,这个ANN以后便能够正确处理 奇偶性判断的问题了.
处理上面这个问题,只需要模拟一个神经元即可,再复杂的问题,可能需要多个神经元,再再复杂,需要多层多神经元的配合来实现 (以后再研究)
//感知器判断数字奇偶性
//关键点,阈值应该怎么定
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <iostream>
using namespace std;
int M[10];//权值
int X[10]={1,2,3,4,5,6,7,8,9,10};//输入向量,
int Y[10]={1,0,1,0,1,0,1,0,1,0};//理想输出向量,0表示奇数,1表示偶数
int O[10];//保存输出向量
int ST=52;//阈值
void initM()
{
int x =0;
srand((unsigned int)time(0));
for(x=0;x<10;++x)
{
M[x]=rand()%100;
}
}
/**?跃迁型激活函数?**/
int active(int m, int x)
{
int o=m*x;
if(o>ST)
{
return 1;
}
else
{
return 0;
}
}
//计算输出向量
void calcY()
{
int x=0;
for(x=0;x<10;++x)
{
O[x]=active(M[x],X[x]);
}
}
//根据实际输出向量和理想输出向量调整权向量,返回实际输出和理想输出不匹配的数目
int adjustM()
{
int err=0;int x=0;
for(x=0;x<10;++x)
{
if(O[x]!=Y[x])
{
err++;
if(0==O[x])
{
M[x]+=X[x];
}
else
{
M[x]-=X[x];
}
}
}
return err;
}
/**?打印权向量?**/
void printM()
{
int x=0;
for(x=0;x<10;++x)
{
printf("M[%d]=%d\n",x,M[x]);
}
}
void test(int input)
{
printf("[%d][%d]",M[input],X[input]);
if(active(M[input],X[input]))
{
printf("%d是偶数\n",input);
}
else
{
printf("%d是奇数\n",input);
}
}
int main()
{
int n=0;
initM();
/**?一直训练直到能够100%正确为止?**/
while(1)
{
n++;
calcY();
int err=adjustM();
if(0>=err)
{
//能够?100?%正确地回答问题了,结束训练
break;
}
cout<<"错误数"<<err<<endl;
}
printM();
printf("阈值%d训练次数%d\n",ST,n);
while(1)
{
int a=0;
scanf("%d",&a);
if(0>a||9<a)
{
break;
}
test(a);
}
return 0;
}