当前位置: 首页 > news >正文

SVM(Support Vector Machine)从入门到精通

核心思想:SVM是什么?

你需要在二维平面上画一条直线,将两种不同颜色的点分开。通常,你可以画出无数条这样的直线。那么,哪一条是最好的呢?

SVM 的核心思想就是:不仅要将两类点分开,而且要以“最大间隔”将它们分开。

  • 决策边界(Decision Boundary): 这就是那条用于分类的线(在二维空间)或面(在三维空间)或超平面(更高维度)。
  • 间隔(Margin): 想象在决策边界两侧各画一条平行的线,刚好触碰到距离最近的那些点。这两条线之间的距离就是“间隔”。SVM 的目标就是最大化这个间隔
  • 支持向量(Support Vectors): 那些刚好落在间隔边界上的点,被称为“支持向量”。它们是定义决策边界的关键点。即使移动或删除其他所有非支持向量的点,决策边界也不会改变。这正是 SVM “Support Vector Machine” 名字的由来。

直观比喻:将决策边界看作街道的中心线,间隔就是整条街道的宽度。SVM 的目标就是在这两类“社区”(数据点)之间,修建一条尽可能宽的“隔离街道”。支持向量就是街道两旁最近的“房子”。

线性SVM:从简单开始

2.1 硬间隔 (Hard Margin) SVM

当数据是完全线性可分的(即存在一条直线能完美地将两类数据分开,没有任何一个点在错误的区域),我们可以使用硬间隔SVM。

它寻找一个最优超平面,其数学表达式为 wTx+b=0w^T x + b = 0wTx+b=0

  • www: 超平面的法向量,决定了平面的方向。
  • bbb: 偏置项,决定了平面与原点的距离。

优化的目标是最大化间隔。间隔的大小可以被证明是 2∣w∣\frac{2}{|w|}w2。因此,最大化间隔等价于最小化 ∣w∣|w|w

同时,必须满足约束条件:所有点都必须被正确分类,并且位于间隔之外。

  • 对于类别为 +1 的点 x_ix\_ix_i,要求 wTx_i+b≥1w^T x\_i + b \geq 1wTx_i+b1
  • 对于类别为 -1 的点 x_ix\_ix_i,要求 wTx_i+b≤−1w^T x\_i + b \leq -1wTx_i+b1

这就是硬间隔SVM的优化问题。它非常严格,不允许任何分类错误。

2.2 软间隔 (Soft Margin) SVM 与惩罚因子 C

在现实世界中,数据往往不是完全线性可分的,存在一些噪声或异常点 (outliers)

软间隔SVM允许一定的“容错性”。它引入了一个松弛变量 ξ_i\xi\_iξ_i (slack variable),允许个别数据点可以处于间隔之内,甚至被错误分类。

当然,我们不希望有太多的点越界,所以需要为这些越界的点付出代价。这个代价由超参数 C(惩罚因子) 来控制。

  • 超参数 C (Cost):
    • 高 C 值: 对误分类的惩罚很高。SVM会试图将所有点都正确分类,这可能导致间隔变窄,决策边界变得非常“扭曲”,容易发生过拟合 (Overfitting)。它更接近硬间隔。
    • 低 C 值: 对误分类的惩罚较低。SVM会更专注于寻找一个更宽的间隔,即使这意味着牺牲一些点的分类准确性。这会使得模型泛化能力 (Generalization) 更强,但可能导致欠拟合 (Underfitting)

C 是一个权衡:在“追求更宽的间隔”和“减少分类错误”之间进行权衡。

非线性SVM:核技巧的魔力 (The Kernel Trick)

如果数据本身是环状或者S形的,一条直线无论如何也无法有效分开它们。

SVM通过核技巧 (Kernel Trick) 来解决这个问题,这是SVM最强大的特性之一。

核心思想:我们不需要在原始维度硬找一条曲线来分割数据。我们可以将数据映射到一个更高维度的空间,在这个新空间里,数据可能就变成线性可分的了。

原始二维空间,线性不可分。通过映射到三维空间,数据变得可以用一个平面(绿色)线性分开了

硬间隔(Hard Margin)
  • 概念:硬间隔SVM用于线性可分数据,目标是找到一个超平面(决策边界),将两个类别的样本完美分开,同时最大化分类间隔(margin)。间隔是决策边界到最近样本点的距离的两倍。硬间隔要求所有样本点都正确分类,且不允许任何样本点进入间隔区域(即“无人区”)。
    • 数学基础:硬间隔的优化问题是最小化 12∥w∥2\frac{1}{2} \|w\|^221w2,约束条件为 yi(w⋅xi+b)≥1y_i(w \cdot x_i + b) \geq 1yi(wxi+b)1(对所有样本点),其中 www 是权重向量,bbb 是偏置项。
  • 解决的问题:适用于数据“完美线性可分”的场景,即存在一条直线(或超平面)能将所有样本点无误分类(如文档中的“苹果和橙子完美分开”的例子)。在无噪声或异常值的干净数据中表现最佳。
  • 优点
    • 提供最大间隔分类器,泛化能力强(在训练数据外表现好)。
    • 决策边界清晰,易于解释。
  • 缺点
    • 对噪声和异常值极度敏感:如果有一个样本点靠近或越过决策边界(如“苹果滚到橙子堆”),模型无法收敛或边界扭曲。
    • 不适用于线性不可分数据:在现实数据中,数据往往有重叠或噪声,硬间隔会失败。
  • 文档中的示例:在代码生成的可视化中,硬间隔模型(C=1e6)会剧烈弯曲决策边界以拟合噪声点,导致间隔变窄、支持向量增多(黄色圈点)。
软间隔(Soft Margin)
  • 概念:软间隔SVM处理线性不可分数据,允许一些样本点分类错误或进入间隔区域。它引入松弛变量(slack variables)ξi\xi_iξi 和惩罚参数 CCC 来控制错误容忍度。
    • 数学基础:优化问题变为最小化 12∥w∥2+C∑ξi\frac{1}{2} \|w\|^2 + C \sum \xi_i21w2+Cξi,约束条件为 yi(w⋅xi+b)≥1−ξiy_i(w \cdot x_i + b) \geq 1 - \xi_iyi(wxi+b)1ξiξi≥0\xi_i \geq 0ξi0。其中 CCC 是惩罚系数:
      • CCC 很大(如 1e6):接近硬间隔,几乎不允许错误。
      • CCC 很小(如 0.1):容忍更多错误,追求更宽的间隔。
  • 解决的问题:适用于现实世界中数据有噪声、异常值或轻微重叠的场景(如文档中的“个别调皮水果溜到对方阵营”)。它通过平衡间隔最大化和错误最小化,处理非完美线性可分数据。
  • 优点
    • 鲁棒性强:对噪声和异常值不敏感,能处理类别重叠。
    • 灵活性强:通过调整 CCC 值,适应不同数据分布(e.g., 高 CCC 用于高精度需求,低 CCC 用于泛化需求)。
  • 缺点
    • 参数 CCC 需要调优:选择不当可能导致过拟合(高 CCC)或欠拟合(低 CCC)。
    • 计算开销略高:因引入松弛变量。
  • 文档中的示例:在代码可视化中,软间隔模型(C=0.1)保持平直决策边界,忽略离群点,间隔变宽、支持向量减少。
实际案例:银行欺诈检测

以银行欺诈检测为例,说明软间隔的应用场景:

  • 问题描述:检测可疑交易,其中正常交易(负类)占99%,欺诈交易(正类)占1%。特征包括交易金额、时间、地点等。
  • 数据特点
    • 类别极度不平衡:负类样本远多于正类,硬间隔会偏向多数类,忽略少数类(欺诈交易)。
    • 边缘案例:如用户境外旅游时的大额消费,可能被误判为欺诈(噪声点)。
    • 测量误差:部分特征不精确,导致数据轻微重叠。
  • 软间隔的适用性
    • 使用软间隔SVM(低 CCC 值),允许少量误分类(e.g., 容忍正常交易被误判为欺诈),但通过惩罚参数控制总体错误率。
    • 优势:在保持高召回率(recall)的同时,避免因噪声导致模型崩溃。

“左侧硬间隔模型试图用复杂边界拟合噪声点,右侧软间隔模型保持平滑边界”

左侧显示硬间隔模型(C=1e6)的决策边界剧烈弯曲以拟合噪声点,间隔窄,支持向量多(黄色圈点)。右侧显示软间隔模型(C=0.1)的决策边界平滑,间隔宽,支持向量少。

在这里插入图片描述

代码说明:
  • 环境要求:Python 3.x,安装库:pip install numpy matplotlib scikit-learn
  • 数据模拟:使用 make_blobs 生成两个类别的数据(模拟正常交易和欺诈交易),添加噪声点模拟异常值(类似银行案例中的边缘案例)。
  • 模型设置
    • 硬间隔:SVC(kernel='linear', C=1e6)(高C值,近似硬间隔)。
    • 软间隔:SVC(kernel='linear', C=0.1)(低C值,容忍错误)。
  • 可视化:绘制决策边界、间隔区域和支持向量,直观展示两种方法的差异。
  • 运行结果:代码输出一个图表,包含两个子图(硬间隔和软间隔),类似嵌入图片的效果。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs# 步骤1: 生成合成数据,模拟银行欺诈检测场景(两个类别:正常交易和欺诈交易)
# - n_samples=100: 总样本数,100个交易记录
# - centers=2: 两个类别中心(负类和正类)
# - cluster_std=1.2: 类别标准差,模拟数据分布宽度(值越大,数据越分散)
# - random_state=42: 随机种子,确保结果可复现
X, y = make_blobs(n_samples=100, centers=2, cluster_std=1.2, random_state=42)# 步骤2: 添加噪声点,模拟异常值(如银行数据中的边缘案例,e.g., 境外大额消费)
# - 生成5个噪声点,位置偏离主要类别中心
# - np.random.randn(5, 2) * 2 + [0, 3]: 从标准正态分布采样,并平移以创建偏移点
np.random.seed(42)  # 固定随机种子
noise = np.random.randn(5, 2) * 2 + [0, 3]  # 噪声点矩阵(5个点,2个特征)
X = np.vstack([X, noise])  # 将噪声点添加到原始数据
y = np.hstack([y, np.ones(5)])  # 将噪声点的标签设为1(正类,模拟欺诈交易)# 步骤3: 定义和训练SVM模型,比较硬间隔和软间隔
# - models列表:包含两个元组,分别表示硬间隔和软间隔模型
# - svm.SVC参数说明:
#   - kernel='linear': 使用线性核函数,适合线性分类
#   - C: 惩罚参数,控制错误容忍度(C越大越接近硬间隔,C越小越容忍错误)
models = [('Hard Margin (C=1e6)', svm.SVC(kernel='linear', C=1e6)),  # 硬间隔模型,C极大('Soft Margin (C=0.1)', svm.SVC(kernel='linear', C=0.1))   # 软间隔模型,C小
]# 步骤4: 设置可视化画布,创建2个子图用于对比
plt.figure(figsize=(12, 5))  # 画布大小:宽12英寸,高5英寸# 遍历每个模型:训练、计算决策边界,并绘制结果
for i, (title, model) in enumerate(models):model.fit(X, y)  # 训练SVM模型ax = plt.subplot(1, 2, i + 1)  # 创建子图(1行2列,第i+1个)# 步骤4.1: 绘制所有样本点,用颜色区分类别# - c=y: 根据标签y着色(负类蓝色,正类红色,cmap='coolwarm')# - edgecolors='k': 点边界为黑色,增强可视性plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k')# 步骤4.2: 计算并绘制决策边界(超平面)# - w: 权重向量(coef_属性),决策边界的法向量# - b: 偏置项(intercept_属性),决策边界的截距w = model.coef_[0]  # 获取权重向量(数组形式)b = model.intercept_[0]  # 获取偏置项x_plot = np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 100)  # 生成x轴坐标范围y_plot = (-w[0] / w[1]) * x_plot - b / w[1]  # 计算决策边界线(基于超平面方程 w·x + b = 0)# 步骤4.3: 计算并绘制间隔边界(间隔区域)# - margin: 间隔距离,公式为 1 / ||w||(间隔边界距离决策边界一个单位)margin = 1 / np.sqrt(w[0] ** 2 + w[1] ** 2)  # 计算间隔距离plt.plot(x_plot, y_plot, 'k-', label='Decision Boundary')  # 绘制决策边界(实线)plt.plot(x_plot, y_plot + margin, 'k--', label='Margin Boundary')  # 绘制上间隔边界(虚线)plt.plot(x_plot, y_plot - margin, 'k--')  # 绘制下间隔边界(虚线)# 步骤4.4: 标出支持向量(关键样本点)# - support_vectors_: 支持向量数组(影响决策边界的点)plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1],s=100, facecolors='none', edgecolors='yellow', label='Support Vectors')# 步骤4.5: 设置子图标题和标签plt.title(f'{title}\nSupport Vectors: {len(model.support_vectors_)}')  # 标题显示支持向量数量plt.xlabel('Feature 1 (e.g., Transaction Amount)')  # x轴标签(模拟特征1,如交易金额)plt.ylabel('Feature 2 (e.g., Location Score)')      # y轴标签(模拟特征2,如位置评分)plt.legend()  # 显示图例# 调整布局并显示图表
plt.tight_layout()  # 自动调整子图间距
plt.show()  # 显示完整图表
代码运行结果和解释:
  • 输出:运行代码后,会显示一个图表,包含两个子图:
    • 左侧子图(Hard Margin, C=1e6):决策边界剧烈弯曲以拟合所有样本点(包括噪声),间隔区域很窄(虚线靠近实线),支持向量数量多(黄色圈点),表明模型过拟合噪声。
    • 右侧子图(Soft Margin, C=0.1):决策边界平滑,间隔区域宽大(虚线远离实线),支持向量数量少,模型忽略噪声点,泛化能力更强。
  • 与文档案例关联:此代码模拟了银行欺诈检测场景(类别不平衡和噪声),软间隔模型通过低C值处理了边缘案例,而硬间隔模型因噪声而扭曲。实际应用中,可根据数据调整C值优化性能。

“技巧”在哪里?
神奇之处在于,我们不需要真的计算数据点在高维空间中的坐标,这通常计算量巨大。核函数可以直接计算出数据点在映射后的高维空间中的内积 (dot product)。SVM的优化过程恰好只需要这个内积结果,而不需要具体的坐标。

常见的核函数
  1. 线性核 (Linear Kernel): kernel='linear'

    • 实际上就是不做映射,用于处理本身就线性可分的数据。速度快。
    • K(x_i,x_j)=x_iTx_jK(x\_i, x\_j) = x\_i^T x\_jK(x_i,x_j)=x_iTx_j
  2. 多项式核 (Polynomial Kernel): kernel='poly'

    • 通过将数据映射到多项式特征空间来处理非线性问题。
    • K(x_i,x_j)=(γx_iTx_j+r)dK(x\_i, x\_j) = (\gamma x\_i^T x\_j + r)^dK(x_i,x_j)=(γx_iTx_j+r)d
    • 需要调整的超参数有 degree (d) 和 coef0 ®。
  3. 高斯核 / 径向基函数核 (RBF Kernel): kernel='rbf'

    • 最常用、最强大的核函数,默认选项。它可以处理非常复杂的非线性关系,因为它能将原始特征映射到无限维空间。
    • K(x_i,x_j)=exp⁡(−γ∣x_i−x_j∣2)K(x\_i, x\_j) = \exp(-\gamma |x\_i - x\_j|^2)K(x_i,x_j)=exp(γx_ix_j2)
    • 它引入了另一个重要的超参数 gamma
超参数 gamma 的角色 (主要针对RBF核)

gamma 定义了单个训练样本的影响范围

  • gamma: 影响范围大。决策边界会非常平滑和宽泛。可以理解为,一个点可以“看得”很远,影响范围内的很多点。这可能导致模型过于简单,造成欠拟合
  • gamma: 影响范围小。只有靠近该点的样本才会对其有影响。这会导致决策边界非常“崎岖”,紧紧地围绕着各个数据点,容易造成过拟合

C 和 gamma 的关系

  • C 控制模型的复杂度(软/硬间隔)。
  • gamma 控制决策边界的形状(平滑/崎岖)。
    这两个参数通常需要一起调优才能获得最佳效果。

典型应用场景

何时应该优先考虑SVM?
  1. 高维数据: 当特征维度非常高时(例如,文本分类中的词袋模型,基因表达数据),SVM表现非常出色。它在维度数量大于样本数量的情况下依然有效。
  2. 小到中等规模数据集: SVM的训练时间复杂度较高(大约在 O(n2)O(n^2)O(n2)O(n3)O(n^3)O(n3) 之间,n为样本数),因此在几十万样本级别的数据集上表现良好,但在百万级以上的数据集上会非常慢。
  3. 复杂的非线性问题: 配合RBF核函数,SVM可以拟合非常复杂的决策边界,适用于图像识别、生物信息学等领域。
  4. 需要高准确率且对模型解释性要求不高的场景
何时应该避免使用SVM?
  1. 超大规模数据集: 当样本量巨大时(如百万、千万级别),训练SVM会非常耗时和消耗内存。此时可以考虑逻辑回归、朴素贝叶斯或深度学习模型。
  2. 噪声非常多的数据集: 如果数据集中有大量噪声且类别重叠严重,SVM可能难以找到一个好的决策边界。
  3. 需要模型解释性的场景: SVM是一个相对“黑盒”的模型。你很难向业务方解释“为什么这个样本被分到了这一类”,因为它是由复杂的支持向量和高维映射决定的。此时决策树或逻辑回归是更好的选择。

Python代码实战 (Scikit-learn)

我们将使用Python的scikit-learn库来演示SVM。

首先,安装必要的库:

pip install numpy matplotlib scikit-learn

辅助函数:我们先定义一个函数来可视化决策边界,这将帮助我们直观地理解模型的效果。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svmdef plot_decision_boundary(model, X, y):"""可视化模型的决策边界"""h = .02  # 网格步长x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, edgecolors='k')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.title(f"SVM with {model.kernel} kernel")plt.show()
场景一:线性可分数据的分类
from sklearn.datasets import make_blobs# 1. 生成线性可分的数据
X, y = make_blobs(n_samples=100, centers=2, random_state=6, cluster_std=0.8)# 2. 创建并训练线性SVM模型
# SVC代表 "Support Vector Classification"
# kernel='linear' 表示我们使用线性核
# C=1.0 是一个相对中性的惩罚值
linear_svm = svm.SVC(kernel='linear', C=1.0)
linear_svm.fit(X, y)# 3. 打印支持向量的数量和具体向量
print(f"Number of support vectors: {len(linear_svm.support_vectors_)}")
print(f"Support vectors:\n {linear_svm.support_vectors_}")# 4. 可视化决策边界
plot_decision_boundary(linear_svm, X, y)

分析:你会看到一条清晰的直线将两类点完美分开,并且有几个点(支持向量)刚好落在间隔边界上。

场景二:非线性数据的分类与核函数选择
from sklearn.datasets import make_moons# 1. 生成月亮形状的非线性数据
X_moon, y_moon = make_moons(n_samples=100, noise=0.1, random_state=0)# 2. 尝试用线性SVM解决 (效果会很差)
linear_svm_moon = svm.SVC(kernel='linear')
linear_svm_moon.fit(X_moon, y_moon)
print("\n--- Trying Linear SVM on Moons ---")
plot_decision_boundary(linear_svm_moon, X_moon, y_moon)# 3. 使用RBF核的SVM解决
rbf_svm_moon = svm.SVC(kernel='rbf', gamma='auto') # 'auto' gamma=1/n_features
rbf_svm_moon.fit(X_moon, y_moon)
print("\n--- Trying RBF SVM on Moons ---")
plot_decision_boundary(rbf_svm_moon, X_moon, y_moon)

分析

  • 第一张图显示,线性SVM无法处理这种月亮形状的数据,分类效果很差。
  • 第二张图显示,使用了RBF核的SVM成功地创建了一条平滑的曲线边界,完美地分开了数据。这就是核技巧的威力。
场景三:超参数调优(C 和 gamma)

让我们看看 Cgamma 如何影响决策边界。

from sklearn.datasets import make_circles# 1. 生成环形数据,更具挑战性
X_circle, y_circle = make_circles(n_samples=100, noise=0.1, factor=0.5, random_state=1)# 2. 定义不同的超参数组合
models = (svm.SVC(kernel='rbf', C=0.1, gamma=0.1),svm.SVC(kernel='rbf', C=1, gamma=0.1),svm.SVC(kernel='rbf', C=1, gamma=10),svm.SVC(kernel='rbf', C=100, gamma=10),
)# 3. 训练并可视化
for clf in models:clf.fit(X_circle, y_circle)print(f"\n--- C={clf.C}, gamma={clf.gamma} ---")plot_decision_boundary(clf, X_circle, y_circle)

分析

  • C=0.1, gamma=0.1: gamma较小,C也小,边界非常平滑,但似乎有点过于简单(欠拟合)。
  • C=1, gamma=0.1: 增加了C,边界变化不大,仍然很平滑。
  • C=1, gamma=10: gamma变得很大,C适中。边界开始变得非常崎岖,紧紧地围绕着数据点,有过拟合的风险。每个点的影响范围变小了。
  • C=100, gamma=10: Cgamma都很大。模型试图将每个点都正确分类(高C),并且决策边界非常复杂(高gamma)。这是典型的过拟合

在实际项目中,我们通常使用GridSearchCV来自动搜索最佳的 Cgamma 组合。

SVM的优缺点

优点 (Pros):

  • 在高维空间中非常有效: 特别是当维度数大于样本数时。
  • 内存效率高: 因为它只使用训练集的一个子集(支持向量)来做决策。
  • 泛化能力强: 通过最大化间隔,SVM倾向于找到一个泛化能力好的解。
  • 非常灵活: 核技巧使其能够适应各种线性和非线性问题。

缺点 (Cons):

  • 训练时间长: 对于大规模数据集,训练速度是一个主要瓶颈。
  • 对参数和核函数敏感: 需要仔细地进行参数调优,否则模型性能会大打折扣。
  • “黑盒”模型: 模型的可解释性不强,难以向非技术人员解释。
  • 对缺失数据敏感: 需要在使用前进行预处理。
http://www.xdnf.cn/news/1160821.html

相关文章:

  • [Python] -项目实战10- 用 Python 自动化批量重命名文件
  • odoo-059 xml中字段上写 domain 和 filter_domain 什么区别
  • 第三章自定义检视面板_创建自定义编辑器类_如何自定义预览窗口(本章进度5/9)
  • Ubuntu 22.04 安装 Jdk 8和 Tomcat (安装包形式)
  • 基于python django的BOSS直聘网站计算机岗位数据分析与可视化系统,包括薪酬预测及岗位推荐,推荐算法为融合算法
  • Sklearn 机器学习 IRIS数据 理解分类报告
  • Nginx IP授权页面实现步骤
  • 分布在内侧内嗅皮层(MEC)的带状细胞对NLP中的深层语义分析有什么积极的影响和启示
  • Zetane:让深度学习不再抽象,一键3D可视化
  • CFD总压边界条件的理解与开发处理
  • 深入解析 Linux 硬链接与软链接:原理、区别及应用场景
  • 用户虚拟地址空间布局架构
  • C语言:20250721笔记
  • 日历类生辰八字九九三伏入梅出梅算法
  • 【用unity实现100个游戏之34】使用环状(车轮)碰撞器(Wheel Collider)从零实现一个汽车车辆物理控制系统,实现一个赛车游戏
  • PHP反序列化漏洞详解
  • 悬镜安全将受邀参加2025开放原子开源生态大会
  • 进程资源分配的安全性判断与安全序列
  • A316-Mini-V1:超小尺寸USB高清音频解码器模组技术探析
  • 基于Vue与CloudBase AI Toolkit的色觉识别Web应用开发报告:VibeCoding新范式实践
  • C#/.NET/.NET Core技术前沿周刊 | 第 47 期(2025年7.14-7.20)
  • 【前端状态更新与异步协调完全指南:React、Vue架构原理与复杂业务场景实战】
  • Django关于ListView通用视图的理解(Cursor解释)
  • RBAC(Role-Based Access Control,基于角色的访问控制)介绍(一种通过角色来管理用户权限的访问控制模型)
  • Spring Boot 集成 RabbitMQ:普通队列、延迟队列与死信队列全解析
  • 微信小程序服务端快速对接指南(java版)
  • Taro 路由相关 API 详解与实战
  • OpenCV学习(二)-二维、三维识别
  • opencv无法读取视频
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pytest’问题