回归问题总结(梯度下降、线性回归、逻辑回归、源码、正则化)

2023-11-16

原文地址:http://blog.csdn.net/gumpeng/article/details/51191376


最近,应妹子要求,对回归问题进行了总结。

网上相关资料很多,主要是针对Andrew Ng的在线课程写的笔记, 但大部分都讲得不清晰。这篇博客不能算是原创,主要是将我认为比较好的博客做了汇总,按照我觉得比较容易看懂的方式进行排版。希望能对大家有帮助。

有兴趣的同学也可以根据文章最后的参考文献,去看看原来博主的文章。


1、线性回归


1.1 基本原理


在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。

例如Andrew Ng老师的课程中给的房价预测的例子,影响房价的因素有n个,如下图:


每个因素即为一个特征,每个训练样本有n个特征。

一般表示格式按如下约定,第i条样本的输入x(i):


所有训练样本的输入表示为x,输出表示为y,共有m个输入:


θ就是我们要求的回归参数,因为是线性回归,所以为没个特征x(i)添加一个参数θ(i),所以h函数的形式如下:


为了公式表示方便,将x0设定为1,同时将所有θ表示成向量:


则有:


linear regression中一般将J函数(打分函数据)取成如下形式:


至于为什么取成该式,这里不进行深入的分析和推导,网上有一篇文章《Standford机器学习+线性回归CostFunction和Normal+equation的推导》进行了推导,可供参考。

用梯度下降法求J(θ)的最小值,梯度下降法就是如下的过程(α表示学习率):


a、对于多个特征:



对于上面给出的J(θ),有:


所以θ的迭代公式为:



b、对于单个特征

当单个特征值时,上式中j表示系数(权重)的编号,右边的值赋值给左边θj从而完成一次迭代。

上式就是批梯度下降算法(batch gradient descent),当上式收敛时则退出迭代,何为收敛,即前后两次迭代的值不再发生变化了。一般情况下,会设置一个具体的参数,当前后两次迭代差值小于该参数时候结束迭代。注意以下几点:

(1) a 即learning rate,决定的下降步伐,如果太小,则找到函数最小值的速度就很慢,如果太大,则可能会出现overshoot the minimum的现象;
(2) 初始点不同,获得的最小值也不同,因此梯度下降求得的只是局部最小值;
(3) 越接近最小值时,下降速度越慢;
(4) 计算批梯度下降算法时候,计算每一个θ值都需要遍历计算所有样本,当数据量的时候这是比较费时的计算。
 
批梯度下降算法的步骤可以归纳为以下几步:
(1)先确定向下一步的步伐大小,我们称为Learning rate ;
(2)任意给定一个初始值:θ向量,一般为0向量
(3)确定一个向下的方向,并向下走预先规定的步伐,并更新θ向量
(4)当下降的高度小于某个定义的值,则停止下降;
批量梯度下降的代码实现:
<span style="font-size:24px;"># coding=utf-8
#!/usr/bin/python

#Training data set
#each element in x represents (x0,x1,x2)
x = [(1,0.,3) , (1,1.,3) ,(1,2.,3), (1,3.,2) , (1,4.,4)]
#y[i] is the output of y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
y = [95.364,97.217205,75.195834,60.105519,49.342380]

epsilon = 0.000001
#learning rate
alpha = 0.001
diff = [0,0]
error1 = 0
error0 =0
m = len(x)


#init the parameters to zero
theta0 = 0
theta1 = 0
theta2 = 0
sum0 = 0
sum1 = 0
sum2 = 0
while True:
    
    #calculate the parameters
    for i in range(m):
        #begin batch gradient descent
        diff[0] = y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] )
        sum0 = sum0 + alpha * diff[0]* x[i][0]
        sum1 = sum1 + alpha * diff[0]* x[i][1]
        sum2 = sum2 + alpha * diff[0]* x[i][2]
        #end  batch gradient descent
    theta0 = sum0;
    theta1 = sum1;
    theta2 = sum2;
    #calculate the cost function
    error1 = 0
    for lp in range(len(x)):
        error1 += ( y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] ) )**2/2
    
    if abs(error1-error0) < epsilon:
        break
    else:
        error0 = error1
    
    print ' theta0 : %f, theta1 : %f, theta2 : %f, error1 : %f'%(theta0,theta1,theta2,error1)


print 'Done: theta0 : %f, theta1 : %f, theta2 : %f'%(theta0,theta1,theta2)</span>


1.2 随机梯度下降


因为每次计算梯度都需要遍历所有的样本点。这是因为梯度是J(θ)的导数,而J(θ)是需要考虑所有样本的误差和 ,这个方法问题就是,扩展性问题,当样本点很大的时候,基本就没法算了。所以接下来又提出了随机梯度下降算法(stochastic gradient descent )。随机梯度下降算法,每次迭代只是考虑让该样本点的J(θ)趋向最小,而不管其他的样本点,这样算法会很快,但是收敛的过程会比较曲折,整体效果上,大多数时候它只能接近局部最优解,而无法真正达到局部最优解。所以适合用于较大训练集的case。


随机梯度下降的代码如下:

<span style="font-size:24px;"># coding=utf-8
#!/usr/bin/python

#Training data set
#each element in x represents (x0,x1,x2)
x = [(1,0.,3) , (1,1.,3) ,(1,2.,3), (1,3.,2) , (1,4.,4)]
#y[i] is the output of y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
y = [95.364,97.217205,75.195834,60.105519,49.342380]

epsilon = 0.0001
#learning rate
alpha = 0.01
diff = [0,0]
error1 = 0
error0 =0
m = len(x)

#init the parameters to zero
theta0 = 0
theta1 = 0
theta2 = 0

while True:
    #calculate the parameters
    for i in range(m):
        diff[0] = y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] )
        theta0 = theta0 + alpha * diff[0]* x[i][0]
        theta1 = theta1 + alpha * diff[0]* x[i][1]
        theta2 = theta2 + alpha * diff[0]* x[i][2]
    
    #calculate the cost function
    error1 = 0
    for lp in range(len(x)):
        error1 += ( y[i]-( theta0 + theta1 * x[i][1] + theta2 * x[i][2] ) )**2/2
    
    if abs(error1-error0) < epsilon:
        break
    else:
        error0 = error1
    
    print ' theta0 : %f, theta1 : %f, theta2 : %f, error1 : %f'%(theta0,theta1,theta2,error1)
print 'Done: theta0 : %f, theta1 : %f, theta2 : %f'%(theta0,theta1,theta2)</span>

1.3 Feature scaling


Feature scaling可以通俗的解释为:将不同特征的取值转换到差不多的范围内。因为不同特征的取值有可能有很大的差别(几个数量级),例如下图中的x1和x2差别就非常大。这样会带来什么后果呢?从左图中可以看出,θ1-θ2的图形会是非常狭长的椭圆形,这样非常不利于梯度下降(θ1方向会非常“敏感”,或者说来回“震荡”)。进行scaling处理后,不同特征的规模相似,因此右图中的θ1-θ2图形会近似为圆形,这样更加适合梯度下降算法。


scaling也有不同的方法:
(1)例如上图中就是用特征值除以该组特征的最大值;
(2)下图中的mean normalization方法(姑且称为“均值归一化”),即用特征值先减去该组特征的平均值,然后再除以该组特征的最大值;
(3)上面两种方法显然还不是最合理的,下图的底部给出的公式x(i) = (x(i) - u(i)) / s(i),x(i)表示x的第i组特征(例如房屋面积,或者卧室数目等),u(i)表示第i组特征的均值,s(i)表示第i组特征的范围(最大值减最小值)或者标准差。


使用(3)中标准差的方法对前面的训练样本x矩阵进行归一化的代码如下:



1.4 vectorization

vectorization是尽量多的使用矩阵计算尽量少的使用for循环,以简化计算过程,提高效率。vectorization的推导在上一篇logistic regression(http://blog.csdn.net/dongtingzhizi/article/details/15962797)中有详细的介绍,这里不再重复,结论是:对于前面约定的x,y和θ矩阵的格式,vectorization后的更新过程如下:



这样,不需要for循环,使用矩阵计算可以一次更新θ矩阵。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

回归问题总结(梯度下降、线性回归、逻辑回归、源码、正则化) 的相关文章

  • 数据挖掘(全书的知识点都包括了)

    数据挖掘 第一章 1 什么是数据挖掘 数据挖掘是从数据中 发现其有用的信息 从而帮助我们做出决策 广义角度 数据挖掘是从大量的 不完全的 有噪声的 模糊的 随机的实际应用数据中 提取隐含在其中的 人们事先不知道的 但又是潜在有用的信息和知识
  • 4-2 过滤器法

    4 2 过滤器法 请参考 数据准备和特征工程 中的相关章节 调试如下代码 注意 本节内容因为要耗费比较大的内存 在线平台有可能无法支持 可以下载到本地执行 基础知识 from sklearn datasets import load iri
  • 对话数据宝董事长汤寒林:数据要素崛起的背后是产业链的爆发

    数字经济再添新概念 数据要素的来到会对行业产生什么影响 数科星球原创 作者丨苑晶 编辑丨十里香 从小众的极客文化再到被众多企业所接纳 信息科技已经历70余年 现在 随着越来越多的企业开始拥抱数据产业之时 数据的有效利用成为企业间备受关注的话
  • 文本情感分析竞赛(首次提交排名第6)

    之前花了半个小时做了个DataCastle上的基础竞赛题 然后提交结果后直接第六名 因此来分享一下 该文章之前记录在我的公众号上 原文链接 https mp weixin qq com s nIJ2begF2 5i WnT1PEM3w 数据
  • 如何统计DataFrame中各列数据分类的各个不同数据出现的次数

    可以使用 value counts 函数来统计每个不同数据在数据列中出现的次数 例如 假设有一个名为 df 的 DataFrame 其中包含一列名为 col 要统计 col 列中各个不同数据的出现次数 可以使用以下代码 counts df
  • Spring源码深度解析:文章目录

    文章目录 序号 内容 链接地址 1 一 Spring整体架构和源码环境搭建 https blog csdn net wts563540 article details 126686645 2 二 手写模拟Spring https blog
  • 『sklearn学习』多种模型预测脸的下半部分的结果对比

    预测脸的下半部分 import numpy as np import matplotlib pyplot as plt from sklearn datasets import fetch olivetti faces from sklea
  • 【数据分析入门】Jupyter Notebook

    目录 一 保存 加载 二 适用多种编程语言 三 编写代码与文本 3 1 编辑单元格 3 2 插入单元格 3 3 运行单元格 3 4 查看单元格 四 Widgets 五 帮助 Jupyter Notebook是基于网页的用于交互计算的应用程序
  • 推荐算法(Recommended Algorithms)

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 一种简单的计算item相似度算法

    计算item之间相似度是个有意义的工作 比如词的相似度就有很多应用场景 词相似度就有很多做法 工业上现在用得最多的可能是word2vec了 还有些算语义相似度的偏学术的办法 这里介绍一种比较简单可行的思路 不只是算词相似度 其他类型也可以
  • 数据缺失类型:MCAR、MAR、MNAR

    2022 01 23 1 Missing Completely at Random MCAR 2 Missing at Random MAR 3 Missing Not at Random MNAR 参考 AI for Medical Pr
  • 软考:中级软件设计师:程序语言基础:表达式,标准分类,法律法规,程序语言特点,函数传值传址

    软考 中级软件设计师 程序语言基础 表达式 提示 系列被面试官问的问题 我自己当时不会 所以下来自己复盘一下 认真学习和总结 以应对未来更多的可能性 关于互联网大厂的笔试面试 都是需要细心准备的 1 自己的科研经历 科研内容 学习的相关领域
  • 淘宝开放API列表展示(含测试链接)

    item get 获得淘宝商品详情 测试入口 item get pro 获得淘宝商品详情高级版 item review 获得淘宝商品评论 item fee 获得淘宝商品快递费用 item password 获得淘口令真实url item l
  • 1688(阿里巴巴国内站)API在跨境电商中的妙用

    随着数字时代的到来 API Application Programming Interface 应用程序编程接口 在各个行业的应用越来越广泛 尤其是在跨境电商领域 API作为一种通用的通信协议 为不同软件应用程序之间的数据交互和功能调用提供
  • 深入挖掘:Python中的Statsmodels库高级应用

    写在开头 随着数据科学的发展 解决更为复杂问题的关键往往在于深入了解数据并采用更高级的分析工具 本文将带您深入探讨Python中的Statsmodels库 并引入一些高级功能 为更深入的数据挖掘奠定基础 1 方差分析 1 1 方差分析概念
  • 病案管理的定义、流程及应用分析

    病案管理是指针对病人的基本信息 病历 就诊记录等进行收集 整理 存储 分析和应用的一项管理工作 它在医院 医疗机构和医疗行业中具有重要的作用 能够提高医疗服务的质量 效率和安全性 本文将就病案管理的定义 流程以及其在医疗健康领域中的应用进行
  • 航空港务数据大屏为航空港的可持续发展提供有力支撑!

    随着经济的发展 不断加建与扩建民用机场 空港行业规模不断扩大 在不断引进和消化发达国家先进技术的同时 中国深入开展了对新技术和新材料的研究 极大地丰富和发展了中国的机场建设技术 且各项机场建设计划均已落实推进 行业在经济发展的推动下欣欣向荣
  • 航空港务数据大屏为航空港的可持续发展提供有力支撑!

    随着经济的发展 不断加建与扩建民用机场 空港行业规模不断扩大 在不断引进和消化发达国家先进技术的同时 中国深入开展了对新技术和新材料的研究 极大地丰富和发展了中国的机场建设技术 且各项机场建设计划均已落实推进 行业在经济发展的推动下欣欣向荣
  • 时间序列平稳性相关检验方法

    理解平稳性 一般来说 平稳时间序列是指随着时间的推移具有相当稳定的统计特性的时间序列 特别是在均值和方差方面 平稳性可能是一个比较模糊的概念 将序列排除为不平稳可能比说序列是平稳的更容易 通常不平稳序列有几个特征 平均值随时间推移发生变化
  • 欢迎来到阿清的数据分析求职分享

    大家好 我是阿清 在这里 我将与大家分享关于数据分析岗位求职路上的点点滴滴 包括行业和岗位的深入见解 求职技巧 面试准备方法 以及实战案例分析等等 关于我 正经工作履历 2015年东南大学计算机专业研究生毕业 校招身份加入了阿里 最初参与面

随机推荐