首页 > 编程知识 正文

逻辑回归算法原理实例,逻辑回归 算法

时间:2023-05-03 18:35:53 阅读:202897 作者:594

1. 算法原理

logistic/sigmoid函数作用:把取值范围从负无穷到正无穷的公式计算结果,压缩到0和1之间,这样的输出值表达为“可能性”更直观。

逻辑回归算法用于估计预测目标的可能性,它属于软分类算法,即最终得到的是一个具体的概率,而不仅仅是“是”或“不是”这样的二分类结果;

逻辑回归能提供一个样本属于正类的可能性是多少,比如假设对于样本x,回归系数w,(w^T是向量w的转置),使用sigmoid函数可以获得这个样本属于正类的概率为:

 

本次实验标签是二分类模型的(1或者0),所以当我们预测得到概率h(x)时这样判断结果:如果样本x属于正类的概率大于0.5,那么就判定它是正类,否则就是负类。

这条公式很简洁,唯一的未知的变量就是参数w,我们需要通过用训练集来训练求解得到最优w,用这个最优w代入上述公式中即可对测试集样本进行预测。先初始化一个w向量(比如设置其所有元素为1),然后不断迭代找到最优的w,那么要怎么判断一个w是最优的呢?这就又要用到最大似然,或者说是代价函数了。

构建逻辑回归模型f(θ),最典型的构建方法便是应用最大似然估计。似然函数公式:

 

当标签y=1时p=h(x),是x样本属于标签1的概率;当标签y=0时p=1-h(x),是x样本属于标签0的概率,因此p必是x样本属于y标签的概率,或者说p代表了准确度。在这个基础上,推导出代价函数:

 

先解释一下这个公式,当标签y=1时,此时的代价可表示为:

 

如果判定的h(x)=1,即预测正确,则代价cost=0,h(x)越小,代价越大,如果判定的h(x)=0,即预测错误,则代价cost趋于无穷大。

同理当标签y=0时,cost可表示为:

 

如果判定h(x)=0,即预测正确则代价cost=0,h(x)越大,代价越大,如果判定h(x)=1即预测错误,则代价cost趋于无穷大。

这个代价函数表示在坐标系上是一个凹函数,这样我们需要一步步靠近局部最底部,最终就能找出最优值

 

利用梯度下降法,通过对w的不断迭代,直至逼近最优解且收敛,有公式:

公式首先计算整个数据集的梯度(代价),然后使用alpha(学习率) x gradient(梯度)来更新回归系数。

这里面η表示学习率,可以理解为逼近最优解过程中每一步的速度,如果把它设置为一个常量,则迭代将会匀速靠近最优解,实际上我一开始就是这样做的,这样做的问题是,如果η设置的比较大,则代价会极不稳定,达不到收敛效果,因为每次更新w时幅度太大,很有可能越过最优解,达不到优化效果;而如果η设置的比较小,虽然最后能达到收敛效果且收敛到最优解附近,但是耗时太长,如果数据集很大的话,这种将要花费极大的时间。

比较理想的方法是梯度下降中使用动态学习率,即需要随着迭代的进行,同时调整学习率,初始学习率较大,而随后逐渐减小,这样既能省时又能最终达到收敛效果。在实验报告的优化部分有展示动态学习率相比于恒定学习率的优点。

 

随机梯度下降:梯度下降算法一般指批量梯度下降,在每次更新回归系数的时候都需要遍历整个数据集(计算整个数据集的回归误差),计算出下降最快的方向,然后踏出一步,这属于一次迭代,更新一次w值,该方法对小数据集效果很好,但应用于大数据集,则它的计算复杂度太高。改进的方法是一次仅用一个样本点(的回归误差)来更新回归系数,这个方法叫随机梯度下降算法。它克服了批量梯度下降复杂度高的缺点,但是它也有缺点:就是它每次迭代只选取一个样本进行分析,因此随机梯度下降的方向,会因为所选取的样本的具体不同而不同,从而在整体方向上会显得左右摇摆。这一点在优化部分也会有展示。

最后迭代到一定次数后,即可用这个训练好的w向量,根据最前面那条公式对测试集进行预测了。

2、伪代码

读取文件、写入文件以及计算准确率等之前实验做过的或者过于简单的函数功能不列出。int main(){读取训练集和测试集,其中训练集每三个样本取前两个作为训练集,第三个作为验证集。初始化w:for(int i=0;i<Length;i++) w[i]=1;for(int k=0:7)for(int i=0:traincnt)//遍历训练集样本{CalWeight(i);//计算样本i的权重分数CalCost(i);//每一维的梯度(代价)计算Updatew();//更新wif(i%20==0)//每更新w20次计算一次准确率{Predict();//预测验证集样本Cal_acc();//计算准确率 ac[cnt]=accuracy;cnt++;}}output_result();//输出验证集准确率以供调试output_test_result();//输出测试集预测结果}void CalWeight(int index){weight=当前向量w的转置*样本i向量;}void CalCost(int index){计算每一维的梯度,存储在向量数组Cost[]中;}void Updatew(){使用w= w - alpha x gradient来更新回归系数(w)}void Predict(){P=1/(1+exp(-1* w^T *样本i向量);if(P>0.5) p_label=1;else p_label=0;}

3、实现效果

读取train文件时每三个样本,前两个读入训练集,第三个读入验证集;使用批梯度下降方法和动态学习率,下图是迭代过程中用模型预测验证集时准确率的曲线变化:

 

 

上面三个图分别是迭代开始(左)、迭代过程中(中)、迭代结束(右)时的准确率,可见前两个图中,准确率一直在提高,说明梯度一直在下降,且迭代刚开始时准确率提升幅度很大而迭代中途提升幅度已经减慢了很多,说明实现了动态学习率方法,而在最后一个图中,准确率已经不再变化,稳定在0.7738,说明已经到达收敛,梯度下降已经到达最优解。

4、完整代码以及实验数据文件

逻辑回归算法C++代码及实验数据

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。