首页 > 编程知识 正文

svm算法推导,svm算法应用实例

时间:2023-05-06 11:40:02 阅读:153083 作者:331

我最近在学习svm算法。 用这篇文章记录了自己的学习过程,很多地方参考了z老师的讲课和沉默的橘子的统计。 如果有不足的地方,海涵; 如果对svm算法进行通俗易懂的二维理解,就是寻找分割线并分为两种。 问题是,如下图所示,可以用三种颜色将点和星星分开,哪条线最合适呢? 这就是我们要考虑的问题;

首先,假设W•X b=0为最佳分割线,将直线分为两种,如下图所示。 那么,如何获得这条最佳直线呢? 和w和b值; SVM中最佳分割面(超平面)是指支持向量与超平面间的最小距离的最大值;

我们的目标是寻找超平面,让比较接近超平面的点有更大的间隔。 也就是说,不认为所有点都必须离开超平面,而是关心求出的超平面在所有点中使最近的点具有最大的间隔。

如上所述,假定蓝色类中存在5个样本,Y=1,紫色类中设定5个样本,Y=-1,总计t={(x,y ),x,} 10个样本,超平面从采样点到超平面的几何距离如下。

在这里说明。 函数距离与几何距离的关系; 在定义上,将样本| wx b|距离称为函数距离,但上式是几何距离,作为可知当w和b以相同倍数增加时,函数距离也以倍数增加的简单例子,从样本x到2wX 2b=0的函数距离为wxb=0的函数距离的2倍的几何矩阵

谈谈如何得到超平面吧?

超平面是指距离支持向量的最小距离为最大,max [支持向量到超平面的最小距离]; 那就算出支撑向量到超平面的距离就可以了,支撑向量到超平面的最小距离可以用下面的公式:表示

因此,最终优化的公式如下。

由函数距离和几何距离可知,即使w和b增加,几何距离也不变,所以如何能够将w和b以相同倍数增加的支持向量(在最接近超平面的采样点(不影响上式优化的情况下,可以将采样代入y ) y(w*x b )=1呢? 关于采样点距离,上图的r1函数距离为1,k1函数距离为1,其他

采样点的函数距离大于1,y(wxb )=1。 将该条件代入上述候选优化公式,即可得到新的优化公式1-3。

式1-3参照下述:将最大化分数最优化,变换为最优化最小化分母,为了最优化的方便,变换为式1-4

为了优化以上表达式,使用拉格朗日表达式和KTT条件优化表达式进行如下转换

在这里说明上面的优化公式。 例如,我们的目标问题是minf(x )。 构造函数l(a,b,x ) :

l(a,b,x )=f ) x ) ag ) BH ) x ),a0此时f ) x )等价于maxa,bl ) a,b,x )。 仅当h(x )=0,g ) x(0,由于ag(x )0,所以ag ) ) x )=0时

因为L(A,b,x )可以取最大值,所以我们的目标函数可以写成minxmaxa,L(A,b,x )。 对偶式:如果使用maxa,BMInxl(a,b,x ),

因为我们的优化是满足强对偶的,强对偶就是说对偶式的最佳值等于原问题的最佳值。 因此,在取最佳值x条件下,满足:

f(x )=maxa,bminxL(a ) a、b、x )=minxmaxa,bl ) a、b、x )=f ) x ),

上面结合一次对偶进行了说明,我们的优化函数如下。 其中,a 0

现在的优化方案如上所述,首先求出最小值,对w和b分别求出偏导数,就可以得到以下公式。

将上式中获取的参数代入公式中,优化max值:

只要解决到最后的步骤,就可以得到最佳的a值。

通过以上操作可以获取超平面!

但是,通常可能存在一些奇点。 去掉这些奇点后,剩下的大多数点都可以线性分离。 有些点不能线性分离。 这意味着此点的函数距离小于1,而不是大于1。 为了解决这个问题,引入了松弛变量=0。 约束如下:

因此,原始优化函数为:

加入缓和变量后,如下图所示进行说明; 距离小于1的样本点远离超平面

面的距离为d ,在绿线和超平面之间的样本点都是由损失的,

其损失变量和距离d 的关系,可以看出 ξ = 1-d , 当d >1的时候会发现ξ =0,当 d<1 的时候 ξ = 1-d ;故可以画出损失函数图,如下图1-7;样式就像翻书一样,我们把这个损失函数叫做 hinge损失;



下面我们简单的就来讨论一下核函数:核函数的作用其实很简单就是把低维映射到平常的中心,便于分类。核函数有耍酷的汽车核等,下面就直接上图看参数对模型的影响,从下图可以了解,当C变化时候,容错变小,泛化能力变小;当选择耍酷的汽车核函数的时候,随时R参数调大,准确高提高,最终有过拟合风险;


下面就直接上代码了(鸢尾花SVM二特征分类):

iris_feature = u'花萼长度', u'花萼宽度', u'花瓣长度', u'花瓣宽度'if __name__ == "__main__": path = 'iris.data' # 数据文件路径 data = pd.read_csv(path, header=None) x, y = data[range(4)], data[4] y = pd.Categorical(y).codes x = x[[0, 1]] x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6) # 分类器 clf = svm.SVC(C=0.3, kernel='linear', decision_function_shape='ovo') clf.fit(x_train, y_train.ravel()) # 准确率 print clf.score(x_train, y_train) # 精度 print '训练集准确率:', accuracy_score(y_train, clf.predict(x_train)) print clf.score(x_test, y_test) print '测试集准确率:', accuracy_score(y_test, clf.predict(x_test)) x1_min, x2_min = x.min() x1_max, x2_max = x.max() x1, x2 = np.mgrid[x1_min:x1_max:500j, x2_min:x2_max:500j] # 生成网格采样点 grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点 print 'grid_test = n', grid_test Z = clf.decision_function(grid_test) Z = Z[:,0].reshape(x1.shape) print "decision_function:",Z grid_hat = clf.predict(grid_test) grid_hat = grid_hat.reshape(x1.shape) mpl.rcParams['font.sans-serif'] = [u'SimHei'] mpl.rcParams['axes.unicode_minus'] = False cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF']) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) plt.figure(facecolor='w') plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light) plt.scatter(x[0], x[1], c=y, edgecolors='k', s=50, cmap=cm_dark) # 样本 plt.scatter(x_test[0], x_test[1], s=120, facecolors='none', zorder=10) # 圈中测试集样本 plt.xlabel(iris_feature[0], fontsize=13) plt.ylabel(iris_feature[1], fontsize=13) plt.xlim(x1_min, x1_max) plt.ylim(x2_min, x2_max) plt.title(u'鸢尾花SVM二特征分类', fontsize=16) plt.grid(b=True, ls=':') plt.show()最后画图如下:














版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。