人工智能算法(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;
            }
        }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值