三、基于支持向量机的分类预测 | 您所在的位置:网站首页 › 支持向量机回归预测模型能够多步预测么 › 三、基于支持向量机的分类预测 |
基于向量机的分类预测
一、什么是支持向量二、支持向量机1.什么是支持向量机2.支持向量机的推导3.SVM的损失函数4.SVM的核函数5.SVM的硬间隔和软间隔
三、代码实现四、参考文献
一、什么是支持向量
在支持向量机中,距离超平面最近的且满足一定条件的几个训练样本点被称为支持向量。 对于一条直线:
支持向量机(Support Vector Machine)是一种十分常见的分类器,可分为以下几类:Linearly Separabel SVM、Linear SVM、Non-Linear SVM。 Linearly Separable SVM的原理是要达到hard margin maximization。Hard margin指的是支持向量到分割面的距离,因为支持向量距离分割面最近,该距离也是过渡带宽度(的一半)。Linear separable是指,当我们想用一个分割平面,将两个数据分割开时,存在至少一个分割面,使两个数据可以完全分离,则我们认为这个SVM是线性可分SVM。 Linear SVM是指,分割面虽然不能完全分割所有数据,但是该线性分割方式可以使绝大多数数据正确的被分类。那么这样的SVM也可以被称为线性SVM。Linear SVM要达到的是soft margin maximization。这里的soft对应线性可分SVM的hard。而soft margin指的是,当SVM不是线性可分的情况时,此时支持向量并不一定是距离分割面最近的向量。因此SVM此时并不能一味地margin maximization,而是使过渡带足够宽。此时的margin maximization并不是真正意义上的,严格的margin maximization。所以用soft进行区分。 对于前两种SVM,对其加入一个kernel function就可以构造出非线性SVM。 2.支持向量机的推导
因此,给定线性可分训练数据集,通过间隔最大化得到的分割超平面为: 对于线性SVM而言,因为不要求所有样本都被分对,因此其约束条件和线性可分SVM并不相同。给出一个大于等于0的松弛因子\xi,使函数间隔加上松弛因子后大于等于1,此时有目标函数及约束条件: 换句话说,松弛因子本身可以被看作是损失的衡量。因为松弛因子本身也是包容分割面的分割错误。实际上,损失本身,就是由于线性SVM允许过渡带内存在向量,甚至向部分错误分类的向量妥协的结果。因此,原目标函数: SVM核函数的选择对于其性能的表现有至关重要的作用,尤其是针对线性不可分的数据。核函数的作用是,通过将空间内线性不可分的数据映射到一个高维的特征空间,使得数据在特征空间内是可分的(动画)。我们定义这种映射为 ϕ(x),那么我们就可以把求解约束最优化问题变为 minα−−>12∑Ni=1∑Ni=1αiαjyiyj(ϕi∗ϕj)−∑Ni=1αi s.t.−−>∑Ni=1αiyi=0 αi≥0,−−>i=1,2,…,N 但是由于从输入空间到特征空间的这种映射会使得维度发生爆炸式的增长,因此上述约束问题中内积(\phi_i*\phi_j)的运算会非常的大以至于无法承受,因此通常我们会构造一个核函数κ(xi,xj)=ϕ(xi)∗ϕ(xj)。从而避免了在特征空间内的运算,只需要在输入空间内就可以进行特征空间的内积运算。 通过上面的描述可知,构造核函数κ首先应确定输入空间到特征空间的映射,想要获取输入空间到映射空间的映射,我们需要明确输入空间内数据的分布情况,但大多数情况下,我们并不知道自己所处理的数据的具体分布,故一般很难构造出完全符合输入空间的核函数,因此我们常用如下几种常用的核函数来代替自己构造核函数: 线性核函数 LINEARκ(x,xi)=x∗xi 线性核,主要用于线性可分的情况。我们可以看到特征空间到输入空间的维度是一样的,其参数少|速度快。对于线性可分数据,其分类效果很理想,因此我们通常首先尝试用线性核函数来做分类,看看效果如何,如果不行再换别的。 高斯径向基核函数 RBFκ(x,xi)=exp(−||x−xi||2δ2) 高斯径向基函数是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间内,该核函数是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数。 多项式核函数 POLYκ(x,xi)=((x∗xi)+1)d 多项式核函数可以实现将低维的输入空间映射到高纬的特征空间,但是多项式核函数的参数多,当多项式的阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。 神经元的非线性作用核函数 Sigmoidκ(x,xi)=tanh(η+θ) 采用sigmoid核函数,支持向量机实现的就是一种多层神经网络。 因此,在选用核函数的时候,如果我们对我们的数据有一定的先验知识,就利用先验来选择符合数据分布的核函数;如果不知道的话,通常使用交叉验证1的方法,来试用不同的核函数,误差最小的即为效果最好的核函数,或者也可以将多个核函数结合起来,形成混合核函数。在吴恩达的课上,也曾经给出过一系列的选择核函数的方法: 如果特征的数量大到和样本数量差不多,则选用LR或者线性核的SVM; 如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数; 如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。 5.SVM的硬间隔和软间隔 硬间隔:完全分类准确,其损失函数不存在;其损失值为0;只要找出两个异类正中间的那个平面;软间隔:允许一定量的样本分类错误;优化函数包括两个部分,一部分是点到平面的间隔距离,一部分是误分类的损失个数;C是惩罚系数,误分类个数在优化函数中的权重值;权重值越大,误分类的损失惩罚的越厉害。误分类的损失函数可分为hinge损失,指数损失,对率损失。而经常使用的或者说默认的是使用了损失函数为hinge损失的软间隔函数。 三、代码实现 库函数导入 ## 基础函数库 import numpy as np ## 导入画图库 import matplotlib.pyplot as plt import seaborn as sns ## 导入逻辑回归模型函数 from sklearn import svm 构建数据集并进行模型训练 ##Demo演示LogisticRegression分类 ## 构造数据集 x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]]) y_label = np.array([0, 0, 0, 1, 1, 1]) ## 调用SVC模型 (支持向量机分类) svc = svm.SVC(kernel='linear') ## 用SVM模型拟合构造的数据集 svc = svc.fit(x_fearures, y_label) 模型参数查看 ## 查看其对应模型的w print('the weight of Logistic Regression:',svc.coef_) ## 查看其对应模型的w0 print('the intercept(w0) of Logistic Regression:',svc.intercept_)the weight of Logistic Regression: [[0.33364706 0.33270588]] the intercept(w0) of Logistic Regression: [-0.00031373] 4. 模型预测 ## 模型预测 y_train_pred = svc.predict(x_fearures) print('The predction result:',y_train_pred)The predction result: [0 0 0 1 1 1] 5. 模型可视化 # 最佳函数 x_range = np.linspace(-3, 3) w = svc.coef_[0] a = -w[0] / w[1] y_3 = a*x_range - (svc.intercept_[0]) / w[1] # 可视化决策边界 plt.figure() plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis') plt.plot(x_range, y_3, '-c') plt.show()1.https://baike.baidu.com/item/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F/23221492?fr=aladdin 2.https://blog.csdn.net/github_38325884/article/details/74418365 3.https://blog.csdn.net/yefcion/article/details/81099390 4.https://blog.csdn.net/ningyanggege/article/details/81015309 |
CopyRight 2018-2019 实验室设备网 版权所有 |