线性回归最小二乘法和梯度下降法-详细

2023-11-13

 原文:  https://blog.csdn.net/y990041769/article/details/69567838

问题描述

首先我们定义问题,线性回归要解决的问题就是根据给出的数据学习出一个线性模型。 
例如我们最常说的身高和体重的关系,以及房屋面积和房价的关系,这里给出一个瑞典汽车保险数据集 
数据集 可以直接复制出来用 
两列分别表示 
索赔要求数量 
对所有索赔的总赔付,以千瑞典克朗计 
数据前五行

108 392,5
19  46,2
13  15,7
124 422,2
40  119,4
  • 1
  • 2
  • 3
  • 4
  • 5

我们按照这个数据集作出图如下 
汽车保险索赔要求和总赔付

大概观察一下可以用线性模型去定义,现在的问题是根据现有的这个数据集合,我们要学习出一个模型,然后给出索赔要求数量我们能够预测总赔付。 
下面给出两种解决方法,并分析这两种方法区别。

最小二乘法

上面这个问题就是最简单的一元线性模型,首先看几个定义 
分类问题 监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等) 
回归问题如果预测的变量是连续的,我们称其为回归 
一元线性回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。 
多元线性如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。 
对于二维空间线性是一条直线;对于三维空间线性是一个平面,对于多维空间线性是一个超平面

对于上面的数据集,我们可以用多条直线去拟合,那么怎么定义那一条直线是最优呢?

首先定义模型: 
其中ei为样本误差 
这里写图片描述

定义损失函数: 
这里写图片描述

上面是损失函数,我们现在目的使得损失函数尽可能的小,就是求如上Q的最小值,函数求极值问题,这里就用到了导数,导数的意义是导数大于0的x处函数递增,导数小于0处x的函数递减,导数为0既为函数的极值点 
这里写图片描述

上面x和y都是已知的数据集,β是我们要求的结果,两个函数两个未知数,就可以解方程了。 
这里写图片描述

证明也很简单,这里给个证明的链接,剩下就是几次求和的事儿了。

多元线性回归

首先我们假设模型: 
这里写图片描述

而对于数据集合中n个个体,每个模型有: 
这里写图片描述 
表示成矩阵形式: 
这里写图片描述

跟一元的一样,首先我们损失函数: 
这里写图片描述

同样通过求偏导数为0解方程可以得到结果: 
这里写图片描述

梯度下降法

我们要求解的问题和上面一样,同样定义的模型和损失函数都一样,模型为线性模型,损失函数为平方差值和最小,同样这里要求解的是线性方程的参数。

首先我们给每个参数赋值一个随机数,然后按照下面公式进行迭代: 
这里写图片描述

按照最小二乘法,我们直接求出导数为0的点,但是有时候很难解出方程,就考虑使用迭代的方法,首先取一个随机数,然后每一次去想着目标结果逼近,而为了效率最高,我们向着梯度下降最快的方向,既θ在偏导数上的取值。而α是学习速率,是个很重要的参数,设置过大会导致超过最小值,过小则学习的太慢。 
对右边的式子展开得到: 
这里写图片描述

则批量梯度下降迭代如下: 
这里写图片描述

随机梯度下降

上面公式我们发现,每迭代一次我们都要遍历所有的数据去求和,如果数据量大的话可能计算一次很耗时,于是就有了随机梯度下降,这样虽然解决了数据量大的问题,但是学习速度比较曲折,并且学习到的结果可能只是几个局部最优解。如果数据量小建议用批量梯度下降: 
这里写图片描述

首先哦我们看按照批量梯度得到的结果 
函数为:y = 19.818 + 3.418 * x 
做图看一下,看图的话效果还是很不错的 
这里写图片描述 
下面给出上面数据的两种方法的代码 
批量梯度下降法:

#!/usr/bin/env python
#coding:utf-8

import json
import sys
import time
reload(sys)
sys.setdefaultencoding('utf-8')

if __name__ == "__main__":
    x = [108.0 , 19.0 , 13.0 , 124.0 , 40.0 , 57.0 , 23.0 , 14.0 , 45.0 , 10.0 , 5.0 , 48.0 , 11.0 , 23.0 , 7.0 , 2.0 , 24.0 , 6.0 , 3.0 , 23.0 , 6.0 , 9.0 , 9.0 , 3.0 , 29.0 , 7.0 , 4.0 , 20.0 , 7.0 , 4.0 , 0.0 , 25.0 , 6.0 , 5.0 , 22.0 , 11.0 , 61.0 , 12.0 , 4.0 , 16.0 , 13.0 , 60.0 , 41.0 , 37.0 , 55.0 , 41.0 , 11.0 , 27.0 , 8.0 , 3.0 , 17.0 , 13.0 , 13.0 , 15.0 , 8.0 , 29.0 , 30.0 , 24.0 , 9.0 , 31.0 , 14.0 , 53.0 , 26.0 ]
    y = [392.5 , 46.2 , 15.7 , 422.2 , 119.4 , 170.9 , 56.9 , 77.5 , 214.0 , 65.3 , 20.9 , 248.1 , 23.5 , 39.6 , 48.8 , 6.6 , 134.9 , 50.9 , 4.4 , 113.0 , 14.8 , 48.7 , 52.1 , 13.2 , 103.9 , 77.5 , 11.8 , 98.1 , 27.9 , 38.1 , 0.0 , 69.2 , 14.6 , 40.3 , 161.5 , 57.2 , 217.6 , 58.1 , 12.6 , 59.6 , 89.9 , 202.4 , 181.3 , 152.8 , 162.8 , 73.4 , 21.3 , 92.6 , 76.1 , 39.9 , 142.1 , 93.0 , 31.9 , 32.1 , 55.6 , 133.3 , 194.5 , 137.9 , 87.4 , 209.8 , 95.5 , 244.6 , 187.5]
    print len(x),len(y)
    epsilon = 0.0001  #迭代伐值

    cnt = 0
    alpha = 0.001
    theta0 = 0
    theta1 = 0

    error1 = 0
    error0 = 0
    while True:
        sum0 = 0 
        sum1 = 0
        cnt = cnt + 1
        for i in range(0, len(x)):
            diff =y[i] - (theta0 + theta1 * x[i])

            sum0 = sum0 + diff
            sum1 = sum1 + diff * x[i]

        theta0 = theta0 + alpha * sum0 / len(x)
        theta1 = theta1 + alpha * sum1 / len(x)

        error1 = 0
        for i in range(0, len(x)):
            error1 = error1 + (y[i] - (theta0 + theta1 * x[i] )) ** 2

        if abs(error1 - error0) < epsilon:
            break
        else:
            error0 = error1

        print 'thata0 : %f, thata1 :%f error1 : %f' % (theta0, theta1, error1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

这一份数据用随机梯度搞不定,学习不出比较好的结果,考虑是不是对数据做一些预处理 
随机梯度下降法:

#!/usr/bin/env python
#coding:utf-8

import json
import sys
import time
reload(sys)
sys.setdefaultencoding('utf-8')

if __name__ == "__main__":
    x = [108.0 , 19.0 , 13.0 , 124.0 , 40.0 , 57.0 , 23.0 , 14.0 , 45.0 , 10.0 , 5.0 , 48.0 , 11.0 , 23.0 , 7.0 , 2.0 , 24.0 , 6.0 , 3.0 , 23.0 , 6.0 , 9.0 , 9.0 , 3.0 , 29.0 , 7.0 , 4.0 , 20.0 , 7.0 , 4.0 , 0.0 , 25.0 , 6.0 , 5.0 , 22.0 , 11.0 , 61.0 , 12.0 , 4.0 , 16.0 , 13.0 , 60.0 , 41.0 , 37.0 , 55.0 , 41.0 , 11.0 , 27.0 , 8.0 , 3.0 , 17.0 , 13.0 , 13.0 , 15.0 , 8.0 , 29.0 , 30.0 , 24.0 , 9.0 , 31.0 , 14.0 , 53.0 , 26.0 ]
    y = [392.5 , 46.2 , 15.7 , 422.2 , 119.4 , 170.9 , 56.9 , 77.5 , 214.0 , 65.3 , 20.9 , 248.1 , 23.5 , 39.6 , 48.8 , 6.6 , 134.9 , 50.9 , 4.4 , 113.0 , 14.8 , 48.7 , 52.1 , 13.2 , 103.9 , 77.5 , 11.8 , 98.1 , 27.9 , 38.1 , 0.0 , 69.2 , 14.6 , 40.3 , 161.5 , 57.2 , 217.6 , 58.1 , 12.6 , 59.6 , 89.9 , 202.4 , 181.3 , 152.8 , 162.8 , 73.4 , 21.3 , 92.6 , 76.1 , 39.9 , 142.1 , 93.0 , 31.9 , 32.1 , 55.6 , 133.3 , 194.5 , 137.9 , 87.4 , 209.8 , 95.5 , 244.6 , 187.5]
    print len(x),len(y)
    epsilon = 0.0001  #迭代伐值

    cnt = 0
    alpha = 0.01
    theta0 = 0
    theta1 = 0

    error1 = 0
    error0 = 0
    while True:
        cnt = cnt + 1
        for i in range(0, len(x)):
            diff =y[i] - (theta0 + theta1 * x[i])

            theta0 = theta0 + alpha * diff 
            theta1 = theta1 + alpha * diff * x[i]

            error1 = 0
            for i in range(0, len(x)):
                error1 = error1 + (y[i] - (theta0 + theta1 * x[i] )) ** 2

            if abs(error1 - error0) < epsilon:
                break
            else:
                error0 = error1

            print 'thata0 : %f, thata1 :%f error1 : %f' % (theta0, theta1, error1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性回归最小二乘法和梯度下降法-详细 的相关文章

  • 离散余弦变换

    离散余弦变换 DCT for Discrete Cosine Transform 是与傅里叶变换相关的一种变换 它类似于离散傅里叶变换 DFT for Discrete Fourier Transform 但是只使用实数 离散余弦变换相当于
  • 贝叶斯推断及其互联网应用(二):过滤垃圾邮件

    上一次 我介绍了贝叶斯推断的原理 今天讲如何将它用于垃圾邮件过滤 贝叶斯推断及其互联网应用 作者 阮一峰 接上文 七 什么是贝叶斯过滤器 垃圾邮件是一种令人头痛的顽症 困扰着所有的互联网用户 正确识别垃圾邮件的技术难度非常大 传统的垃圾邮件
  • 证明sinx/x的极限等于1(x趋向于0)

    洛比达法则 上下都对x求导 得1 cosx 1
  • 逆矩阵(inverse matrix)的概念及其意义

    逆矩阵 inverse matrix 的概念及其意义 2015年09月17日 00 09 10 阅读数 21838 标签 逆矩阵为何需要逆矩阵逆矩阵应用逆矩阵实例逆矩阵与倒数 更多 版权声明 本文为博主原创文章 未经博主允许不得转载 htt
  • 时域和空域和频域

    傅立叶变换是f t 乘以正弦项的展开 正弦项的频率由u 其实是miu 的值决定 因为积分后左边剩下的为一变量是频率 所以我们说傅立叶变换域是频率域 数字图像处理 冈萨雷斯 中文第三版P128 当变量t用于说明图像时 我们一般将变量t的域称为
  • 极限导数练习题

    f x sinx 2 x 当x趋近于0时 f x 的极限是0 f x sin x 2 x 当x趋近于0时 f x 的极限是0 f x sin 2x x 当x趋近于0时 f x 的极限是2
  • python 之pulp 线性规划介绍及举例

    原文 https www cnblogs com shizhenqiang p 8274806 html 安装 conda install pulp pulp http pythonhosted org PuLP main basic py
  • 凸函数性质习题

    试题专页 1题文 考试题提前练 gt 戳这 凸函数的性质定理为 如果函数f x 在区间D上是凸函数 则对于区间D内的任意x1 x2 xn 有 f x1 f x2 f xn n f x1 x2 xn n 已知函数y sinx在区间 0 上是凸
  • 贝叶斯推断及其互联网应用(一)

    贝叶斯推断及其互联网应用 一 投递人 itwriter 发布于 2011 08 25 14 03 评论 6 有1981人阅读 原文链接 收藏 一年前的这个时候 我正在翻译Paul Graham的 黑客与画家 那本书大部分谈的是技术哲学 但是
  • 相关系数,互相关函数,协方差,卷积

    X t 为随机过程 a t E X t 为期望 Y t 为另一随机过程 自相关函数的定义为 R s t E X s X t 互相关函数的定义为 R s t E X s Y t 事实上 在图象处理中 自相关和互相关函数的定义如下 设原函数是f
  • 函数的相关和卷积

    1 卷积的定义 卷积满足交换律 分配律 结合律 也具有位移不变性以及缩放性质 2 互相关的定义 变量替换后有 上述两式完全等价 性质 1 互相关是两个函数间存在相似性的量度 2 由上述 2 式可得 3 相关运算和卷积运算的区别 对相关来说
  • 世界上最完美的公式 ----欧拉公式

    欧拉公式 在数学历史上有很多公式都是欧拉 leonhard euler 公元1707 1783年 发现的 它们都叫做 欧拉公式 它们分散在各个数学分支之中 1 分式里的欧拉公式 a r a b a c b r b c b a c r c a
  • 线性回归最小二乘法和梯度下降法-详细

    原文 https blog csdn net y990041769 article details 69567838 问题描述 首先我们定义问题 线性回归要解决的问题就是根据给出的数据学习出一个线性模型 例如我们最常说的身高和体重的关系 以
  • java实现高斯赛德尔算法解线性方程组

    package linear equation import java util Scanner 使用高斯赛德尔迭代法求解线性方程组 public class Gauss Seidel Iterate 求下三角 private static
  • 协方差矩阵的几何解释

    A geometric interpretation of the covariance matrix http www visiondummy com 2014 04 geometric interpretation covariance
  • 自然对数e的来历

    e是自然对数的底数 是一个无限不循环小数 其值是2 71828 是这样定义的 当n gt 时 1 1 n n的极限 注 x y表示x的y次方 随着n的增大 底数越来越接近1 而指数趋向无穷大 那结果到底是趋向于1还是无穷大呢 其实 是趋向于
  • 对数和指数

    参考 https www zhihu com question 21453993 这就相当于先发明减法符号 再发明加法符号 1614年 纳皮尔发明了对数和对数表 1637年 法国数学家笛卡儿发明了指数 比对数晚了20多年 1770年 欧拉才
  • 2的31次方和3的21次方哪个大,123组成最大的数是多少?

    123这三个数字组成最大的数是什么数 面试官告诉小孙 123这三个数字组成最大的数是什么数 我希望你能够在5分钟之内回答出来 小孙当时连想都没有想 123组成的最大数字 当然就是123了 当小孙把这个答案告诉面试官的时候 面试官摇摇头 然后
  • 特征值和特征向量的几何和物理意义

    原文 http blog 163 com renguangqian 126 blog static 1624014002011711114526759 FUCk 相见很晚 如果大学期间遇到这样的文章 线代必须90分以上 特征值和特征向量的几
  • 协方差矩阵的实例与意义

    协方差矩阵的实例与意义 在机器学习中经常需要计算协方差矩阵 本科时没学过这个概念 一直对此非常头疼 现在试图通过实例的计算 图形化的表示来梳理一下什么是协方差矩阵 A numerical example 问题 有一组数据 如下 分别为二维向

随机推荐

  • [其他]IDEA中Maven项目配置国内源

    配置国内源主要解决了 在maven项目中pom xml下载jar包失败或过慢的问题 在IDEA中的设置分成两种 设置当前项目与新创项目 我们就需要两种都进行设置 不然只有在当前项目配置了国内源 新创项目的时候还是默认的状态 由于下面两种设置
  • 有监督对比loss计算

    https blog csdn net wf19971210 article details 116715880 关于对比损失 无监督对比损失 通常视数据增强后的图像与原图像互为正例 而对于有监督对比损失来说 可以将同一batch中标签相同
  • 均值计算的R语言实现

    均值计算的R语言实现 在数据分析和统计学中 均值是一个常用的指标 用于描述数据集的集中趋势 在R语言中 我们可以使用多种方法来计算均值 下面将介绍几种常见的方法 并提供相应的R代码示例 使用mean 函数计算均值 mean 函数是R语言中用
  • Scratch的克隆体

    克隆体 克隆就是将角色本体完全复制一份 包含该角色当前的所有属性 例如造型 位置 颜色 大小等 控制积木中提供了克隆自己积木 在事件积木中 单独提供了一个当作为克隆体启动时的积木 当某个角色被克隆 则其克隆体会触发该事件 故而 对于那些克隆
  • 第十课,OpenGL光照之贴图

    光照贴图 光照贴图 及使用纹理代替物体颜色 物体的实际颜色由物体材质和光照决定 漫反射贴图 使用一张覆盖物体的图像 让我们能够逐片段索引其独立的颜色值 方式 1 将纹理传入 GLuint texture1 loadTexture conta
  • 在 CentOs7 中安装宝塔面板和 Docker(包括MySQL,Redis)

    在 CentOs7 中安装宝塔面板和Docker 包括MySQL Redis 1 使用 Xshell 连接 CentOs7 2 安装宝塔面板 2 1 安装 Tomcat 同 Java 8 2 1 安装 Docker 2 2 安装 MySQL
  • 「考研算法」

    考研算法 前言 本系列文章涉及的算法内容 针对的是哈尔滨工业大学854科目 在本文中通过具体的算法题进行讲解相应算法 今天涉及的算法主要有线性筛 十大排序中快速排序和归并排序 C语言版 一 线性筛算法 算法题目 筛质数 给定一个正整数 n
  • ctf_show_web4

    这一道题他们给的提示是 url var log nginx access log 用上面的这个来找出日志接下来就是文件包含这里我们要用到bp 抓包后我们在User Agent中插入一句话木马 之后连接你的蚁剑 测试连接连接成功 最后就会得到
  • Android项目如何上传Gitee仓库

    前言 最近Android项目比较多 我都是把Android项目上传到Gitee中去 GitHub的话我用的少 可能我还是更喜欢Gitee吧 毕竟Gitee仓库用起来更加方便 一 创建Gitee仓库 1 先创建一个Gitee账号 然后登录上去
  • 基于区块链智能合约的疫苗溯源系统

    绪论 该系统基于以太坊的Solidity进行智能合约开发 并通过hardhat进行部署在了本机 通过Mocha和Chai进行了单元测试的编写 同时提供了一个基于React的前端界面与用户进行交互 区块链的介绍 不难看出 区块链技术对现有的经
  • JS(ES5,ES6)实现栈数据结构

    栈是一种遵从后进先出原则的有序集合 新添加的或待删除的元素都保存在栈的同一端 称作栈顶 另一端叫做栈底 栈也被用在编程语言的编译器和内存中保存变量 方法调用等 ES5实现 function Stack let items 向栈添加元素 th
  • Git拉取分支代码小结以及问题解决

    更全面的版本 三分钟学会git 一 拉取代码 git clone git example com myproject 默认拉取的master 若需要切换分支 git branch a master origin HEAD origin ma
  • vlc-android源码的编译

    一 编译前须知 1 参考官方文档 https wiki videolan org AndroidCompile 2 必须要在Linux环境下 3 我使用的是ubuntu 二 编译前安装开发工具 1 Linux操作系统 我选择的是在windo
  • 七牛云存储java_api代码实现

    这是思维图 画的有点拉 看官老爷凑合看 接下来就按照这个逻辑来实现 七牛云本身是提供的Java SDK的 可以完成图片上传和删除 我们可以参考官方提供的例子 官方文档 https developer qiniu com kodo sdk 1
  • Python组合数据的输入问题

    以输入5个数据为例 以前是单个变量的处理 所以习惯单个数据输入 a eval input 输入5个数据 自然想到的就是让它循环5次 这种方式执行时 因为每次输入回车 相当于竖着输 能不能一次输入呢 在一行横着输 元组 t eval inpu
  • 网络攻防——Fiddler工具的使用

    Fiddler工具的使用 1 引言 2 什么是Fiddler 3 Fiddler的基本使用 4 基于手机模拟器的APP抓包 5 接口捕获 6 引言 7 鸣谢 1 引言 虽然之前写了退出一切关于编程的学习 其实我还想学react typesc
  • 【cdk的使用】C语言 跨平台生成伪随机数

    Github地址 https github com wujin1989 cdk C标准库中有rand 和srand 函数用来生成伪随机数 但是虽然在标准库里 确依然不能跨平台 因为C标准里没有明确rand 函数生成的随机数范围 比如 win
  • 【Xilinx DMA SG】Xilinx DMA SG 模式

    DMA简介 AXI 直接存储器访问 AXI DMA IP 提供高带宽直接存储器 AXI4 存储器映射和 AXI4 Stream IP 接口之间的访问 它SG模式还可以从中央处理中卸载数据移动任务 基于处理器的系统中的单元 CPU 初始化 状
  • 机器学习入门——线性回归预测广告投入数据集

    0 Advertising数据集 Advertising数据集是关于广告收益与广告在不同的媒体上投放的相关数据 分别是在TV Radio Newspaper三种媒体上投放花费与 投放所产生的收益的数据 数据共有200条 数据的格式如下 1
  • 线性回归最小二乘法和梯度下降法-详细

    原文 https blog csdn net y990041769 article details 69567838 问题描述 首先我们定义问题 线性回归要解决的问题就是根据给出的数据学习出一个线性模型 例如我们最常说的身高和体重的关系 以