腿足机器人之四- 卡尔曼滤波

腿足机器人之四卡尔曼滤波

    • 概率学基础
      • 贝叶斯准则
    • 卡尔曼滤波
      • 扩展卡尔曼滤波
      • 信息滤波器

在机器人(四足、人形)领域,感知和行动的不确定性可能由多种因素引起,如传感器噪声、外部环境的变化、非精确控制以及实时性算力限制等。

和人类类似,基于无机体的智能机器人需要四模块,认知推理模块、运动/行动模块、视觉和听觉模块,当前深度神经网络的发展已经使得机器在视觉(识别,理解)和听觉(语音识别、语音合成)一些方面已经超越人类平均水平(如识别的准确性),而多模态大语言模型的发展使得认知推理模块的发展也较为迅速,而运动/行动模块的发展相对滞后一些,当运动/行动模块发展好了之后,会应该模块之间的融合。

因此行动放在了这一系列博文的开端。

为了处理机器人感知和行动中不确定性,衍生出了如混合动力系统(Hybrid Systems)、概率机器人学(Probabilistic robotics)、深度学习(Deep Learning)、强化学习(Reinforcement Learning)等范式,每一种都提供了处理不确定性的独特方法,它们可以单独使用,也可以与其他方法结合起来,以优化四足和人形机器人在多变环境中的表现。

概率机器人学(Probabilistic robotics)的关键思想是使用概率论的微积分明确地表示不确定性,这和规划算法相比,需要的算力会高不少。
在这里插入图片描述
概率机器人专著

概率学基础

对于概率密度、高斯分布、混合高斯分布不清楚的,可以网上搜索关键词或者查找概率论相关的著作,这里展示概率论中两个比较核心的点,贝叶斯准则和熵。

贝叶斯准则

贝叶斯准则(Bayes’ Theorem),也称为贝叶斯法则或贝叶斯更新,是概率论中的一个核心概念,用于计算条件概率。也就是说,它描述了在已知某些信息的情况下如何更新事件发生的概率。贝叶斯准则是基于先前的知识或信念对未知概率的一种修正方式。

贝叶斯准则可以表示为:

P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) ​ P(A∣B)= \frac{P(B∣A)P(A)}{P(B)}​ P(AB)=P(B)P(BA)P(A)

其中:

P ( A ∣ B ) P(A | B) P(AB)是在事件 (B) 发生的条件下事件 (A) 发生的概率,称为后验概率。

P ( B ∣ A ) P(B | A) P(BA)是在事件 (A) 发生的条件下事件 (B) 发生的概率。

P ( A ) P(A) P(A) P ( B ) P(B) P(B)分别是 (A) 和 (B) 发生的边缘概率。

概率的理解和计算
边缘概率 P ( A ) P(A) P(A) P ( B ) P(B) P(B): 这是不考虑其他因素影响下单独某事件发生的概率。

条件概率 P ( B ∣ A ) P(B | A) P(BA): 表示在已知事件 (A) 发生的情况下,事件 (B) 发生的概率。

后验概率 P ( A ∣ B ) P(A | B) P(AB): 表示在已知事件 (B) 发生的情况下,事件 (A) 发生的概率。这是贝叶斯准则计算的主要目标,也是基于新证据对原有信念进行更新的过程。

概率密度用小写字母表示,如 p p p,概率用大写字母,如 P P P,这是因为概率是通过概率密度积分(连续情况,如观察火箭深空时尾焰温度)或者求和(离散情况,如抛硬币)。

还是以一个机器人行动的例子说明贝叶斯准则是如何使用的。

场景设定
假设一个机器人在一个已知环境中导航,但机器人的确切位置有不确定性。机器人可以通过传感器读取周围环境(如墙壁的距离)并移动,但这些传感器和移动的命令执行都有误差。

问题定义
机器人的任务是根据传感器读取和之前的移动历史估计自己的当前位置。这里的关键是如何根据新的传感器数据更新机器人对当前位置的估计。

几个贝叶斯准则涉及的概率
先验概率 P ( x ) P(x) P(x): 在获取新的传感器数据之前,机器人对自己可能位置的估计。这称为“先验概率”,基于以往的位置信息和移动命令。

似然概率 P ( z ∣ x ) P(z \mid x) P(zx) 在已知机器人位于特定位置 x x x 的情况下,得到当前传感器读数 z z z的概率。这反映了传感器的特性,如传感器误差等。

证据 P ( z ) P(z) P(z): 这通常是用全概率定理计算的,表示在所有可能位置下得到当前传感器读数 z z z的概率。

后验概率 P ( x ∣ z ) P(x \mid z) P(xz): 给定新的传感器读数 z z z 后,机器人位置为 x x x 的概率。这是我们希望计算的结果——在新证据的基础上更新的位置估计。

显然后验概率要比先验概率得到的位置更准,因为其使用了传感器的数据进行了“校准”,

通过贝叶斯准则,我们可以结合先验概率和新的传感器信息来得到后验概率:
P ( x ∣ z ) = P ( z ∣ x ) P ( x ) P ( z ) P(x|z)=\frac{P(z|x)P(x)}{P(z)} P(xz)=P(z)P(zx)P(x)
这里, P ( x ∣ z ) P(x \mid z) P(xz)告诉我们在观察到新数据后,各个位置的可能性。

在实践中,该过程会不断重复,每次机器人获取新的传感器信息或移动时,都会使用贝叶斯准则来更新位置的估计。这个过程使得机器人能够综合所有可用信息,并不断改进自身对于当前位置的估计。

另外 P ( z ) P(z) P(z)是不需要求的,因为上面不断重复的过程中,分母都是 P ( z ) P(z) P(z),其类似一个归一化因子的作用。

另外需要注意的是,机器人一般都是多传感器的,这里增加传感器 y y y,这样就涉及到两个传感器,其联合概率密度的贝叶斯公式,如下:
P ( x ∣ z , y ) = P ( y ∣ x , z ) P ( x ∣ z ) P ( y ∣ z ) P(x|z,y) = \frac{P(y|x,z)P(x|z)}{P(y|z)} P(xz,y)=P(yz)P(yx,z)P(xz)

熵(Entropy)是信息论中的一个核心概念,用以量化随机变量的不确定性或者信息的随机性。对于离散随机变量,熵被定义为其概率分布的期望信息量,这可以被理解为如果你知道随机变量的实际取值,你将会获得多少信息。

熵的数学表达
对于一个离散随机变量,其熵 H ( P ) H(P) H(P) 可以通过下面的表达式给出:
H ( P ) = − ∑ x p ( x ) log ⁡ 2 p ( x ) H(P)=− \sum \limits_x p(x)\log_{2}p(x) H(P)=xp(x)log2p(x)

其中:

  • p ( x ) p(x) p(x) 是随机变量取特定值 x x x 的概率。
  • log ⁡ 2 p ( x ) \log_2 p(x) log2p(x)是以 2 为底 p ( x ) p(x) p(x)的对数。

信息量通常定义为 − log ⁡ 2 p ( x ) -\log_2 p(x) log2p(x),这表示如果事件 x x x 发生,你将获得的信息量。这里的对数以 2 为底,因而结果的单位是比特(bits),即在二进制表述中表示信息的单位。前面加负号是因为 p ( x ) p(x) p(x) 是一个概率值,所以它位于 0 和 1 之间。对这种概率值取对数将会得到一个负值(因为对小于 1 的正数取对数结果为负),为了使信息量为正,我们在前面加上一个负号。

熵实际上是信息量 − log ⁡ 2 p ( x ) -\log_2 p(x) log2p(x)的期望值,即当随机变量随机地取各种可能值时,平均每次观测到的信息量。这个期望通过所有可能的 x x x 值的 p ( x ) log ⁡ 2 p ( x ) p(x) \log_2 p(x) p(x)log2p(x) 的加权总和(权重即为概率 p ( x ) p(x) p(x))来计算。

熵度量了随机变量的不确定性。一个熵值高的随机变量其结果不可预料性更强,因而不确定性更高。反之,熵值低表示随机变量的结果可预料性更强,不确定性更低。

如果对于机器人行动状态求熵,如果其熵值等于0,那么意味着在某事件上的概率 ( p(x) = 1 )(即总是发生同一个结果),也即机器人永远只有一个状态。

在深度学习领域还有一个交叉熵,这个容易混淆,也做一个简单的介绍。

在深度学习中,交叉熵(Cross-Entropy)是一种常用的损失函数(Loss Function),用于评估模型的预测概率分布与真实标签的概率分布之间的差异。特别是在分类任务中,交叉熵损失非常流行,因为它可以有效地衡量预测结果的准确性。

交叉熵的定义
对于两个概率分布 ( p ) 和 ( q ),交叉熵定义为:
H ( p , q ) = − ∑ x p ( x ) log ⁡ q ( x ) H(p,q)=-\sum \limits_x p(x)\log q(x) H(p,q)=xp(x)logq(x)
其中:

  • p ( x ) p(x) p(x) 是真实分布的概率,通常表示为标签的分布。
  • q ( x ) q(x) q(x) 是模型预测的概率分布。

交叉熵提供了一个衡量两个概率分布之间差异的方法。在理想情况下,如果模型的预测 q ( x ) q(x) q(x)完全准确,那么它应该等于真实分布 p ( x ) p(x) p(x),这时交叉熵会达到最低值(理论上为0,当 q ( x ) = p ( x ) q(x) = p(x) q(x)=p(x) 时)。当预测值与实际值偏离越大,交叉熵值就越高。

卡尔曼滤波

状态转移和观测模型都是线性的,对于高斯状态的状态转移和测量的卡尔曼滤波算法如下:
在这里插入图片描述
一个高斯分布的概率密度可以由其均值和方差确定,这里 u t u_t ut表示的是控制器/驱动器均值向量(比如仰角、步速等), ∑ t − 1 \sum_{t-1} t1表示的是控制器协方差矩阵,之所以使用均值向量和协方差矩阵是因为机器人具有多个自由度。

z t z_t zt是传感器测量值,实际是一个向量,比如可以由多个距离、扭力、测力计等等构成。

首先我们可以根据驱动器信息 u t u_t ut和机器人的前一时刻状态 x t − 1 x_{t-1} xt1(位置、或者姿势)来估算当前的时刻的姿势 x t x_{t} xt,然后再根据传感器的观测值 z t z_t zt来修正机器人在各个状态下概率值,最后以概率最高的状态作为机器人的状态。

第2行和3行就是获得当前状态的 x ‾ t \overline x_t xt(先验分布)的均值 μ ‾ t \overline \mu_t μt和方差 ∑ ‾ t \overline \sum_t t信息(这是因为高斯分布可以由均值向量和协方差矩阵确定)。

第4行 K t K_t Kt是卡尔曼增益,该增益用于对不同的观测值加不同的权重,也即不同的传感器观测值对于最终的状态 x t x_t xt影响是不同的。

第5和6行是使用当前观测向量 z t z_t zt修正当前的状态 x t x_t xt(是由均值向量 μ t \mu_t μt和协方差矩阵 ∑ t \sum_t t唯一表示,修正之后是后验分布,所以没有上划线了)。

卡尔曼滤波器是一种有效的线性估计工具,用于处理线性动态系统中的噪声测量数据,然而实际的机器人应用中可能不成立。例如,机器人在执行任务时可能会执行复杂的非线性运动(如圆周运动),这种情况下,其状态变化不能简单地用线性方程描述。此外,机器人的实际运动可能受多种因素影响,导致其状态分布是多峰的或非高斯的,这超出了普通卡尔曼滤波器的处理范围。

因此,对于复杂或高度非线性的机器人系统,更先进的滤波技术(如扩展卡尔曼滤波器(EKF)、无迹卡尔曼滤波器(UKF)或粒子滤波器)更加适合,因为这些方法能够更好地处理非线性问题和非高斯噪声。

扩展卡尔曼滤波

扩展卡尔曼滤波extended Kalman filter (EKF)将下一个状态的概率和观测概率使用非线性函数表示:
x t = g ( u t , x t − 1 ) + ϵ t x_t = g(u_t, x_{t-1})+\epsilon_t xt=g(ut,xt1)+ϵt
z t = h ( x t ) + δ t z_t = h(x_t)+\delta_t zt=h(xt)+δt
其中 g g g h h h是非线性函数, x t x_t xt可以表示机器人的状态(空间中三维坐标叠加俯仰角姿势,即位置+姿势信息), U − t t U-tt Utt是控制信息(比如各个驱动器,马达或者液压的驱动量), z t z_t zt是观测量(距离传感器、压力传感器,刚性力测量等),另外两个是扰动或者观测噪声。

当一个高斯分布通过这样的非线性函数处理时,输出通常不再是高斯分布,非线性函数 g g g将替换上面的 A t A_t At B t B_t Bt,而 h h h会取代 C t C_t Ct,这就导致状态的概率分布将不再是高斯分布,因而状态的概率分布精确解也无法求得。

EKF通过计算真实状态的概率分布的近似值来处理这一问题。它仍然使用高斯分布来表示这个近似的状态的概率分布,其中,任一时刻 (t) 的状态的概率分布 x t x_t xt由均值 μ t \mu_t μt和协方差 Σ t \Sigma_t Σt描述。具体方法是将非线性函数线性化。

线性化常用的技术包括泰勒展开(Taylor expansion)。泰勒展开是一种数学方法,用于在已知函数在某点的值及其导数的情况下,构建该函数在该点的线性近似。

对于EKF线性化做法是在高斯的均值处将函数 g g g近似为一条切线的方法,通过计算非线性函数 g g g 在高斯均值处的一阶导数(偏导数),可以构建一个与 g g g在该点切线相同的线性函数,通过这个线性近似函数而非原始的非线性函数来传播高斯分布,可以使后验分布仍然保持高斯形态。

对于感测非线性函数 h h h可以做类似的线性化,这意味着,尽管处理的是非线性系统,EKF通过近似线性化使得处理过程类似于线性系统的处理。由于线性化仅是近似方法,EKF可能在高度非线性的情况下表现不佳,特别是当系统偏离线性化点很远时,这是可能需要更高级的滤波技术,如无迹卡尔曼滤波器(UKF)或粒子滤波器。

EKF是一种计算效率非常高的状态估计工具。每次更新所需的时间复杂度为 ( O ( k 2.8 + n ) ) (O(k^{2.8} + n)) (O(k2.8+n)),其中 (k) 是测量向量 (z) 的维度,(n) 是状态向量 (x) 的维度。与可能需要指数级时间的其他算法(例如粒子滤波器)相比,EKF的效率优势尤为明显。

EKF保持了原始卡尔曼滤波器的简单性,使用多变量高斯分布来表示信念(即状态的概率分布)。因为高斯分布是单峰的,所以通常可以理解为对状态的单一估计,并附带一个不确定性椭圆来描述估计的可靠性。

EKF通常只能提供对状态的单一估计,无法处理多模态(multimodal)的情况,即可能存在多个不同的合理假设。例如,一个机器人可能在空间中有两个完全不同的位置假设,而这两个位置的算术平均值并不是一个可能的位置。

为了解决EKF在表示多模态信念方面的不足,一种常见的扩展是使用高斯混合模型(Gaussian Mixtures)来表示后验信念。一个高斯混合可以形式化为多个高斯分布的和,这允许表示和处理多个独立假设。

信息滤波器

信息滤波器和卡尔曼滤波器都是用来估计系统状态(比如机器人的位置,机器人的姿态等)的概率滤波器,且都假设信念(belief,即状态概率分布)是高斯分布的。

在KF及其非线性版本EKF中,状态更新和预测相对直观和计算效率高,但如果要计算协方差的逆等操作则相对复杂。

信息滤波器(IF, information filter)使用高斯分布的典范表示(canonical representation),这包括信息矩阵(information matrix) Ω = Σ − 1 \Omega = \Sigma^{-1} Ω=Σ1和信息向量(information vector) ξ = Σ − 1 μ \xi = \Sigma^{-1} \mu ξ=Σ1μ。信息矩阵是协方差矩阵的逆,信息向量是协方差矩阵的逆乘以均值向量。更新信息矩阵和信息向量(这涉及到矩阵的逆和乘法)可能更为直观和容易,尤其是在信息矩阵已知的情况下。但转换回常规的均值和协方差表示则相对复杂。

对于一个多元高斯分布,其概率密度函数如下:
p ( x ) = det ⁡ ( 2 π Σ ) − 1 / 2 e − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) p(x)=\det (2\pi \Sigma)^{-1/2} e^{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)} p(x)=det(2πΣ)1/2e21(xμ)TΣ1(xμ)

使用信息矩阵和信息向量替换之后,其概率密度可以表示为:
p ( x ) = η e − 1 2 x T Ω x + x T ξ p(x)=\eta e^{-\frac{1}{2}x^T\Omega x+x^T\xi} p(x)=ηe21xTΩx+xTξ

在这里插入图片描述
在信息滤波器中,状态的全局不确定性的表示非常简单,只需将信息矩阵(Ω)设为0。而在卡尔曼滤波器中,这需要协方差矩阵有无限大的值。
信息滤波器天然适合处理多机器人集成的问题,尤其是需要集成多个机器人收集的分散感测数据的场景。信息滤波器通过简单地对信息进行加和来实现集成,这一过程是可交换的,可以在任意顺序、任意延迟及完全分散的方式下进行。但在高维状态空间的情况下,一般认为其计算效率低于卡尔曼滤波器。这也是为什么扩展卡尔曼滤波器(EKF)比扩展信息滤波器(EIF)更为流行的原因之一。

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

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

相关文章

基于AWS云平台的法律AI应用系统开发方案

该方案可实现法律文档处理速度提升300%,关键信息提取准确率可达92%以上(基于实际测试数据),适合构建企业级法律智能中台。建议采用分阶段实施策略,优先实现文档解析和智能问答模块。 一、技术栈规划 层级技术组件说明…

使用 GPT-SoVITS 克隆声音,很详细

使用 GPT-SoVITS 克隆声音,很详细 一、前言二、下载三、启动四、克隆声音1、准备克隆音频2、分离人声伴奏3、音频分割4、语音降噪5、ASR工具6、语音文本校对标注工具7、训练模型8、微调训练9、推理 一、前言 最近对文本转语言很感兴趣,但对直接在网站上…

基于Python的Flask微博话题舆情分析可视化系统

2024数据 ✅️标价源码 远程部署加 20 ✅️爬虫可用 有六月数据 ✅️修复bug不会突然打不开网页 系统稳定 系统的功能如下: 1.数据的爬取 2.用户的登录注册 3.热词统计,舆情统计 4.文章统计分析 5.发布地址统计 6.评论统计 7.情感分类统计 编程语言:py…

Pygame中自定义事件处理的方法2-2

在《Pygame中自定义事件处理的方法2-1》中提到了处理自定义事件的方法。通过处理自定义事件,可以实现动画等效果。 1 弹跳小球程序 通过处理自定义事件,可以实现弹跳小球程序,如图1所示。 图1 弹跳小球程序 2 弹跳小球程序原理 实现弹跳小…

【Flink快速入门-5.流处理之多流转换算子】

流处理之多流转换算子 实验介绍 前面实验中介绍的算子已经能够满足我们的大部分开发需求了,但是在实际工作中有时候还会遇到一些业务场景,例如需要摄入多个输入流并将其合并处理,或者需要将一条输入流分割为多条子流,在不同的子…

【STM32】DRV8833驱动电机

1.电机如何转动 只需要给电机两个端子加一正一负的极性就会转起来了,但是要注意的是不要将电机两端直接接在5v和gnd之间,这种电机一般要提供几百毫安的电流,而GPIO口只能提供几毫安,所以我们使用一个DRV8833来驱动 DRV8833输入口…

vue2老版本 npm install 安装失败_安装卡主

vue2老版本 npm install 安装失败_安装卡主 特别说明:vue2老版本安装慢、运行慢,建议升级vue3element plus vite 解决方案1: 第一步、修改npm 镜像为国内镜像 使用淘宝镜像: npm config set registry https://registry.npmmir…

Linux相关概念和易错知识点(27)(认识线程、页表与进程地址空间、线程资源划分)

目录 1.认识线程 (1)进程与线程的关系 (2)最小执行流 (3)轻量级进程(LWP) ①对task_struct的理解 ②轻量级进程 ③LWP和TCB的区别 2.页表与进程地址空间 (1&…

GitHub基本操作及Git简单命令

GitHub简介 GitHub就是一个远程仓库,远程仓库可以理解为就是一个可以保存自己代码的地方,在实际开发当中一个项目往往是有多个人来共同协作开发完成的,那么就需要一个统一代码保存的地方,而GitHub就是起到一个共享和汇总代码的作…

数据结构(陈越,何钦铭)第三讲 树(上)

3.1 树与数的表示 3.1.1 顺序查找 int SequentialSearch(List Tbl,ElementType K){int i;Tbl->Element[0]K;for(iTbl->Length;Tbl->Element[i]!K;i--);return i; } typedef struct LNode *List; struct LNode{ElementType Element[MAXSIZE];int Length; };3.1.2 二分…

【PYTORCH】官方的turoria实现中英文翻译

参考 https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html 背景 pytorch官方的是seq2seq是法语到英文,做了一个中文到英文的。 数据集 下载后解压,使用的data\testsets\devset\UNv1.0.devset.zh和UNv1.0.devset.en&#x…

仿叮咚买菜鸿蒙原生APP

# DingdongShopping 这是一个原生鸿蒙版的仿叮咚买菜APP项目 鸿蒙Next发布至今已经有一年多的时间了,但有时候我们想要实现一些复杂的功能或者效果,在开发文档上查阅一些资料还是比较费时的,有可能还找不到我们想要的内容。而社会层面上分享…

VSCode 接入DeepSeek V3大模型,附使用说明

VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…

中上211硕对嵌入式AI感兴趣,如何有效规划学习路径?

今天给大家分享的是一位粉丝的提问,中上211硕对嵌入式AI感兴趣,如何有效规划学习路径? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问: 中上211,…

Linux 目录结构与基础命令学习记录

在 Linux 的学习旅程中,熟练掌握基础命令是开启高效操作与系统管理的钥匙。这些命令不仅能帮助我们在 Linux 系统中自由穿梭,还能深入了解系统的运行状态。以下是我对 Linux 基础命令的学习总结,希望能为大家的 Linux 学习提供帮助。 一、Lin…

python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注

【1】引言 前序学习进程中,已经使用cv2.findContours()函数cv2.drawContours()函数实现图像轮廓识别和标注,这种标注沿着图像的轮廓进行,比较细致。相关文章链接为: python学opencv|读取图像(六十四)使用…

Visionpro 齿轮测量

效果展示 一、题目要求 求出最大值,最小值,平均值 二、分析 1.首先要进行模板匹配 2.划清匹配范围 3.匹配小三角的模板匹配 4.卡尺 5.用找圆工具 工具 1.CogPMAlignTool 2.CogCaliperTool 3.CogFindCircleTool 4.CogFixtureTool 三、模板匹…

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析②】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase02 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-002测试用例 用例ID测试场景验证要点参考条款预期…

AlmaLinux使用Ansible自动部署k8s集群

一、环境准备 节点规划(最低要求) 1台Master节点(4核/8GB内存)2台Worker节点(2核/4GB内存)1台Ansible控制机(可复用Master节点) 系统配置 # 所有节点执行 sudo hostnamectl set-hos…

机器学习:十大算法实现汇总

机器学习十大算法代码实现:使用numpy、pandas,不调用机器学习相关库。 已将代码和相关文档上传到了github:golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com) 一元线性回归:机器学习&…