序列最小优化算法(SMO)

SMO算法是一种启发式的算法,它在求解过程中通过以分析的方式来定位最优解可能存在的位置,从而避免了传统方法在求解中所遭遇的大量数值计算问题,并且最终以迭代的方式来求得最优解。

SMO算法原理

获得没有修剪的原始解;

对原始解进行修建;

更新阈值b

#SMO算法在软间隔SVM分类中的应用
import numpy as np
import random
import matplotlib.pyplot as pltdef simple_smo(dataset, labels, C, max_iter):''' 简化版SMO算法实现,未使用启发式方法对alpha对进行选择.:param dataset: 所有特征数据向量:param labels: 所有的数据标签:param C: 软间隔常数, 0 <= alpha_i <= C:param max_iter: 外层循环最大迭代次数'''dataset = np.array(dataset)m, n = dataset.shape #样本数量,特征数量labels = np.array(labels)# 初始化参数λ,b为0lambds = np.zeros(m) #每个样本都有一个λ乘子b = 0it = 0while it < max_iter:pair_changed = 0 #选取的一对值相较于之前是否有变化,没有的话可以停止迭代for i in range(m):λ_i, x_i, y_i = lambds[i], dataset[i], labels[i] #选取一组λfx_i = SVM_predict(x_i,lambds,dataset,labels,b)E_i = fx_i - y_ij = select_j(i, m) #选取另一个λλ_j, x_j, y_j = lambds[j], dataset[j], labels[j]fx_j = SVM_predict(x_j,lambds,dataset,labels,b)E_j = fx_j - y_jK_ii, K_jj, K_ij = np.dot(x_i, x_i), np.dot(x_j, x_j), np.dot(x_i, x_j)eta = K_ii + K_jj - 2*K_ij #if eta <= 0:print('WARNING  eta <= 0')continue# 获取更新的alpha对λ_i_old, λ_j_old = λ_i, λ_j #未更新前的参数λ_j_new = λ_j_old + y_j*(E_i - E_j)/eta# 对alpha进行修剪if y_i != y_j:L = max(0, λ_j_old - λ_i_old)H = min(C, C + λ_j_old - λ_i_old)else:L = max(0, λ_i_old + λ_j_old - C)H = min(C, λ_j_old + λ_i_old)λ_j_new = clip(λ_j_new, L, H) #根据上下界修剪λ_i_new = λ_i_old + y_i*y_j*(λ_j_old - λ_j_new) #根据公式反推另一个参数if abs(λ_j_new - λ_j_old) < 0.00001: #这个参数已经优化到最佳,换下一个#print('WARNING   alpha_j not moving enough')continue#更新blambds[i], lambds[j] = λ_i_new, λ_j_newb_i = -E_i - y_i*K_ii*(λ_i_new - λ_i_old) - y_j*K_ij*(λ_j_new - λ_j_old) + bb_j = -E_j - y_i*K_ij*(λ_i_new - λ_i_old) - y_j*K_jj*(λ_j_new - λ_j_old) + bif 0 < λ_i_new < C:b = b_ielif 0 < λ_j_new < C:b = b_jelse:b = (b_i + b_j)/2pair_changed += 1print('INFO   iteration:{}  i:{}  pair_changed:{}'.format(it, i, pair_changed))if pair_changed == 0: #参数优化完成,下一轮it += 1else: #参数没有优化完成,继续迭代it = 0print('iteration number: {}'.format(it))return lambds, bdef SVM_predict(x,lambds,data,label,b):"SVM分类器函数 y = w^Tx + b,即文中的f(x)"res = 0for i in range(data.shape[0]):res += lambds[i]*label[i]*(data[i].dot(x.T))return res + bdef get_w(lambdas, dataset, labels):#通过λ求ww = 0for i in range(len(dataset)):w += lambdas[i]*y[i]*dataset[i]return wdef clip(alpha, L, H):#修建λ的值到L和H之间.if alpha < L:return Lelif alpha > H:return Helse:return alphadef select_j(i, m):#在m中随机选择除了i之外剩余的l = list(range(m))seq = l[: i] + l[i+1:]return random.choice(seq)def get_point():x_true =  [[1,1.5],[1,3],[4,5],[2,4]]x_false = [[1,0.5],[4,2],[5,1],[4,1]]x_true =  [[1,2],[1,3],[4,5],[2,4],[2,1.5]]x_false = [[1,0.5],[4,2],[5,1],[4,1],[3,2]]x_all = np.array(x_true+x_false)y = [1]*len(x_true) + [-1]*len(x_false)return x_all,y,x_true,x_falsedef plot(x_true,x_false,w,b):plot_x = np.arange(0,7,0.1)plot_y = -(w[0]*plot_x+b)/w[1]plt.scatter([x[0] for x in x_true],[x[1] for x in x_true] , c='r' , label='+1')plt.scatter([x[0] for x in x_false],[x[1] for x in x_false] , c='b',label='-1')plt.plot(plot_x,plot_y,c = 'green')plt.xlim(0,7)plt.ylim(0,7)plt.legend()plt.plot()plt.show()if __name__ == '__main__':x,y,x_true,x_false = get_point()MAX_EPOCHES = 20 #最大迭代次数C = 50 #λ边界#调节C的值会有不同的改变lambdas, b = simple_smo(x, y, C, MAX_EPOCHES)w = get_w(lambdas, x, y)print('-'*40+'result'+'-'*40)print('lambdas:{}\nw:{}\nb:{}'.format(lambdas,w,b))plot(x_true,x_false,w,b) #LHQ

SMO算法在软间隔SVM分类中的应用相关推荐

  1. Python使用佩加索斯(Pegasos)算法实现软间隔SVM

    一.软间隔SVM目标函数推导 SVM假定存在一个超平面能够将两类样本完全分隔开来,但在实际情况中,数据是不能被一个平面完全分隔的,因此,为了使得问题可解,我们需要在原SVM的优化问题上加入松弛变量ε, ...

  2. SVM笔记(二)拉格朗日对偶、KTT条件、软间隔SVM

    上一篇:SVM笔记(一) 上一篇写到讲硬间隔的SVM转化为凸二次规划问题,也就是QP问题,之后可以是用现成的软件求解QP问题.但是如果样本数量大和维度比较高,会导致问题求解困难或不可解,因此引入了拉格 ...

  3. 砥志研思SVM(三) 最优间隔分类器问题(下):软间隔SVM

  4. python svm核函数_机器学习算法实践-SVM核函数和软间隔

    前言 上文中简单总结了对于线性可分数据的SVM的算法原理,本文对于非线性可分以及有噪声存在的时候我们需要对基本SVM算法的改进进行下总结其中包括: 核函数在SVM算法中的使用 引入松弛变量和惩罚函数的 ...

  5. 支持向量机SVM(五)SMO算法

    11 SMO优化算法(Sequential minimal optimization) SMO算法由Microsoft Research的John C. Platt在1998年提出,并成为最快的二次规 ...

  6. 【机器学习系列】之SVM核函数和SMO算法

    作者:張張張張 github地址:https://github.com/zhanghekai [转载请注明出处,谢谢!] [机器学习系列]之SVM硬间隔和软间隔 [机器学习系列]之SVM核函数和SMO ...

  7. 【机器学习系列】之SVM硬间隔和软间隔

    作者:張張張張 github地址:https://github.com/zhanghekai [转载请注明出处,谢谢!] [机器学习系列]之SVM硬间隔和软间隔 [机器学习系列]之SVM核函数和SMO ...

  8. SVM问题的求解方法SMO算法

    西瓜书学习笔记:支持向量机(6.1-6.2)笔记 1.SMO算法思路讲解 列表就是西瓜书上面的公式6.11 2.SMO算法简单实现 的点就是支持向量机上面的点. 30:43分钟开始讲code exam ...

  9. 软间隔SVM---松弛变量惩罚因子

    软间隔SVM 0.为什么要引入软间隔SVM 在svm中对于线性不可分问题可以通过使用核函数将特征映射到高维空间实现"线性可分" 直观解释: 盒子中的小球(黑白两种颜色),在盒子上面 ...

最新文章

  1. 基于ISE的设计实现基础
  2. 【面试相关】python实现快速幂取余算法详解
  3. 【资源】吴恩达新书《Machine Learning Yearning》完整中文版免费下载
  4. linux mv命令源码,linux命令学习(8):mv命令
  5. linux下多版本opencv共存问题
  6. 线程池版本的mysql_MySQL线程池内幕
  7. FileSplit cannot be cast Exception
  8. js禁止中文输入 最简洁的【禁止输入中文】
  9. 头像编辑器怎么禁用摄像头
  10. Excel如何把同类数据合并到同一单元格
  11. linux强制安装deb,ubuntu强行修改deb安装包依赖
  12. ie窗口如何最大化设置
  13. 确认main_arena相对libc的偏移地址
  14. 佐治亚大学计算机科学与工程,2019上海软科世界一流学科排名计算机科学与工程专业排名佐治亚大学排名第401-500...
  15. 购买Blender cloud支援今年官方开源电影Gooseberry
  16. 夏天吃西瓜10大禁忌必须知道
  17. 计算机病毒和木马完全相同,木马和计算机病毒的特点
  18. 【JS基础】立即执行函数表达式(自执行函数)
  19. 兄弟选择器——用于选择除第一个元素外的其他兄弟元素
  20. 【华为机试真题 Python】九宫格按键输入

热门文章

  1. 《Real-Time Rendering 3rd》提炼总结 RTR3读书笔记
  2. 如何将Firebase Analytics添加到NativeScript移动应用程序中
  3. 剑侠情缘手游服务器bug修复,剑侠情缘手游19职业段氏修复无BUG版服务端+客户端+后台+网站+教程(带门客绝学小风车忘忧酒馆+特色神器)...
  4. 煤矿无线广播系统解决方案
  5. 逻辑漏洞原理与实践练习题
  6. 电源管理芯片代理商:电源管理芯片的领域和封装
  7. 鼠标在linux下如何工作,如何在Linux上映射鼠标
  8. [css3动画教程]:逐帧自适应精灵图
  9. python正则表达式两个条件_python高级正则表达式
  10. 【云原生】coding部署docker镜像到远程服务器