Logistic回归小结
1.梯度上升优化
1). 伪代码:
所有回归系数初始化为1-------------------weights = ones((colNum,1))
重复r次:
计算整个数据集的梯度gradient
使用alpha*gradient更新回归系数的向量
返回回归系数weights
2). 迭代r次的代码:
for k in range(r): #heavy on matrix operations
h = sigmoid(dataMatrix*weights) #matrix mult
error = (labelMat - h) #vector subtraction
weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
2.随机梯度上升
梯度上升算法每次更新回归系数都要遍历整个数据集(批处理),样本集数十亿时复杂度相当高。
一种改进方法是一次仅用一个样本点来更新回归系数(在线学习),该方法称为“随机梯度上升算法”。
1). 伪代码:
所有回归系数初始化为1
对数据集中每个样本:
计算该样本梯度gradient
使用alpha*gradient更新回归系数的向量
返回回归系数weights
2). 用每个样本点更新回归系数代码:
for i in range(m):
h = sigmoid(sum(dataMatrix[i]*weights))
error = classLabels[i] - h
weights = weights + alpha * error * dataMatrix[i]
3. 1与2比较:
1加载的是列表,用numpy.mat()转成矩阵计算,计算中是向量运算。2加载数据时就已通过numpy.array()转换列表数据为数组数据类型,计算中是数值运算。
4. 改进随机梯度上升
一种判断优化算法优劣的可靠方法是看它是否收敛,也就是说参数是否达到了稳定值,是否还会不断变化。
将2在整个数据集运行200次,绘制出X0,X1,X2三个回归系数的变化情况。发现1)系数2较快达到稳定值,2)大波动停止后,还有周期性小波动,原因是存在一些不能正确分类的样本点(数据及非线性可分),在每次迭代时引发系数剧烈改变。
期望改进:1)避免来回波动,从而收敛到某个值;2)加快收敛速度
改进随机梯度上升算法更新回归系数代码:
for j in range(numIter):
dataIndex = range(m)
for i in range(m):
alpha = 4/(1.0+j+i)+0.0001 #apha decreases with iteration, does not
randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights + alpha * error * dataMatrix[randIndex]
del(dataIndex[randIndex])
改进之处:
1)alpha = 4/(1.0+j+i)+0.0001,alpha在每次迭代中都会作调整,缓解数据波动或高频波动。alpha每次减少1/(j+i),j是迭代次数,i表示本次迭代中第i个选出来的样本,当j<<max(i)时,alpha就不是严格下降的。类似模拟退火等其他优化算法中避免参数严格下降。另alpha永远不会减小到0,因为存在常数项,保证在多次迭代后新数据仍有影响。如要处理的问题是动态变化,可适当加大上述常数项,确保新值获得更大回归系数。
2)通过随机选取样本更新回归系数,减小周期波动。这种方法每次随机从列表中选出一个值,然后从列表删除改值(再进行下次迭代)。
效果:与梯度上升分割数据效果差不多,但迭代次数远小于后者,前者20次,后者500次。另系数周期性波动有缓解。
5.画图
Andrew Ng在Cousera ML课中用Octave绘制Decision Boundary,本节中用python matplot实现相同分隔线绘制。本节中还有参数在迭代中变化情况的绘制。
6.数据预处理
数据集来自UCI机器学习数据库http://archive.ics.uci.edu/ml/datasets/Horse+Colic。该数据集有的指标比较主观,有的难以测量(如疼痛程度等)。另数据集有30%数据缺失。
比较用Pandas,R,和Excel处理数据集中缺失值,Excel处理如此次数据量不大、结构不复杂的数据集较为方便。
用Excel将数据集保存为文本分隔文件,缺失值全部用0替换,NumPy数据类型不允许包含缺失值。选择0来替换,恰好适用于Logistic回归。回归系数更新公式如下:
weights = weights + alpha * error * dataMatrix[randIndex]
如果dataMatrix某个特征对应值为0,那么系数将不做更新。
Logistic回归小结的更多相关文章
- Logistic回归分类算法原理分析与代码实现
前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...
- 第五章:Logistic回归
本章内容 □sigmod函数和logistic回归分类器 □最优化理论初步□梯度下降最优化算法□数据中的缺失项处理 这会是激动人心的一章,因为我们将首次接触到最优化算法.仔细想想就会发现,其实我们日常 ...
- 机器学习实践之Logistic回归
关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2017年12月17日 19:18:31所撰写内容(http://blog.cs ...
- 第七篇:Logistic回归分类算法原理分析与代码实现
前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...
- Logistic回归python实现小样例
假设现在有一些点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,依次进行分类.Lo ...
- 【4】Logistic回归
前言 logistic回归的主要思想:根据现有数据对分类边界建立回归公式,以此进行分类 所谓logistic,无非就是True or False两种判断,表明了这其实是一个二分类问题 我们又知道回归就 ...
- 吴裕雄--天生自然python机器学习:使用Logistic回归从疝气病症预测病马的死亡率
,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有 30%的值是缺失的.下面将首先介绍如何处理数据集中的数据缺失问题,然 后 再 利 用 Logistic回 归 和随机梯度上升算法来预测 ...
- [机器学习实战-Logistic回归]使用Logistic回归预测各种实例
目录 本实验代码已经传到gitee上,请点击查收! 一.实验目的 二.实验内容与设计思想 实验内容 设计思想 三.实验使用环境 四.实验步骤和调试过程 4.1 基于Logistic回归和Sigmoid ...
- 神经网络、logistic回归等分类算法简单实现
最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...
随机推荐
- Runnable和Thread的区别 (转)
在java中可有两种方式实现多线程,一种是继承 Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的 run ...
- 异步加载JS的4种方式(详解)
方案1:$(document).ready <!DOCTYPE html> <html> <head> <script src="http://co ...
- Python Locust性能测试框架实践
[本文出自天外归云的博客园] Locust的介绍 Locust是一个python的性能测试工具,你可以通过写python脚本的方式来对web接口进行负载测试. Locust的安装 首先你要安装pyth ...
- 【Java】一个小程序,计算它包含的代码所需的耗时
写一个小程序,用来计算它包含的代码所需的耗时.虽然简单,测试代码是否耗时还是有点用的,不用重新写嘛~ import java.util.Date; import java.util.concurren ...
- web服务器工作原理
Web服务器工作原理概述 转载自http://www.importnew.com/15020.html 很多时候我们都想知道,web容器或web服务器(比如Tomcat或者jboss)是怎样工作的?它 ...
- 堆排序(C++实现)
#include<iostream> #include<vector> using namespace std; void swap(vector<int> &am ...
- javascript guid(uuid)
http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript function generateU ...
- Linux变量
变量:(大的分为环境变量与本的变量) 本地变量: 本地变量在用户现在的shell生命期的脚本中使用.例如,本地变量file-name="loop.doc",这个值只在用户当前she ...
- MFC编程入门之七(对话框:为对话框添加控件)
创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件. 上一节中创建了一个名为"A ...
- linux下打包命令的使用
Unix系统业务使用(特别是数据管理与备份)中,经过一番研究.整理后,充分利用Unix系统本身的命令tar.cpio和compress等来做到打包和压缩,使之充当类似DOS下的压缩软件,同时在Unix ...