Logistic回归算法调试

一、算法原理

Logistic回归算法是一种优化算法,主要用用于只有两种标签的分类问题。其原理为对一些数据点用一条直线去拟合,对数据集进行划分。从广义上来讲这也是一种多元线性回归方法,所不同的是这种算法需要找出的是能够最大可能地将两个类别划分开来而不是根据直线关系预测因变量的值。Logistic回归算法的核心部分是sigmoid函数:

其中xi为数据集的第i个特征。定义损失函数损失函数:

损失函数越小表明曲线拟合的效果就越好。利用梯度向上法更新x的系数W,求出W的最优解。梯度向上法的原理就是要求得一个函数的极值最好的方法就是沿着该函数的梯度方向进行,梯度可用偏导数求解。Logistic回归算法的损失函数的梯度grad为 

通过不断的更新x的权重迭代一定次数之后就能够得到想要的w

二、算法调试

2.1梯度下降法算法

  首先定义导入数据的函数loadDataSet(),使得数据的导入更加方便。为运行方便,对书中的代码稍作改变,有输入文件位置改成直接输入矩阵。梯度下降算法中的下面两行来自于对损失函数的求解,推到过程并不复杂。

运行loadDataSet对输入的算法进行测试,能够正常运行结果如下:

2.2  画出决策边界

在测试完梯度上升算法可行之后,实际上解出了一组回归系数。为了更好的理解logistic算法,需要把分隔线画出来。定义函数plotBestFit,在pycharm中输入代码。在这个程序中值得注意的是其中使用的getA这个函数,这是numpy库中的maxtri模块中的一个函数,作用刚好与mat相反,是把矩阵转化成数组。如果去掉之后则不能正常运行,主要原因是矩阵的每一行长度只能为1,不能像数组一样。通过测试之后的结果如图1.

图1

2.3随机梯度上升算法

  由于构造梯度上升算法时每次都要便历整个数据集,当数据量非常庞大时,运算量非常大。下面是梯段上升算法的一种改进算法,随机梯度上升算法。其原理是每一次只用一个样本更新回归系数,当新的样本输入时再进行增量式更新。定义stocGradAscent0函数,期待与梯度上升算法非常相似。输入代码进行验证,发现之间验证会出现以下错误:

出现这种问题是因为“*”这个运算符号的问题,在列表之间的计算时,只能够用整数去乘另外一个列表,这可能是因为在python中一个数字乘一个矩阵时会先把数字复制成为一个长度与被乘列表相同的列表,然后再相乘。但是其中的问题在于生成复制列表时只能对整数起作用,因而出现上述问题。修改的方法是将列表转化为矩阵,然后在再运算。修改的地方为:

经过调试能够很好的输出结果,如图2所示:

图2

从结果来看划分的效果并不如之前的好,这是因为有些系数的收敛速度非常慢,经过500次迭代并不能达到稳定值,因此需要进行下一步改进。

2.4 改进的随机梯度上升法

为了避免系数在迭代过程中来回波动,从而收敛到某个值。对随机上升梯度法进行了改进,一方面对α进行调整,这回使得波动减小;另一方面采用随机选择样本来更新回归系数,这将会减少周期性波动。然后调试程序,输入代码运行并未发现问题,能够直接运行出结果,如图3所示:

            图3

从图中可以看出分类的效果非常好,把数据集完全分类开来,证明了算法的有效性。

2.5 logistic回归分类算法

Logistic优化算法已经找出来了,下面需要用logistic回归进行分类测试。首先构造logistic分类器。由于选取的为西瓜数据集,与教材中的数据有所不用,因此代码稍有不同。但方法是一样的。主要程序代码如下:

def classifyVector(inX,weights):
prob=sigmoid(sum(inX*weights))
if prob>0.5:return 1.0
else: return 0.0 def colicTest(testSet,weights,labelset):#输入测试集,回归系数,标签
errorcount = 0
n = shape(testSet)[0]
for i in range(n):
if classifyVector(array(testSet[i]),weights) != labelset[i]:
errorcount = errorcount + 1
errorrate = errorcount*1.0/n
return errorrate def multiTest(testSet,weights,labelSet):
numTests=10;errorSum=0.0
for k in range(numTests):
errorSum=errorSum+colicTest(testSet,weights,labelSet)
print('平均错误率为%s'%(errorSum/numTests))

  这里我们采用的是西瓜数据集,由于样本较少预测效果不太好,使用三种算法之后,错误率在55%左右。如果把数据集即作为训练集又作为测试集准确率在75%左右,通过修改迭代次数最终准确率会收敛到84%。

三、总结

首先通过算法的调试,对算法的原理及实现方法有了进一步的理解。从理论上来看,logistic函数时一种比较理想的算法。算法中对梯度上升法进行了一些改进,使得收敛速度更快,使得算法的可行性有了大大提高。但是通过实例分析,分类的效果并不如预期的效果那么好。算法中是否还存在能够改进的地方,值得进一步探究。

机器学习算法-logistic回归算法的更多相关文章

  1. 机器学习之Logistic 回归算法

    1 Logistic 回归算法的原理 1.1 需要的数学基础 我在看机器学习实战时对其中的代码非常费解,说好的利用偏导数求最值怎么代码中没有体现啊,就一个简单的式子:θ= θ - α Σ [( hθ( ...

  2. 机器学习之logistic回归算法与代码实现原理

    Logistic回归算法原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10033567.html ...

  3. Logistic回归算法梯度公式的推导

    最近学习Logistic回归算法,在网上看了许多博文,笔者觉得这篇文章http://blog.kamidox.com/logistic-regression.html写得最好.但其中有个关键问题没有讲 ...

  4. [机器学习实战-Logistic回归]使用Logistic回归预测各种实例

    目录 本实验代码已经传到gitee上,请点击查收! 一.实验目的 二.实验内容与设计思想 实验内容 设计思想 三.实验使用环境 四.实验步骤和调试过程 4.1 基于Logistic回归和Sigmoid ...

  5. 机器学习算法( 五、Logistic回归算法)

    一.概述 这会是激动人心的一章,因为我们将首次接触到最优化算法.仔细想想就会发现,其实我们日常生活中遇到过很多最优化问题,比如如何在最短时间内从A点到达B点?如何投入最少工作量却获得最大的效益?如何设 ...

  6. 【机器学习】分类算法——Logistic回归

    一.LR分类器(Logistic Regression Classifier) 在分类情形下,经过学习后的LR分类器是一组权值w0,w1, -, wn,当测试样本的数据输入时,这组权值与测试数据按照线 ...

  7. logistic回归算法及其matlib实现

    一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大.如果非要使用回归算法,可以使用logistic回归. logistic回归本质上是线性回归,只是在特征到结果的映射中多加入了 ...

  8. matlib实现logistic回归算法(序一)

    数据下载:http://archive.ics.uci.edu/ml/datasets/Adult 数据描述:http://archive.ics.uci.edu/ml/machine-learnin ...

  9. 跟我学算法-Logistic回归

    虽然Logistic回归叫回归,但是其实它是一个二分类或者多分类问题 这里的话我们使用信用诈骗的数据进行分析 第一步:导入数据,Amount的数值较大,后续将进行(-1,1)的归一化 data = p ...

随机推荐

  1. 通过游戏学javascript系列第一节Canvas游戏开发基础

    本节教程通过一个简单的游戏小例子,讲解Canvas的基础知识. 最终效果: 点击移动的方块,方块上的分数会增加,方块的行进方向会改变,并且方块的速度会增加. 在线演示 源码 HTML5引入了canva ...

  2. 前端js实现九宫格模式抽奖(多宫格抽奖)

    介绍: 前端九宫格是一种常见的抽奖方式,js实现如下,掌握其原理,不论多少宫格,都可以轻松应对.(代码可复制直接运行看效果). 该案例以四宫格入门,可扩展多宫格,奖品模块的布局可自由设置. <! ...

  3. redis 存储验证码 基本使用

    1 redis 存储验证码 基本使用 1.1 setting 配置 CACHES = { "default": { "BACKEND": "djang ...

  4. 精尽Spring MVC源码分析 - MultipartResolver 组件

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  5. pag object设模式

    pag object 是自动化测试最佳模式测试之一,它主要体现在对界面交互细节的封装 优点: 减少代码重复,提高测试的可读性,提搞测试用例的可维护性.

  6. [日常摸鱼]poj2417 DiscreteLogging-BSGS算法

    在这题TLE了一天-T_T BSGS裸题-不知道为什么一直挂 第二天(也就是今天)换成黄学长博客里的写法就过掉了 题意:解关于$x$的方程:$a^x \equiv b \pmod{p}$,$p$为质数 ...

  7. burpsuite进阶使用

    .Burpsuite:爆破 个人建议选择pro破解版的,免费版的太鸡肋,爆破不能设置线程,速度超乎你想像 浏览器和burpsuite设置代理后,开启抓包,截获数据包后,右键选择发送到repeater修 ...

  8. 探究 | App Startup真的能减少启动耗时吗

    前言 之前我们说了启动优化的一些常用方法,但是有的小伙伴就很不屑了: "这些方法很久之前就知道了,不知道说点新东西?比如App Startup?能对启动优化有帮助吗?" ok,既然 ...

  9. python SQLAlchemy反射生成models

    1.安装SQLAcodegen pip install sqlacodegen 2.使用sqlacodegen生成案列 sqlacodegen mysql://root:123456@127.0.0. ...

  10. Python制作折线图

    利用python的第三方包Pygal制作简单的折线图. 申明:本文仅供学习交流使用.源码大部分来自<python编程从入门到实践>:如有侵权,请联系我删除. 1 #!usr/bin/env ...