什么是SVM SVM (support vector machines)即支持向量机。它是一种二分类模型,它将实例的特征向量映射为空间中的一些点,SVM 的目的就是想要画出一条线,以 “最好地” 区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。SVM 适合中小型数据样本、非线性、高维的分类问题。 SVM 最早是由 Vladimir N. Vapnik 和 Alexey Ya. Chervonenkis 在1963年提出,目前的版本(soft margin)是由 Corinna Cortes 和 Vapnik 在1993年提出,并在1995年发表。深度学习(2012)出现之前,SVM 被认为机器学习中近十几年来最成功,表现最好的算法。
SVM基本原理
SVM的基本原理可以总结为以下几个步骤: a. 数据预处理:对数据进行标准化、归一化等操作,使得数据具有相同的尺度和范围。 b. 特征提取:从原始数据中提取出更有意义的特征,以便更好地区分不同类别的样本。 c. 寻找最优超平面:通过优化算法找到一个最优的超平面,使得两个类别之间的间隔最大化。 d. 核技巧:对于非线性可分的情况,使用核函数将数据映射到高维空间,以便在高维空间中找到一个线性可分的超平面。 e. 模型评估和优化:通过交叉验证等方法对模型进行评估和优化。
SVM在机器学习中的应用
SVM算法在机器学习领域有多种应用,包括但不限于以下几个方面: a. 图像分类:SVM可以用于图像分类任务,如人脸识别、物体识别等。通过提取图像的特征并训练SVM模型,可以实现准确的图像分类。 b. 文本分类:SVM在文本分类中也有广泛的应用。通过将文本转换为向量表示,并训练SVM模型,可以对文本进行分类,如垃圾邮件过滤、情感分析等。 c. 生物信息学:SVM在生物信息学中的应用也非常重要。通过将基因表达数据转换为数值特征,并使用SVM模型进行分类或回归分析,可以帮助研究者发现基因与某些疾病之间的联系。 d. 异常检测:SVM可以用于异常检测任务,如网络入侵检测、信用卡欺诈检测等。通过训练SVM模型,可以将正常和异常样本分开,从而实现精确的异常检测。
代码示意
import numpy as np
class SVM:
def __init__(self, C=1.0, kernel='linear', degree=3, gamma='auto'):
self.C = C
self.kernel = kernel
self.degree = degree
self.gamma = gamma
self.alpha = None
self.b = None
self.X = None
self.y = None
def fit(self, X, y):
self.X = X
self.y = y
# Compute the kernel matrix
K = self._compute_kernel(X, X)
# Set up the optimization problem
n_samples = X.shape[0]
P = K * np.outer(y, y)
q = -np.ones(n_samples)
G = np.vstack((np.diag(-np.ones(n_samples)), np.diag(np.ones(n_samples))))
h = np.hstack((np.zeros(n_samples), self.C * np.ones(n_samples)))
A = y.reshape(1, -1)
b = np.zeros(1)
# Solve the optimization problem
from cvxopt import matrix, solvers
solvers.options['show_progress'] = False
alpha = np.ravel(matrix(solvers.qp(matrix(P), matrix(q), matrix(G), matrix(h), matrix(A), matrix(b))['x']))
self.alpha = alpha
# Calculate the intercept
sv = self.alpha > 1e-5
ind = np.arange(len(self.alpha))[sv]
self.b = 0
for i in ind:
self.b += y[i]
self.b -= np.sum(self.alpha * y * K[:, i])
self.b /= len(ind)
def predict(self, X):
# Compute the kernel matrix between the test data and the training data
K = self._compute_kernel(X, self.X)
# Make predictions using the kernel matrix and the support vectors
y_pred = np.dot(K.T, self.alpha * self.y) + self.b
y_pred = np.sign(y_pred)
return y_pred
def _compute_kernel(self, X1, X2):
if self.kernel == 'linear':
K = np.dot(X1, X2.T)
elif self.kernel == 'poly':
K = (np.dot(X1, X2.T) + 1) ** self.degree
elif self.kernel == 'rbf':
if self.gamma == 'auto':
gamma = 1.0 / X1.shape[1]
else:
gamma = self.gamma