七天学完十大机器学习经典算法-06.支持向量机(SVM):分类边界的艺术——深入浅出指南

 

接上一篇《七天学完十大机器学习经典算法-05.从投票到分类:K近邻(KNN)算法完全指南》

想象你要在操场上为两个班级划活动区域,如何画出一条最公平的分界线?这条线不仅要分开两班学生,还要让两个班都离分界线尽可能远——这就是支持向量机的核心思想。

一、SVM是什么?为什么它是"艺术"?

支持向量机(Support Vector Machine, SVM) 是机器学习中最强大且最受欢迎的监督学习算法之一,主要用于分类任务,也可用于回归(称为SVR)。它被誉为"分类边界的艺术",源于其独特的目标:寻找最优分类超平面,最大化类别间的边界(Margin)

SVM的核心哲学
  1. 追求最大间隔:不同于其他算法只关注分类正确,SVM致力于找到一条"最宽的道路"来分隔类别,提升模型的泛化能力(处理新数据的能力)。

  2. 关注关键样本:SVM的决策边界仅由少数关键样本点决定,这些点被称为支持向量——它们像柱子一样"支撑"起分类的边界道路。

  3. 应对复杂边界:通过核技巧(Kernel Trick),SVM能在高维空间中轻松找到线性分界面,解决原始低维空间中的非线性问题。

(图1:SVM的核心目标是找到间隔最大的超平面,支持向量是位于间隔边界上的样本点)

二、从线性可分到线性不可分:SVM的演进之路

场景1:完美线性可分(硬间隔SVM)

问题:假设我们有一组学生数据,特征只有两个:平均每天学习时间(小时)每周出勤率(%)。目标是根据这些预测该学生是否可能通过考试(是/否)。数据点在二维平面上线性可分

目标:找到一条直线(在更高维是超平面w·x + b = 0,完美分开两类,并使得间隔(Margin) 最大化。

  • 决策函数f(x) = sign(w·x + b)

    • 若 w·x + b >= 1,预测为类别+1(通过)

    • 若 w·x + b <= -1,预测为类别-1(未通过)

  • 间隔:两条虚线 w·x + b = 1 和 w·x + b = -1 之间的距离。数学计算得出:间隔 = 2 / ||w||

  • 优化目标:最大化间隔等价于最小化 ||w||² / 2(为了后续优化方便)。

约束条件:所有训练样本必须分类正确且位于间隔边界之外(或之上)。

  • 对于类别+1的样本:w·x_i + b >= 1

  • 对于类别-1的样本:w·x_i + b <= -1

  • 合并为:y_i(w·x_i + b) >= 1(其中 y_i 是样本的类别标签,取值为+1或-1)

支持向量:是那些满足 y_i(w·x_i + b) = 1 的样本点。它们直接决定了决策边界的位置和方向。即使删除其他所有样本,只保留支持向量,SVM得到的决策边界也不会改变。

# 线性可分SVM示例 (Python伪代码)
from sklearn.svm import SVC# 假设X_train是特征[[学习时间, 出勤率], ...], y_train是标签[1, -1, ...]
model = SVC(kernel='linear', C=1000)  # C设置很大,近似"硬间隔"
model.fit(X_train, y_train)# 获取支持向量
support_vectors = model.support_vectors_
print("支持向量坐标:", support_vectors)# 获取决策边界参数 w 和 b
w = model.coef_[0]
b = model.intercept_[0]
print(f"决策边界方程: {w[0]:.2f}*学习时间 + {w[1]:.2f}*出勤率 + {b:.2f} = 0")
场景2:近似线性可分(软间隔SVM)

现实挑战:真实数据往往存在噪声或些许重叠,严格线性可分(硬间隔)会导致模型过拟合、非常敏感,甚至无解。

解决方案软间隔(Soft Margin)SVM。允许一些样本点违反 y_i(w·x_i + b) >= 1 的约束,即允许它们进入间隔内部甚至被错误分类,但要受到惩罚。

  • 引入松弛变量(Slack Variables)ξ_i >= 0

    • ξ_i = 0:样本点满足硬间隔约束。

    • 0 < ξ_i < 1:样本点位于间隔内部,但分类正确。

    • ξ_i >= 1:样本点被错误分类。

  • 修改约束条件y_i(w·x_i + b) >= 1 - ξ_i

  • 修改优化目标:在最小化 ||w||² / 2(最大化间隔)的同时,也要最小化所有松弛变量的总和(惩罚分类错误),即:最小化: ||w||² / 2 + C * Σξ_i

    • C:惩罚参数(关键超参数!)

      • C 很大(如1000):对分类错误的惩罚很重。模型倾向于更小的训练错误(间隔可能变窄),可能过拟合。

      • C 很小(如0.1):对分类错误的惩罚很轻。模型允许更多训练错误(间隔可能变宽),提高泛化能力,可能欠拟合。

支持向量:在软间隔SVM中,支持向量包括:

  1. 位于间隔边界上的样本点(y_i(w·x_i + b) = 1)。

  2. 位于间隔内部的样本点(0 < y_i(w·x_i + b) < 1)。

  3. 被错误分类的样本点(y_i(w·x_i + b) < 0)。

# 软间隔SVM示例 - 调整C值
model_low_C = SVC(kernel='linear', C=0.1)  # 容忍更多错误,宽间隔
model_high_C = SVC(kernel='linear', C=10) # 容忍更少错误,窄间隔model_low_C.fit(X_train, y_train)
model_high_C.fit(X_train, y_train)# 可视化两种C值下的决策边界和间隔 (通常需要matplotlib)
# ... 代码会显示C越大边界越曲折,C越小边界越平滑 ...
场景3:完全线性不可分(核技巧与非线性SVM)

问题:如果我们的学生数据分布如下图所示,无法用一条直线分开"通过"和"未通过"的学生呢?

SVM的魔法:核技巧(Kernel Trick)

  1. 核心思想:将原始低维空间中的非线性可分数据,通过一个非线性映射函数Φ,转换到一个高维(甚至无限维)的特征空间中。在这个高维空间中,数据变得线性可分(或近似线性可分)!

  2. 关键优势(核技巧的精髓):SVM的优化目标和决策函数都只依赖于样本点之间的内积(Dot Product) <x_i, x_j>。我们不需要显式计算高维空间中的复杂映射Φ(x),也不需要知道Φ(x)的具体形式。我们只需要定义一个核函数(Kernel Function) K(x_i, x_j),它等于高维空间中的内积<Φ(x_i), Φ(x_j)>

    • 优化目标变为:最大化 Σα_i - 1/2 ΣΣα_i α_j y_i y_j K(x_i, x_j)

    • 决策函数变为:f(x) = sign( Σα_i y_i K(x_i, x) + b )

  3. 常用核函数

    • 线性核(Linear Kernel)K(x_i, x_j) = x_i·x_j。就是原始空间的内积,用于线性情况。

    • 多项式核(Polynomial Kernel)K(x_i, x_j) = (γ * x_i·x_j + r)^dd控制多项式阶数,γ, r是参数。能学习d阶多项式决策边界。

    • 径向基函数核(RBF Kernel / 高斯核)K(x_i, x_j) = exp(-γ * ||x_i - x_j||²)最常用! γgamma)控制高斯函数的宽度,决定单个样本的影响范围。γ大,影响范围小,决策边界曲折(可能过拟合);γ小,影响范围大,决策边界平滑(可能欠拟合)。

    • Sigmoid核K(x_i, x_j) = tanh(γ * x_i·x_j + r)。效果类似神经网络。

它避免了直接进行高维计算的巨大开销,仅通过在原空间计算核函数K就等效实现了高维空间中的线性分类。这是SVM处理非线性问题的关键。

# 非线性SVM示例 (使用RBF核)
from sklearn.datasets import make_circles
import matplotlib.pyplot as plt# 创建环形可分数据 (二维线性不可分)
X, y = make_circles(n_samples=100, noise=0.1, factor=0.5, random_state=42)# 使用线性SVM (注定失败)
linear_svm = SVC(kernel='linear').fit(X, y)
# 使用RBF核SVM
rbf_svm = SVC(kernel='rbf', gamma=1, C=1).fit(X, y)# 可视化结果
def plot_decision_boundary(model, X, y, title):# ... 创建网格点 ...# ... 预测网格点类别 ...plt.contourf(xx, yy, Z, alpha=0.3)  # 绘制决策区域plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)  # 绘制样本点plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1],s=100, facecolors='none', edgecolors='k')  # 标出支持向量plt.title(title)plt.show()plot_decision_boundary(linear_svm, X, y, "Linear Kernel (Fails)")
plot_decision_boundary(rbf_svm, X, y, "RBF Kernel (Succeeds)")

三、SVM实战:手把手解决真实问题

案例1:鸢尾花分类(经典数据集再战)

目标:根据花萼和花瓣的长度、宽度(4个特征),区分山鸢尾、变色鸢尾、维吉尼亚鸢尾(3类)。SVM天然处理二分类,但可通过"一对一"或"一对多"策略处理多类。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report
from sklearn.preprocessing import StandardScaler  # 重要!# 1. 加载数据
iris = load_iris()
X = iris.data
y = iris.target# 2. 特征标准化 (SVM对特征尺度敏感!)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 3. 划分训练集/测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)# 4. 创建SVM模型 (使用RBF核,并调整关键参数)
svm_model = SVC(kernel='rbf', C=1.0, gamma='scale')  # 'scale'是gamma的默认值,1/(n_features * X.var())
# 也可以尝试 GridSearchCV 寻找最优C和gamma# 5. 训练模型
svm_model.fit(X_train, y_train)# 6. 预测测试集
y_pred = svm_model.predict(X_test)# 7. 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集准确率: {accuracy:.4f}")
print("\n分类报告:\n", classification_report(y_test, y_pred))# 8. 查看支持向量 (每个类都可能有多支持向量)
print("支持向量数量:", len(svm_model.support_vectors_))

关键点

  1. 特征标准化必不可少:SVM基于距离(核函数常基于距离如RBF),不同特征量纲差异会极大影响结果。StandardScaler使每个特征均值为0,标准差为1。

  2. 参数调优Cgamma(对于RBF核)是核心超参数。通常使用网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV)寻找最优组合。

案例2:手写数字识别(MNIST数据集简化版)

目标:识别0-9的手写数字图片(28x28像素=784维特征)。

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt# 1. 加载简化版MNIST (8x8像素)
digits = load_digits()
X = digits.data
y = digits.target# 2. 划分训练集/测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 3. SVM参数网格搜索 (小范围示例,实际需要更广范围/交叉验证)
param_grid = {'C': [0.1, 1, 10], 'gamma': [0.001, 0.01, 0.1], 'kernel': ['rbf']}
grid_search = GridSearchCV(SVC(), param_grid, cv=3, n_jobs=-1, verbose=2)
grid_search.fit(X_train, y_train)# 4. 最优模型
best_svm = grid_search.best_estimator_
print("最优参数:", grid_search.best_params_)# 5. 预测测试集
y_pred = best_svm.predict(X_test)# 6. 评估
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集准确率: {accuracy:.4f}")
print("\n混淆矩阵:\n", confusion_matrix(y_test, y_pred))# 7. 可视化一些预测结果和支持向量 (支持向量在高维空间,难以直接可视化784维)
plt.figure(figsize=(10, 8))
for i in range(10):plt.subplot(2, 5, i + 1)plt.imshow(X_test[i].reshape(8, 8), cmap='gray')plt.title(f"Pred: {y_pred[i]}, True: {y_test[i]}")plt.axis('off')
plt.tight_layout()
plt.show()

注意

  • 实际MNIST(28x28)维度更高,计算量更大。SVM在中小型数据集上表现优异,但对于超大规模数据集(如ImageNet),训练会非常慢,此时深度学习的CNN更高效。

  • 特征标准化(如MinMaxScaler缩放到[0, 1])在这里也很有帮助,因为像素值范围是[0, 16]。

  • 支持向量在高维空间(这里是64维),难以像二维案例那样直观展示。

四、SVM的优缺点:看清手中的利剑

优点
  1. 强大的分类性能:尤其在中小型数据集、特征维度不太高的情况下,常常能取得非常高的准确率。

  2. 理论完备性:基于坚实的统计学习理论(VC维、结构风险最小化),泛化误差有界。

  3. 高维数据处理有效:即使特征数量远大于样本数量(如文本分类),核技巧也能有效工作。

  4. 内存效率高:决策函数仅依赖于支持向量。预测新样本时,只需计算它与支持向量的核函数值。

  5. 灵活性:通过选择不同的核函数(kernel),可以构造各种复杂的非线性决策边界,适应不同问题。C参数提供对错误分类和模型复杂度的控制。

  6. 对特征相关性不敏感:不像线性回归等对特征多重共线性敏感。

缺点
  1. 训练时间复杂度高:标准的SVM训练算法复杂度通常在 O(n²) 到 O(n³) 之间(n是样本数)。对于大型数据集(>10万样本)训练非常慢

  2. 参数选择(C, gamma)敏感:参数选择对模型性能影响巨大,需要仔细调优(如网格搜索)。结果解释性不如决策树或线性模型直观。

  3. 难以直接输出概率估计:虽然可以通过Platt缩放等方法得到概率估计(SVC(probability=True)),但其可靠性通常不如逻辑回归。

  4. 对缺失数据和噪声敏感:训练前需要仔细处理缺失值和异常值。

  5. 核函数选择依赖经验:选择最合适的核函数及其参数需要领域知识和实验。

  6. 二分类原生设计:处理多类分类需要额外策略(OvO, OvR),增加计算开销。

五、SVM最佳实践指南

  1. 数据预处理是王道

    • 标准化/归一化StandardScalerMinMaxScaler是SVM前必须的步骤。

    • 处理缺失值:删除或填充缺失值。

    • 处理异常值:SVM(尤其是大C值)对异常值敏感。

  2. 从简单模型开始:先尝试线性核(kernel='linear'。如果效果不佳,再考虑非线性核(如RBF)。线性SVM通常更快、更容易解释。

  3. 核心超参数调优

    • C (惩罚参数):尝试对数间隔值(如0.001, 0.01, 0.1, 1, 10, 100)。使用交叉验证评估。

    • gamma (RBF核参数):尝试对数间隔值(如0.001, 0.01, 0.1, 1, 10, 100)。gamma='scale'(默认)或gamma='auto'是好的起点。gamma 和 C 需要联合调优! 务必使用GridSearchCVRandomizedSearchCV

  4. 核函数选择策略

    • 特征多/样本大/疑似线性:先用线性核

    • 样本数中等/特征间关系复杂:首选RBF核(高斯核),灵活强大。

    • 特征有明确阶数关系:可试多项式核(需调degree)。

  5. 利用高效算法

    • 对于大型线性SVM,考虑使用LinearSVC(基于liblinear库),它通常比SVC(kernel='linear')(基于libsvm)更快,尤其支持penalty='l1'(稀疏解)或penalty='l2'

    • 对于大型非线性SVM,可考虑近似算法或采样技术,但深度网络可能是更好的选择。

  6. 理解支持向量:查看支持向量的数量和分布,有助于理解模型的复杂度和决策依据。

  7. 多类分类策略SVC默认采用"一对一"(OvO)。对于特别多的类别,"一对多"(OvR)可能更快,但SVC通常自动处理得很好。

六、SVM在现实世界中的闪光点

  1. 文本分类与情感分析:SVM(特别是线性核)是文本分类(垃圾邮件识别、新闻主题分类)的历史王者之一。TF-IDF特征 + 线性SVM是经典组合。

  2. 图像识别

    • 传统方法:HOG(方向梯度直方图)特征 + SVM用于行人检测、物体识别。

    • 深度学习时代:SVM有时用作CNN提取特征后的分类器(虽然现在多被全连接层替代)。

  3. 生物信息学

    • 基因微阵列数据分析(癌症亚型分类)。

    • 蛋白质结构/功能预测。

  4. 金融风控

    • 信用评分(预测用户违约风险)。

    • 欺诈交易检测(识别异常模式)。

  5. 医学诊断:基于医学影像(X光、MRI)或病理数据的辅助诊断。

结语:边界艺术的永恒魅力

支持向量机(SVM)以其优雅的数学形式(最大间隔优化)、巧妙的工程实现(核技巧)以及在众多领域展现出的强大分类能力,牢牢占据着机器学习"十大经典算法"的重要席位。它教会我们:

  • 大道至简:最鲁棒的决策往往存在于最宽阔的边界之中(最大间隔原则)。

  • 关键少数:系统的核心特性常常由少数关键元素决定(支持向量)。

  • 视角转换:在低维空间无解的难题,转换到高维视角可能豁然开朗(核技巧)。

虽然深度神经网络在诸多领域风头正劲,但在数据量适中、特征维度可控、追求强解释性和高精度的场景下,SVM依然是工程师和科学家手中一把锋利而可靠的"大杀器"。理解SVM的原理和实践,不仅能掌握一项强大的工具,更能深刻领悟机器学习中关于泛化、复杂性与计算效率的永恒平衡艺术。

创作不易,如有收获请点🌟收藏加关注啦!下期预告:《七天学完十大机器学习经典算法-07.朴素贝叶斯:概率思维的智慧——从“拼线索”到精准预测的完全指南》

上一篇《七天学完十大机器学习经典算法-05.从投票到分类:K近邻(KNN)算法完全指南》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87133.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python如何安装PyQt6-stubs依赖包

PyQt6-stubs 是为 PyQt6 提供类型提示&#xff08;Type Hints&#xff09;和 IDE 智能补全支持的第三方补丁包&#xff0c;特别适用于 PyCharm、VS Code 等现代 IDE。它对开发者在编码时帮助极大。 一、安装方法 需要提前安装好git&#xff0c;然后克隆PyQt6-stubs源码&#xf…

创宇智脑 MCP 赋能 AiPy,IP 风险调查效率实现 10 倍飞跃,威胁分析一键生成

还记得上个月那个焦头烂额的凌晨三点吗&#xff1f;监控大屏突然疯狂闪烁&#xff0c;500 多个 IP 地址同时出现异常访问&#xff0c;密密麻麻的数据流在屏幕上跳动&#xff0c;像极了一张让人窒息的大网。我和团队成员瞪着布满血丝的眼睛&#xff0c;手动排查每一个 IP&#x…

使用SRS+ffmpeg实现https推流flv

1修改SRS的live.conf配置如下&#xff1a; # Live streaming config for SRS. # see full.conf for detail config.listen 1935; max_connections 1000; srs_log_tank console; daemon off;http_api {enabled on;listen …

力扣网编程题:合并两个有序数组(双指针解法)

一. 简介 上一篇文章对"合并两个有序数组"题目&#xff0c;使用了暴力解法&#xff0c;算法时间复杂度比较高。文章如下&#xff1a; 力扣网编程题&#xff1a;合并两个有序数组&#xff08;直接解法&#xff09;-CSDN博客 本文满足进阶要求&#xff0c;算法时间复…

数据结构之 【树的简介】(树的(相关)概念、二叉树的概念、部分性质、满二叉树、完全二叉树)

目录 1.树的概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.4树在实际中的应用 2.二叉树概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4应用题 1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;由 n&#xff08;n…

Redis-7.4.3-Windows-x64下载安装使用

Redis软件包下载地址链接&#xff1a;https://github.com/redis-windows/redis-windows/releases 检查或者修改配置文件redis.conf&#xff1a; #如果允许外部其他主机访问本机redis&#xff0c;设置成&#xff1a;bind 0.0.0.0 bind 127.0.0.1 protected-mode yes #设置端口…

Educational Codeforces Round 180 (Rated for Div. 2)

AB 略 C 对于axayaz>max(2*az,an)&#xff0c;枚举y z 二分x D 首先&#xff0c;长度为1的边的已经有n-1条&#xff0c;那么构造的图中只能存在一条长度为2的好边。我们先构造出一个图只存在n-1条好边&#xff0c;我们发现对于一个点所有连接它的边要不均指向它要不均背…

CAD文件处理控件Aspose.CAD教程:在 Python 中将 DGN 文件转换为 PDF

概述 将DGN文件转换为PDF对许多行业至关重要&#xff0c;包括工程和建筑行业。能够轻松地以 PDF 格式共享设计&#xff0c;增强协作和可访问性。通过使用Aspose.CAD for Python via .NET的强大功能&#xff0c;开发人员可以高效地自动化此过程。这款 CAD 转换器 SDK 简化了转换…

宁德时代携手问界,以“厂中厂”模式加速扩产

6月30日&#xff0c;宁德时代在赛力斯超级工厂的两条CTP2.0高端电池包产线正式投产。这是宁德时代在重庆布局的首个基地&#xff0c;并首次采用“厂中厂”合作模式&#xff0c;为问界系列车型本地化生产供应动力电池系统。重庆市、四川省广安市有关负责人&#xff0c;赛力斯集团…

工作中常用的Git操作命令(一)

说明 时间过得真快&#xff0c;一转眼吗喽也是好歹工作几年了&#xff0c;把这些年平时用的git命令整理记录一下&#xff0c;分几个文章&#xff0c;囊括了常用的命令&#xff0c;工作日常很多时候都是使用svn&#xff0c;回到宿舍自己的项目才是git&#xff0c;就问你离不离谱…

2.2.5 Windows系统日志管理

文章目录 一、试题及考试说明二、操作步骤1. 在计算机策略中&#xff0c;启用安装程序的日志记录&#xff0c;并且配置日志大小最大10M&#xff0c;日志存储位置为D:\kaoshi_3\2.2.5\&#xff1b;2. 查询安全日志中登录失败的日志信息&#xff0c;并导出保存在D:\kaoshi_3\2.2.…

AiPy实战(7):一键生成天气组件,解放UI设计的双手

在传统 UI 开发流程中&#xff0c;界面设计与实现往往是一项高度依赖人工投入的系统性工作。从页面布局架构搭建、图标元素精确定位&#xff0c;到响应式设计适配&#xff0c;仅基础样式表&#xff08;CSS&#xff09;的编写就可能涉及数十行甚至上百行代码。​ 随着智能开发工…

解读32页大数据中心运营管理整体规划方案【附全文阅读】

该文档为大数据中心运营管理整体规划方案&#xff0c;聚焦于构建高效规范的运营管理体系。方案提出以 “敏前台、稳中台、强后台” 为框架&#xff0c;构建覆盖全角色、全过程、全周期、全要素的一体化 IT 运营管控体系&#xff0c;采用 “11N” 运营模式&#xff0c;明确业主、…

Pyhton-EXCEL与Mysql数据对比

该段代码主要实现从数据库和 Excel 文件中读取数据&#xff0c;并对两者进行字段匹配&#xff0c;最终找出 Excel 中未匹配到的数据库记录。功能如下&#xff1a; [sqlSelect()]&#xff1a;连接 MySQL 数据库并查询比价单及其商品信息。[BiJiaDaoChu()]&#xff1a;调用外部 …

InnoDB索引

1、索引的建立 / 数据的存储 一条条数据存储到页中后&#xff0c;各个数据页组成了一个双向链表&#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表。此时&#xff0c;如果我想根据主键值查询一条记录&#xff0c;只能从第一个数据页开始一个页一个页…

[考研408数据结构]王道大题暑假自用复习记录(每日更新...)

DAY1 2025年6月29日 雨转晴&#x1f327;&#x1f324; 第二章 线性表 2.2线性表的顺序表示 1、从顺序表中删除具有最小值的元素&#xff08;假设唯一&#xff09;并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信…

vue2 el-select下拉选择框 点击其他位置或者弹窗关闭下拉框/点击取消时,下拉框变成之前的值

1.elSelect点击空白处无法收起下拉框&#xff08;失去焦点并隐藏&#xff09; // 定义指令 directives: {clickOutside: {bind: function (el, binding, vnode) {el.clickOutsideEvent function (event) { // here I check that click was outside the el and his childrensif…

MYSQL-JAVAweb1

1.登录 在黑框中输入 net start mysql // 启动mysql服务 net stop mysql // 停止mysql服务1.MySQL数据模型 关系型数据库&#xff1a; 关系型数据库是建立在关系模型基础上的数据库&#xff0c;简单说&#xff0c;关系型数据库是由多张能互相连接的 二维表 组成的数据库 如…

将POD指定具体机器上运行

在Kubernetes中&#xff0c;你可以通过多种方式将Pod调度到指定的节点&#xff08;机器&#xff09;上运行。以下是几种常用的方法及其适用场景&#xff1a; 1. NodeSelector&#xff08;简单标签匹配&#xff09; 通过标签选择器将Pod绑定到具有特定标签的节点。 步骤 为目…

eNSP实验一:IPv4编址及IPv4路由基础

一、实验目的&#xff1a; 配置各路由器上的物理接口的IP地址并实现互联互通配置各路由器的 Loopback 的IP地址并实现互联互通&#xff08;包括备份路由&#xff0c;默认路由&#xff09;图中三个路由器型号为 AR3620。 二、配置物理接口ip 基础配置 设备命名<Huawei>…