我整理了《BAT常见机器学习算法面试题1000题》,供大家学习和参考。资源获取方式:
第1步:
打开v搜索:医学大数据与人工智能,并关注。
第2步:
在对话框中输入:E001,即可获取资源地址。
支持向量机的数学推导
考虑一个二元分类问题,有两个类别,标记为+1和-1。我们有一个包含输入特征向量X和它们对应的类别标签Y的训练数据集。线性超平面的方程可以写成:
向量w代表超平面的法向量,即垂直于超平面的方向。方程中的参数b代表超平面沿法向量w从原点的偏移或距离。数据点x_i与决策边界之间的距离可以计算为:
其中,||w||代表权重向量w的欧几里得范数,即法向量w的欧几里得范数。
对于线性支持向量机分类器:
优化
对于硬间隔线性支持向量机分类器:
这个语句中,第i个训练实例的目标变量或标签用符号ti表示。对于负实例(当yi=0时),ti=-1,对于正实例(当yi=1时),ti=1。因为我们需要满足约束条件的决策边界:
对于软边界线性支持向量机分类器:
对偶问题:需要找到与支持向量相关的拉格朗日乘子的优化问题的对偶问题可用于解决支持向量机问题。最大化以下对偶目标函数的最优拉格朗日乘子α(i):
其中,αi 是与第i个训练样本相关的拉格朗日乘子。
K(xi, xj) 是核函数,计算两个样本xi和xj之间的相似性。它允许SVM通过隐式地将样本映射到更高维的特征空间来处理非线性分类问题。
术语∑αi 表示所有拉格朗日乘子的总和。
一旦解决了对偶问题并找到了最优的拉格朗日乘子,就可以用这些最优的拉格朗日乘子和支持向量来描述SVM的决策边界。那些具有i > 0的训练样本是支持向量,而决策边界由以下方式提供:
支持向量机的类型
根据决策边界的性质,支持向量机(Support Vector Machines,SVM)可以分为两个主要类型:
线性支持向量机(Linear SVM):线性SVM使用线性决策边界来分离不同类别的数据点。当数据可以被精确地线性分离时,线性SVM非常适用。这意味着单一的直线(在2D中)或者超平面(在更高维度中)可以完全将数据点分成它们各自的类别。决策边界是使类别间间隔最大化的超平面。
非线性支持向量机(Non-Linear SVM):非线性SVM用于分类那些不能被一条直线(在2D情况下)分割为两类的数据。通过使用核函数,非线性SVM可以处理非线性可分的数据。这些核函数将原始输入数据转换为更高维的特征空间,在该空间中,数据点可以线性分离。然后,在这个修改后的空间中使用线性SVM来确定非线性决策边界。
这两种类型的SVM分别适用于线性可分和非线性可分的数据情况,使其成为强大的分类器之一。选择使用哪种类型的SVM取决于数据的性质和问题的要求。如果数据可以被直线分隔,那么线性SVM通常是一个不错的选择。如果数据是非线性可分的,那么非线性SVM通过核函数提供了一种有效的解决方案。
SVM中常用的核函数
SVM核函数是一个函数,它将低维输入空间转化为高维空间,也就是将不可分问题转化为可分问题。它在非线性分离问题中非常有用。简单来说,核函数进行一些极其复杂的数据转换,然后根据定义的标签或输出,找出了将数据分开的过程。核函数的主要作用是将数据映射到一个更高维度的空间,以便在该空间中找到一个线性或非线性的决策边界,从而能够有效地解决非线性可分问题。不同类型的核函数可以适用于不同类型的数据和问题,以提高SVM在各种应用中的性能。
SVM的优点
在高维情况下效果显著。
由于它使用决策函数中的一部分训练点,称为支持向量,因此其内存效率高。
可以为决策函数指定不同的核函数,还可以指定自定义核函数。
Python中SVM的实现
预测癌症是良性还是恶性。使用癌症患者的历史数据使医生能够区分恶性病例和良性病例。
步骤
- 从sklearn.datasets加载乳腺癌数据集
- 分离输入特征和目标变量。
- 构建和训练使用RBF核的SVM分类器。
- 绘制输入特征的散点图。
- 绘制决策边界。
# Load the important packages
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.svm import SVC
# Load the datasets
cancer = load_breast_cancer()
X = cancer.data[:, :2]
y = cancer.target
#Build the model
svm = SVC(kernel="rbf", gamma=0.5, C=1.0)
# Trained the model
svm.fit(X, y)
# Plot Decision Boundary
DecisionBoundaryDisplay.from_estimator(
svm,
X,
response_method="predict",
cmap=plt.cm.Spectral,
alpha=0.8,
xlabel=cancer.feature_names[0],
ylabel=cancer.feature_names[1],
)
# Scatter plot
plt.scatter(X[:, 0], X[:, 1],
c=y,
s=20, edgecolors="k")
plt.show()