如何用Python绘制给定参数的多元函数Contour Plot(等高线图)
绘制多元残差平方和函数的等高线图
你的目标函数是$\frac{1}{2}|AX - b|_2^2$,其中$X$是二维向量(对应$x_1, x_2$两个变量),$A \in \mathbb{R}^{100 \times 2}$,$b \in \mathbb{R}^{100 \times 1}$。由于这是基于矩阵运算的函数,不能像简单二元函数那样逐元素计算,需要通过批量向量运算生成网格点对应的函数值,具体实现步骤如下:
实现代码
import numpy as np import matplotlib.pyplot as plt # 1. 模拟你的A和b数据(替换为你实际的A、b矩阵) np.random.seed(42) # 固定随机种子,保证结果可复现 A = np.random.randn(100, 2) b = np.random.randn(100, 1) # 2. 生成x1和x2的网格(可根据实际需求调整取值范围) x1 = np.linspace(-5, 5, 400) x2 = np.linspace(-5, 5, 400) XX, YY = np.meshgrid(x1, x2) # 3. 批量计算所有网格点的函数值 # 将网格转换为(2, N)的矩阵,每一列对应一个X向量 X_flat = np.vstack([XX.ravel(), YY.ravel()]) # 计算AX - b,得到每个X对应的残差矩阵 AX_minus_b = A @ X_flat - b # 计算每个X对应的函数值:1/2 * 残差的L2范数平方 Z_flat = 0.5 * np.sum(AX_minus_b ** 2, axis=0) # 将扁平化的Z值还原为网格形状 Z = Z_flat.reshape(XX.shape) # 4. 绘制等高线图 fig, ax = plt.subplots(figsize=(8, 6)) contour = ax.contour(XX, YY, Z, levels=20) # 添加等高线数值标签 ax.clabel(contour, inline=True, fontsize=8) # 设置坐标轴标签和标题 ax.set_xlabel('$x_1$') ax.set_ylabel('$x_2$') ax.set_title('等高线图: $\\frac{1}{2}\\|AX - b\\|_2^2$') plt.show()
关键步骤说明
- 网格数据转换:
np.vstack([XX.ravel(), YY.ravel()])把二维网格的所有点转换成列向量形式,利用矩阵乘法批量计算所有点的函数值,避免循环遍历,提升效率。 - 函数值计算:通过矩阵乘法
A @ X_flat得到所有X对应的AX结果,减去b后逐平方再求和,最后乘以1/2,得到每个网格点的函数值。 - 形状还原:把扁平化的
Z_flat还原成和XX、YY一致的网格形状,才能被contour函数识别绘制。
内容的提问来源于stack exchange,提问作者Enigmacy
相关产品推荐
相关产品推荐

