Logistic回归及梯度上升算法
逻辑回归
逻辑回归可以用来进行回归与分类,两者仅有略微不同,主体算法是一样的,本文以分类进行讲解。如下图二分类问题,我们希望找到一个直线(高维空间为超平面)来将数据划分开。
梯度上升
有了以上的逻辑回归的理论基础,下面我们编程实现这一步骤。就以第一张图的样本为例进行,样本维数为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回归及梯度上升算法相关推荐
- Logistic回归与梯度上升算法
下面大部分是转载的,加上自己的笔记 在<机器学习实战>一书的第5章中讲到了Logistic用于二分类问题.书中只是给出梯度上升算法代码,但是并没有给出数学推导.故哪怕是简单的几行代码,依然 ...
- Logistic回归与梯度下降法
Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素之间关系的一种 多变量分析方法.通常的问题是,研究某些因素条件下某个结果是否发生,比如医学中根据病人的一些症状来判断它是 ...
- 1.2.2 Logistic回归和梯度下降计算的数学流程
计算图 可以说,一个神经网络的计算都是按照前向或者反向传播过程来实现的,首先计算出神经网络的输出,紧接着一个反向传播的操作.后者,我们用来计算出对应的梯度或者导数.这个流程图解释了为什么用这样的方式来 ...
- 2.14 向量化 Logistic 回归的梯度输出-深度学习-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 2.13 向量化 Logistic 回归 回到目录 2.15 Python 中的广播 向量化 Logistic 回归的梯度输出 (Vectorizing Logistic R ...
- 2.9 Logistic 回归的梯度下降法-深度学习-Stanford吴恩达教授
←上一篇 ↓↑ 下一篇→ 2.8 计算图的导数计算 回到目录 2.10 m 个样本的梯度下降 Logistic 回归的梯度下降法 (Logistic Regression Gradient Desce ...
- 深度学习(二)向量化 Logistic 回归及其梯度输出
概述 本篇属于理论篇,你将了解什么是向量化.向量化对神经网络训练优化的重要性,以及如何向量化 Logistic 回归及其梯度输出. 转自猴开发博客:深度学习(二)向量化 Logistic 回归及其梯度 ...
- 1.2.1 Logistic回归和梯度下降简介
二分分类 计算机要保存一张图片,实际需要保存三个矩阵.分别对应的是红绿蓝三个颜色通道. 在二分分类问题中,目标是训练出一个分类器.它以图片中的特征向量x作为输入,预测输出结果标签y是1(是一个猫)还是 ...
- 逻辑斯特回归(随机梯度上升算法)预测马疝病的死亡率问题
预测马疝病死亡率github代码 随机梯度上升(下降)算法推导过程: 使用的一些变量,类别标签向量 y y,数据集样本矩阵XX,回归系数向量 W W,观察值与真实值偏差向量ee,步长(学习率) α \ ...
- 【机器学习】机器学习从零到掌握之十三 -- 教你理解Logistics回归之梯度上升算法
本文是<机器学习从零到掌握>系列之第13篇 机器学习从零到掌握之一 -- 教你理解K近邻算法 机器学习从零到掌握之二 -- 教你实现K近邻算法 机器学习从零到掌握之三 -- 教你使用K近邻 ...
- 2.14 向量化 logistic 回归的梯度输出
最新文章
- 大规模数据库的性能改善方法之一 数据分割
- 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现
- CSS自学教程--一天搞定CSS(终篇总结)
- 图论--树的直径--DFS+树形DP模板
- cuda nsight 调试和性能分析
- android四大组件之Service 注册广播接收者
- 360网址导航源码5.0源码
- pycon视频_观看6个PyCon 2015社区相关视频
- linux某用户 计划任务,Linux基本计划任务
- mysql 创建索引 key_Mysql中创建索引的INDEX和KEY
- Linux 进程服务查看(服务启动时间或运行时间查看)
- 卷积神经网络卷积层BN层计算原理和卷积BN层融合
- PLC液压控制系列之比例流量阀结构分析
- JAVA计算机毕业设计民航售票管理系统(附源码、数据库)
- [刷题]leetcode #309 - Best Time to Buy and Sell Stock with Cooldown
- 怎么给PPT文档加密
- MongoDb副本集详解及搭建
- 不懂算法,还想进大厂?做梦吧(转载自微信公众号 -- 大飞码字)
- 2014 北京邀请赛 B
- 程序中调用CMD,运行命令或启动子程序
热门文章
- Ubuntu配置网络
- Linux 进程管理 (ZZ)
- 教你如何理解Vue中的nextTick
- Multipart生成的临时文件
- Java操作MongoDB(聚合函数)向Mongo插入及查询数据
- 经典排序算法(十八)--Proxmap Sort
- 03. 二维数组中的查找(C++实现)
- 树中两节点的最低公共祖先
- 安装linux-mysql-yum方式
- mfc oracle数据库编程,testmfc - 源码下载|数据库系统|Oracle数据库|源代码 - 源码中国...