numpy.meshgrid()的数学推导及代码实现

这篇博客介绍了numpy库中的meshgrid()函数,该函数用于在给定的一组坐标轴上生成网格点的坐标矩阵。通过将长度为3的x数组和长度为4的y数组输入到meshgrid(),输出的是两个4x3的二维矩阵,分别对应于x和y轴上的每个点。这种网格化操作在进行二维图形绘制和多维数据操作时非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

numpy.meshgrid():生成网格点坐标矩阵
注意维度 : X,Y两个长度分别为3和4,但是经过meshgrid()之后变成了4*3的多维矩阵

数学推导:

在这里插入图片描述
代码实现

x = np.arange(1,4,1)
y = np.arange(0 ,4,1)
res= M,N=np.meshgrid(x,y)
print(x,x.shape)
print('-----------')
print(y)
print('-----------')
print(res)
print('-----------')
print(X)
print('-----------')
print(Y)

输出结果:

[1 2 3] (3,)
-----------
[0 1 2 3]
-----------
[array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]]), array([[0, 0, 0],
       [1, 1, 1],
       [2, 2, 2],
       [3, 3, 3]])]
-----------
[[1 2 3]
 [1 2 3]
 [1 2 3]
 [1 2 3]]
-----------
[[0 0 0]
 [1 1 1]
 [2 2 2]
 [3 3 3]]
<think>好的,用户现在想要可视化他们的SVM分类结果。他们之前已经生成了数据,训练了模型,现在需要绘制决策边界和支持向量。让我先看看他们的代码有什么问题。 首先,用户使用了`svm.SVC`,参数设置正确,用的是线性核,随机状态和C参数也设置好了。数据生成部分看起来没问题,`make_classification`生成了两个特征的数据集,分为训练集和测试集,比例是85%的训练数据。网格数据生成的部分也正确,用`meshgrid`生成了500x500的点,用于绘制决策边界。 用户提到需要可视化,所以接下来需要添加绘图代码。他们可能不熟悉如何将决策边界和支持向量画出来。首先,要预测网格数据点的类别,然后用等高线画出决策边界。同时,要标出支持向量。 之前的警告信息是关于中文字体缺少下标字符,用户可能在绘图时遇到中文或数学符号的问题。需要确保他们按照之前的解决方案设置了支持中文的字体,比如微软雅黑,或者启用了LaTeX渲染。 现在需要检查他们的绘图代码是否包含正确的步骤:创建散点图,绘制决策边界,标记支持向量,添加标签和图例,设置标题等。可能还需要调整坐标轴范围和颜色设置,使图像更清晰。 另外,用户可能在运行代码时没有正确设置字体,导致之前的警告。需要提醒他们在绘图前设置`plt.rcParams`,避免中文乱码或符号缺失的问题。 总结一下,用户的代码缺少可视化部分,需要补充绘制决策边界和支持向量的代码,并确保字体设置正确,避免警告再次出现。可能需要分步骤指导他们如何添加这些代码,并解释每个部分的作用。</think>--- ### **代码解析与可视化实现** 以下代码在您原有基础上添加了 **决策边界绘制** 和 **支持向量标记** 功能,并解决中文字体显示问题: ```python import matplotlib.pyplot as plt import numpy as np from sklearn import svm from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # 设置中文字体(解决下标数字警告) plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 使用微软雅黑 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # 数据生成与模型训练(原代码部分) N = 100 X, Y = make_classification(n_samples=N, n_features=2, n_redundant=0, n_informative=2, class_sep=1, random_state=1, n_clusters_per_class=1) X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=0.85, random_state=123) # 生成网格数据 X1, X2 = np.meshgrid(np.linspace(X[:, 0].min()-0.5, X[:, 0].max()+0.5, 500), np.linspace(X[:, 1].min()-0.5, X[:, 1].max()+0.5, 500)) X_grid = np.c_[X1.ravel(), X2.ravel()] # 训练SVM模型 model = svm.SVC(kernel='linear', C=2, random_state=123) model.fit(X_train, Y_train) # 获取决策函数值 Z = model.decision_function(X_grid).reshape(X1.shape) # 可视化部分 plt.figure(figsize=(10, 6)) # 绘制决策边界与间隔 plt.contourf(X1, X2, Z > 0, alpha=0.2) # 分类区域 plt.contour(X1, X2, Z, levels=[-1, 0, 1], linestyles=['--', '-', '--'], colors='k') # 边界与间隔 # 绘制训练样本 plt.scatter(X_train[:, 0], X_train[:, 1], c=Y_train, cmap=plt.cm.Paired, edgecolors='k', s=50, label='训练数据') # 标记支持向量 plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=150, facecolors='none', edgecolors='r', linewidths=1.5, label='支持向量 (数量: %d)' % len(model.support_vectors_)) # 添加超平面方程 w = model.coef_[0] b = model.intercept_[0] equation = f'决策超平面: {w[0]:.2f}x₁ + {w[1]:.2f}x₂ + {b:.2f} = 0' plt.text(0.05, 0.95, equation, transform=plt.gca().transAxes, verticalalignment='top', bbox=dict(facecolor='white', alpha=0.8)) # 设置图形参数 plt.xlabel("特征 x₁") plt.ylabel("特征 x₂") plt.title("SVM分类结果可视化 (线性核)") plt.legend(loc='upper right') plt.grid(True, alpha=0.3) plt.show() # 输出模型参数 print("=== 模型参数 ===") print(f"超平面常数项 b: {model.intercept_[0]:.4f}") print(f"权重向量 w: {np.round(model.coef_[0], 4)}") print(f"支持向量数量: {model.n_support_}") ``` --- ### **可视化效果说明** 1. **颜色区域**: - 蓝色/橙色区域表示两个类别的决策区域 - 颜色深浅表示置信度(距离超平面的远近) 2. **边界线**: - 实线:决策边界($w^Tx + b = 0$) - 虚线:间隔边界($w^Tx + b = \pm 1$) 3. **特殊标记**: - 红色空心圆:支持向量 - 右上角显示超平面方程 --- ### **关键参数说明** | 参数 | 数学含义 | 可视化对应元素 | |---------------------|----------------------------|------------------------| | `model.coef_` | 权重向量 $w = [w_1, w_2]^T$ | 超平面方程的斜率 | | `model.intercept_` | 偏置项 $b$ | 超平面在y轴的截距 | | `support_vectors_` | 支持向量集合 $\{x_i\}$ | 红色空心圆标记 | | `decision_function` | 决策函数 $f(x) = w^Tx + b$ | 等高线Z值的计算基础 | --- ### **数学公式推导** 决策边界方程推导过程: $$ \begin{aligned} \text{原始超平面方程} &: w_1x_1 + w_2x_2 + b = 0 \\ \text{解为} &: x_2 = -\frac{w_1}{w_2}x_1 - \frac{b}{w_2} \\ \text{可视化时} &: \text{使用} \ \texttt{plt.contour} \ \text{自动计算等高线} \end{aligned} $$ --- ### **扩展建议** 1. **核函数对比**:尝试修改 `kernel='rbf'` 观察非线性分类效果 2. **参数敏感性**:调整 `C=2` 参数值,观察间隔宽度的变化 3. **三维可视化**:使用 `mpl_toolkits.mplot3d` 展示决策函数曲面 如果需要进一步调整可视化风格或分析特定参数影响,请随时告知!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值