这两天在看神经网络设计(中文版),有些地方不是很懂。因此自己动手写代码以加深理解。
顺便把代码贴上来,大家一起看看。c#写的。代码中已经有详细解释了。
付一个效果图
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace neuralNetworks
{
/// <summary>
/// 参考文献:神经网络设计_中文版 第4章
/// 乐子:2008-11-25
/// </summary>
class singlePerceptron
{
//
int R, S;//r是输入向量的维数,s是输出向量的维数,这里取s=1;
public double[,] W;//权值矩阵=int[s,r]
public double[,] B;//偏置向量b=[s,1]
public singlePerceptron(int inputDimension,int outputDimension)
{
R = inputDimension ;
S = outputDimension;
init();
}
private void init()
{
//初始化感知器
W = new double[S, R];
B = new double[S,1];
//W[0, 0] = 0.5;
//W[0, 1] = -1;
//W[0, 2] = -0.5;
//B[0, 0] = 0.5;
}
public void train(double[,] inputs,int[] outputs)
{
//训练感知器,参考p42页
int sampleCount = inputs.GetLength(0);//训练集样本个数
bool error=true;//出现计算结果和目标不一致
double sum;
int e;
while (error)
{
//用训练集迭代更新W,B
error=false ;
for (int j = 0; j < sampleCount; j++)
{
for (int i = 0; i < S; i++)
{
//W[i]*inputs[j]+B[i],W[i]是R维的,B[i]是1维的
//这里以后写个矩阵运算函数进行规范,先直接用for语句
sum=0;
for (int h = 0; h < R; h++)
{
sum = sum + W[i, h] * inputs[j, h];
}
sum = sum + B[i,0];
//传输函数
//计算e值
e =outputs[j]- transmissionFun.hardlim(sum,0);
//修正权值
if (e != 0)
{
error = true;
for (int h = 0; h < R; h++)
{
W[i,h] =W[i, h]+e * inputs[j, h];
}
B[i, 0] = B[i, 0] + e;
}
//
}
}
}
}
public int sim(double[] input)
{
double sum = 0;
for (int i = 0; i < S; i++)
{
for (int h = 0; h < R; h++)
{
sum = sum + W[i, h] * input[h];
}
sum = sum + B[i, 0];
}
return transmissionFun.hardlim(sum,0);
}
public void ToString()
{
}
}
static class transmissionFun
{
static public int hardlim(double v,double thresh)
{
if (v >= thresh)
return 1;
return 0;
}
}
}