支持向量机(SVM):机器学习中的强力分类器

文摘   2024-11-13 15:06   云南  

引言

在机器学习的浩瀚宇宙中,算法如繁星般众多,但有些因其卓越的性能和广泛的应用而熠熠生辉。支持向量机(SVM)便是这样一颗明星。SVM是一种强大的分类算法,它在图像识别、生物信息学和文本分类等多个领域中都发挥着重要作用。本文将带你深入了解SVM的工作原理、优势以及如何在实际问题中应用它。


什么是支持向量机?

支持向量机是一种监督学习算法,主要用于分类问题。其核心思想是找到一个超平面,这个超平面能够将数据集中的不同类别尽可能地分开。这个超平面被称为最大间隔超平面,因为它最大化了两个类别之间的间隔。


SVM的关键概念

1.超平面

在二维空间中,超平面是一个直线;在三维空间中,它是一个平面。在更高维的空间中,它是一个我们难以直观理解的超平面。SVM的目标就是找到这样一个超平面,使得不同类别的数据点被这个超平面分开,并且这个超平面到最近的数据点(支持向量)的距离最大化。

2.支持向量

支持向量是那些位于两个类别边界上的数据点。这些点是至关重要的,因为它们决定了超平面的位置和方向。支持向量是支持向量机(SVM)算法中的一个核心概念。在SVM中,支持向量是那些位于决策边界(即超平面)最近的数据点,它们直接影响到超平面的位置和方向。以下是关于支持向量的详细解释:

定义支持向量是训练数据集中的一部分样本点,它们位于决策边界(超平面)的最近位置。这些点决定了超平面的位置和方向。

作用决定超平面:支持向量是SVM中最关键的数据点,因为它们直接影响到超平面的位置。SVM的目标是最大化支持向量到超平面的距离,从而最大化两个类别之间的间隔。提高泛化能力:通过关注支持向量,SVM可以提高模型的泛化能力。只有支持向量对模型的最终决策有影响,而其他非支持向量的数据点即使发生变化,也不会影响模型的分类结果。

特点位于边界上:支持向量位于两个类别的决策边界上,它们是类别之间的“分界线”。具有最大间隔:支持向量到超平面的距离是所有数据点中最大的,这个距离被称为间隔(margin)。

3.核函数

• SVM的一个强大之处在于它可以通过核函数处理非线性可分的数据。核函数可以将数据映射到高维空间,使得原本在低维空间中线性不可分的数据在高维空间中线性可分。核函数的关键在于它能够计算两个向量在高维空间中的内积,而无需显式地定义映射函数。这样做的好处是避免了直接在高维空间中进行计算,从而节省了计算资源和时间。

以下是一些常用的核函数:

1. 线性核(Linear Kernel):

线性核不进行任何映射,直接计算两个向量的点积。当数据线性可分时,使用线性核是合适的。

2. 多项式核(Polynomial Kernel):

其中, c 是常数项, d 是多项式的度数。多项式核可以将数据映射到更高维的空间,以处理非线性问题。

3. 径向基函数核(Radial Basis Function Kernel,RBF或高斯核):

其中, γ 是一个参数,通常设置为 1/(2σ2) , σ是标准差。RBF核是SVM中最常用的核函数之一,对非线性问题很有效。

4. Sigmoid核:

Sigmoid核类似于神经网络中的激活函数,它试图模拟感知机的学习。

核函数的选择取决于具体问题和数据的性质。在实际应用中,可能需要尝试不同的核函数和参数,以找到最佳的模型性能

4.间隔

• 间隔是指超平面到最近数据点的距离。SVM的目标是最大化这个间隔,这样可以提高分类的鲁棒性,因为如果数据点发生小的扰动,分类结果不会改变。


SVM的工作原理

SVM通过解决一个优化问题来找到最大间隔超平面。这个问题可以被表述为一个二次规划问题,目标是最小化以下函数:

同时满足以下约束条件:

这里,W是超平面的法向量,b是偏置项,Xi是数据点,yi是它们的类别标签。


SVM的优势

高维空间表现良好:SVM通过核技巧可以很好地处理高维数据。

• 泛化能力强:SVM通过最大化间隔来提高模型的泛化能力。

• 适用于小样本数据:SVM不需要大量的数据就能获得较好的分类性能。

• 稀疏解:SVM的解是稀疏的,这意味着只有少数的支持向量决定了超平面的位置。


SVM的应用

SVM在许多领域都有广泛的应用,包括但不限于:

• 图像识别:用于识别图像中的对象。

• 生物信息学:用于基因表达数据的分类。

• 文本分类:用于将文本文档分类到不同的类别。

• 手写识别:用于识别手写数字。


结论

支持向量机是一种强大的分类算法,它以其出色的性能和广泛的应用而闻名。通过理解其工作原理和优势,我们可以更好地利用SVM解决实际问题。随着机器学习技术的不断进步,SVM仍然是一个值得研究和应用的重要工具。


代码实现:

import numpy as npimport cv2from tqdm import tqdmfrom skimage.transform import resize
def transformLabel(label_raw):  #此时类别是两个类 # results = [0, 0] if label_raw == 1: ## results = [0, 1] # elif label_raw == '0': else: results = [1, 0]    return results
def read_data_from_txt(filePath): tmpData = [] tmpLabel = [] resize_format = (256, 256) with open(filePath) as txtData: lines = txtData.readlines() # nn = 0 for line in tqdm(lines, ncols=180, colour='green'): file, label = line.split(',') # print(file) label = int(label) tmpLabel.append(label) img = cv2.imread(file, cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, resize_format) # print(img.shape) # 展平图像 img = img.flatten() tmpData.append(img) # nn = nn + 1 # if nn==aa: # break            # 返回图像路径和标签的列表 return np.array(tmpData), np.array(tmpLabel)

trainpath = r"data\training_set.txt"
testpath = r"data\testing_set.txt"

import timefrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_score, classification_report# 训练模型t1 = time.time()# 加载训练集和测试集的图像数据和标签X_train, y_train = read_data_from_txt(trainpath)X_test, y_test = read_data_from_txt(testpath)# 创建SVM分类器clf = SVC(verbose=1)clf.fit(X_train, y_train)t2 = time.time()traindatatime = t2 - t1print("traindatatime is:", traindatatime)
# 预测测试集t3= time.time()y_pred = clf.predict(X_test)t4 = time.time()testdatatime = t4 - t3
# 计算准确率等性能指标accuracy = accuracy_score(y_test, y_pred)report = classification_report(y_test, y_pred)from sklearn.metrics import roc_curve, roc_auc_scorefpr, tpr, thresholds = roc_curve(y_test, y_pred)auc = roc_auc_score(y_test, y_pred)print(f'fpr: {fpr}')print(f'AUC: {auc}')print(f'tpr: {tpr}')print(f'thresholds: {thresholds}')print(f'Accuracy: {accuracy}')print(f'Classification Report:\n{report}'



海洋遥感Dynamic和AI
海洋遥感(基于光学遥感、合成孔径雷达、卫星测高数据等的海洋现象研究),主要方法为人工智能与海洋动力学的结合,本公粽号将会进行代码、资料,文献等分享。