SVM代码实现,朴素实现基础上的优化:

因为二次凸优化已经把解析结果明白表现出来了,所以优化只能体现在两个变量的选择上,或者说是两个样本的选择上:
1、第一个变量的选择:这次实现也并不是选择最不满足KKT条件的样本点,而是优先使用边界上的样本点也就是0<alpha<C的样本点,假如边界上的样本点均满足KKT条件,就遍历全体样本去找不满足的样本点
2、第二个变量的选择:选择和第一个样本误差相差最大的样本点,也就是|e1-e2|最大的点。
3、根据样本误差找第二个变量做了一定的优化:只需要已经更新过样本点误差的样本。

计算样本误差(预测值-实际值)、更新样本误差

def calcEkK(oS, k):"""计算第k个样本点的误差:param oS::param k::return:"""# 计算第k个样本点的误差值fXk = float(np.multiply(oS.alphas,oS.labelMat).T*(oS.X*oS.X[k,:].T)) + oS.b# 计算第k个样本的误差Ek = fXk - float(oS.labelMat[k])return Ekdef updateEkK(oS, k):# 更新误差,根据当前oS里面alphas和b,来更新误差,并标志误差为新的Ek = calcEkK(oS, k)oS.eCache[k] = [1,Ek]

启发式选择第二个变量:

def selectJK(i, oS, Ei):"""选择第2个变量的过程,即内层循环中的启发规则。选择标准是使alpha_2有足够大的变化。:param i:第一个变量:param oS:中间结果:param Ei:第i个点的误差:return:"""# 用于存放最大相距误差的样本点,最大相距误差,该样本点的误差maxK = -1; maxDeltaE = 0; Ej = 0oS.eCache[i] = [1,Ei]                           #设为有效# 找寻产生最大误差变化的alphavalidEcacheList = np.nonzero(oS.eCache[:,0].A)[0]  #有效位为1的误差列表if (len(validEcacheList)) > 1:for k in validEcacheList:                   #遍历列表找出最大误差变化if k == i: continue                     #第二个alpha不应该等于第一个# 遍历计算每一个样本的误差Ek = calcEkK(oS, k)deltaE = abs(Ei - Ek)if (deltaE > maxDeltaE):maxK = k; maxDeltaE = deltaE; Ej = Ekreturn maxK, Ejelse:                                        #找不到,只好随机选择一个# 第一次假如所有的样本都没有更新过,就随机选择,假如更新过,就使用上述策略j = selectJrand(i, oS.m)Ej = calcEkK(oS, j)return j, Ejdef 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

选取了第一个变量之后的核心处理:

# 内层循环,选择了第一个样本点之后,选择第二个样本点进行解析求解
def innerLK(i, oS):# 计算第一个样本点的误差Ei = calcEkK(oS, i)#如果误差太大,且alpha满足约束,则尝试优化它# 第一个样本点满足kkt条件if ((oS.labelMat[i]*Ei < -oS.tol) and (oS.alphas[i] < oS.C)) or ((oS.labelMat[i]*Ei > oS.tol) and (oS.alphas[i] > 0)):# 根据第一个样本点找第二个偏离最大的样本点,第一次eCache没有有效的样本误差,随机选择j,Ej = selectJK(i, oS, Ei)   #不再是 selectJrand 那种简化的选择方法alphaIold = oS.alphas[i].copy(); alphaJold = oS.alphas[j].copy() # 教材中的α_1^old和α_2^old# 计算边界if (oS.labelMat[i] != oS.labelMat[j]):                           # 两者所在的对角线段端点的界L = max(0, oS.alphas[j] - oS.alphas[i])H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i])else:L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C)H = min(oS.C, oS.alphas[j] + oS.alphas[i])if L==H: print("L==H"); return 0# 计算-dKeta = 2.0 * oS.X[i,:]*oS.X[j,:].T - oS.X[i,:]*oS.X[i,:].T - oS.X[j,:]*oS.X[j,:].Tif eta >= 0: print("eta>=0"); return 0# 计算a_2oS.alphas[j] -= oS.labelMat[j]*(Ei - Ej)/etaoS.alphas[j] = clipAlpha(oS.alphas[j],H,L)# 更新第二个样本点的误差,并设置误差有效updateEkK(oS, j)                                                # 更新误差缓存# 假如第二个样本点改进不大,换第一个样本点if (abs(oS.alphas[j] - alphaJold) < 0.00001): print ("j not moving enough"); return 0# 计算a_1oS.alphas[i] += oS.labelMat[j]*oS.labelMat[i]*(alphaJold - oS.alphas[j])    #更新α_1# 更新a_1的误差updateEkK(oS, i)                                                 # # 更新误差缓存# 计算bb1 = oS.b - Ei- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.X[i,:]*oS.X[i,:].T - oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.X[i,:]*oS.X[j,:].Tb2 = oS.b - Ej- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.X[i,:]*oS.X[j,:].T - oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.X[j,:]*oS.X[j,:].Tif (0 < oS.alphas[i]) and (oS.C > oS.alphas[i]): oS.b = b1elif (0 < oS.alphas[j]) and (oS.C > oS.alphas[j]): oS.b = b2else: oS.b = (b1 + b2)/2.0return 1# 第一个样本点不满足kkt条件,直接下一个样本点else: return 0

第一个变量选择及主程序:

def smoPK(dataMatIn, classLabels, C, toler, maxIter):"""完整版的Platt SMO算法:param dataMatIn::param classLabels::param C::param toler::param maxIter::return:"""oS = optStructK(np.mat(dataMatIn),np.mat(classLabels).transpose(),C,toler)iter = 0entireSet = True; alphaPairsChanged = 0# 这里的实现并没有在训练样本中选取违反KKT条件最严重的样本点,# 而是优先顺序遍历间隔边界上的支持向量点,若无法优化模型则遍历整个数据集。while (iter < maxIter) and ((alphaPairsChanged > 0) or (entireSet)):alphaPairsChanged = 0# 第一次遍历整个数据集if entireSet:           #遍历所有值# 遍历每一个样本点,alphaPairsChanged标记了样本点是否做了操作for i in range(oS.m):        alphaPairsChanged += innerLK(i,oS)print ("fullSet, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))iter += 1else:                   #遍历间隔边界上的支持向量点# 遍历 0< alpha < C上的样本点,也就是支持向量nonBoundIs = np.nonzero((oS.alphas.A > 0) * (oS.alphas.A < C))[0]for i in nonBoundIs:alphaPairsChanged += innerLK(i,oS)print ("non-bound, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))iter += 1if entireSet: entireSet = False                 #翻转entireSet# 假如在支持向量上遍历,没有样本点可以优化,那么就在全集上遍历elif (alphaPairsChanged == 0): entireSet = True  print ("iteration number: %d" % iter)return oS.b,oS.alphas

机器学习:SVM代码实现,朴素实现基础上的优化相关推荐

  1. 张鸿洋 视频 android,PageStateManager 在张鸿洋的 LoadingAndRetryManager 的基础上改写,优化 api,封装 @codeKK Android开源站...

    页面状态管理 在张鸿洋的LoadingAndRetryManager的基础上改写,修正一些 bug,优化 api,并提供使用时封装的例子 特性 api 超级简单 可以在 xml 中使用 Statefu ...

  2. 关于烂代码的那些事(上中下)

    1. 摘要 最近写了不少代码,review了不少代码,也做了不少重构,总之是对着烂代码工作了几周.为了抒发一下这几周里好几次到达崩溃边缘的情绪,我决定写一篇文章谈一谈烂代码的那些事.这里是上篇,谈一谈 ...

  3. java文件上传最优方案_大规格文件的上传优化

    在开发过程中,收到这样一个问题反馈,在网站上传 100 MB 以上的文件经常失败,重试也要等老半天,这就难为需要上传大规格文件的用户了.那么应该怎么做才能快速上传,就算失败了再次发送也能从上次中断的地 ...

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

    文章目录 SVM的最朴素代码实现: 代码实现: 第一个变量遍历样本获得,主要步骤如下: 第二个变量随机选择: 计算w: 其他: SVM的最朴素代码实现: 算法简单步骤: 1.遍历样本作为第一个变量a1 ...

  5. 机器学习实战 支持向量机SVM 代码解析

    机器学习实战 支持向量机SVM 代码解析 <机器学习实战>用代码实现了算法,理解源代码更有助于我们掌握算法,但是比较适合有一定基础的小伙伴.svm这章代码看起来风轻云淡,实则对于新手来说有 ...

  6. 【机器学习基础】数学推导+纯Python实现机器学习算法11:朴素贝叶斯

    Python机器学习算法实现 Author:louwill 今天要讲的算法是朴素贝叶斯(Naive Bayes).相较于之前的支持向量机等模型,朴素贝叶斯就要简单多了.朴素贝叶斯是一种基于贝叶斯定理和 ...

  7. python中class_【机器学习基础】数学推导+纯Python实现机器学习算法11:朴素贝叶斯...

    Python机器学习算法实现 Author:louwill 今天要讲的算法是朴素贝叶斯(Naive Bayes).相较于之前的支持向量机等模型,朴素贝叶斯就要简单多了.朴素贝叶斯是一种基于贝叶斯定理和 ...

  8. 粒子群优化算法分布式电源选址定容 matlab源代码,分析了分布式电源接入配电网前后对网络损耗的影响,在此基础上提出采用混合模拟退火算法的改进粒子群优化算法进行分布式电源选址和定代码按照高水平文章复现

    (1)粒子群优化算法分布式电源选址定容 如图12 matlab源代码,代码按照高水平文章复现,保证正确 分析了分布式电源接入配电网前后对网络损耗的影响,在此基础上提出采用混合模拟退火算法的改进粒子群优 ...

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

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

最新文章

  1. 小程序客服消息推送自动回复_如何让小程序客服消息根据用户输入关键词自动回复图片?...
  2. 中兴智能视觉大数据报道:人脸识别准确率高达99.8%
  3. php uncaught thrown,PHP异常详解
  4. FPGA 资料搜集记录
  5. python12岁_12岁。Python操作Excel,12Python,excel
  6. Blazor.Server以正确的方式集成Ids4
  7. STL11-stack容器
  8. java开发微信抢红包挂_「高并发秒杀」微信抢红包实战案例
  9. 薏米到底有多强大?真是没想到还能这样吃~
  10. 多少并发量算高并发_Linux服务端最大并发数是多少?
  11. HADOOP实践101:在Hadoop集群中添加机器和删除机器
  12. JEP 379:将低暂停时间的垃圾收集器Shenandoah推向生产
  13. adf的主要功能之一是_复印机ADF是什么意思
  14. Salient Object Detection Driven by Fixation Prediction 论文解读
  15. 单片机c语言编写注解,单片机C语言程序注解
  16. 白噪声,有色噪声的定义、特性及其MATLAB仿真
  17. Python 预测 NBA 比赛结果
  18. VSCode实现Cesium的自动提示功能
  19. 华为云HCCDA认证考试
  20. 计算机二级学校有名单吗,文管二级和计算机二级有啥区别?

热门文章

  1. php 重定向 cookie,php – 如何在CURL重定向上传递Cookie?
  2. win10无法检测java_Javac 在windows10系统不识别
  3. linux 分区_Linux文件系统、逻辑分区、物理分区
  4. 三星s9android recovery,三星S9+刷第三方中文twrp recovery工具和教程
  5. jsp中两个字符串格式的日期可以相减吗_举个栗子!Tableau 技巧(126):学几个常用的日期函数...
  6. 错误:No plugin found for prefix spring-boot in the current project and in the plugin groups
  7. 【cropper】限制图片大小
  8. from _sqlite3 import ImportError DLL load failed 找不到指定的模块
  9. cbow word2vec 损失_Skip-gram和CBOW知识点
  10. bagging和时间序列预测_时间序列的LSTM模型预测——基于Keras