1.思想
感知机(Perceptron)是一种线性分类的模型,针对线性可分的数据,感知机分类结果并不唯一,进寻找其中一种方案。如果推广至高维空间,则为寻找一个分类超平面,其学习过程就是寻找合适的损失函数,并尽可能使损失最小化,属于监督学习算法;
2.代码
/// <summary>
/// 随机梯度下降感知机
/// </summary>
/// <param name="x">样本矩阵(存在首列1向量)</param>
/// <param name="y">标签矩阵(列)</param>
/// <param name="lr">学习率</param>
/// <param name="iterations">最大迭代次数</param>
/// <returns></returns>
public static double[,] PerceptronModel(double[,] x, double[,] y,double lr=1e-2,double iterations=1e4)
{
int p = x.GetLength(1);
int n = x.GetLength(0);
double[,] beta = new double[p, 1];
//初始化权重矩阵[0,0,…,0]
int rId = 0;
for(int t = 0; t < iterations; t++)
{
//随机梯度下降部分
rId = new Random().Next(n);
//随机找寻样本数据相应索引
double[,] currRow = Matrix.VectorGenerate(Matrix.MatrixGetVector(x, rId, true), true);
//获取随机索引样本数据
double linePart = Matrix.MultiplyMatrix(currRow, beta)[0, 0];
//误分类条件:
//当样本标签yi与分类结果符号不一致,说明判定与结果不符
//sign(x)={x>0,-1;x=0,0;x<0,-1}
bool check = -1 * y[rId, 0] * Sign(linePart) >= 0;
//误分类判断
if (!check)
{
continue;
}
else
{
double[,] lossGrad = Matrix.MultiplyConst(currRow, y[rId, 0]);
//损失函数梯度计算
lossGrad = Matrix.MultiplyConst(lossGrad, lr);
//权重系数=权重系数+学习率*损失函数梯度
beta = Matrix.AddMatrix(beta, Matrix.Transpose(lossGrad));
//权重系数更新
}
}
return beta;
}
3.缺点
单个感知机仅能实现与、或、非逻辑分类,无法实现异或。