【机器学习】数值分析01——绪论及误差分析

数值分析——绪论及误差分析

全文目录

(博客园)机器学习

(Github)MachineLearning Math

数值分析的作用及其学习工具使用

数值分析方法是在解决科学研究和实践中遇到的各种奇怪复杂问题时,构建一种简单的数学物理模型来进行研究,最终得到我们需要的解。例如对于一个无法求得原函数的积分,我们可以用足够多的曲边梯形面积和进行求解。或者对于一个高次方程,我们也无法直接求得它的零点,那么这个时候,我们建立对应的数值分析模型时非常有必要的。

数值分析常用工具

对于本系列课程,建议读者对包括但不限于以下三种语言有一定的了解:C#、Matlab、Python ,本系列文章将用以下三种语言对其中涉及的算法进行Coding和解析。同时推荐安装以下库及应用程序:

应用程序:

  • Visual Studio Code:当今最强大的支持拓展的编辑器,适合各种语言的开发工作。强力建议安装。
  • Visual Studio 2022:宇宙第一IDE,微软出品的最强开发套件,配合C#如虎添翼事半功倍,建议使用C#的同学们安装
  • Pycharm:JB公司出品的Python IDE,适合于大型Python项目开发使用。如果只是写写小算法小程序,此软件过于庞大,吃性能。
  • Matlab:科学计算、建模第一开发工具,其中各种库可以有效的支撑你的需求,非常强大的一款工具软件,但是软件收费且非专业人员许多功能用不上
  • Octave:你可以理解为一个开源免费的Matlab,没有了商业用途的各种工具库,只留下了最基础的一些科学计算和Matlab语言,在科学计算方面非常不错,吴恩达在机器学习教程中也使用这款工具,推荐使用。
  • GeoGebra全家桶:科学计算、2、3D绘图最好用的工具之一。

库及SDK:

  • .NET 6(C#):微软最新的开发框架,性能速度以及语法已经达到了前几名的位置,单论语言执行速度效率已经在前几名,支持U3d,web、ML等各种开发。单独拎出来是因为微软旗下库版本众多,这里推荐最新的.NET6
  • MathNet.Numerics:C#.NET上最强大的科学计算工具,在nuget中可以进行下载。
  • NPlot:C#.NET上一个优秀的绘图工具库
  • Numpy:python上一个优秀的科学计算库
  • Matplotlib:python上用于函数、数据等绘图的工具库。

数值分析的具体实例(多项式简化求值)

对于一个复杂多项式的计算,我们往往需要花费巨大的人力逐次计算,比如求:

f ( x ) = 3 x 4 − 2 x 3 + 4 x 2 + 5 x − 1 , 求 f ( 1 2 ) f(x)=3x^4-2x^3+4x^2+5x-1,求f(\frac{1}{2}) f(x)=3x42x3+4x2+5x1f(21)

最最直接的方法就是进行计算

3 × 1 2 × 1 2 × 1 2 × 1 2 − 2 × 1 2 × 1 2 × 1 2 + 4 × 1 2 × 1 2 + 5 × 1 2 − 1 3\times\frac{1}{2}\times\frac{1}{2}\times\frac{1}{2}\times\frac{1}{2}-2\times\frac{1}{2}\times\frac{1}{2}\times\frac{1}{2}+4\times\frac{1}{2}\times\frac{1}{2}+5\times\frac{1}{2}-1 3×21×21×21×212×21×21×21+4×21×21+5×211

我们计算了10次的乘法,同时还计算了四次加减法运算,这实在是太复杂了,那么我们试着去优化一下,倘若我将 a = 1 2 × 1 2 a=\frac{1}{2}\times\frac{1}{2} a=21×21记录一下,那么式子就可以变成

3 × a × a − 2 × a × 1 2 + 4 × a + 5 × 1 2 − 1 3\times a\times a-2\times a\times\frac{1}{2}+4\times a+5\times\frac{1}{2}-1 3×a×a2×a×21+4×a+5×211

这样,我们包含计算a在内大概需要计算7次乘法,四次加减法运算。很明显我们减少了不少的计算步骤,那么继续试试是否又其他的做法?

f ( x ) = 3 x 4 − 2 x 3 + 4 x 2 + 5 x − 1 = x ( 5 + 4 x − 2 x 2 + 3 x 3 ) − 1 = x ( 5 + x ( 4 − 2 x + 3 x 2 ) ) − 1 = x ( 5 + x ( 4 + x ( 3 x − 2 ) ) ) − 1 f(x)=3x^4-2x^3+4x^2+5x-1\\ =x(5+4x-2x^2+3x^3)-1\\ =x(5+x(4-2x+3x^2))-1\\ =x(5+x(4+x(3x-2)))-1 f(x)=3x42x3+4x2+5x1=x(5+4x2x2+3x3)1=x(5+x(42x+3x2))1=x(5+x(4+x(3x2)))1

通过这个变换(称为霍纳方法、嵌套乘法),我们只需要进行4次乘法和4次加法,计算的时候从内往外计算。一般而言,任意一个n次多项式都可以通过n次乘法和n次加法求得。

这个例子展示了科学计算的主题特征,简单计算的速度总是比复杂的计算快得多,同一个问题当我们采取不同的方法时可能可以有效的提升我们的效率和速度。这也是为什么数值分析(计算方法)显得尤为重要的原因。

计算机数值误差产生机理

计算机的数值存储方式

这里我们直接对计算机数值存储方式进行讲解而不作过多的展开。详细的内容可以参考我《.NET Guide》—— 基本数据类型及其存储方式 #5.2

计算机误差产生原因

数值分析是一门建立在计算机计算的基础上的学科,我们需要详细解释一下在计算机中,是什么导致了误差的出现。首先抛出一个问题,为什么计算机会存在精度问题?或者换句话说,任何非0、5结尾的小数在计算机中都不是一个精确值?

上述问题是一个非常有建设意义的问题,我们知道计算机时使用二进制进行数据的运算和存储的,那么根据二进制的计算法则,浮点数的二进制表示应当是 ∑ i ∗ 2 − n , i ∈ { 0 , 1 } , n ∈ N + \sum i*2^{-n},i \in \{0,1 \},n \in N^+ i2n,i{ 0,1},nN+,根据这个式子不难看出对于二进制而言,并不能用有限的位数表示所有的浮点数。举个浅显的例子,例如十进制数 ( 1 3 ) 10 = 0. 3 ˙ (\frac{1}{3})_{10}=0.\dot{3} (31)10=0.3˙,无论我们怎么写都无法用有限的十进制位数写出准确的数值,只能通过近似的值进行描述,当我们采用三进制数,我们就能用有限小数 ( 0.1 ) 3 (0.1)_3 (0.1)3 进行描述。

因此对于二进制存储信息的计算机来说,数据的存储位数总是有限度的,我们不可能准确的表述每一个浮点数,于是,对于那些无法表示的数值,我们只能采取近似的手段进行拟合,误差就出现了。

误差

误差限与精度

首先我们给出这样一个定义,设 x ∗ x^* x是某量的一个精确值,而 x x x 是此量的近似值,那么我们将 e = ∣ x ∗ − x ∣ e = |x^*-x| e=xx 定义为值的 绝对误差,也就是误差

不过在工程实践中,我们往往是不知道实际值 x ∗ x^* x的,同时误差e也并不是已知量,我们只能设法在计算过程中采取某些手段,对误差进行一个估计。这个估计是一个区间范围,那么给出下面条件

∃ ϵ > 0 , ∣ e ∣ = ∣ x ∗ − x ∣ ≤ ϵ \exist \epsilon>0,\\ |e| = |x^*-x|\leq\epsilon ϵ>0,e=xxϵ

若上式成立,我们则给出了 x − ϵ ≤ x ∗ ≤ x + ϵ , x ∈ [ x − ϵ , x + ϵ ] x-\epsilon\leq x^*\leq x+\epsilon,x\in[x-\epsilon,x+\epsilon] xϵxx+ϵ,x[xϵ,x+ϵ],于是我们称 ϵ \epsilon ϵ为绝对误差限,又称为精度。它描绘了我们近似值与绝对值的相似程度,给出了误差的最大值。

通常,在同一范围或数量级内,误差限越小,也就是我们的数据越精确。当逾越这条线的时候,绝对误差限就显得心有余而力不足了。例如数字的近似值是9999,精确值是10000,它的误差限是1;若近似值是9,精确值是10,误差限也是1,很明显前者的拟合效果要好于后者。我们称前者是99.99%的吻合度,而后者的吻合度是90%。

上述式子很明显是因为比较的数量级不同而导致的,为了更好的描述,我们采用相对误差及相对误差限进行描述。相对误差定义为 e r = e x ∗ = 1 − x x ∗ e_r=\frac{e}{x^*}=1-\frac{x}{x^*} er=xe=1xx,根据量纲的计算法则,很明显相对误差区别于绝对误差的地方就在于相对误差是一个无量纲常量,通常也采用百分比作为表示。

与绝对误差一样,我们通常无法直接得出 e r e_r er的值,精确值往往也是未知的,同样的,我们使用相对误差限去给出一个区间估计。

∣ e r ∣ = ∣ e x ∗ ∣ ≤ ϵ r |e_r| = |\frac{e}{x^*}|\leq \epsilon_r er=xeϵr

这里我们可以给出任意数值的误差估计方法,如下式所示:

设有精确值 x 1 ∗ x^*_1 x1,估计值 x 1 x_1 x1,构造函数 y = f ( x ) , f ( x 1 ) y=f(x),f(x_1) y=f(x),f(x1) x 1 ∗ x^*_1 x1处Taylor展开得:

f ( x 1 ) = f ( x 1 ∗ ) + ( d f d x 1 ) ∗ ( x 1 − x 1 ∗ ) + 1 2 ! ( d 2 f d 2 x 1 ) ∗ ( x 1 − x 1 ∗ ) 2 + 1 3 ! ( d 3 f d 3 x 1 ) ∗ ( x 1 − x 1 ∗ ) 3 + ⋯ f(x_1) = f(x^*_1)+(\frac{df}{dx_1})^*(x_1-x^*_1)+\frac{1}{2!}(\frac{d^2f}{d^2x_1})^*(x_1-x^*_1)^2+\frac{1}{3!}(\frac{d^3f}{d^3x_1})^*(x_1-x^*_1)^3+\dotsb f(x1)=f(x1)+(dx1df)(x1x1)+2!1(d2x1d2f)(x1x1)2+3!1(d3x1d3f)(x1x1)3+

同时我们知道估计值和精确值的差即为误差 e ( x 1 ) e(x_1) e(x1),且为无穷小量,那么上述式子化为

f ( x 1 ) = f ( x 1 ∗ ) + e ( x 1 ) ( d f d x 1 ) ∗ + ⋯ 故 e ( f ( x ) ) = f ( x ) − f ( x ∗ ) = f ( x 1 ) − f ( x 1 ∗ ) ≈ e ( x 1 ) ( d f d x 1 ) ∗ f(x_1)=f(x^*_1)+e(x_1)(\frac{df}{dx_1})^*+\dotsb\\ 故e(f(x))=f(x)-f(x^*)=f(x_1)-f(x^*_1)\approx e(x_1)(\frac{df}{dx_1})^* f(x1)=f(x1)+e(x1)(dx1df)+e(f(x))=f(x)f(x)=f(x1)f(x1)e(x1)(dx1df)

因此我们得出了误差的一个分析式, ( d f d x 1 ) ∗ (\frac{df}{dx_1})^* (dx1df)则称为绝对误差增长因子,表示误差经过运算 f f f后变化的速率或倍数。

同时给出相对误差估计推导:

e ( f ( x ) ) r = e ( f ( x ) ) f ( x 1 ∗ ) = ( d f d x 1 ) ∗ ⋅ e ( x 1 ) f ( x 1 ∗ ) = x 1 ∗ f ( x 1 ∗ ) ( d f d x 1 ) ∗ ⋅ e r ( x 1 ) e(f(x))_r=\frac{e(f(x))}{f(x^*_1)}=(\frac{df}{dx_1})^* \cdot \frac{e(x_1)}{f(x_1^*)}\\ =\frac{x_1^*}{f(x_1^*)}(\frac{df}{dx_1})^*\cdot e_r(x_1) e(f(x))r=f(x1)e(f(x))=(dx1df)f(x1)e(x1)=f(x1)x1(dx1df)er(x1)

同样的, x 1 ∗ f ( x 1 ∗ ) ( d f d x 1 ) ∗ \frac{x_1^*}{f(x_1^*)}(\frac{df}{dx_1})^* f(x1)x1(dx1df)则称为相对误差增长因子,表示误差经过运算 f f f后变化的速率或倍数。

更一般的,给出任意函数的误差分析式:

绝 对 误 差 : e ( f ) ≈ ∑ i = 1 n [ ( ∂ f ∂ x i ) ⋅ e ( x i ) ] 相 对 误 差 : e r ( f ) ≈ ∑ i = 1 n [ ( x i ∗ f ( ⋯   ) ⋅ ∂ f ∂ x i ) ⋅ e r ( x i ) ] 绝对误差:e(f)\approx\sum_{i=1}^n \left [\left( \frac{\partial f}{\partial x_i}\right)\cdot e(x_i)\right]\\ 相对误差:e_r(f)\approx\sum_{i=1}^n \left [\left( \frac{x_i^*}{f(\dotsb)}\cdot\frac{\partial f}{\partial x_i}\right)\cdot e_r(x_i)\right] e(f)i=1n[(xif)e(xi)]er(f)i=1n[(f()xixif)er(xi)]

模型误差

模型误差往往是建模过程中,忽略了那些影响细微的次要因素,最终在要求精度的情况下,出现了模型的误差。例如我们初高中学过的公式 G = m g G=mg G=mg,我们往往会有一句g取9.8N/kg,数学模型描述就为 G = 9.8 m G=9.8m G=9.8m,这里的g就是一个近似值,而我们知道重力加速度在不同的地方是会受到高度、海拔、地壳密度分布等等因素影响的,由于我们的重力加速度取了近似值,因此这个模型也是一个近似模型,而这里必然会产生误差,由于近似模型导致的误差我们就称为模型误差。

观测误差

观测误差往往是因为数据的来源受到主观因素的影响,假设我有一个绝对精准的弹簧式重力计,我们用它去测量物体重量的时候必须通过肉眼去读取仪器上的刻度数字,在这里我们因读数不准产生的误差就是观测误差。或者同上面的质量和重量的方程中,假设我们知道了G,通过计算得出了质量m,它与实际质量的差值就是观测误差。

截断误差

截断误差在计算机和生活中是一个常见误差。我们在进行大笔金钱交易的时候往往会讨价还价,最常见的还价就是“抹零头”,284元的饭钱讲价成280元,这就是一种截断。计算机因数据溢出而直接抹去首尾的数据时,也是一种截断,只是这种更多视为一种错误,而不是误差。

如果你对高等数学了解一些,那必然知道泰勒展开式是一个无穷级数,我们常常采用带拉格朗日或皮亚诺余项去描述误差,这个误差也是因为我们只取了有限的项而导致了数据的不精确。

例如下列展开:

e x = S ( x ) = 1 + x + x 2 2 ! + ⋯ + x n n ! e^x=S(x)=1+x+\frac{x^2}{2!}+\dotsb+\frac{x^n}{n!} ex=S(x)=1+x+2!x2++n!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值