逻辑回归

逻辑回归可以用来进行回归与分类,两者仅有略微不同,主体算法是一样的,本文以分类进行讲解。如下图二分类问题,我们希望找到一个直线(高维空间为超平面)来将数据划分开。



梯度上升

有了以上的逻辑回归的理论基础,下面我们编程实现这一步骤。就以第一张图的样本为例进行,样本维数为2维,采用梯度上升算法进行迭代。
迭代步数自己选择

批量梯度上升

批量梯度上升每进行一次迭代更新就会计算所有样本,因此得到的模型正确率比较高,但同时计算复杂度高,算法耗时。计算过程如下:


代码如下

import numpy as np
import re
from pandas import DataFrame
import time as time
import matplotlib.pyplot as plt
import mathdef get_data(filename):                 #读取数据f = open(filename)data = DataFrame(columns=['x0','x1','x2','label']) #构造DataFrame存放数据,列名为x与yline = f.readline()line = line.strip()p = re.compile(r'\s+')              #由于数据由若干个空格分隔,构造正则表达式分隔while line:line = line.strip()linedata = p.split(line)data.set_value(len(data),['x0','x1','x2','label'],[1,float(linedata[0]),float(linedata[1]),int(linedata[2])]) #数据存入DataFrameline = f.readline()return np.array(data.loc[:,['x0','x1','x2']]),np.array(data['label'])
def sigmoid(x):return 1.0/(1+np.exp(-x))
def stocGradAscent(dataMat,labelMat,alpha = 0.01):   #随机梯度上升start_time = time.time()                         #记录程序开始时间m,n = dataMat.shapeweights = np.ones((n,1))                         #分配权值为1for i in range(m):h = sigmoid(np.dot(dataMat[i],weights).astype('int64')) #注意:这里两个二维数组做内积后得到的dtype是object,需要转换成int64error = labelMat[i]-h                        #误差weights = weights + alpha*dataMat[i].reshape((3,1))*error #更新权重duration = time.time()-start_timeprint('time:',duration)return weights
def gradAscent(dataMat,labelMat,alpha = 0.01,maxstep = 1000): #批量梯度上升start_time = time.time()m,n = dataMat.shapeweights = np.ones((n,1))for i in range(maxstep):h = sigmoid(np.dot(dataMat,weights).astype('int64'))  #这里直接进行矩阵运算labelMat = labelMat.reshape((100,1))                  #label本为一维,转成2维error = labelMat-h                                    #批量计算误差weights = weights + alpha*np.dot(dataMat.T,error)     #更新权重duration = time.time()-start_timeprint('time:',duration)return weights
def betterStoGradAscent(dataMat,labelMat,alpha = 0.01,maxstep = 150):start_time = time.time()m,n = dataMat.shapeweights = np.ones((n,1))for j in range(maxstep):for i in range(m):alpha = 4/(1+i+j) + 0.01                         #设置更新率随迭代而减小h = sigmoid(np.dot(dataMat[i],weights).astype('int64'))error = labelMat[i]-hweights = weights + alpha*dataMat[i].reshape((3,1))*errorduration = time.time()-start_timeprint('time:',duration)return weights
def show(dataMat, labelMat, weights):#dataMat = np.mat(dataMat)#labelMat = np.mat(labelMat)m,n = dataMat.shapemin_x = min(dataMat[:, 1])max_x = max(dataMat[:, 1])xcoord1 = []; ycoord1 = []xcoord2 = []; ycoord2 = []for i in range(m):if int(labelMat[i]) == 0:xcoord1.append(dataMat[i, 1]); ycoord1.append(dataMat[i, 2])elif int(labelMat[i]) == 1:xcoord2.append(dataMat[i, 1]); ycoord2.append(dataMat[i, 2])fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(xcoord1, ycoord1, s=30, c="red", marker="s")ax.scatter(xcoord2, ycoord2, s=30, c="green")x = np.arange(min_x, max_x, 0.1)y = (-float(weights[0]) - float(weights[1])*x) / float(weights[2])ax.plot(x, y)plt.xlabel("x1"); plt.ylabel("x2")plt.show()if __name__=='__main__':dataMat,labelMat = get_data('data1.txt')weights = gradAscent(dataMat,labelMat)show(dataMat,labelMat,weights)

效果

随机梯度:

批量梯度:

改进的随机梯度: 实际就是进行多次随机梯度,学习率随着迭代步数而减小。

Logistic回归及梯度上升算法相关推荐

  1. Logistic回归与梯度上升算法

    下面大部分是转载的,加上自己的笔记 在<机器学习实战>一书的第5章中讲到了Logistic用于二分类问题.书中只是给出梯度上升算法代码,但是并没有给出数学推导.故哪怕是简单的几行代码,依然 ...

  2. Logistic回归与梯度下降法

    Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素之间关系的一种 多变量分析方法.通常的问题是,研究某些因素条件下某个结果是否发生,比如医学中根据病人的一些症状来判断它是 ...

  3. 1.2.2 Logistic回归和梯度下降计算的数学流程

    计算图 可以说,一个神经网络的计算都是按照前向或者反向传播过程来实现的,首先计算出神经网络的输出,紧接着一个反向传播的操作.后者,我们用来计算出对应的梯度或者导数.这个流程图解释了为什么用这样的方式来 ...

  4. 2.14 向量化 Logistic 回归的梯度输出-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.13 向量化 Logistic 回归 回到目录 2.15 Python 中的广播 向量化 Logistic 回归的梯度输出 (Vectorizing Logistic R ...

  5. 2.9 Logistic 回归的梯度下降法-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.8 计算图的导数计算 回到目录 2.10 m 个样本的梯度下降 Logistic 回归的梯度下降法 (Logistic Regression Gradient Desce ...

  6. 深度学习(二)向量化 Logistic 回归及其梯度输出

    概述 本篇属于理论篇,你将了解什么是向量化.向量化对神经网络训练优化的重要性,以及如何向量化 Logistic 回归及其梯度输出. 转自猴开发博客:深度学习(二)向量化 Logistic 回归及其梯度 ...

  7. 1.2.1 Logistic回归和梯度下降简介

    二分分类 计算机要保存一张图片,实际需要保存三个矩阵.分别对应的是红绿蓝三个颜色通道. 在二分分类问题中,目标是训练出一个分类器.它以图片中的特征向量x作为输入,预测输出结果标签y是1(是一个猫)还是 ...

  8. 逻辑斯特回归(随机梯度上升算法)预测马疝病的死亡率问题

    预测马疝病死亡率github代码 随机梯度上升(下降)算法推导过程: 使用的一些变量,类别标签向量 y y,数据集样本矩阵XX,回归系数向量 W W,观察值与真实值偏差向量ee,步长(学习率) α \ ...

  9. 【机器学习】机器学习从零到掌握之十三 -- 教你理解Logistics回归之梯度上升算法

    本文是<机器学习从零到掌握>系列之第13篇 机器学习从零到掌握之一 -- 教你理解K近邻算法 机器学习从零到掌握之二 -- 教你实现K近邻算法 机器学习从零到掌握之三 -- 教你使用K近邻 ...

  10. 2.14 向量化 logistic 回归的梯度输出

最新文章

  1. 大规模数据库的性能改善方法之一 数据分割
  2. 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现
  3. CSS自学教程--一天搞定CSS(终篇总结)
  4. 图论--树的直径--DFS+树形DP模板
  5. cuda nsight 调试和性能分析
  6. android四大组件之Service 注册广播接收者
  7. 360网址导航源码5.0源码
  8. pycon视频_观看6个PyCon 2015社区相关视频
  9. linux某用户 计划任务,Linux基本计划任务
  10. mysql 创建索引 key_Mysql中创建索引的INDEX和KEY
  11. Linux 进程服务查看(服务启动时间或运行时间查看)
  12. 卷积神经网络卷积层BN层计算原理和卷积BN层融合
  13. PLC液压控制系列之比例流量阀结构分析
  14. JAVA计算机毕业设计民航售票管理系统(附源码、数据库)
  15. [刷题]leetcode #309 - Best Time to Buy and Sell Stock with Cooldown
  16. 怎么给PPT文档加密
  17. MongoDb副本集详解及搭建
  18. 不懂算法,还想进大厂?做梦吧(转载自微信公众号 -- 大飞码字)
  19. 2014 北京邀请赛 B
  20. 程序中调用CMD,运行命令或启动子程序

热门文章

  1. Ubuntu配置网络
  2. Linux 进程管理 (ZZ)
  3. 教你如何理解Vue中的nextTick
  4. Multipart生成的临时文件
  5. Java操作MongoDB(聚合函数)向Mongo插入及查询数据
  6. 经典排序算法(十八)--Proxmap Sort
  7. 03. 二维数组中的查找(C++实现)
  8. 树中两节点的最低公共祖先
  9. 安装linux-mysql-yum方式
  10. mfc oracle数据库编程,testmfc - 源码下载|数据库系统|Oracle数据库|源代码 - 源码中国...