机器学习算法-logistic回归算法
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回归算法的更多相关文章
- 机器学习之Logistic 回归算法
1 Logistic 回归算法的原理 1.1 需要的数学基础 我在看机器学习实战时对其中的代码非常费解,说好的利用偏导数求最值怎么代码中没有体现啊,就一个简单的式子:θ= θ - α Σ [( hθ( ...
- 机器学习之logistic回归算法与代码实现原理
Logistic回归算法原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10033567.html ...
- Logistic回归算法梯度公式的推导
最近学习Logistic回归算法,在网上看了许多博文,笔者觉得这篇文章http://blog.kamidox.com/logistic-regression.html写得最好.但其中有个关键问题没有讲 ...
- [机器学习实战-Logistic回归]使用Logistic回归预测各种实例
目录 本实验代码已经传到gitee上,请点击查收! 一.实验目的 二.实验内容与设计思想 实验内容 设计思想 三.实验使用环境 四.实验步骤和调试过程 4.1 基于Logistic回归和Sigmoid ...
- 机器学习算法( 五、Logistic回归算法)
一.概述 这会是激动人心的一章,因为我们将首次接触到最优化算法.仔细想想就会发现,其实我们日常生活中遇到过很多最优化问题,比如如何在最短时间内从A点到达B点?如何投入最少工作量却获得最大的效益?如何设 ...
- 【机器学习】分类算法——Logistic回归
一.LR分类器(Logistic Regression Classifier) 在分类情形下,经过学习后的LR分类器是一组权值w0,w1, -, wn,当测试样本的数据输入时,这组权值与测试数据按照线 ...
- logistic回归算法及其matlib实现
一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大.如果非要使用回归算法,可以使用logistic回归. logistic回归本质上是线性回归,只是在特征到结果的映射中多加入了 ...
- matlib实现logistic回归算法(序一)
数据下载:http://archive.ics.uci.edu/ml/datasets/Adult 数据描述:http://archive.ics.uci.edu/ml/machine-learnin ...
- 跟我学算法-Logistic回归
虽然Logistic回归叫回归,但是其实它是一个二分类或者多分类问题 这里的话我们使用信用诈骗的数据进行分析 第一步:导入数据,Amount的数值较大,后续将进行(-1,1)的归一化 data = p ...
随机推荐
- hive实例的使用
一.hive用本地文件进行词频统计 1.准备本地txt文件 2.启动hadoop,启动hive 3.创建数据库,创建文本表 4.映射本地文件的数据到文本 5.hql语句进行词频统计交将结果保存到结果表 ...
- 【转载】Django,学习笔记
[转自]https://www.cnblogs.com/jinbchen/p/11133225.html Django知识笔记 基本应用 创建项目: django-admin startproje ...
- 升级jenkins之后无法启动 报错Unable to read /var/lib/jenkins/config.xml
故障记录 点击jenkins升级后再点击回滚到之前版本,jenkins就起不来了. 欲哭无泪,报错如下 hudson.util.HudsonFailedToLoad: org.jvnet.hudson ...
- 线段树入门详解,洛谷P3372 【模板】线段树 1
关于线段树: 本随笔参考例题 P3372 [模板]线段树 1 所谓线段树就是把一串数组拆分成一个一个线段形成的一棵树. 比如说像这样的一个数组1,2,3,4,5: 1 ~ 5 / ...
- 钩子与API截获
http://www.pudn.com/Download/type/id/19.html
- 用Python实现童年的回忆:俄罗斯方块!别说还挺好玩
在那个电子产品比较匮乏的年代,小游戏机
- python简单的函数应用
一个简单的函数应用,包括自定义函数,lambda函数,列表解析. 1 #!usr/bin/env python3 2 # -*- coding:utf-8 -*- 3 4 #开始定义函数 5 def ...
- Xrdp远程连接到CentOS7系统配置
1 服务器端配置 1.1 查询是否已经安装epel库 打开已经安装了CentOS7的主机,以root用户登录,在桌面上打开一个终端,输入命令:rpm -qa|grep epel,查询 ...
- Visual Studio 2013中安装Resharper之后一些快捷键无法使用,比如F6和F12
快捷键是一个很好用的东西,尤其对于计算机从业者来说,好的快捷键能够高程度提高工作效率.像我们程序员经常需要团队开发,我们会遇到一个问题,那就是快捷键不一致问题,我一般会安装resharper,但是有的 ...
- easyui框架 jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...