随机梯度下降感知机Perceptron(C#)学习案例

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.缺点

单个感知机仅能实现与、或、非逻辑分类,无法实现异或。

猜你喜欢

转载自blog.csdn.net/JAYLEE900/article/details/131987658