人工智能算法(1)感知机原理及代码实现(C#)

感知机原理

以下3篇文章写的很好,不敢赘述。

  1. 统计学习方法|感知机原理剖析及实现对感知机的讲解很直观。例如有一堆零件,每个零件有重量、长度等。零件检验人员依据专业知识,按零件的重量(重量在10-20且长度在1-5为好)和长度判断零件质量的好坏而将一堆零件分为good和bad两类——即样本。对于非专业人员(如程序员)、电脑,给一个零件,如何判断质量好坏?没有专业背景知识,只能猜测判断好坏的依据——即特征:零件的颜色、重量、长度、体积等等,然后建立4维特征空间的向量样本,进行训练。最关键的其实是特征提取!
  2. 梯度下降法求解感知机模型,该文中的梯度下降法求解函数最小值的实例很好,有助于理解梯度下降法的应用。
  3. 机器学习之感知机与梯度下降法认知,该文先求解梯度(偏导),以便于负梯度方向更新值,便于理解更新过程。下图也来源于该文。
    人工智能算法(1)感知机原理及代码实现(C#)_第1张图片

C#代码实现

class Perceptron
    {
        /// 
        /// 朴素感知机算法
        /// 
        /// 样本数据,二维数组mxn:m行元素表示有m个样本点,每个样本点有n-1个特征,每行的最后一列是每行样本的标签(用1或-1标识)
        /// 步长,也叫学习率
        /// 最大迭代次数
        /// 数组类型,感知机模型参数 
        public double[] PerceptronTrain(double[,] SampleData,double step, int MAXIterationNum)
        {
            int flag = 0;//循环标识
            int times = 0;//迭代次数
            int dimension = SampleData.GetLength(0)-1;//样本空间的维度
            int rowsNum = SampleData.Length / (dimension + 1);//样本的个数,也就是二维数组的行数

            double[] para = new double[dimension+1];//para最后一个数据为超平面的偏置项
            //初始化模型参数为0
            for (int i = 0; i < para.Length; i++)
            {
                para[i] = 0;
            }
            do
            {
                for (int i = 0; i < rowsNum; i++)
                {
                    double y =0;
                    for (int j = 0; j < dimension; j++)
                    {
                        y += para[j] * SampleData[i, j];
                    }
                    y += para[dimension];
                    if (sign(y)!=SampleData[i,dimension])//如果是误分类点,更新模型参数。
                    {
                        for (int j = 0; j < dimension; j++)
                        {
                              para[j]= para[j] +step* SampleData[i,j]*SampleData[i,dimension];
                        }
                        para[dimension]+=step* SampleData[i, dimension];
                        flag =1;
                        times += 1;
                        break;
                    }
                    else
                    {
                        flag = 0;
                    }
                }
            } while (flag == 1&&times< MAXIterationNum); //存在误分类,且迭代次数小于预设的最大迭代次数。           
            return para;
        } 

         /// 
        /// sign函数
        /// 
        /// 
        /// -1或1
        public int sign(double y)
        {
            if (y < 0||y==0)
            {
                return -1;
            }
            else
            {
                return 1;
            }
        }

运行结果如下图:
人工智能算法(1)感知机原理及代码实现(C#)_第2张图片

你可能感兴趣的:(人工智能,算法)