机器学习第一道菜(二):玩转最小二乘法

机器学习第一道菜(二):玩转最小二乘法


之前在 《机器学习第一道菜(一):线性回归的理论模型》一文中,我们建立了线性回归的理论模型,本文就用“最小二乘法”来求解这个模型。

一、线性函数表达式

1.1 函数表达式 y y y

在《机器学习第一道菜(一):线性回归的理论模型》一文中,我们最终得到的表达式为:
y = θ 0 + θ 1 x y=\theta_0 + \theta_1x y=θ0+θ1x
别被这个式子吓到,它只不过是我们熟知的一次函数 y = k x + b y=kx+b y=kx+b的另一种写法(把k换成 θ 1 \theta_1 θ1,b换成 θ 0 \theta_0 θ0)。
搞这个函数是为了找到一条最佳直线,拟合我们文中“千金买笑”(简单理解为:送礼越贵,妹子越笑)问题的离散数据点。
在这里插入图片描述
对付这些散乱的数据点的入门级武器就是“最小二乘法”,它能找到数据背后的规律。

1.2 函数表达式 f θ ( x ) f_\theta(x) fθ(x)

为了让最小二乘法这道菜做得更地道,我们需要再次转换一下上面的表达式,改成这个鸟样:
f θ ( x ) = θ 0 + θ 1 x f_\theta(x)=\theta_0 + \theta_1x fθ(x)=θ0+θ1x
咱们要做的就是确定这个函数,也就是求出 θ \theta θ的值。
这么写也很好理解。咱们上学时就经常把y写成 f ( x ) f(x) f(x),这样就更清楚地表示这个函数是关于x的函数。还有一点,如果继续使用y,后面可能会造成混乱。 f ( x ) f(x) f(x)加上下标 θ \theta θ是为了标明这个函数含有我们要求的参数 θ \theta θ

1.3 最小误差

现在再明确一下问题:
已知:礼物金额及对应的微笑次数数据,这些数据被称为训练数据。
θ \theta θ的值,即 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1,也就是一次函数的截距和斜率。
这个问题可以转换为下面的问题:
找到 θ \theta θ,使训练数据中的x(礼物金额)代入函数后,求出来的 f θ ( x ) f_\theta(x) fθ(x)(微笑次数)与训练数据中的微笑次数的差最小。
随便拿上面散点图中的几个数据为例:

礼物金额 x x x微笑次数 y y y
12459
132414
184312
234222
318928

由于最开始不知道给 θ \theta θ取多大的值合适,那就先随便给个随机值,比如设 θ 0 = 1 \theta_0=1 θ0=1 θ 1 = 2 \theta_1=2 θ1=2,则表达式变为:
f θ ( x ) = 1 + 2 x f_\theta(x)=1+ 2x fθ(x)=1+2x
将上表中的x代入函数,求出 f θ ( x ) f_\theta(x) fθ(x)

礼物金额 x x x微笑次数 y y y θ 0 = 1 \theta_0=1 θ0=1 θ 1 = 2 \theta_1=2 θ1=2 时的 f θ ( x ) f_\theta(x) fθ(x)
124592491
1324142649
1843123687
2342224685
3189286379

接下来我们要做的就是通过不断调整 θ \theta θ,使计算值 f θ ( x ) f_\theta(x) fθ(x)与实际值 y y y的差值最小。
理想的情况就是二者的差值为0,即:
y − f θ ( x ) = 0 y-f_\theta(x)=0 yfθ(x)=0
y和fθ(x)之间的误差为0,可能对于个别数据可以实现,但要所有点的误差都是0是不可能的。
实际上,个别点误差最小是没有意义的,我们应该着眼于所有点,使所有点的误差之和尽可能地小。用公式表示为:
min ⁡ ∑ i = 1 n ∣ y i − f θ ( x i ) ∣ \min \sum_{i=1}^{n}|y_i - f_\theta(x_i)| mini=1nyifθ(xi)

∑是求和符号,读作“西格玛”。上面的公式表示对每个训练数据的误差求和。

然而,这个式子求解起来很不方便,主要有两个原因:
(1)可加性。因为求绝对值需要考虑误差为负的情况,这虽然不存在什么困难,但会降低效率。
(2)可微性。这是最主要的原因。求解误差最小值,需要用到微分。绝对值函数图像不连续,有的点不可微分,而且还必须分情况讨论,很麻烦。
下面介绍一个求解类似误差和最小问题的通用方法:最小二乘法。相比如前面的最小绝对值法,最小二乘法的优势是使用平方类函数,图像连续、可微分,计算微分也非常简单。

二、最小二乘法:数据拟合大师

2.1 概念及其历史背景

最小二乘法(Least Squares Method)是一种数据拟合方法。
从名字可以看出它有两个特点:

  • 最小(Least ):它求的是最小值。
  • 二乘(Squares):square的意思是平方。二乘就是两个同样的数相乘,就是求平方。

最小二乘法的核心思想是:找到一个最佳的函数曲线(通常是一条直线或曲线),使得所有数据点到这条曲线的垂直距离(也就是误差)的平方和最小。简单来说,就是找到一个最“平均”的拟合方式,让所有数据点都尽可能地靠近这条曲线。
这种方法最早可以追溯到18世纪末期,由德国数学家高斯(Carl Friedrich Gauss)和法国数学家勒让德(Adrien-Marie Legendre)分别独立提出,并逐渐成为现代统计学、机器学习等领域不可或缺的一部分。

2.2 拟合优势

最小二乘法相比其他拟合方法有以下几大优势:

  • 计算简便:只需要求解线性方程组即可获得结果,非常适合计算机自动化处理;
  • 稳定性强:即使输入数据存在轻微波动或噪声干扰,也能保证输出结果相对稳定;
  • 应用广泛:不仅限于线性关系建模,还可以扩展应用于非线性回归分析等多个场景。

2.3 数学表达式

2.3.1 一般公式

假设我们有一组实际数据 ( x i , y i ) (x_i, y_i) (xi,yi),其中 i = 1 , 2 , … , n i=1,2,\ldots,n i=1,2,,n表示数据(或者称样本)编号。我们的目标是找到一条直线(或其他形式的曲线),使得这条线上每个点与实际值之间的垂直距离尽可能小。用公式表示就是:
min ⁡ a , b ∑ i = 1 n ( y i − ( a x i + b ) ) 2 \min_{a,b} \sum_{i=1}^{n}(y_i - (ax_i + b))^2 a,bmini=1n(yi(axi+b))2
这里, a a a代表斜率, b b b则是截距, a x i + b ax_i + b axi+b为所求一次函数。
这是最小二乘法公式的一般形式。
为了方便计算,可以进一步简化为矩阵形式:
e T e = ( Y − X β ) T ( Y − X β ) \mathbf{e}^T\mathbf{e} = (\mathbf{Y}-X\mathbf{\beta})^T(\mathbf{Y}-X\mathbf{\beta}) eTe=(Y)T(Y)
其中, Y \mathbf{Y} Y是一个包含所有 y i y_i yi的列向量, X X X是由 x i x_i xi组成的系数矩阵,而 β \mathbf{\beta} β则包含了待估计的参数 a a a b b b。通过求导并令导数等于零,最终可以得到最优解 β ^ = ( X T X ) − 1 X T Y \hat{\beta}=(X^TX)^{-1}X^T\mathbf{Y} β^=(XTX)1XTY
这个矩阵形式说是为了简化计算,但感觉是复杂了理解。老金反正正是没看明白。

2.3.2 目标函数

介绍完最小二乘法公式的一般形式,再回到咱们今天要说的机器学习中的线性回归问题。
前面说了,用 min ⁡ ∑ i = 1 n ∣ y i − f θ ( x i ) ∣ \min \sum_{i=1}^{n}|y_i - f_\theta(x_i)| mini=1nyifθ(xi)这种绝对值的形式求最小误差和不好求解。改用最小二乘法后,变成误差的平方形式,可直接消去绝对值。
在线性回归问题中,一般采用下面的奇葩写法:
E ( θ ) = 1 2 ∑ i = 1 n ( y ( i ) − f θ ( x ( i ) ) ) 2 E(\theta)=\frac{1}{2}\sum_{i=1}^{n}(y^{(i)} -f_\theta(x^{(i)}))^2 E(θ)=21i=1n(y(i)fθ(x(i)))2

注意:
E ( θ ) E(\theta) E(θ)是一个函数,这说明 E E E是关于 θ \theta θ的函数,就是说参数 θ \theta θ才是他的自变量, x x x不是。
E ( θ ) E(\theta) E(θ) E E E是误差的英语单词Error的首字母。
x ( i ) x^{(i)} x(i) y ( i ) y^{(i)} y(i)中的i不是i次幂的意思,而是指第i个训练数据。也就是说,它们就相当于 x i x_i xi y i y_i yi
④常数 1 2 \frac{1}{2} 21是硬凑出来的,加不加并不影响结果(只要是正的常数都不影响),加上它纯出于美观考虑。这是为了后面的微分,因为微分的时候指数2会下来变成乘以2,正好跟1/2抵消,微分后的式子前面就没有了常数2,看起来会很有美感。

这玩艺被称为“目标函数”,也被称为损失函数(loss function)、成本函数或误差函数。
说到底,它就是一个用来衡量预测值与真实值之间差距的函数。
机器学习的目标就是找到一组模型参数(也就是 θ \theta θ的值),使得目标函数 E ( θ ) E(\theta) E(θ)的值最小。
这样的问题称为最优化问题,或者叫目标规划。
我们可以把1.3节中最后一张表中的微笑次数 y y y,及当 θ 0 = 1 \theta_0=1 θ0=1 θ 1 = 2 \theta_1=2 θ1=2 时的 f θ ( x ) f_\theta(x) fθ(x)代入这个目标函数:
E ( θ ) = 1 2 ∑ i = 1 n ( y ( i ) − f θ ( x ( i ) ) ) 2 = 1 2 × ( ( 9 − 2491 ) 2 + ( 14 − 2649 ) 2 + ( 12 − 3687 ) 2 + ( 22 − 4685 ) 2 + ( 28 − 6379 ) 2 ) = 1 2 × ( 6160324 + 6943225 + 13505625 + 21743569 + 40335201 ) = 44343972 \begin{align*} E(\theta)&=\frac{1}{2}\sum_{i=1}^{n}(y^{(i)} -f_\theta(x^{(i)}))^2 \\ &= \frac{1}{2}\times((9-2491)^2+(14-2649)^2+(12-3687)^2+ (22-4685)^2 +(28-6379)^2) \\ &= \frac{1}{2}\times(6160324+6943225+13505625+21743569+40335201) \\ &= 44343972 \end{align*} E(θ)=21i=1n(y(i)fθ(x(i)))2=21×((92491)2+(142649)2+(123687)2+(224685)2+(286379)2)=21×(6160324+6943225+13505625+21743569+40335201)=44343972
这个误差确实有点大哈,而且这才只有5组数据,要是有5万组呢?
我们要做的就是不断修改参数 θ \theta θ,使这个值变得越来越小,这就是最小二乘法。

2.4 用python快速搞定最小二乘法

最小二乘法基本形式咱们搞明白了,但要求出目标函数最小时的 θ \theta θ,还有一定难度。
等不了了,先上个工具把结果直接求出来再说。
用python求解这个问题非常简单,只需要几行代码,简直可以说妈妈再也不用担心我的学习。
求解之前,先要下载两个库。

2.4.1 numpy

NumPy(Numerical Python)是一个用于科学计算的Python库,它提供了一种高效处理大型多维数组和矩阵的方式,是Python进行科学计算的一个基础包。
官方网站:http://www.numpy.org/
安装方法
①在Windows左下方的输入框中键入cmd,回车
在这里插入图片描述
②在弹出的黑窗口(命令提示符)中输入:
pip install numpy
即可完成安装

2.4.2 linear_model

linear_model可以快速实现最小二乘法线性回归。它是sklearn(即scikit-learn)库的一部分,提供了一系列用于拟合线性模型的方法和工具。
官方网站:https://scikit-learn.org/
安装方法:同上,只是输入:pip install scikit-learn

2.4.3 python代码

import numpy as np
from sklearn.linear_model import LinearRegression
# 输入数据集
days = np.array([1245, 1324, 1843, 2342, 3189]).reshape((-1, 1))
temperatures = np.array([9, 14, 12, 22, 28,])
# 创建并训练线性回归模型
model = LinearRegression()
model.fit(days, temperatures)
# 输出拟合结果
print("斜率:", model.coef_[0])
print("截距:", model.intercept_)

输出:

斜率: 0.009157584356140707
截距: -1.2107722506214103

把它们代进去,求出的函数为:
y = 0.009157584356140707 x − 1.2107722506214103 y=0.009157584356140707x-1.2107722506214103 y=0.009157584356140707x1.2107722506214103
按这个函数求出5组数据的微笑次数如下:

礼物金额 x x x实际微笑次数 y y y利用函数求出的微笑次数
1245910
13241411
18431216
23422220
31892828

怎么样,看着效果还不错吧。这只是5组数据,如果数据更多,它的拟合效果就越好。
咱们可以把数据都代入函数,算下此时目标函数的值:
E ( θ ) = 1 2 ∑ i = 1 n ( y ( i ) − f θ ( x ( i ) ) ) 2 = 1 2 × ( ( 9 − 10 ) 2 + ( 14 − 11 ) 2 + ( 12 − 16 ) 2 + ( 22 − 20 ) 2 + ( 28 − 28 ) 2 ) = 1 2 × ( 1 + 9 + 16 + 4 + 0 ) = 15 \begin{align*} E(\theta)&=\frac{1}{2}\sum_{i=1}^{n}(y^{(i)} -f_\theta(x^{(i)}))^2 \\ &= \frac{1}{2}\times((9-10)^2+(14-11)^2+(12-16)^2+ (22-20)^2 +(28-28)^2) \\ &= \frac{1}{2}\times(1+9+16+4+0) \\ &= 15 \end{align*} E(θ)=21i=1n(y(i)fθ(x(i)))2=21×((910)2+(1411)2+(1216)2+(2220)2+(2828)2)=21×(1+9+16+4+0)=15
是不是非常小了?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8730.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于低代码技术架构的思考

我们经常会看到很多低代码系统的技术架构图,而且经常看不懂。是因为技术架构图没有画好,还是因为技术不够先进,有时候往往都不是。 比如下图: 一个开发者,看到的视角往往都是技术层面,你给用户讲React18、M…

Python嵌套循环

# coding: utf-8 print("—————————— 嵌套循环 ——————————")while 表达式1:while 表达式2:语句块2for 循环变量1 in 遍历对象1:for 循环变量2 in 遍历对象2:语句块2 print("—————————…

【MySQL — 数据库增删改查操作】深入解析MySQL的 Retrieve 检索操作

Retrieve 检索 示例 1. 构造数据 创建表结构 create table exam1(id bigint, name varchar(20) comment同学姓名, Chinesedecimal(3,1) comment 语文成绩, Math decimal(3,1) comment 数学成绩, English decimal(3,1) comment 英语成绩 ); 插入测试数据 insert into ex…

【反悔堆】力扣1642. 可以到达的最远建筑

给你一个整数数组 heights ,表示建筑物的高度。另有一些砖块 bricks 和梯子 ladders 。 你从建筑物 0 开始旅程,不断向后面的建筑物移动,期间可能会用到砖块或梯子。 当从建筑物 i 移动到建筑物 i1(下标 从 0 开始 )…

搭建Spring Boot开发环境

JDK&#xff08;1.8及以上版本&#xff09; Apache Maven 3.6.0 修改settings.xml 设置本地仓库位置 <localRepository>D:/repository</localRepository> 设置远程仓库镜像 <mirror><id>alimaven</id><name>aliyun maven</name&…

算法-接雨水

hello 大家好&#xff01;今天开写一个新章节&#xff0c;每一天一道算法题。让我们一起来学习算法思维吧&#xff01; function trap(height) {// 获取柱子数组的长度const n height.length;// 如果柱子数量小于等于 2&#xff0c;无法形成凹槽接雨水&#xff0c;直接返回 0i…

实现B-树

一、概述 1.历史 B树&#xff08;B-Tree&#xff09;结构是一种高效存储和查询数据的方法&#xff0c;它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database S…

Fort Firewall:全方位守护网络安全

Fort Firewall是一款专为 Windows 操作系统设计的开源防火墙工具&#xff0c;旨在为用户提供全面的网络安全保护。它基于 Windows 过滤平台&#xff08;WFP&#xff09;&#xff0c;能够与系统无缝集成&#xff0c;确保高效的网络流量管理和安全防护。该软件支持实时监控网络流…

OpenCV:图像处理中的低通滤波

目录 简述 什么是低通滤波&#xff1f; 各种滤波器简介与实现 方盒滤波 均值滤波 中值滤波 高斯滤波 双边滤波 各种滤波的对比与应用场景 相关阅读 OpenCV基础&#xff1a;图像变换-CSDN博客 OpenCV&#xff1a;图像滤波、卷积与卷积核-CSDN博客 简述 低通滤波是一…

某公交管理系统简易逻辑漏洞+SQL注入挖掘

视频教程在我主页简介或专栏里 目录: 某公交管理系统挖掘 SQL注入漏洞 越权漏洞 某公交管理系统挖掘 SQL注入漏洞 前台通过给的账号密码,进去 按顺序依次点击1、2、3走一遍功能点&#xff0c;然后开启抓包点击4 当点击上图的4步骤按钮时&#xff0c;会抓到图下数据包&a…

【数据结构】_链表经典算法OJ:分割链表(力扣—中等)

目录 1. 题目描述及链接 2. 解题思路 2.1 思路1 2.2 思路2 2.3 思路3&#xff08;本题采取该解法&#xff09; 3. 题解程序 1. 题目描述及链接 题目链接&#xff1a;面试题 02.04. 分割链表 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个链表…

工业相机 SDK 二次开发-VC6.0 程序示例

本文主要介绍了使用工业相机SDK(Software Development Kit)开发C程序方法及过 程。在 SDK 开发包目录下&#xff0c;提供了 13 个 VC6.0 示例程序&#xff0c;其中 MFC 程序 5 个&#xff0c;分别为 BasicDemo、ReconnectDemo、SetIODemo、ForceIpDemo、MultipleCamera&#xf…

选择困难?直接生成pynput快捷键字符串

from pynput import keyboard# 文档&#xff1a;https://pynput.readthedocs.io/en/latest/keyboard.html#monitoring-the-keyboard # 博客(pynput相关源码)&#xff1a;https://blog.csdn.net/qq_39124701/article/details/145230331 # 虚拟键码(十六进制)&#xff1a;https:/…

初阶1 入门

本章重点 C的关键字命名空间C的输入输出缺省参数函数重载引用内联函数auto关键字基于范围的for循环指针的空值nullptr 1.C的关键字 c总共有63个关键字&#xff0c;其中包含c语言的32个 这些关键字不需要特意去记&#xff0c;在我们日后写代码的过程中会慢慢用到并记住。 2.…

以太网详解(六)OSI 七层模型

文章目录 OSI : Open System Interconnect&#xff08;Reference Model&#xff09;第七层&#xff1a;应用层&#xff08;Application&#xff09;第六层&#xff1a;表示层&#xff08;Presentation&#xff09;第五层&#xff1a;会话层&#xff08;Session&#xff09;第四…

【Python】 python实现我的世界(Minecraft)计算器(重制版)

【Python】 python实现我的世界(Minecraft)计算器 文章目录 【Python】 python实现我的世界(Minecraft)计算器1.引言与原理2.写代码之前的配置1.BuidTools.jar文件配置服务器2.raspberryjuice-1.12.1.jar用python控制服务器 3.第三方库mcpi的基本方法4.计算器构建的思路5.源码展…

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

uni-app 程序打包 Android apk、安卓夜神模拟器调试运行

1、打包思路 云端打包方案&#xff08;每天免费次数限制5&#xff0c;最简单&#xff0c;可以先打包尝试一下你的程序打包后是否能用&#xff09;&#xff1a; HBuilderX 发行App-Android云打包 选择Android、使用云端证书、快速安心打包本地打包&#xff1a; HBuilderX …

Hugging Face 推出最小体积多模态模型,浏览器运行成为现实!

1. SmolVLM 模型家族简介 1.1 什么是 SmolVLM-256M 和 SmolVLM-500M,它们为何如此重要? 在人工智能的多模态模型领域,如何在有限的计算资源下实现强大性能一直是一个重要的挑战。SmolVLM-256M 和 SmolVLM-500M 是最近推出的两款视觉语言模型,它们不仅突破了传统“大模型”…

速通Docker === Docker Compose

目录 Docker Compose 简介 Docker Compose 常用命令 使用 Docker Compose 启动 WordPress 普通启动方式&#xff08;使用 Docker 命令&#xff09; 使用 Docker Compose 启动 Docker Compose 的特性 Docker Compose 简介 Docker Compose 是一个用于定义和运行多容器 Dock…