欢迎来到人工智能的世界
博客主页:卿云阁欢迎关注点赞收藏⭐️留言
本文由卿云阁原创!
本阶段属于练气阶段,希望各位仙友顺利完成突破
首发时间:2025年9月23日
✉️希望可以和大家一起完成进阶之路!
作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
导数和微分
导数
微分
求导法则
复合函数的求导
隐函数的求导
参数方程求导法
泰勒公式
微分中值定理
导数和微分
导数
import sympy as sp
# 1. 定义符号变量
# 在 SymPy 中,首先需要定义一个符号变量 'x',以便进行符号计算。
x = sp.Symbol('x')
# 2. 定义函数表达式
# 将函数 f(x) = x^2 - 2 作为一个 SymPy 表达式来表示。
f_x = x**2 - 2
# 3. 计算一阶导数
# 使用 sp.diff() 函数对 f_x 进行求导。
# 第一个参数是要被求导的函数,第二个参数是求导的变量。
f_prime = sp.diff(f_x, x)
# 4. 计算二阶导数
# 对 f_prime 再次求导,即可得到二阶导数。
f_double_prime = sp.diff(f_prime, x)
# 5. 打印结果
# 使用 sp.latex() 函数可以将 SymPy 表达式转换为 LaTeX 格式,
# 让输出结果更接近数学公式的样式,但在这里直接打印也清晰明了。
print(f"原函数 f(x) = {f_x}")
print(f"一阶导数 f'(x) = {f_prime}")
print(f"二阶导数 f''(x) = {f_double_prime}")
集合意义
简单来说:函数在某一点的导数,就是函数图像在这一点切线的斜率。
导数的应用:梯度下降算法
假设我们有一个非常简单的机器学习模型,其损失函数是:
我们的目标是找到参数 w 的值,使得这个损失函数达到最小值。
解决方法:我们可以使用梯度下降。梯度(在一维情况下就是导数)告诉我们函数在当前位置变化
最快的方向。为了找到最小值,我们需要沿着导数相反的方向前进。
w_new 是新的参数值,w_old 是旧的参数值,α 是学习率(Learning Rate),它控制着我们
每一步前进的幅度。
import numpy as np
import matplotlib.pyplot as plt
# 设置字体和负号显示,支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 定义损失函数 L(w)
def loss_function(w):return w**2 - 4*w + 5
# 2. 定义损失函数的导数 L'(w)
# 这是导数的关键应用,它指示了梯度的方向
def gradient(w):return 2*w - 4
# 3. 设置梯度下降参数
learning_rate = 0.1 # 学习率
initial_w = 10 # 初始参数值
num_iterations = 20 # 迭代次数
# 4. 运行梯度下降
w_history = [initial_w]
loss_history = [loss_function(initial_w)]
w = initial_w
for i in range(num_iterations):grad = gradient(w)w = w - learning_rate * gradw_history.append(w)loss_history.append(loss_function(w))
# 5. 可视化结果
# 生成用于绘图的 w 值范围
w_vals = np.linspace(-5, 15, 400)
loss_vals = loss_function(w_vals)
plt.figure(figsize=(10, 7))
# 绘制损失函数曲线
plt.plot(w_vals, loss_vals, label='损失函数 $L(w) = w^2 - 4w + 5$', color='#1f77b4', linewidth=2.5)
# 绘制梯度下降的路径
plt.plot(w_history, loss_history, 'o--', color='red', markersize=8, label='梯度下降路径')
# 标记起点和终点
plt.plot(w_history[0], loss_history[0], 'go', markersize=10, label='起点')
plt.plot(w_history[-1], loss_history[-1], 'ro', markersize=10, label=f'终点 (w={w_history[-1]:.2f})')
# 标记最小值点
min_w = 2 # 损失函数的最小值点可以通过 L'(w)=0 得到
plt.plot(min_w, loss_function(min_w), 'k*', markersize=15, label=f'最小值点 (w={min_w})')
# 设置图表标题和标签
plt.title('导数在梯度下降中的应用', fontsize=16, fontweight='bold')
plt.xlabel('参数 w', fontsize=12)
plt.ylabel('损失 L(w)', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.5)
plt.legend(fontsize=12)
plt.show()
# 6. 打印最终结果
print(f"最终找到的 w 值为: {w_history[-1]:.4f}")
print(f"最终的损失值为: {loss_history[-1]:.4f}")
print(f"理论上的最小值 w={min_w}, 损失={loss_function(min_w)}")
微分
微分:是一个增量,它是在导数的基础上,用来近似函数在自变量微小变化时所产生的增量。
微分就是用导数(斜率)来估算这个小增量。
求导法则
复合函数的求导
隐函数的求导
圆的方程 x² + y² = 1
为例,它就是一个典型的隐函数。没有办法写成y=...x这种形式。圆的
方程也可以表示为 x² + y² -1=0,也可以记作F(x,y)=0。
import sympy as sp
# 1. 定义符号变量
x, y = sp.symbols('x y')
# 2. 定义隐函数表达式 F(x, y) = x^2 + y^2 - 1
# SymPy 会将其理解为 F(x, y) = 0
f_xy = x**2 + y**2 - 1
# 3. 使用 sp.idiff() 函数进行隐函数求导
# 参数: (表达式, 对谁求导, 谁是函数)
# 这里的 y 被视为 x 的函数
dy_dx = sp.idiff(f_xy, y, x)
# 4. 打印结果
print(f"隐函数表达式: {f_xy} = 0")
print(f"隐函数求导结果 dy/dx = {dy_dx}")
参数方程求导法
泰勒公式
泰勒公式的本质是:用多项式函数来近似一个复杂的函数。通过函数在一点上的所有导数值
(包括0阶导数),来构建一个多项式,从而精确地描述和近似函数在这一点附近的局部行为。
为什么这个方法有效?
泰勒公式的核心在于,它利用了函数在某一点的所有导数信息。这些导数信息包含了函数在这一
点周围的所有局部几何特征:一阶导数:决定了函数的斜率。二阶导数:决定了函数的凹凸性。三
阶及更高阶导数:决定了函数的“弯曲变化”。通过把所有这些局部信息叠加起来,泰勒多项式就能
像一个“整形医生”一样,越来越精确地模仿原始函数的局部形状。
应用
近似计算:在计算机中,计算 ex 或 sinx 这样复杂函数的值时,通常就是使用它们的泰勒级数展开
式,通过有限项求和来得到近似值。
在人工智能领域:假设我们有一个神经网络模型,我们想要通过调整其参数来最小化在训练集上的
损失函数。然而,有时候这个损失函数非常复杂,难以直接求解。这时候,我们可以使用泰勒公式
来近似表示这个复杂的损失函数。我们选择一个适当的点作为展开的中心点,然后计算损失函数在
这个点的值、一阶导数、二阶导数等。我们可以使用泰勒公式将损失函数在这个点附近展开为一个
简单的二次函数。我们可以使用这个简化的二次函数来找到损失函数的最小值。虽然这个最小值可
能不是原始损失函数的真实最小值,但它足够接近,让我们可以通过调整模型参数来得到一个好的
解决方案。
微分中值定理
本质就是:割线的斜率等于切线的斜率
罗尔定理
拉格朗日定理
柯西定理