tnblog
首页
视频
资源
登录

人工智能数学基础补习题(极限、无穷、导数、偏导数、梯度)

4778人阅读 2023/11/30 17:38 总访问:3454903 评论:0 收藏:0 手机
分类: python

人工智能数学基础补习题(极限、无穷、导数、偏导数、梯度)

SymPy 简单介绍


SymPy 是一个用于符号数学计算的 Python 库。符号数学计算是指在计算过程中保留符号表示,而不是进行数值逼近。SymPy 提供了一套丰富的功能,包括代数运算、微积分、方程求解、线性代数、解微分方程、级数展开、矩阵运算等计算。

常用的SymPy内置符号


自然对数的底e的表达方式。

  1. import sympy as sp
  2. sp.E

e


求对数函数

  1. sp.log(sp.E)

1


无穷大极限的表达方式oo

  1. import sympy as sp
  2. 1/sp.oo

0


圆周率 π 的表达方式

  1. sp.pi


对π的正弦函数

  1. sp.sin(sp.pi)

用SymPy进行初等运算

函数 描述
sympy.log 求对数函数
sympy.sin 正弦函数
sympy.sqrt 求平方根函数
sympy.root 求n次方根函数
sympy.factorial 求阶乘函数

表达式与表达式求值


SymPy可以用一套符号系统来表示一个表达式,如函数、多项式等,并且可以进行求值。

  1. # 定义x为一个符号,表示一个变量
  2. x = sp.Symbol('x')
  3. fx = 2*x+1 # fx 是一个表达式
  4. fx.evalf(subs={x:2}) # 用evalf函数,传入变量的值,对表达式进行求值

5.0

  1. x,y = sp.symbols('x y')
  2. fx = 2*x+y
  3. fx.evalf(subs={x:1,y:2}) # 以字典的形式传入多个变量的值
  4. # 如果只传入一个变量的值,则输出原来的表达式的值

4.0

  1. fx.evalf(subs={x:1})

y+2.0

求极限用sympy.limit函数

\lim_{x\to \infty}\frac{\sin x}{x}

  1. import sympy
  2. from sympy import oo # 无穷是两个小写oo
  3. import numpy as np
  4. x=sympy.Symbol('x')
  5. f=sympy.sin(x)/x
  6. r=sympy.limit(f,x,oo)
  7. r

0

\lim_{x\to 1}\frac{\ x^2-1}{x-1}

  1. import sympy
  2. from sympy import oo
  3. import numpy as np
  4. x=sympy.Symbol('x')
  5. f=(x**2-1)/(x-1)
  6. r=sympy.limit(f,x,1)
  7. r

2

\lim_{x\to 0}\frac{\sin x}{3x-x^3}

  1. import sympy
  2. from sympy import oo
  3. import numpy as np
  4. x=sympy.Symbol('x')
  5. f=sympy.sin(x)/((3*x)+(x**3))
  6. r=sympy.limit(f,x,0)
  7. r

\frac{1}{3}

求导sympy.diff函数


求导的目的是找到一个函数在某一点的变化率,也就是函数在这一点的瞬时斜率。(单个因素)
求出下列函数的导数:

y=\arcsin \sqrt{\sin x}

  1. from sympy import *
  2. from sympy.abc import x,y,z,f
  3. # diff求导函数,arcsin数学函数表示形式为asin
  4. diff(asin(sqrt(sin(x))))


偏导数的目的是了解一个多变量函数在某个特定方向上的变化率。(多个因素)
求出下列表达式在点(1,2)处的偏导数。

f(x, y)=x^2+3xy+y^2


先获取x和y的偏导公式,再进行带入。

  1. from sympy import *
  2. from sympy.abc import x,y,z,f
  3. f=x**2+3*x*y+y**2
  4. # 求对于x的导数
  5. fx=diff(f,x)
  6. fx

2x+3y

  1. # 求对于y的导数
  2. fy=diff(f,y)
  3. fy

3x+2y

  1. # 求在点(1,2)时,x的偏导数
  2. fx.evalf(subs={x:1,y:2})

8.0

  1. # 求在点(1,2)时,y的偏导数
  2. fy.evalf(subs={x:1,y:2})

7.0

方向导数


在偏导数之上确定了沿生的方向。
梯度向量:包含了函数在该点对每个变量的偏导数(x,y,z)。
方向导数=?f(梯度向量)*v(方向向量)

梯度下降


梯度就是方向导数取最大值,就是下坡最近的一种方式。
实现下列梯度下降求解下面函数的最小值

min f(x)=x-y+2x^2+2xy+y^2


通过对x和y的偏导得知公式为

\frac{\partial f}{\partial x}=4x+2y+1

\frac{\partial f}{\partial y}=-1+2x+2y

再此之前请确保安装了ipympl包。

  1. !pip install ipympl
  2. %matplotlib widget
  1. # 开启colab渲染,如果不是使用的google colab没有必要
  2. from google.colab import output
  3. output.enable_custom_widget_manager()
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from mpl_toolkits.mplot3d import Axes3D
  4. # 定义梯度函数
  5. def Fun(x,y):
  6. return x - y + 2 * x * x + 2 * x * y + y * y
  7. # 求偏导x
  8. def PxFun(x,y):
  9. return 1 + 4 * x + 2 * y
  10. # 求偏导y
  11. def PyFun(x,y):
  12. return -1 + 2 * x + 2 * y
  13. fig = plt.figure()
  14. ax = plt.axes(projection='3d')
  15. # 取样并作满射联合
  16. X,Y = np.mgrid[-2:2:40j, -2:2:40j]
  17. # 取样并作满射联合
  18. Z = Fun(X,Y)
  19. # X,Y,Z 指定行和列 表面图上色
  20. ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis', edgecolor='none')
  21. # 取样并作满射联合
  22. ax.set_xlabel('X')
  23. ax.set_ylabel('Y')
  24. ax.set_zlabel('Z')
  25. # 梯度下降
  26. # 取步长
  27. step = 0.0008
  28. x = 0
  29. y = 0
  30. tag_x = [x]
  31. tag_y = [y]
  32. tag_z = [Fun(x,y)] # 3个坐标分别打入表中,该表用于绘制点
  33. new_x = x
  34. new_y = y
  35. Over = False
  36. while Over == False:
  37. # 获取偏导并乘以阿尔法下降速度
  38. new_x -= step * PxFun(x,y)
  39. new_y -= step * PyFun(x,y)
  40. if Fun(x,y) - Fun(new_x,new_y) < 7e-9:
  41. Over = True
  42. x = new_x
  43. y = new_y
  44. # 添加更新的点
  45. tag_x.append(x)
  46. tag_y.append(y)
  47. tag_z.append(Fun(x,y))
  48. ax.plot(tag_x,tag_y,tag_z,'r')
  49. plt.title('(x,y)-('+str(x)+','+str(y)+')')
  50. plt.show()


这里小于7e-9保证精度够小。

  1. # 输出最小的x,y,z
  2. x,y,Fun(x,y)

(-0.9979655105730022, 1.4967081269573648, -1.2499942798392145)

NumPy库简单介绍


NumPy(Numerical Python的缩写)是Python中用于科学计算的核心库之一。它提供了一个强大的多维数组对象(numpy.array)和用于处理这些数组的各种函数。NumPy是很多其他科学计算库的基础,包括Pandas、SciPy、Matplotlib等。

数组的操作

  1. import numpy as np
  2. a = np.array([1,2,3]) # 创建一个rank的数组
  3. print(a[0],a[1],a[2])

1 2 3

  1. b = np.array([[1,2,3],[4,5,6]])
  2. print(b[0,0],b[0,1],b[0,2])

1 2 3


在绘制三维图表时,需要用到NumPy中的mgrid函数。 它会返回一个密集的多维网格,一般形式为np.mgrid[start:end:step]
start:开始值
end:结束坐标
step:表示步数

  1. np.mgrid[-1:4:2]

array([-1, 1, 3])

  1. np.mgrid[-1:4:2,-3:1:1]

SciPy库简单介绍


SciPy是建立在NumPy基础上的一个开源科学计算库,提供了许多在科学和工程中常用的高级数学、信号处理、优化、统计等算法和工具。

使用SciPy求导


使用scipy.misc模块下的derivative函数。
求f(x)在x0处的导数即f`(x0)

  1. import numpy as np
  2. from scipy.misc import derivative
  3. def f(x): # 定义函数
  4. return x**5
  5. print(derivative(f, 2, dx=1e-6)) # 对函数在x=2处求导

80.00000000230045

dx参数表示用于计算数值导数的微小变化量


使用polyld()函数构造f(x)polyld函数的形参是多项式的系数,最左侧的是最高次数的系数,构造的函数为多项式。
Numpy的polylder函数和deriv函数的作用差不多,都是对多项式求导,可以得到函数导数的表达式和在某点的导数。
对下面的多项式进行求导

x^5+2x^4+3x^2+5

  1. # 对多项式x^5 + 2x^4 + 3x^2 + 5求导
  2. import numpy as np
  3. p = np.poly1d([1,2,0,3,0,5]) # 通过系数构造多项式
  4. print(p)

5 4 2
1 x + 2 x + 3 x + 5

  1. print(np.polyder(p,1)) # 求一阶导数

4 3
5 x + 8 x + 6 x

  1. print(np.polyder(p,1)(1.0)) # 求一阶导数在点x=1处的值

19.0

  1. print(p.deriv(1)) # 求一阶导数

4 3
5 x + 8 x + 6 x

  1. print(p.deriv(1)(1.0)) # 求一阶导数在点x=1处的值

19.0

练习


求下列极限

\lim_{x\to 1}\sin (ln x)

  1. import sympy as sp
  2. x = sp.symbols('x')
  3. fx = sp.sin(sp.ln(x))
  4. sp.limit(fx,x,1)

0

\lim_{x\to 8}\frac{ 2^{1/3} - 2} {x-8}

  1. import sympy as sp
  2. x = sp.symbols('x')
  3. fx = (x**(1/3)-2)/(x-8)
  4. sp.limit(fx,x,8)

\frac{1} {12}


求下列导数

y=x^4-2x^3+5sinx+ln3

  1. import sympy as sp
  2. x,y = sp.symbols('x y')
  3. y = x**4-2*x**3+5*sp.sin(x)+sp.ln(3)
  4. sp.diff(y,x)

已知 z=(3x^2+y^2)^{4x+2y},求在点(1,2)处的偏导数,并使用python编程(提示:复合函数求导,设u=3x^2+y^2v=4x+2y

  1. import sympy as sp
  2. z,x,y = sp.symbols('z x y')
  3. z = (3*x**2+y**2)**(4*x+2*y)
  4. # 对x求偏导
  5. fx = sp.diff(z,x)
  6. fy = sp.diff(z,y)
  7. result_at_point = {
  8. 'dz/dx': fx.evalf(subs={x:1,y:2}),
  9. 'dz/dy': fy.evalf(subs={x:1,y:2})
  10. }
  11. print("在点 (1, 2) 处的偏导数:", result_at_point)

在点 (1, 2) 处的偏导数: {‘dz/dx’: 84401203.0927369, ‘dz/dy’: 48788945.5463684}

求函数 z=x^2+y^2 在点(1,2)处沿点(1,2)到点(2,2+3^{1/2})方向的方向导数,以及在点(1,2)的梯度。

  1. import sympy as sp
  2. z,x,y = sp.symbols('z x y')
  3. z = x**2+y**2
  4. # 对x求偏导
  5. fx = sp.diff(z,x)
  6. fy = sp.diff(z,y)
  7. # 定义点 (1, 2)
  8. point_1_2 = sp.Point(1, 2)
  9. # 定义点 (2, 2 + sqrt(3))
  10. point_2_2_sqrt3 = sp.Point(2, 2 + sp.sqrt(3))
  11. # 计算从点 (1, 2) 到点 (2, 2 + sqrt(3)) 的方向向量
  12. direction_vector = point_2_2_sqrt3 - point_1_2
  13. # 计算方向导数
  14. directional_derivative = sp.diff(z, x) * direction_vector[0] + sp.diff(z, y) * direction_vector[1]
  15. r1 =[fx.subs({x: 1, y: 2}),fy.subs({x: 1, y: 2})];
  16. result_at_point = {
  17. '在点 (1, 2) 处的梯度': r1, # 使用subs也可以
  18. "从点 (1, 2) 沿着到点 (2, 2 + sqrt(3)) 的方向的方向导数:": directional_derivative
  19. }
  20. print(":", result_at_point)

{
‘在点 (1, 2) 处的梯度’: [2, 4],
‘从点 (1, 2) 沿着到点 (2, 2 + sqrt(3)) 的方向的方向导数:’: 2x + 2sqrt(3)*y
}


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Quartz.NET实例动态改变周期调度。misfireCron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.NET Windows服务发布安装卸载监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

C ??? 问号和2个问号的用法(类型?对象?)

C# ?C# ???:单问号1.定义数据类型可为空。可用于对int,double,bool等无法直接赋值为null的数据类型进行null的赋值如这...

C outref关键字的用法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。out:classProgram { /* *out、ref都是引用传递,传递后使用都会改变...

cVB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

redis中主从哨兵和集群这三个有什么区别

主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。sentinel(哨兵)发现master挂了后,就会从slave中重新选举一个...

JS监听inputkeydown,有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

下划线换行回车空格ASCII码值与对照表

下划线,ASCII码95换行 , ASCII码10回车 , ASCII码13空格 , ASCII码32ASCII码表:Bin(二进制)Oct(八进制)Dec(十进制)Hex(...

docker常用命令删除镜像命令进入容器docker重启命令等

1. docker version查看 Docker 版本信息2. docker info显示 Docker 系统信息,包括镜像,容器数等3. 运行容器第一次使用:d...

多线程Lock锁数据库实现队列

队列其元素以先进先出(Firstin,Firstout,FIFO)的方式来处理的集合。先放入队列中的元素会先读取。队列使用System.Collect...

jsJQuery获取文本的宽高

页面编写:&lt;!DOCTYPEhtml&gt; &lt;html&gt; &lt;head&gt; &lt;metacharset=&quot;UTF-8&quot;/&gt; &lt;title&gt;jQ...

code first执行命令报错,无法将“Enable-Migrations”项识别为 cmdlet函数脚本文件

EF:执行命令报错无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如...

缓存穿透缓存击穿缓存雪崩区别

一、缓存穿透 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存...

微服务分布式架构项目的一点点想法

分布式与微服务的区别:说一点个人理解分布式: 分散压力。 不同功能块之间的通讯少,还是会有不少代码,每一...

文件传输原理与二进制字节字符理解

传输文件原理: 把文件转换成字节数组,通过字节数组传输 然后接收方在把字节数据转换成文件二进制为什么能存储文件 ...

使用jquery操作元素的css样式(获取修改等等)

使用jquery操作元素的css样式(获取、修改等等) //1、获取和设置样式 $(&quot;#tow&quot;).attr(&quot;class&quot;)...
这一世以无限游戏为使命!
排名
2
文章
633
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术