关于机器学习的一些数学基础(一)

Big O notation

一般我们描述算法复杂度时,会使用大O符号。例如冒泡排序的复杂度是O(n^2),快排与归并排序的复杂度为O(nlogn)。那么什么是大O符号呢。

一般呢,我们说f(x)=O(g(x)),即指f(x)与g(x)的量级差不多,使用数学语言呢,即是:

\exists x_{0},M 使x\geqslant x_{0} 时

f(x)\leqslant Mg(x)

如g(x)=x^2 与 f(x)=3x^2+5x+2 。当x>=10的时候,只要M为4。f(x)一定小于Mg(x)。这时候我们可以说3x^2+5x+2=O(x^2)。而如果g(x)换做x。我们找不到一个x0和M满足于这个条件。因为当x趋近于无穷大时,f(x)始终>Mg(x)。

同时还存在一个小o符号。他的意义为f(x)=o(g(x))时,f(x)量级严重小于与g(x)。类似x^2=o(x^3)使用数学语言呢,即是:

\forall \varepsilon ,\exists x_{0} 使x\geqslant x_{0} 时

f(x)\leqslant \varepsilon g(x)

大家感兴趣可以代入公式试一试。

我们一般使用大O符号描述算法的复杂度。这种方式可以清晰地看出不同算法执行时所需要消耗的资源多少,时间长短的对比与关系。以及当算法中元素增加时,耗费资源时间增长的剧烈程度。

 

极限与导数

关于极限与导数基本上都是高数中的核心内容。即表示函数以及变化的趋势。

与上面的内容结合起来。如果我们说f(x)=o(g(x)),那么在x趋近于无穷大时,f(x)/g(x)一定为0。

因为根据极限的定义我们可得

 

\forall \varepsilon > 0 ,\exists x_{0} 使x\geqslant x_{0} 时

\frac{f(x)}{g(x)}< \varepsilon  即 f(x)< \varepsilon g(x) 即 f(x)=o(g(x))。

同理如果是大O符号,那么结果一定是小于等于大O符号中定义为M的一个常数。

另外python中有一个Sympy库,可以使用符号进行求导。

另外对于导数延伸开来,有一个费马引理,即:

函数f(x)在点a的某邻域U(a)内有定义,并且在a可导,如果对于任意的x∈U(a),都有f(x)≤f(a) (或f(x)≥f(a) ),那么f '(a)=0。

通俗来说就是区间内如果存在极值,那么此点的导数一定为0。

而从此又延伸出罗尔定理:

如果 上的函数 f(x) 满足以下条件:

(1)在闭区间 [a,b] 上连续

(2)在开区间 (a,b) 内可导

(3)f(a)=f(b),则至少存在一个 \varepsilon∈(a,b),使得 f'(\varepsilon)=0。

因为函数 f(x) 在闭区间[a,b] 上连续,所以存在最大值最小值,分别用 M 和 m 表示,分两种情况讨论:

1. 若 M=m,则函数 f(x) 在闭区间 [a,b] 上必为常函数,结论显然成立。

2. 若 M>m,则因为 f(a)=f(b) 使得最大值 M 与最小值 m 至少有一个在 (a,b) 内某点\varepsilon处取得,从而\varepsilon是f(x)的极值点,又条件 f(x) 在开区间 (a,b) 内可导得,f(x) 在 \varepsilon 处取得极值,由费马引理,可导的极值点一定是驻点,推知:f'(\varepsilon)=0。

另又从罗尔定理可延伸到拉格朗日中值定理:

 

如果函数f(x)满足:

(1)在闭区间[a,b]上连续

(2)在开区间(a,b)内可导;

那么在开区间(a,b)内至少有一点\varepsilon

 

 使等式f(b)-f(a)=f'(\varepsilon )(b-a)

 

 成立。

只需要构造函数g(x)=f(x)-f(a)-\frac{f(b)-f(a)}{b-a}(x-a)

这样我们可得g(a)=g(b)。根据罗尔定理则有一点\varepsilon使g'(\varepsilon)=0。同时g'(\varepsilon)=f'(\varepsilon)即证。

根据此我们可以推导出如何逼近一个函数,进而得到拉格朗日余项泰勒展开。

f(x)=f(x_{0})+(x-x_{0})f'(x_{0})+(x-x_{0})^{2}\frac{f''(x_{0})}{2}+...(x-x_{0})^{n}\frac{f^{n}(x_{0})}{n!}+o((x-x_{0})^{n})

有兴趣的可以自己推导尝试,过程不在此详细说明。

通过拉格朗日余项泰勒展开我们就可以通过多项式来逼近任何一个可导函数。

 

凸函数

通俗来讲,我们称二阶导数不变号的函数为凸函数。上凸函数则二阶导<0,下凸函数则二阶导>0。根据定义则是在函数f(x)上划一条线,线公式为g(x),有两个交点a,b(a<b)。则对于任意x_{0}(a<x<b)都有f(x_{0})>g(x_{0}) (上凸函数)/ f(x_{0})<g(x_{0}) (下凸函数)。

其实就是描述一个函数变化的趋势是不变的。一直变大就是下凸,一直变小就是上凸。

在机器学习中应用广泛的凸优化问题即是基于凸函数的定义。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值