文章目录

  • SVM的最朴素代码实现:
  • 代码实现:
  • 第一个变量遍历样本获得,主要步骤如下:
  • 第二个变量随机选择:
  • 计算w:
  • 其他:

SVM的最朴素代码实现:

算法简单步骤:
1、遍历样本作为第一个变量a1,根据旧的a和b求得误差,满足KKT条件换下一个样本;不满足,
2、不满足的话,随机选取第二个变量a2(不能和第一个相同);
3、根据解析式求得a2;
4、根据解析式求a2的约束上界和下界;
5、根据4的约束求得新的a2;
6、根据解析式求得a1;
7、根据解析式求得b;
8、返回到第一步根据新得a和b求误差

代码实现:

第一个变量遍历样本获得,主要步骤如下:

def smoSimple(dataMatIn, classLabels, C, toler, maxIter):"""简化版SMO算法:param dataMatIn:       X:param classLabels:     Y:param C:               惩罚参数:param toler:           容错率:param maxIter:         最大循环次数:return:"""dataMatrix = np.array(dataMatIn)# 备注针对行向量转化为列向量需要添加[]labelMat = np.array([classLabels]).Tb = 0m,n = np.shape(dataMatrix)  # m:=训练实例的个数;n:=每个实例的维度alphas = np.zeros((m,1),dtype=float)# 迭代次数iter = 0while (iter < maxIter):alphaPairsChanged = 0   #alpha是否已经进行了优化# 遍历样本点for i in range(m):# 在初始的alpha下计算每一个样本点的预测值#   w = alpha * y * x;  f(x_i) = w^T * x_i + bw_ = np.dot(np.multiply(alphas,labelMat).T,dataMatrix)fXi = np.dot(w_, dataMatrix[i,:].T) + b
#            fXi = float(np.multiply(alphas,labelMat).T*dataMatrix*dataMatrix[i,:].T) + b     # 计算预测值和实际值的误差Ei = fXi - float(labelMat[i])   #得到误差,如果误差太大,检查是否可能被优化     # y[i]*g(x_i)-1  <0 and alphas[i] < C,这是违反KKT的情况# y[i]*g(x_i)-1  >0 and alphas[i] > 0,这个也是违反KKT的情况# 这里是简化处理,没有选择最严重的样本点,只要不满足,就当第一个变量找到了if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)): #必须满足约束# 随机选择第二个样本点作为变量j = selectJrand(i,m)# 计算第二个样本的预测值fXj = np.dot(np.multiply(alphas,labelMat).T,np.dot(dataMatrix,dataMatrix[j,:].T)) + b
#                fXj = float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + b# 计算第二个样本的误差Ej = fXj - float(labelMat[j])# alpha_i,alpha_j的旧值,教材中的α_1^old和α_2^oldalphaIold = alphas[i].copy(); alphaJold = alphas[j].copy()  # 因为存在约束,计算alpha_j的界if (labelMat[i] != labelMat[j]):                                          # 两者所在的对角线段端点的界L = max(0, alphas[j] - alphas[i])H = min(C, C + alphas[j] - alphas[i])else:L = max(0, alphas[j] + alphas[i] - C)H = min(C, alphas[j] + alphas[i])# 假如alpha_j的上界=下界,退出本次选择,选择下一个样本点,# 因为alpha只有一个取值,假如alpha!=H就是无效的if L==H: print("L==H"); continue# 计算-dK# Eta = -(2 * K12 - K11 - K22),且Eta非负,此处eta = -Eta则非正eta = 2.0 * np.dot(dataMatrix[i,:],dataMatrix[j,:].T) - np.dot(dataMatrix[i,:],dataMatrix[i,:].T) - np.dot(dataMatrix[j,:],dataMatrix[j,:].T)if eta >= 0: print("eta>=0"); continue# 根据解析式求alpha_jalphas[j] -= labelMat[j]*(Ei - Ej)/eta# 根据约束条件求得满足约束的alpha_2alphas[j] = clipAlpha(alphas[j],H,L)#如果内层循环通过以上方法选择的α_2不能使目标函数有足够的下降,那么放弃α_1if (abs(alphas[j] - alphaJold) < 0.00001): print("j not moving enough"); continue# 根据解析式结果计算α_1alphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j])# 根据解析式计算b,可以求出2个b,根据是否满足KKT条件,如果两者均0<a<C满足KKT,b1 = b2# 如果a_1,a_2是0或者C,那么在b1,b2之间的b都是可行b,求他们均值就行了b1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].Tb2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].Tif (0 < alphas[i]) and (C > alphas[i]): b = b1elif (0 < alphas[j]) and (C > alphas[j]): b = b2else: b = (b1 + b2)/2.0# 标记一下该样本修改alphaPairsChanged += 1print("iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))# 假如所有的样本都遍历了一遍,没有不满足kkt的样本点,迭代次数加1if (alphaPairsChanged == 0): iter += 1# 只要一次迭代里面修改过alpha,就重复本次迭代else: iter = 0print("iteration number: %d" % iter)return b,alphas

第二个变量随机选择:

def selectJrand(i,m):"""随机从0到m挑选一个不等于i的数:param i::param m::return:"""j=i             #排除iwhile (j==i):j = int(np.random.uniform(0,m))return j

计算w:

w是非必须计算的,因为它就是alpha的组合而已。

def calcWs(alphas,dataArr,classLabels):"""根据支持向量计算分离超平面(w,b)的w参数:param alphas:拉格朗日乘子向量:param dataArr:数据集x:param classLabels:数据集y:return: w=∑alphas_i*y_i*x_i"""X = np.array(dataArr); labelMat = np.array([classLabels]).transpose()m,n = np.shape(X)w = np.zeros((n,1))for i in range(m):w += np.multiply(alphas[i]*labelMat[i],X[i,:].T)return w

其他:

def clipAlpha(aj,H,L):"""将aj剪裁到L(ow)和H(igh)之间:param aj::param H::param L::return:"""if aj > H:aj = Hif L > aj:aj = Lreturn ajdef loadDataSet(fileName):"""加载数据集:param fileName::return:"""dataMat = []; labelMat = []fr = open(fileName)for line in fr.readlines():lineArr = line.strip().split('\t')dataMat.append([float(lineArr[0]), float(lineArr[1])])labelMat.append(float(lineArr[2]))return dataMat,labelMat

机器学习:SVM的最朴素代码实现,第一个变量遍历样本获得,第二个变量随机选择相关推荐

  1. 机器学习—SVM原理及简单代码实现(matlab)

    传统的SVM做的事情其实就是找到一个超平面,实现二分类,一类+1,一类-1.如上所示.它的目的就是使得两类的间隔最大.只要确定了间隔最大和两边距离相等,就能确定唯一平面.黑色的块表示距离分割面最近的样 ...

  2. security_huks模块下hks_rkc.c代码评注第一部分

    security_huks模块下hks_rkc.c代码评注第一部分 本篇综述 变量定义与初始化 密钥库文件属性初始化 初始化熵 填充密钥库文件缓冲区 填充哈希字段到缓冲区 填充根密钥数据到缓冲区 填充 ...

  3. 机器学习:SVM代码实现,第一个变量选择最偏离KKT条件的样本点,第二个变量随机

    文章目录 SMO算法描述: 代码实现 确定第一个变量: 确定第二个变量: 更新alpha值: 更新dw,db,y^,注意参数传入的方法: 主要处理程序(一):一个回合的处理 主要处理程序(二):整体e ...

  4. 机器学习实现图像分类(简单易上手) SVM KNN 决策树 朴素贝叶斯 机器学习作业

    机器学习实现图像分类 SVM KNN 决策树 朴素贝叶斯 重要提示:本文仅仅靠调用python的sklearn中的模型包实现机器学习方法,不喜勿喷 代码主要参考并改进 https://blog.csd ...

  5. matlab svm工具箱_机器学习笔记--SVM(MATLAB 实现代码)

    我们知道SVM的基本原理就是找一个超平面(广义平面)将样本分为几个部分,即分类. MATLAB中自带SVM包,使用起来也十分方便,假如X是特征矩阵,Y是分类标签(可以是数值(1.2)也可以是strin ...

  6. 机器学习完整项目实战附代码(一):探索型数据分析+特征工程+建模+报告

    1. 项目背景   泰坦尼克号的沉没是历史上最臭名昭著的沉船之一.1912年4月15日,在她的处女航中,被广泛认为"不沉"的"泰坦尼克号"在与冰山相撞后沉没.不 ...

  7. 机器学习—— SVM分类垃圾短信

    机器学习-- SVM分类算法 垃圾短信分类问题 Python语言凭借其强大的特性,其众多的外部库支持下,在机器学习和数据挖掘等领域发挥着强大的作用.本文基于python的机器学习库scikit-lea ...

  8. 一文读懂支持向量机SVM(附实现代码、公式)

    来源:机器学习算法与Python学习 本文约11000字,建议阅读10+分钟. 本文以简单实例化形式记录学习SVM的过程,力图帮助新手级学习者少走弯路. 支持向量机(SVM),一个神秘而众知的名字,在 ...

  9. python决策树代码解读_建模分析之机器学习算法(附pythonR代码)

    0序 随着移动互联和大数据的拓展越发觉得算法以及模型在设计和开发中的重要性.不管是现在接触比较多的安全产品还是大互联网公司经常提到的人工智能产品(甚至人类2045的的智能拐点时代).都基于算法及建模来 ...

最新文章

  1. php window.onload,window.onload 触发时机问题
  2. JPA基础(一):全面阐释和精彩总结JPA
  3. codeforces_A. Salem and Sticks_数组/暴力
  4. 如何轻松学习 Kubernetes?
  5. Linux路由器的架设
  6. C语言打印链表的中间节点的算法(附完整源码)
  7. 前端随笔整理[5.14]
  8. Swagger2介绍
  9. 50-20-190-配置-Flink 配置文件详解-flink-conf.yaml
  10. int 与Integer的用法与区别
  11. Scala的sealed关键字
  12. 【Ahoi2005】【BZOJ1968】COMMON 约数研究(水题,乱搞,约数)
  13. 如何用有道词典查找论文
  14. RH850 F1L freeRTOS 任务栈的切换
  15. 超级记忆/图像数字记忆 110位数字图像转换表 21-30
  16. 搜狗浏览器怎么清除浏览记录 搜狗浏览器清除浏览记录教程
  17. 2015年全国大学生电子设计大赛综合测评题
  18. JQuery模拟MAC任务栏放大效果
  19. kmplayer 修改快捷键——以倍速播放为例
  20. wordpress创建_您可以使用WordPress创建的19种网站类型

热门文章

  1. linux中怎样建立批量用户,Linux 大批量建立用户
  2. 开卡教程_流量卡开卡教程(必看)
  3. camunda流程定义表无数据_BPM - 业务流程管理
  4. QT使用xsl将xml为html,使用xslt 2.0将属性设置为根元素(Puting attributes to the root-element with xslt 2.0)...
  5. hadoop集群swap_性能瓶颈--MEM(swap)
  6. oracle产品追溯,如何追溯AR到Receipt再到GL
  7. mysql空间释放_linux 空间释放,mysql数据库空间释放
  8. rewrite.php wordpress 缓存 固定连接,【转】Wordpress中文标签无法正常连接 - 完美解决方案...
  9. easyui 动态设置单元格控件_比Excel还简单,实现动态报表原来只需要十分钟!
  10. 消费升级背景下零食行业发展报告_零食行业进入4.0时代,蔬菜、水果、肉制品站上万亿风口!...