欢迎来到 安卓源码空间!
安卓源码空间

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



感知机原理

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

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

C#代码实现

 class Perceptron
    {
        /// <summary>
        /// 朴素感知机算法
        /// </summary>
        /// <param name="SampleData">样本数据,二维数组mxn:m行元素表示有m个样本点,每个样本点有n-1个特征,每行的最后一列是每行样本的标签(用1或-1标识)</param>
        /// <param name="step">步长,也叫学习率</param>
        /// <param name="MAXIterationNum">最大迭代次数</param>
        /// <returns>数组类型,感知机模型参数</returns> 
        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;
        } 

         /// <summary>
        /// sign函数
        /// </summary>
        /// <param name="y"></param>
        /// <returns>-1或1</returns>
        public int sign(double y)
        {
            if (y < 0||y==0)
            {
                return -1;
            }
            else
            {
                return 1;
            }
        }

运行结果如下图:
在这里插入图片描述


————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
                            原文链接:https://blog.csdn.net/weixin_42727550/article/details/109176426

copyright@ 2020-2028  安卓源码空间网版权所有   

备案号:豫ICP备2023034476号-1号