第1关:SMO高效优化算法

import numpy as np
import random
def calcEk(oS, k):"""计算误差Parameters:oS - 数据结构k - 标号为k的数据Returns:Ek - 标号为k的数据误差"""fXk = float(np.multiply(oS.alphas,oS.labelMat).T*(oS.X*oS.X[k,:].T) + oS.b)Ek = fXk - float(oS.labelMat[k])return Ekdef loadDataSet(fileName):"""读取数据Parameters:fileName - 文件名Returns:dataMat - 数据矩阵labelMat - 数据标签"""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
def selectJrand(i, m):"""函数说明:随机选择alpha_j的索引值Parameters:i - alpha_i的索引值m - alpha参数个数Returns:j - alpha_j的索引值"""j = i                                 #选择一个不等于i的jwhile (j == i):j = int(random.uniform(0, m))return jdef selectJ(i, oS, Ei):"""内循环启发方式2Parameters:i - 标号为i的数据的索引值oS - 数据结构Ei - 标号为i的数据误差Returns:j, maxK - 标号为j或maxK的数据的索引值Ej - 标号为j的数据误差"""maxK = -1; maxDeltaE = 0; Ej = 0                         #初始化oS.eCache[i] = [1,Ei]                                      #根据Ei更新误差缓存validEcacheList = np.nonzero(oS.eCache[:,0].A)[0]        #返回误差不为0的数据的索引值if (len(validEcacheList)) > 1:                            #有不为0的误差for k in validEcacheList:                           #遍历,找到最大的Ekif k == i: continue                             #不计算i,浪费时间Ek = calcEk(oS, k)                                #计算EkdeltaE = abs(Ei - Ek)                            #计算|Ei-Ek|if (deltaE > maxDeltaE):                        #找到maxDeltaEmaxK = k; maxDeltaE = deltaE; Ej = Ekreturn maxK, Ej                                        #返回maxK,Ejelse:                                                   #没有不为0的误差j = selectJrand(i, oS.m)                            #随机选择alpha_j的索引值Ej = calcEk(oS, j)                                    #计算Ejreturn j, Ej                                             #j,Ejdef updateEk(oS, k):"""计算Ek,并更新误差缓存Parameters:oS - 数据结构k - 标号为k的数据的索引值Returns:无"""Ek = calcEk(oS, k)                                        #计算EkoS.eCache[k] = [1,Ek]                                    #更新误差缓存def clipAlpha(aj,H,L):"""修剪alpha_jParameters:aj - alpha_j的值H - alpha上限L - alpha下限Returns:aj - 修剪后的alpah_j的值"""if aj > H:aj = Hif L > aj:aj = Lreturn ajclass optStruct:"""数据结构,维护所有需要操作的值Parameters:dataMatIn - 数据矩阵classLabels - 数据标签C - 松弛变量toler - 容错率"""def __init__(self, dataMatIn, classLabels, C, toler):self.X = dataMatIn                                #数据矩阵self.labelMat = classLabels                        #数据标签self.C = C                                         #松弛变量self.tol = toler                                 #容错率self.m = np.shape(dataMatIn)[0]                 #数据矩阵行数self.alphas = np.mat(np.zeros((self.m,1)))         #根据矩阵行数初始化alpha参数为0self.b = 0                                         #初始化b参数为0self.eCache = np.mat(np.zeros((self.m,2)))         #根据矩阵行数初始化虎误差缓存,第一列为是否有效的标志位,第二列为实际的误差E的值。def smoP(dataMatIn, classLabels, C, toler, maxIter):#转换为numpy的mat存储dataMatrix = np.mat(dataMatIn); labelMat = np.mat(classLabels).transpose()#初始化b参数,统计dataMatrix的维度b = 0; m,n = np.shape(dataMatrix)#初始化alpha参数,设为0alphas = np.mat(np.zeros((m,1)))#初始化迭代次数iter_num = 0#最多迭代matIter次while (iter_num < maxIter):alphaPairsChanged = 0for i in range(m):#步骤1:计算误差EifXi = float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + bEi = fXi - float(labelMat[i])#优化alpha,更设定一定的容错率。if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)):#随机选择另一个与alpha_i成对优化的alpha_jj = selectJrand(i,m)#步骤1:计算误差EjfXj = float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + bEj = fXj - float(labelMat[j])#保存更新前的aplpha值,使用深拷贝alphaIold = alphas[i].copy(); alphaJold = alphas[j].copy();#步骤2:计算上下界L和Hif (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])if L==H: print("L==H"); continue#步骤3:计算etaeta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].Tif eta >= 0: print("eta>=0"); continue#步骤4:更新alpha_jalphas[j] -= labelMat[j]*(Ei - Ej)/eta#步骤5:修剪alpha_jalphas[j] = clipAlpha(alphas[j],H,L)if (abs(alphas[j] - alphaJold) < 0.00001): print("alpha_j变化太小"); continue#步骤6:更新alpha_ialphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j])#步骤7:更新b_1和b_2b1 = 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,:].T#步骤8:根据b_1和b_2更新bif (0 < alphas[i]) and (C > alphas[i]): b = b1elif (0 < alphas[j]) and (C > alphas[j]): b = b2else: b = (b1 + b2)/2.0#统计优化次数alphaPairsChanged += 1#打印统计信息#print("第%d次迭代 样本:%d, alpha优化次数:%d" % (iter_num,i,alphaPairsChanged))#更新迭代次数if (alphaPairsChanged == 0): iter_num += 1else: iter_num = 0print("迭代次数: %d" % iter_num)return b,alphas#返回SMO算法计算的b和alphas
def calcWs(alphas,dataArr,classLabels):"""计算wParameters:dataArr - 数据矩阵classLabels - 数据标签alphas - alphas值Returns:w - 计算得到的w"""X = np.mat(dataArr); labelMat = np.mat(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 wif __name__ == '__main__':dataArr, classLabels = loadDataSet('./src/step2/testSet.txt')b, alphas = smoP(dataArr, classLabels, 0.6, 0.001, 40)w = calcWs(alphas,dataArr, classLabels)

educoder SMO进行优化相关推荐

  1. Educoder 机器学习 SMO进行优化 第1关:SMO高效优化算法

    第1关:SMO高效优化算法 任务要求 参考答案 评论1 任务描述 相关知识 了解SMO的工作原理 编程要求 测试说明 任务描述 本关任务:编写一个SMO算法. 相关知识 为了完成本关任务,你需要掌握: ...

  2. SVM——详细讲解SMO算法优化两个变量以及变量的选择

    一.SMO(序列最小最优化)优化两个变量 以非线性支持向量机的对偶问题为例,使用SMO算法求解该对偶问题的最优参数α* . 非线性支持向量机的对偶问题如下: 对偶问题转换:(如何转换请看这篇博客) 存 ...

  3. 机器学习实战之支持向量机(SVM)(三)SMO高效优化算法

    转载请注明作者和出处:https://blog.csdn.net/weixin_45814668 知乎:https://www.zhihu.com/people/qiongjian0427 Git:h ...

  4. python实现SMO(优化版)

    #来自周志华的<机器学习> from numpy import *#存储变量的类 class opStruct():def __init__(self,dataMatIn,classLab ...

  5. SMO(序列最小优化)算法论文及原理详述

    今日拜读了Platt的关于SMO的论文:Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Mac ...

  6. 机器学习入门笔记:(4.3)SMO算法

    前言 之前的博客中,已经介绍了SVM的原理: 机器学习入门学习笔记:(4.1)SVM算法 机器学习入门学习笔记:(4.2)核函数和软间隔 最后我们得到的优化问题如下: maxα∑i=1mαi−12∑i ...

  7. 支持向量机(SVM) SMO算法详解

    1.寻找最大间隔 训练样本集:D = { (x1, y1) ,  (x2, y2) , ... ,(xm, ym) } , yi ϵ { -1, +1} 划分超平面的线性方程:wTx + b = 0( ...

  8. 经典SVM之SMO算法实现

    经典SVM之SMO算法实现 一.浅谈理论 (1)原始问题部分        对于理论不做过深的解释和讨论.原因有两个.第一,我也不会.第二,写公式符号太头疼!所以,只是简单 给出 一些最重要的公式或者 ...

  9. 机器学习算法实践-SVM中的SMO算法

    前言 前两篇关于SVM的文章分别总结了SVM基本原理和核函数以及软间隔原理,本文我们就针对前面推导出的SVM对偶问题的一种高效的优化方法-序列最小优化算法(Sequential Minimal Opt ...

最新文章

  1. R语言rms包生存分析之限制性立方样条(RCS, Restricted cubic spline)分析详解实战:拟合连续性自变量和事件风险之间的关系:基于survival包lung数据
  2. 京东涉足快递业加剧行业动乱
  3. 【翻译】Oracle不同版本之间Export Import的兼容性矩阵
  4. R语言入门第四集 实验三:数据可视化
  5. Java 压缩字符串
  6. 信仰的力量—海归毕业季的选择与入职后的蜕变记
  7. 转:J2SE5中的最新注释功能SuppressWarnings
  8. linux tao环境 安装_Linux安装jdk8及环境变量配置
  9. poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...
  10. Linux基本管理篇
  11. linux查看php执行用户,在浏览器中打开php文件时,是Linux中的哪个用户执行的?...
  12. 2007年8月28日 月全食 照片
  13. 全网首发:github已经设置了令牌token,为什么还要验证用户密码
  14. mysql数据库表中重命名语句_mysql数据库重命名sql语句
  15. Dorado7自定义下拉框
  16. 如何在手机和电脑之间共享文件以及共享模拟器网络给电脑
  17. 路由器dhcp服务异常不能上网_路由器关闭dhcp之后无法上网怎么办?
  18. linux ssh权限设置,linux 让ssh只允许指定的用户登录的权限设置
  19. 【题解】P3939数颜色
  20. swift 百度地图加载与百度地图电子围栏加载

热门文章

  1. 删除DCIM文件下的照片无效问题
  2. ipad视频导入重新命名排序
  3. 文件包含漏洞特点和php封装伪协议
  4. 大学生综合评测系统(C语言)
  5. html5 开发tv,乐视TV开放平台鼎力支持html5开发者
  6. 在cmd中输入javac不行_cmd运行java可以javac不行
  7. 3 Genymotion的安装与使用
  8. 客户忠诚度解决方案的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. 海外社交媒体营销:facebook广告文案的8个写作技巧分享
  10. 为什么方差公式要用平方而不用绝对值_科学网—最小二乘法?为神马不是差的绝对值 - 于淼的博文...