人工智能算法(1)感知机原理及代码实现(C#)
感知机原理
以下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&×< 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