机器学习 第六章

一、间隔与支持向量

给定训练样本集D={(x_1,y_1),(x_2,y_2),\cdots ,(x_m,y_m)},y_i\in \left \{ -1,+1 \right \},分类学习最基本的想法是基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开。在样本空间中,划分超平面可通过如下线性方程表示:w^Tx+b=0,w为法向量,决定超平面的方向;b为位移项,决定超平面与原点间的距离。因此可用(w,b)来表示一个超平面。

假设超平面可以对训练样本正确分类,那么可以用下式来表示其分类:

距离超平面最近的几个训练样本点使得上式成立,被叫做支持向量,两个异类支持向量到超平面的距离之和是间隔。想要找到最大间隔的划分超平面,也就是要满足下式:

这就是支持向量机(SVM)的基本型。

二、对偶问题

 SVM的基本型本身是一个凸二次规划问题,能直接用现成的优化计算包求解,但是也可以使用别的方法来求解。这里使用拉格朗日乘子法可以得到其对偶问题。对上式的每个约束添加拉格朗日乘子,可将式子写为:

 经过偏导的计算以及考虑前面的约束,可得上式的对偶问题为:

最终可以得到模型f(x)=w^Tx+b=\sum_{i=1}^{m}a_iy_ix_i^Tx+b。上述过程满足KKT条件,即要求

支持向量机的一个重要性质为训练完成后,大部分的训练样本都不需保留,最终模型仅与支持向量有关。 对与对偶问题的求解,其中一个著名的算法为SMO。其基本思路为先固定a_i之外的所有参数,然后求a_i上的极值;由于存在约束条件,若固定a_i之外的所有参数,a_i可由其他参数导出。之后将执行下述两个步骤直到收敛:(1)选取一对需更新的变量a_ia_j(2)固定a_ia_j以外的参数,求解对偶问题得到新的a_ia_j

SMO采用了一个启发式:使选取的两变量所对应样本之间的间隔最大。SMO高效的原因是在固定其他参数后,只优化两个参数。对于偏移量b可以使用所有支持向量求解平均值。

三、核函数

对于原始样本空间中不存在一个能正确划分两类样本的超平面,可将样本从原始样本空间映射到一个更高维的特征空间,使得样本在这个特征空间中线性可分。如果原始样本空间有限维,即属性数有限,那么一定存在一个高维特征空间使样本可分。

在特征空间中划分超平面对应的模型可以表示为f(x)=w^T\phi (x)+b\phi (x)表示x映射后的样本空间。w和b是样本参数,其计算类似上面的计算。对于\phi (x_i)^T\phi (x_j),直接计算比较困难,可以使用一个称为核技巧的方法来进行计算,即x_ix_j在特征空间的内积等于他们在原始空间中通过函数\kappa (\cdot ,\cdot )计算的结果。最后求解可得表达式为:

其中,函数\kappa (\cdot ,\cdot )就是核函数, 这一式子也叫做支持向量展式。

核函数的定理为令\chi为输入空间,\kappa (\cdot ,\cdot )是定义在\chi*\chi上的对称函数,则\kappa是核函数当且仅当对于任意数据D=\left \{ x_1,x_2,\cdots ,x_m \right \},核矩阵K总是半正定的。其表明只要有一个对称函数所对应的核矩阵半正定的,就可以当作核函数使用。任何一个核函数都可以隐式定义一个称为再生核希尔伯特空间(RKHS)的特征空间。其中几种常见的核函数为:

其次,若k1和k2都为核函数那么其线性组合也为核函数; 若k1和k2都为核函数,核函数的直积也为核函数;若k1为核函数,那么对应任意g(x),\kappa (x,z)=g(x)\kappa _1(x,z)g(z)也为核函数。

四、软间隔与正则化

在现实任务中很难找到一个合适的核函数使得训练样本在特征空间中线性可分。缓解该问题的一个方法是允许支持向量机在一些样本上出错,所以引入了软间隔概念。它允许一些样本不满足约束,其次在最大化间隔的同时,不满足约束的样本应该尽可能少,所以可将优化目标写为:

 其中\iota _{0/1}是0/1损失函数,其非凸、非连续,数学性质不太好,通常使用别的损失函数来替代它。叫做替代损失。其中三种常见的替代函数为:

在引入松弛变量\xi _i\geq 0,那么可以得到软间隔支持向量机的公式为:

其与硬间隔下的对偶问题相比,唯一的差别在于对偶变量的约束不同,可以采用上述同样的方法来对软间隔进行求解。软间隔支持向量机的最终模型仅与支持向量相关,即通过采用hinge损失函数仍保持了稀疏度。

支持向量机与对率回归的优化目标相近,通常情形性能也相差不多。对率回归的优势主要在于其输出具有自然的概率意义,即在给出预测标记的同时也给出了概率 。

其次还可以使用别的替代损失函数得到其他的模型,其性质与所用的替代函数直接相关,但共性在于:优化目标中的第一项用来描述划分超平面的间隔大小,另一项用来表述训练集上的误差,可写为

其中的\Omega (f)叫做结构风险,用于描述模型f的一些性质;后面的求和式子叫做经验风险,用于描述模型和训练数据的契合程度。上式被叫做正则化问题。

五、支持向量回归 

支持向量回归(SVR)假设能容忍f(x)与y之间最多有\epsilon的偏差,即仅当f(x)与y之间的差别的绝对值大于\epsilon时才计算损失。SVR问题可以形式化为:

经过引入松弛变量和拉格朗日变化之后,可以得到其对偶问题的式子为:

 能使得(\hat{a}_i-a_i)\neq 0的样本即为SVR的支持向量,必须落在\epsilon -间隔带之外,其解仍然具有稀疏性。对于b的求解通常采用选取多个满足条件0< a_i< C的样本求解b之后求解平均值。

六、核方法

给定训练样本若不考虑偏移项b,学得的模型都能表示成核函数的线性组合,既有如下的表示定理:令H为核函数k对应的再生核希尔伯特空间,\left \| h \right \|_H表示H空间中关于h的范数,对于任意单调递增函数\Omega和任意非负损失函数\iota,优化问题的解总可以写为h^*(x)=\sum_{i=1}^{m}a_i\kappa (x,x_i)。其对损失函数没有要求,对正则化项\Omega要求单调递增。

核方法指的是一系列基于核函数的方法。最常见的是通过"核化" (即引入核函数)来将线性学习器拓展为非线性学习器。核线性判别分析(KLDA)的学习目标是:

经过一系列的变换可将上式转化为:

使用线性判别分析求解方法即可得到\alpha,进而得到投影函数h(x)。

总结

 本章详细的介绍了支持向量机的基本原理、优化方法、核函数应用以及扩展模型如SVR。SVM以其强大的分类能力和良好的泛化性能在机器学习领域得到了广泛应用。

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是《机器学习实战》第六章应用案例中人脸识别的代码,包括数据预处理、特征提取和分类器训练等过程: ``` # 导入所需的库 import os import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from sklearn.svm import SVC from sklearn.metrics import accuracy_score import cv2 # 定义数据预处理函数 def preprocess_data(data_path): images = [] labels = [] for sub_folder in os.listdir(data_path): sub_folder_path = os.path.join(data_path, sub_folder) for file_name in os.listdir(sub_folder_path): if file_name.startswith('.'): continue image_path = os.path.join(sub_folder_path, file_name) image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) image = cv2.resize(image, (128, 128)) images.append(np.asarray(image, dtype=np.uint8)) labels.append(sub_folder) return images, labels # 定义特征提取函数 def extract_features(images): features = [] for image in images: hist = cv2.calcHist([image], [0], None, [256], [0, 256]) features.append(hist) features = np.asarray(features) features = np.reshape(features, (features.shape[0], -1)) return features # 加载数据 data_path = 'path_to_data_folder' images, labels = preprocess_data(data_path) # 特征提取 features = extract_features(images) # 标签编码 le = LabelEncoder() labels = le.fit_transform(labels) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42) # 训练分类器 clf = SVC(kernel='linear', C=1.0, random_state=42) clf.fit(X_train, y_train) # 预测并计算准确率 y_pred = clf.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('Accuracy: %.2f%%' % (accuracy * 100.0)) ``` 需要注意的是,以上代码只是一个示例,请根据实际情况进行修改和调整。同时,为了让模型具有更好的性能,建议使用更多的训练数据和更复杂的特征提取和分类器模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值