单神经元感知机代码

来源:互联网 发布:省份的三级联动数据库 编辑:程序博客网 时间:2024/04/30 16:40

这两天在看神经网络设计(中文版),有些地方不是很懂。因此自己动手写代码以加深理解。

顺便把代码贴上来,大家一起看看。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;
        }
    }

}

原创粉丝点击