用Python和NumPy玩转凸函数与凸集:从数学定义到动态可视化
记得刚开始学习机器学习时,最让我头疼的就是那些抽象的数学概念。特别是"凸函数"和"凸集"这两个词,在教材里反复出现,但光看定义总觉得隔靴搔痒。直到有一天,我尝试用Python把这些概念画出来,一切突然变得清晰可见。这篇文章就是要把这种"可视化学习法"分享给你,让你也能通过代码亲手触摸这些数学概念的形状。
1. 准备工作:搭建你的Python可视化实验室
在开始之前,我们需要准备好Python环境和必要的库。推荐使用Anaconda创建虚拟环境,这样可以避免库版本冲突的问题:
bash复制conda create -n convex_env python=3.8
conda activate convex_env
pip install numpy matplotlib ipykernel
核心工具包的功能简介:
- NumPy:处理数学运算和数组操作的核心库
- Matplotlib:数据可视化的瑞士军刀
- SciPy(可选):提供额外的数学工具和优化算法
提示:如果你使用Jupyter Notebook,可以添加
%matplotlib inline魔法命令,让图表直接显示在笔记本中。
让我们先定义一个简单的绘图函数,后续可以重复使用:
python复制import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def plot_function(f, x_range=(-5,5), y_range=(-5,5), step=0.1):
"""绘制二元函数的三维曲面"""
x = np.arange(x_range[0], x_range[1], step)
y = np.arange(y_range[0], y_range[1], step)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure(figsize=(12,6))
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)
fig.colorbar(surf)
plt.title(f"Function: {f.__name__}")
plt.show()
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 凸集:用代码画出形状的本质
数学定义说凸集是"集合内任意两点连线上的点都在集合内",这听起来很抽象。让我们用代码来具象化这个概念。
2.1 经典凸集示例
先创建几个常见的凸集:
python复制def plot_convex_sets():
# 圆形(凸集)
circle = plt.Circle((0,0), 2, fill=False, edgecolor='blue', linewidth=2)
# 矩形(凸集)
rectangle = plt.Rectangle((-1,-1), 2, 2, fill=False, edgecolor='green', linewidth=2)
# 非凸集示例(月牙形)
theta = np.linspace(0, 2*np.pi, 100)
moon_x = 2*np.cos(theta)
moon_y = 2*np.sin(theta) + np.where(theta < np.pi, 0.5, -0.5)
fig, ax = plt.subplots(figsize
