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

it2022-12-27  111

感知机原理

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

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

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; } }

运行结果如下图:

最新回复(0)