非线性回归是线性回归的延伸,其目标预测函数不是线性的。本文主要介绍逻辑回归Logistic Regression),它是非线性回归的一种,虽然名字中有“回归”二字,但其本质上是一个分类模型

含义

我们知道,线性回归的模型是求出输出特征向量Y和输入样本矩阵X之间的线性关系系数θ,满足Y=XθY=XθY=Xθ。此时Y是连续的,所以是回归模型。如果Y是离散的话,如何解决?一个可以想到的办法是,我们对于Y再做一次函数转换,变为g(Y)。如果我们令g(Y)的值在某个实数区间的时候是类别A,在另一个实数区间的时候是类别B,以此类推,就得到了一个分类模型。如果结果的类别只有两种,那么就是一个二元分类模型了。逻辑回归的出发点就是从这来的。

看如下实例
有这么几组医疗数据,X特征是肿瘤的大小(连续型),Y是其良恶性(离散型),Y只有0(良性)和1(恶性)2种取值。

我们选取阈值0.5,h(x)>0.5(恶性),Malignant=1,反之为0,良性。


我们选取阈值0.2,h(x)>0.2(恶性),Malignant=1,反之为0,良性。

比较上述两种情况,新的数值加入时需要不断调整阈值,说明用线性的方法进行回归不太合理。

基本模型

我们假设测试数据为X(x0,x1,...,xn)X(x_0,x_1,...,x_n)X(x0​,x1​,...,xn​)
需要学习的参数为Θ(θ0,θ1,...,θn)\Theta(\theta_0,\theta_1,...,\theta_n)Θ(θ0​,θ1​,...,θn​)

给定函数

Z=θ0+θ1x1+θ2x2+...+θnxnZ = \theta_0 + \theta_1x_1 + \theta_2x_2+...+\theta_nx_n Z=θ0​+θ1​x1​+θ2​x2​+...+θn​xn​
向量化可表示为
Z=ΘTXZ = \Theta^TX Z=ΘTX
经常需要一个分界线作为区分两类结果。再次需要一个函数进行曲线平滑化,由此引入Sigmoid 函数进行转化:

g(z)=11+e−zg(z) = \frac{1}{1+e^{-z}} g(z)=1+e−z1​

这样的,可以以 0.5 作为分界线。因此逻辑回归的最终目标函数就是:
hθ(X)=g(θ0+θ1x1+θ2x2+...+θnxn)=g(θTX)=11+e−θTXh_\theta(X) = g(\theta_0 + \theta_1x_1 + \theta_2x_2+...+\theta_nx_n) = g(\theta^TX) = \frac{1}{1+e^{-\theta^TX}} hθ​(X)=g(θ0​+θ1​x1​+θ2​x2​+...+θn​xn​)=g(θTX)=1+e−θTX1​
回归是用来得到样本属于某个分类的概率。因此在分类结果中,假设 y 值是 0 或 1,那么正例 (y = 1):

hθ(X)=P(y=1∣X;θ)h_\theta(X) = P(y=1|X;\theta) hθ​(X)=P(y=1∣X;θ)
反例(y = 0):
1−hθ(X)=P(y=0∣X;θ)1 - h_\theta(X) = P(y=0|X;\theta) 1−hθ​(X)=P(y=0∣X;θ)
在线性回归中,我们要找到合适的θ(i)\theta^{(i)}θ(i)使下面的损失函数值最小:
Cost(hθ(x(i)),y(i))=∑i=1m(hθ(x(i))−y(i))2Cost(h_\theta(x^{(i)}),y^{(i)}) = \sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 Cost(hθ​(x(i)),y(i))=i=1∑m​(hθ​(x(i))−y(i))2
如果在逻辑回归中运用上面这种损失函数,得到的函数 J 是一个非凸函数,存在多个局部最小值,很难进行求解,因此需要换一个 cost 函数。重新定义个 cost 函数如下:
Cost(hθ(x(i)),y(i))=−1m[∑i=1m(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))]Cost(h_\theta(x^{(i)}),y^{(i)}) = -\frac{1}{m}[\sum_{i=1}^{m}(y^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1-h_\theta(x^{(i)})))] Cost(hθ​(x(i)),y(i))=−m1​[i=1∑m​(y(i)log(hθ​(x(i)))+(1−y(i))log(1−hθ​(x(i))))]

求解方法

我们采用梯度下降法求解最佳解。梯度下降法的计算过程就是沿梯度下降的方向求解极小值

  1. 先确定向下一步的步幅大小,称之为Learning rate;
  2. 任意给定一个初始值:θ0,θ1,...,θn\theta_0,\theta_1,...,\theta_nθ0​,θ1​,...,θn​;
  3. 确定一个向下的方向,并向下走预先规定的步伐,并更新θ0,θ1,...,θn\theta_0,\theta_1,...,\theta_nθ0​,θ1​,...,θn​;
  4. 当下降的高度小于某个定义的阈值时,停止下降更新。

这就好比是下山,下一步的方向选的是最陡的方向。梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。θ 的更新方程如下:
θj=θj−α∂∂θjJ(θ)\theta_j = \theta_j - \alpha\frac{\partial}{\partial\theta_j}J(\theta) θj​=θj​−α∂θj​∂​J(θ)
其中,偏导是:
∂∂θjJ(θ)=1m∑i=1m(h(x(i))−y(i))xj(i)\frac{\partial}{\partial\theta_j}J(\theta) = \frac{1}{m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})x_j^{(i)} ∂θj​∂​J(θ)=m1​i=1∑m​(h(x(i))−y(i))xj(i)​

代码实例

本部分我们将采用2种方式实现逻辑回归模型,一种自己编写函数方法,一种调用sklearn中的方法库(LogisticRegression)。

自己实现

import numpy as np
import random
import matplotlib.pyplot as plt
#sigmod函数,将值量化到0-1
def sigmoid(x):return 1.0 / (1 + np.exp(-x))# 梯度下降算法
def gradientDescent(x, y, theta, alpha, m, numIteration):''':param x: 输入实例:param y: 分类标签:param theta: 学习的参数:param alpha: 学习率:param m: 实例个数:param numIteration: 迭代次数:return: 学习擦参数theta'''xTrans = x.transpose()  # 矩阵的转置J = [] # 存储损失的列表,方便绘图for i in range(0, numIteration):hypothsis = sigmoid(np.dot(x, theta)) #量化到0-1loss = hypothsis - y #计算误差cost = np.sum(loss ** 2) / (2 * m) #计算损失J.append(cost) # 将损失存入列表print("Iteration %d / Cost:%f" % (i, cost))gradient = np.dot(xTrans, loss) / mtheta = theta - alpha * gradient  # 更新梯度plt.plot(J) # 可视化损失变化plt.show()return theta# 创建数据,用作测试
def genData(numPoints, bais, variance):''':param numPoints: 输入实例数目:param bais: 偏向:param variance: 方差:return 创建的数据 x,y'''# 实例(行数)、偏向、方差x = np.zeros(shape=(numPoints, 2))  # 初始化numPoints行2列(x1,x2)的全零元素矩阵y = np.zeros(shape=numPoints)  # 归类标签y_list = [0,1] # 标签列表y的取值for i in range(0, numPoints):x[i][0] = random.uniform(0, 1) * variance # 创建X的特征对x[i][1] = (i + bais) + random.uniform(0, 1) * variancerandom.shuffle(y_list) # 给X特征对附上随机的0 1 标签y[i] =y_list[0]return x, yx, y = genData(100, 2, 5)
#print(x)
#print(y)#x和y的维度
m, n = np.shape(x)
n_y = np.shape(y)numIteration = 100000
alpha = 0.0005
theta = np.ones(n)  # 初始化theta
theta = gradientDescent(x, y, theta, alpha, m, numIteration)
print(theta) #output [-0.14718538  0.00381781]

Sklearn实现

from sklearn.linear_model import LogisticRegression
# 调用sklearn自带的逻辑回归方法
sk = LogisticRegression(max_iter=100000)
sk.fit(x, y) # 此处的x和y与上面自己实现的一致
print(sk.intercept_)
print(sk.coef_) #output [-0.11612453  0.00272452]

我们发现自己闪现求解的θ\thetaθ值与sklearn中的相比,还是存在一定误差的,这是因为sklearn中的方法 LogisticRegression有很多参数进行了详细的优化,详情参见https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn-linear-model-logisticregression

Cost损失可视化

模型优缺点

优点:

  1. 适合需要得到一个分类概率的场景
  2. 计算代价不高,容易理解实现。LR在时间和内存需求上相当高效
  3. LR对于数据中小噪声的鲁棒性很好

缺点:

  1. 容易欠拟合,分类精度不高
  2. 对异常值敏感

机器学习方法之非线性回归( Logistic Regression)相关推荐

  1. 机器学习方法:回归(一):线性回归Linear regression

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 开一个机器学习方法科普系列:做基础回顾之用,学而时习之:也拿出来与大家分享.数学水平有限,只求易懂,学习与工 ...

  2. 札记_ML——《统计学习方法》逻辑回归logistic regression)

    统计学习方法:五. 逻辑回归logistic regression 逻辑回归logistic regression Logistic的起源 1).概念logistic回归又称logistic回归分析, ...

  3. 机器学习-非线性回归( Unlinear Regression) -逻辑回归(Logistic Regression)算法

    学习彭亮<深度学习基础介绍:机器学习>课程 概率 定义 概率(Probability): 对一件事情发生的可能性的衡量 范围 0 <= P <= 1 计算方法 根据个人置信 根 ...

  4. ❤️解决非线性回归问题的机器学习方法总结:多项式线性模型、广义线性(GAM)模型、回归树模型、支持向量回归(SVR)模型

    文章目录 前言 多项式回归模型 概念解释: sklearn实现多项式回归模型: 广义线性可加(GAM)模型 概念解释: pygam实现广义线性可加模型: GAM模型的优点与不足: 回归树模型 概念解释 ...

  5. 【算法】Logistic regression (逻辑回归) 概述

    Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性.比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等 ...

  6. Logistic Regression逻辑回归

    参考自: http://blog.sina.com.cn/s/blog_74cf26810100ypzf.html http://blog.sina.com.cn/s/blog_64ecfc2f010 ...

  7. Logistic regression (逻辑回归) 概述

    http://hi.baidu.com/grandyang/item/e1df4ecf195eb816b77a240e Logistic regression (逻辑回归)是当前业界比较常用的机器学习 ...

  8. 转:Logistic regression (逻辑回归) 概述

    Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性.比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等 ...

  9. 【转】Logistic regression (逻辑回归) 概述

    原文出处:苏冉旭,http://hi.baidu.com/hehehehello/item/40025c33d7d9b7b9633aff87 Logistic regression (逻辑回归)是当前 ...

  10. 如何用机器学习方法进行数据建模?(文末福利)

    本文节选自CCF大数据教材系列丛书之<大数据导论>,由中国科学院院士梅宏主编.本书系统地介绍大数据涵盖的内容,包括数据与大数据概述.大数据感知与获取.大数据存储与管理.大数据分析.大数据处 ...

最新文章

  1. 计算机视觉顶会ECCV 2020中国预会议:日程公开,注册有奖
  2. CCNP学习笔记(6)
  3. centos的网络配置
  4. 10 个免费的服务器监控工具推荐
  5. C++容器(三):pair类型
  6. java配置接口提供给vue,vue在js中配置全局API接口
  7. Python编程语言学习:在for循环中如何同时使用2个变量或者3个变量
  8. 前端学习(2783):封装myrequest并绑定到全局
  9. java scanner以回车结束_请问Scanner在输入回车后,如何才能退出?
  10. tp5模板使用php函数,tp5 自定义公共函数,前台模板调用
  11. 设置windows服务依赖项
  12. linux命令文本处理(一)grep
  13. c语言 文本放大,Javascript 编写的文字放大效果_js
  14. 计算机共享网络的账号密码怎么设置密码,win10局域网共享怎么设置账号密码
  15. 微信下载app需要点击右上角在浏览器中打开下载的解决办法
  16. 人月神话(七)没有银弹-软件工程中的根本和次要问题、20 年后的人月神话
  17. uni-app小程序基础知识速览(上)
  18. 中文转换为日文的几点注意事项
  19. 【有利可图网】双十一“亮眼”设计大赏来了!!
  20. 打印当前页面指定元素中的内容

热门文章

  1. Unity 5.3 官方VR教程(—)VR综述
  2. Lambda表达详细介绍、全的不能全了!!
  3. about cisco DNA
  4. 2017我都干了啥?
  5. Notepad远程Xftp服务器使用技巧
  6. 新浪UC 单文件精简版
  7. ssm教务系统网站毕业设计源码290915
  8. 各种手机处理器排行榜_手机处理器性能排行榜和代表机型介绍
  9. 新加坡经验:大数据时代政府的角色
  10. 谷歌google浏览器升级后发生个人资料错误 发送反馈解决方法