逻辑回归

  1. 逻辑回归的模型是一个非线性模型
  2. sigmoid函数,又称逻辑回归函数。但是它本质上又是一个线性回归模型
  3. 因为除去sigmoid映射函数关系,其他的步骤,算法都是线性回归
  4. 可以说,逻辑回归,都是以线性回归为理论支持的
  5. 只不过,线性模型,无法做到sigmoid的非线性形式,sigmoid可以轻松处理0/1分类问题

逻辑回归

  1. 找一个合适的预测函数,一般表示为h函数,该函数就是需要找的分类函数,它用来预测输入数据的判断结果
  2. 构造一个损失函数,该函数表示预测输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者其他的形式。综合考虑所有训练数据的“损失”,将损失求和或者求平均,记为函数,表示所有训练数据预测值与实际类别的偏差。
  3. 显然,函数的值越小表示预测函数越精确,所以这一步需要做的就是找到函数的最小值,这里利用梯度下降法

Logistic函数

如果忽略二分类问题中的y的取值是一个离散的取值(0或1),我们继续使用线性回归来预测y的取值。这样做会导致y的取值并不为0或1。逻辑回归使用一个函数来归一化y值,使y的取值在区间(0,1)内,这个函数称为Logistic函数,也称Sigmoid函数,函数公式如下:

函数图形如下:

Z是线性回归函数,所以也可以表示成:

对于线性边界的情况,边界形式如下:

构造预测函数为:

函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:

损失函数

对于任何机器学习问题,都需要明确损失函数:

但是在LR模型解决的二分类问题中,这个函数形式为:

这个损失函数通常称作是对数损失(logloss),由于y的取值为0或者1,因此可以表示为:

优化求解

现在我们已经确定了模型的损失函数,那么接下来就是根据这个损失函数,不断优化模型参数从而获得拟合数据的最佳模型。重新看一下损失函数,其本质上是;关于模型中线性方程部分两个参数w和b的函数:

其中:

现在的学习任务转化为数学优化的形式即为:

由于损失函数连续可微,我们可以借助梯度下降法进行优化求解,对于这个核心参数的更新方式如下:

代码及代码解释如下:

import numpy as np
class LogisticRegression(object):
#初始化参数(学习率,最大迭代次数,seed为种子数,seed相同时,numpy.random.seed()生成的随机数相同def __init__(self,learning_rate=0.1,max_iter=100,seed=None):self.seed = seedself.lr = learning_rateself.max_iter = max_iter
#进行训练,np.random.normal()的意思是一个正态分布,normal这里是正态的意思。
# 参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布,
# 参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。
# 参数size(int 或者整数元组):输出的值赋在shape里,默认为None。def fit(self,x,y):np.random.seed(self.seed)self.w = np.random.normal(loc=0.0,scale=1.0,size=x.shape[1])self.b = np.random.normal(loc=0.0,scale=1.0)self.x = xself.y = yfor i in range(self.max_iter):self._update_step()def _sigmoid(self,z):return 1.0/(1.0+np.exp(-z))
# 返回一个逻辑函数def _f(self,x,w,b):z = x.dot(w) + breturn self._sigmoid(z)def predict_prob(self,x=None):if x is None:x = self.xy_preb = self._f(x,self.w,self.b)
# 预测值,y_pred_proba表示逻辑函数Y,是一个概率,y_pred为分类后的预测值def predict(self,x=None):if x is None:x = self.xy_pred_proba = self._f(x,self.w,self.b)y_pred = np.array([0 if y_pred_proba[i]<0.5 else 1 for i in range(len(y_pred_proba))])return y_preddef score(self,y_true=None,y_pred=None):if y_true is None or y_pred is None:y_true = self.yy_pred = self.predict()acc = np.mean([1 if y_true[i]==y_pred[i] else 0 for i in range(len(y_true))])return acc
#损失函数def loss(self,y_true=None,y_pred_proba=None):if y_true is None or y_pred is None:y_true = self.yy_pred_proba = self.predict_proba()return np.mean(-1.0*(y_true*np.log(y_pred_prob)+(1.0-y_true)*np.log(1.0-y_pred_proba)))
# 机算梯度def _cal_gradient(self):y_pred = self.predict()d_w = (y_pred - self.y).dot(self.x)/len(self.y)d_b = np.mean(y_pred - self.y)return d_w,d_b
# 进行迭代,利用梯度下降算法求解w,b,d_w,d_b为损失函数L对w,b求偏导def _update_step(self):d_w,d_b = self._cal_gradient()self.w = self.w - self.lr*d_wself.b = self.b - self.lr*d_breturn self.w, self.b
#生成数据
def generate_data(seed):np.random.seed(seed)data_size_1 = 300x1_1 = np.random.normal(loc=5.0,scale=1.0,size=data_size_1)x2_1 = np.random.normal(loc=5.0,scale=1.0,size=data_size_1)y_1 = [0 for _ in range(data_size_1)]data_size_2 = 400x1_2 = np.random.normal(loc=10.0,scale=2.0,size=data_size_2)x2_2 = np.random.normal(loc=8.0,scale=2.0,size=data_size_2)y_2 = [1 for _ in range(data_size_2)]
# numpy.concatenate((a1, a2, ...), axis),a1,a2 .. 相同类型的数组序列,axis 必须连接数组的轴。默认值为0x1 = np.concatenate((x1_1,x1_2),axis=0)x2 = np.concatenate((x2_1,x2_2),axis=0)
# hstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组,它其实就是水平(按列顺序)把数组给堆叠起来
# reshape(-1,1)表示(任意行,1列),第一列为横坐标,第二列为纵坐标,y为分类的值,为0或者1x = np.hstack((x1.reshape(-1,1),x2.reshape(-1,1)))y = np.concatenate((y_1,y_2),axis=0)
# np.random.permutation():随机排列序列                data_size_all = data_size_1 + data_size_2shuffled_index = np.random.permutation(data_size_all)x = x[shuffled_index]y = y[shuffled_index]return x,y
# 训练集和测试集分割
def train_tset_split(x,y):splite_index = int(len(y)*0.7)x_train = x[:splite_index]y_train = y[:splite_index]x_test = x[splite_index:]y_test = y[splite_index:]return x_train,y_train,x_test,y_test
import matplotlib.pyplot as plt
x,y = generate_data(seed=272)
x_train,y_train,x_test,y_test = train_tset_split(x,y)
# x_train第一列为横坐标,第二列为纵坐标,根据y_train的值(0或者1)来标记颜色
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,marker=".")
plt.show()
plt.scatter(x_test[:,0], x_test[:,1], c=y_test, marker='.')
plt.show()
# s数据归一化
x_train=(x_train-np.min(x_train,axis=0))/(np.max(x_train,axis=0)-np.min(x_train,axis=0))
x_test=(x_test-np.min(x_test,axis=0))/(np.max(x_test,axis=0)-np.min(x_test,axis=0))
# 逻辑回归
clf = LogisticRegression(learning_rate=0.1,max_iter=500,seed=272)
clf.fit(x_train,y_train)
# xx表示0.1-0.6 步长为0.1
# 由于是斜向下的直线,因此y=-wx-b
split_boundary_fuc = lambda x:(-clf.b-clf.w[0]*x)/clf.w[1]
xx = np.arange(0.1,0.6,0.1)
cValue=['g','b']
plt.scatter(x_train[:,0],x_train[:,1],c=[cValue[i] for i in y_train],marker="o")
plt.plot(xx,split_boundary_fuc(xx),c='red')

运行结果为:

对数几率回归(逻辑回归)相关推荐

  1. 逻辑斯蒂回归 逻辑回归_逻辑回归简介

    逻辑斯蒂回归 逻辑回归 Logistic regression is a classification algorithm, which is pretty popular in some commu ...

  2. 对数几率回归-逻辑回归

    算法原理 上一节内容讨论了如何使用线性模型进行回归模型,但要做回归任务要如何呢? 只要找一个单调可微的函数将分类任务的真实标记y与线性回归模型的预测值联系起来 在线性模型的基础上套一个映射函数来实现分 ...

  3. 对数线性模型之一(逻辑回归), 广义线性模型学习总结

    经典线性模型自变量的线性预测就是因变量的估计值. 广义线性模型:自变量的线性预测的函数是因变量的估计值.常见的广义线性模型有:probit模型.poisson模型.对数线性模型等等.对数线性模型里有: ...

  4. oracle 逻辑回归,逻辑回归 (Logistic Regression):计算概率

    预计用时:10 分钟 许多问题需要将概率估算值作为输出.逻辑回归是一种极其高效的概率计算机制.实际上,您可以通过下两种方式之一使用返回的概率: "按原样" 转换成二元类别. 我们来 ...

  5. 西瓜书《机器学习》线性模型 对数几率(逻辑)回归公式推导

  6. 机器学习D9——逻辑回归分类

    逻辑回归 之前我们已经接触过相关的回归模型了,我们知道回归模型是用来处理和预测连续型数据的算法.然而逻辑回归是一种命名为"回归"的线性分类器,其本质是由线性回归变化而来的,一种广泛 ...

  7. 机器学习笔记(七)——逻辑回归算法

    逻辑回归(Logistic Regression,LR).在Kaggle竞赛的统计中,LR算法以63.5%的出产率,荣获各领域中"出场率最高的算法"这一殊荣.在实际场景中,逻辑回归 ...

  8. TensorFlow基础7-机器学习基础知识(逻辑回归,鸢尾花实现多分类)

    记录TensorFlow听课笔记 文章目录 记录TensorFlow听课笔记 一,线性回归 二,广义线性回归 三,一元/多元逻辑回归 四,实现一元逻辑回归 五,多分类问题 六,TensorFlow实现 ...

  9. 回归、线性回归和逻辑回归【逻辑回归部分待完成】

    一.回归 "回归"这个词很有误导性,在陈希孺的<概率论与数理统计>中对这个词的来源有过解释.是个外国人,在做数据分析的时候,发现将数据画出来后,不管大的小的数据都会有一 ...

  10. Lesson 4.1-4.2 逻辑回归模型构建与多分类学习方法逻辑回归参数估计

    Lesson 4.1 逻辑回归模型构建与多分类学习方法 首先我们来讨论关于逻辑回归的基本原理,当然,在此过程中,我们也将进一步补充机器学习数学理论基础. 逻辑回归的基本原理,从整体上来划分可以分为两个 ...

最新文章

  1. [WebService]之代码优先方法与契约优先方法
  2. maven多模块eclipse jetty热部署
  3. Python-EEG工具库MNE中文教程(9)-参考电极应用
  4. OTA和Recovery系统升级流程介绍
  5. c语言设计一个万年历的需求分析,万年历设计报告
  6. linux rz批量上传
  7. Java虚拟机-常用工具
  8. 设计模式(行为型模式)——模板方法模式(Template Method)
  9. DevOps使用教程 华为云(6)文档报告 项目进度 会议记录 迭代评审
  10. springboot 调用Jxbrowser内嵌浏览器
  11. 阿里数据仓库架构与模型设计
  12. Excel里面输入18位数字,但是显示却是其他的?!请问怎么解决?
  13. [NOIP初赛复习]插空法与插板法解排列组合问题
  14. 解决openssl提示链接库不存在的问题
  15. OpenGL显示文字--显示英文
  16. 实现Gmail邮箱翻转效果之开篇
  17. 怎样与项目中的“怪人”沟通
  18. 《新程序员》杂志|李鹏辉谈开源云原生消息流系统
  19. UEFI应用与编程--SMM(一)
  20. excel相乘再相加_EXCEL数组计算【SUMPRODUCT】多条件相乘再相加

热门文章

  1. java 验证手机号
  2. 亚夏汽车首发申请通过 成第2家IPO经销商_135
  3. 2007版本中国网络新秀之七剑下天山
  4. Java二维码生成工具类
  5. 记录一次zabbix网页端报错Assuming that agent dropped connection because of access permissions
  6. python ccf题解 201809-1 卖菜
  7. 小学-知识与能力【9】
  8. springboot注解实现自动插入创建时间和更新时间到数据库
  9. 习题 9.8 修改第6题的程序,增加一个fun函数,改写main函数。改为在fun函数中调用change和display函数。在fun函数中使用对象的引用(Student )作为形参。
  10. UI设计中图形设计详解