SVM-核函数

SVM在处理非线性数据时通过核函数将数据映射到高维空间,使得原本线性不可分的问题在高维空间变得可分。本文介绍了多项式和高斯核函数,以及如何使用坐标上升法的SMO算法解决SVM的对偶问题。同时,为处理outliers,引入了松弛变量δi,保证模型对异常值的鲁棒性。

1.1 SVM非线性可分-核函数
在上一章节中,我们首先假设数据在原始空间上是线性可分的,在这样的前提条件下,我们知道如何求解最大间隔分类器 f(x)=wTx+b=mi=1αiy(i)<x(i),x>+b 。但实际上,大多数情况下,数据可能并不是线性可分,你无法在原始数据空间上寻找到这样一条分类超平面,使得数据线性可分。

比如,下面这个例子,很明显蓝色点和红色点应该被归类为两个类别,数据本身又是线性不可分的。但是很容易想到,一个理想的分类界面应该是位于两类数据中心的“圆”而不是直线。(转自:http://blog.youkuaiyun.com/v_july_v/article/details/7624837
这里写图片描述

那么尝试将这个假想的分界面用数学表达进行描述。如果以 X,Y 表示二维空间的两个坐标,那么分界面圆的方程可以表示为,

a1X+a2X2+a3Y+a4Y2+a5XY+a6=0

有趣的是,我们可以通过构造另外一个五维度的空间,且其各个坐标值分别为, Z1=X,Z2=X2,Z3=Y,Z4=Y2,Z5=XY ,那么上面的式子可以表达为,
i=15aiZi+a6=a1Z1+a2Z2+a3Z3+a4Z4+a5Z5+a6=0

显然在新构造的五维空间下,这个“圆”分界面变成线性的了!那么,可以考虑,如果将所有原始空间的数据通过映射关系: :R2R5 ,从原始的二维空间映射为五维空间,数据将有可能变成线性可分的。
(X,Y)=[X,X2,Y,Y2,XY]T

++++++
如果数据在变换后的高维空间(在上面的例子中是五维度)上是线性可分的,那么我们就可以在这个变换的空间上采用线性SVM计算最优间隔分类器对数据进行分类处理了。SVM在处理线性可分数据时分类器形式为,

f(x)=i=1mαiy(i)<x(i),x>+b

假设映射关系 (x) 可以将原始数据映射到特征空间F,且在该空间下,数据是线性可分的,那么在这个空间上的SVM分类器就表示为,

f(x)=i=1mαiy(i)<(x(i)),(x)>+b
SVM - linear 即支持向量机的线性核函数(linear),它是支持向量机(SVM)中一种重要的核函数。线性核函数是最简单的核函数形式,其表达式为 \(K(x_i, x_j) = x_i^T x_j\),也就是两个向量的点积。 线性核函数适用于数据是线性可分或者近似线性可分的情况。使用线性核函数SVM 模型在训练时,会在特征空间中寻找一个最优的超平面,使得不同类别的数据点能够被最大程度地分开,这个超平面就是分类的决策边界。相比于其他核函数,如多项式核函数(poly)和高斯径向基核函数(rbf),线性核函数计算简单、训练速度快,尤其是在处理大规模数据集时,优势更为明显。 在垃圾邮件分类中,SVM - linear 函数有着广泛的应用。垃圾邮件分类本质上是一个二分类问题,即判断一封邮件是垃圾邮件还是正常邮件。通常会将邮件的各种特征(如邮件内容中的关键词、发件人信息、邮件格式等)提取出来,将其转化为特征向量。由于邮件的特征和类别之间可能存在线性关系,所以可以使用线性核函数SVM 模型来进行分类。 具体应用过程如下: 1. **数据预处理**:收集大量的邮件数据,将其分为垃圾邮件和正常邮件两类。对邮件进行特征提取,例如统计邮件中某些特定关键词的出现频率等,将每封邮件转化为一个特征向量。 2. **模型训练**:使用训练数据集,通过 SVM - linear 函数训练一个分类模型。在训练过程中,模型会根据线性核函数计算样本之间的相似度,寻找最优的超平面。 3. **模型评估**:使用测试数据集对训练好的模型进行评估,计算模型的准确率、召回率等指标,评估模型的分类性能。 4. **分类预测**:对于新收到的邮件,提取其特征向量,输入到训练好的模型中,模型会根据超平面进行分类,判断该邮件是否为垃圾邮件。 ```python from sklearn import svm from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as np # 假设 X 是邮件的特征矩阵,y 是对应的标签(0 表示正常邮件,1 表示垃圾邮件) X = np.random.rand(100, 10) # 示例特征矩阵 y = np.random.randint(0, 2, 100) # 示例标签 # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建并训练 SVM - linear 模型 model = svm.SVC(kernel='linear') model.fit(X_train, y_train) # 预测测试集 y_pred = model.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f"模型准确率: {accuracy}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值