本节为吴恩达教授机器学习笔记第二部分:逻辑回归与分类(1)-逻辑回归参数更新规则推导,包括:逻辑回归提出的背景,选用sigmoid函数的原因,极大似然方法推导参数更新规则,最后附上逻辑回归的pytorch实现以及核心的python代码。

1. 逻辑回归

  忽略标签数据离散的事实用线性回归算法解决二值分类问题,效果差而且对于不在[0,1]区间的值也没有意义,为此重新构建hθ(x)h_{\theta}(x)hθ​(x)如下:

  其中:

  称为逻辑回归函数(sigmoid函数),它定义在数据区间并且值域为(0,1),因此hθ(x)h_{\theta}(x)hθ​(x)的值域也为(0,1)。g(z)g(z)g(z)的导数如下:

  其实值域(0,1)的函数有很多,但二类问题选择sigmoid的原因也不是简单的导数形式简单啥的,是因为sigmoid函数是推到出来的。

题外:为什么逻辑回归要用sigmoid函数
https://blog.csdn.net/watermelon12138/article/details/95098070

  接下来就是给定逻辑回归模型,如何确定θ\thetaθ。首先,假设:

  即:

  假设训练集中的mmm个训练样本独立,我们可以得到下面的似然函数:

  同样,对数似然函数更容易计算:

  使用梯度下降算法,θ\thetaθ更新规则如下:

  因此对似然函数求导,有:

  于是θ\thetaθ更新规则可以写为:

  和最小均方算法的更新规则看起来相同,但是此处hθ(x)h_{\theta}(x)hθ​(x)已经不是θTx(i)\theta^Tx^{(i)}θTx(i)的线性函数了。


逻辑回归,二类问题,多类应用softmax而非sigmoid。
pytorch代码

import torch
import torch.nn as nn
from torch.autograd import Variable
import numpy as np
import torch.optim as optim
import matplotlib.pyplot as plt#从data.txt中读入点
with open('data.txt','r') as f:data_list = f.readlines()print(data_list)data_list = [i.split('\n')[0] for i in data_list]print(data_list)data_list = [i.split(',') for i in data_list]print(data_list)data = [(float(i[0]),float(i[1]),float(i[2])) for i in data_list]print(data)
# 标准化
x0_max = max([i[0] for i in data])
x1_max = max([i[1] for i in data])
data = [(i[0]/x0_max,i[1]/x1_max,i[2]) for i in data]
# x_data = [(float(i[0]), float(i[1])) for i in data_list]
# y_data = [(float(i[2])) for i in data_list]X0 = list(filter(lambda x: x[-1] == 0.0, data))#选择第一类的点
X1 = list(filter(lambda x: x[-1] == 1.0, data))#选择第二类的点
plot_X0_0 = [i[0] for i in X0]
plot_X0_1 = [i[1] for i in X0]
plot_X1_0 = [i[0] for i in X1]
plot_X1_1 = [i[1] for i in X1]
plt.plot(plot_X0_0,plot_X0_1,'ro',label='x_0')
plt.plot(plot_X1_0,plot_X1_1,'bo',label='x_1')
plt.legend(loc='best')
plt.show()#将数据转换成numpy类型,接着转换成Tensor类型
np_data = np.array(data,dtype='float32')#转成numpy array
x_data = torch.from_numpy(np_data[:,0:2])#转换成Tensor,大小是[100,2]
y_data = torch.from_numpy(np_data[:,-1]).unsqueeze(1)#转成tensor,大小是[100,1]class LogisticRegression(nn.Module):def __init__(self):super(LogisticRegression,self).__init__()self.lr = nn.Linear(2,1)self.sm = nn.Sigmoid()def forward(self, x):x = self.lr(x)x = self.sm(x)return xlogistic_model = LogisticRegression()
if torch.cuda.is_available():logistic_model.cuda()
else:logistic_model = LogisticRegression()criterion = nn.BCELoss()
optimizer = optim.SGD(logistic_model.parameters(),lr=1e-3,momentum=0.9)for epoch in range(50000):if torch.cuda.is_available():x = Variable(x_data).cuda()y = Variable(y_data).cuda()else:x = Variable(x_data)y = Variable(y_data)#向前传播out = logistic_model(x_data)loss = criterion(out,y_data)print_loss = loss.item()#向后传播optimizer.zero_grad()loss.backward()optimizer.step()#计算正确率mask = out.ge(0.5).float()acc = (mask == y_data).sum().item()/y_data.shape[0]if(epoch+1)%1000 == 0:print('*'*10)print('epoch{}'.format(epoch+1))print('loss is {:.4f}'.format(print_loss))print('acc is {:.4f}'.format(acc))w0,w1 = logistic_model.lr.weight[0]
w0 = w0.item()
w1 = w1.item()
b = logistic_model.lr.bias.item()
plot_x = np.arange(30,100,0.1)
plot_y = (-w0*plot_x-b)/w1
plt.plot(plot_x,plot_y)
plt.show()

python核心代码

    # Logistic函数def logistic(self,wx):return 1.0 / (1.0 + exp(-wx))def train(self,dataMat, target,weights):for k in range(self.steps):# wxgradient = dataMat * mat(weights)# sigmoid(wx)output = self.logistic(gradient)  # logistic functionerrors = target - output  # 计算误差weights = weights + self.alpha * dataMat.T * errorsreturn weights

再次证明处理数据才是工作量大头哈哈


欢迎扫描二维码关注微信公众号 深度学习与数学   [每天获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]

机器学习笔记【二】逻辑回归与分类(1):逻辑回归参数更新规则以及pytorch实现相关推荐

  1. 【机器学习笔记14】softmax多分类模型【下篇】从零开始自己实现softmax多分类器(含具体代码与示例数据集)

    文章目录 推荐阅读 前言 关于代码 第一部分 Softmax分类器相关公式与步骤 相关公式 梯度下降步骤 数据集获取 从零开始实现softmax多分类器 导入数据 初始框架 step1:将label向 ...

  2. 李弘毅机器学习笔记:第五章—分类

    李弘毅机器学习笔记:第五章-分类 例子(神奇宝贝属性预测) 分类概念 神奇宝贝的属性(水.电.草)预测 回归模型 vs 概率模型 回归模型 其他模型(理想替代品) 概率模型实现原理 盒子抽球概率举例 ...

  3. 回归算法分类,常用回归算法解析

    回归算法分类,常用回归算法解析 回归是数学建模.分类和预测中最古老但功能非常强大的工具之一.回归在工程.物理学.生物学.金融.社会科学等各个领域都有应用,是数据科学家常用的基本工具. 回归通常是机器学 ...

  4. 机器学习(一)——线性回归、分类与逻辑回归

    http://antkillerfarm.github.io/ 序 这是根据Andrew Ng的<机器学习讲义>,编写的系列blog. http://www.cnblogs.com/jer ...

  5. 机器学习笔记---从极大似然估计的角度看待Logistic回归

    前言 看完极大似然估计后,想起Logistic回归中的参数估计就是使用这个方法,因此详细的记录整个推导的过程.[公式可以移动,若不能,可以切换横屏] 本文约1.4k字,预计阅读10分钟 Logisti ...

  6. 机器学习(二)线性模型——线性回归、对数几率回归、线性判别分析

    一.线性回归 线性回归(linear regression:试图学得一个线性模型以尽可能准确地预测实值输出标记. 1.最简单的形式:输入属性的数且只有一个, 最小二乘法:基于均方差误差最小化来进行模型 ...

  7. 机器学习十大算法之-CART分类决策树、回归树和模型树

    转载(http://blog.163.com/zhoulili1987619@126/blog/static/35308201201542731455261/) Classification And ...

  8. 机器学习笔记(二)模型评估与选择

    2.模型评估与选择 2.1经验误差和过拟合 不同学习算法及其不同参数产生的不同模型,涉及到模型选择的问题,关系到两个指标性,就是经验误差和过拟合. 1)经验误差 错误率(errorrate):分类错误 ...

  9. 机器学习笔记III: 基于支持向量机的分类预测

    支持向量机(Support Vector Machine,SVM)是一个非常优雅的算法,具有非常完善的数学理论,常用于数据分类,也可以用于数据的回归预测中,由于其优美的理论保证和利用核函数对于线性不可 ...

  10. 机器学习笔记二 单型线性回归

    线性回归 (一)介绍 (二) 数学模型 2.1 一元线性回归公式 2.2 方差 - 损失函数 Cost Function 2.3 优化方法 Optimization Function 2.4 算法步骤 ...

最新文章

  1. [C#]统计文本文件txt中的行数(快速读取)
  2. 苹果APPLE最新MI芯片笔记本安装第三方内核扩展
  3. c语言建立一个链表,每个结点包括姓名和成绩,求C语言几道题的答案~~拜托了~~...
  4. MySQL新建数据库和表
  5. java俄罗斯方块旋转,俄罗斯方块旋转算法研究
  6. 调整自己--提升自己
  7. 《C语言及程序设计》实践参考——转着圈加密
  8. 第一个冲刺周期第二天补发
  9. 计算机操作系统详细学习笔记(五):文件管理
  10. python对接60码平台
  11. Python 高级编程笔记之测试驱动开发
  12. 园林计算机制图在计算机上的应用,园林计算机制图
  13. Junit5 单元测试框架的使用
  14. 如何看待ICCV 2021接收论文被指抄袭?
  15. Latex的各种帽子
  16. xmu 1303.田教主的卡片
  17. LaTeX 页面设置 插入代码
  18. 基于单细胞测序数据构建细胞状态转换轨迹(cell trajectory)方法总结
  19. Java 通过URL获取页面快照十种方式解读
  20. Java之终止继承:Final类和Fianl方法

热门文章

  1. fopen()和fgetl()打开问件,读取内容
  2. pytest文档2-用例运行规则
  3. 1. webpack 复制文件
  4. Reinforcement Learning by David Silver 学记记录
  5. C# try catch
  6. javaScript 中的异步编程
  7. markDown零碎整理
  8. 解决 placeholder 垂直不居中,偏上的问题
  9. 动态改变 itemRenderer 。
  10. MEncoder的基础用法——6.9. 将DVD子标题提取到VOBsub文件