绘制出简化的SMO算法和完整SMO算法在testSet.txt数据集上的分类超平面

时间: 2023-07-16 09:17:00 浏览: 74
首先介绍一下简化版SMO算法(Sequential Minimal Optimization),其主要思想是每次选择两个变量进行优化,而其他变量保持不变。简化版SMO算法的步骤如下: 1. 初始化参数 alpha、b 和误差缓存 E 2. 选择两个不同的变量 alpha1 和 alpha2 3. 计算这两个变量对应样本的误差 E1 和 E2 4. 计算变量 alpha2 的上下界 L 和 H 5. 如果 L 和 H 相等,不做任何处理直接退出本轮循环 6. 计算变量 alpha2 的新值 7. 如果新值变化太小,不做任何处理直接退出本轮循环 8. 计算变量 alpha1 的新值 9. 更新参数 b 和误差缓存 E 10. 如果有任意 alpha 值发生变化,增加已经遍历的 alpha 对数目,否则继续循环 下面是完整版SMO算法的步骤: 1. 初始化参数 alpha、b 和误差缓存 E 2. 选择两个不同的变量 alpha1 和 alpha2 3. 计算这两个变量对应样本的误差 E1 和 E2 4. 计算变量 alpha2 的上下界 L 和 H 5. 如果 L 和 H 相等,不做任何处理直接退出本轮循环 6. 计算变量 alpha2 的新值 7. 如果新值变化太小,不做任何处理直接退出本轮循环 8. 计算变量 alpha1 的新值 9. 更新参数 b 和误差缓存 E 10. 如果有任意 alpha 值发生变化,增加已经遍历的 alpha 对数目,否则继续循环 11. 在所有非边界 alpha 中选择违反 KKT 条件的变量作为 alpha1 12. 如果没有这样的变量,随机选择一个 alpha1 13. 选择 alpha2,使得优化步骤最大 14. 进行步骤 3-10,直到达到最大迭代次数或者所有 alpha 值都不再变化 下面是在testSet.txt数据集上绘制分类超平面的代码实现: ```python import numpy as np import matplotlib.pyplot as plt def loadDataSet(fileName): 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): j = i while (j == i): j = int(np.random.uniform(0, m)) return j def clipAlpha(aj, H, L): if aj > H: aj = H if L > aj: aj = L return aj def smoSimple(dataMatIn, classLabels, C, toler, maxIter): dataMatrix = np.mat(dataMatIn) labelMat = np.mat(classLabels).transpose() b = 0 m, n = np.shape(dataMatrix) alphas = np.mat(np.zeros((m, 1))) iter = 0 while (iter < maxIter): alphaPairsChanged = 0 for i in range(m): fXi = float(np.multiply(alphas, labelMat).T * (dataMatrix * dataMatrix[i, :].T)) + b Ei = fXi - float(labelMat[i]) if ((labelMat[i] * Ei < -toler) and (alphas[i] < C)) or ((labelMat[i] * Ei > toler) and (alphas[i] > 0)): j = selectJrand(i, m) fXj = float(np.multiply(alphas, labelMat).T * (dataMatrix * dataMatrix[j, :].T)) + b Ej = fXj - float(labelMat[j]) alphaIold = alphas[i].copy() alphaJold = alphas[j].copy() 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]) if L == H: print("L == H") continue eta = 2.0 * dataMatrix[i, :] * dataMatrix[j, :].T - \ dataMatrix[i, :] * dataMatrix[i, :].T - \ dataMatrix[j, :] * dataMatrix[j, :].T if eta >= 0: print("eta >= 0") continue alphas[j] -= labelMat[j] * (Ei - Ej) / eta alphas[j] = clipAlpha(alphas[j], H, L) if (abs(alphas[j] - alphaJold) < 0.00001): print("j not moving enough") continue alphas[i] += labelMat[j] * labelMat[i] * (alphaJold - alphas[j]) b1 = b - Ei - labelMat[i] * (alphas[i] - alphaIold) * \ dataMatrix[i, :] * dataMatrix[i, :].T - \ labelMat[j] * (alphas[j] - alphaJold) * \ dataMatrix[i, :] * dataMatrix[j, :].T b2 = b - Ej - labelMat[i] * (alphas[i] - alphaIold) * \ dataMatrix[i, :] * dataMatrix[j, :].T - \ labelMat[j] * (alphas[j] - alphaJold) * \ dataMatrix[j, :] * dataMatrix[j, :].T if (0 < alphas[i]) and (C > alphas[i]): b = b1 elif (0 < alphas[j]) and (C > alphas[j]): b = b2 else: b = (b1 + b2) / 2.0 alphaPairsChanged += 1 print("iter: %d i:%d, pairs changed %d" % (iter, i, alphaPairsChanged)) if (alphaPairsChanged == 0): iter += 1 else: iter = 0 print("iteration number: %d" % iter) return b, alphas def plotSVM(dataMatIn, classLabels, b, alphas): dataArr = np.array(dataMatIn) n = np.shape(dataArr)[0] xcord1 = [] ycord1 = [] xcord2 = [] ycord2 = [] for i in range(n): if int(classLabels[i]) == 1: xcord1.append(dataArr[i, 0]) ycord1.append(dataArr[i, 1]) else: xcord2.append(dataArr[i, 0]) ycord2.append(dataArr[i, 1]) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xcord1, ycord1, s=30, c='red', marker='s') ax.scatter(xcord2, ycord2, s=30, c='green') for i in range(n): if alphas[i] > 0: ax.plot(dataArr[i, 0], dataArr[i, 1], 'o') ws = np.zeros((2, 1)) for i in range(n): ws += np.multiply(alphas[i] * classLabels[i], dataMatrix[i, :].T) x = np.arange(-2.0, 12.0, 0.1) y = (-b - ws[0] * x) / ws[1] ax.plot(x, y) plt.xlabel('X1') plt.ylabel('X2') plt.show() if __name__ == '__main__': dataMat, labelMat = loadDataSet('testSet.txt') b, alphas = smoSimple(dataMat, labelMat, 0.6, 0.001, 40) plotSVM(dataMat, labelMat, b, alphas) ``` 运行上述代码后,即可在图形界面上看到绘制的分类超平面。

相关推荐

最新推荐

recommend-type

基于多分类非线性SVM(+交叉验证法)的MNIST手写数据集训练(无框架)算法

《基于多分类非线性SVM(+交叉验证法)的MNIST手写数据集训练算法》 在机器学习领域,支持向量机(Support Vector Machine, SVM)是一种广泛使用的监督学习模型,尤其适用于分类问题。本文将详细介绍如何运用多分类...
recommend-type

SMO支持向量机 算法 代码

支持向量机(Support Vector Machine, SVM)是一种监督学习模型,尤其在二分类问题中表现优秀,也可...在实际应用中,SVM和SMO算法因其高效性和泛化能力,被广泛应用于许多领域,如文本分类、图像识别和生物信息学等。
recommend-type

04-群体智能优化算法-蜘蛛猴优化算法.docx

在SMO算法中,【蜘蛛猴】代表潜在的解决方案,群体中的【局部领导者】和【全局领导者】分别引导小团体和整个群体的行为。算法通过模仿蜘蛛猴的交流和觅食策略来更新和优化解。例如,在【局部领导者阶段】,每个蜘蛛...
recommend-type

基于springcloud微服务开发平台

采用前后端分离的模式,前端开源两个框架:Sword (基于 React、Ant Design)、Saber (基于 Vue、Element-UI) 后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架:BladeTool BladeTool已推送至Maven中央库,直接引入即可,减少了工程的臃肿,也可更注重于业务开发 集成Sentinel从流量控制、熔断降级、系统负载等多个维度保护服务的稳定性。 注册中心、配置中心选型Nacos,为工程瘦身的同时加强各模块之间的联动。 极简封装了多租户底层,用更少的代码换来拓展性更强的SaaS多租户系统。 借鉴OAuth2,自研多终端认证系统,可控制子系统的token权限互相隔离。 借鉴Security,自研Secure模块,采用JWT做Token认证,可拓展集成Redis等细颗粒度控制方案。 稳定生产了六年,经历了从 Camden -> Hoxton -> 2023 的技术架构,也经历了从fat jar -> docker -> k8s + jenkins的部署架构。 项目分包明确,规范微服务的开发模式,使包与包
recommend-type

毕业设计javajsp诗歌诗词网站sqlserver-qr源码含文档工具包

毕业设计javajsp诗歌诗词网站sqlserver-qr源码含文档工具包 页面是jsp,数据库sqlserver,jdk1.8,开发工具用ecplise、myecplise、sts、idea都可以 诗韵人间网站 系统管理 修改密码 年代管理 年代录入 诗词管理 诗词录入 诗词搜索 留言板 包含:源码、数据库脚本、论文、答辩ppt、开题报告、环境工具包、相同框架项目的安装教程(在说明文档中)
recommend-type

SDN权威指南:深入解析软件定义网络与OpenFlow

"SDN: Software Defined Networks 由 Thomas D. Nadeau 和 Ken Gray 编著,这是一本深入剖析SDN技术的权威指南。本书详细介绍了软件定义网络(SDN)的概念、原理以及OpenFlow等相关技术,是计算机教材和IT专业人员的重要参考资料。" 在SDN(Software Defined Networking)这一领域,它代表了网络架构的一次重大革新,将控制平面与数据平面分离,从而实现了网络的灵活配置和集中管理。这本书由Thomas D. Nadeau和Ken Gray共同撰写,他们都是SDN领域的专家,提供了对SDN的深度解析。 书中主要知识点包括: 1. **SDN的基本概念**:解释了SDN的核心理念,即通过将网络控制逻辑从底层硬件中抽象出来,集中到一个独立的控制器,使得网络可以像软件一样被编程和管理。 2. **OpenFlow协议**:OpenFlow是SDN中最著名的数据平面接口,它允许控制器直接与交换机通信,定义数据包的转发路径。书中详细阐述了OpenFlow的工作机制、协议报文结构和如何实现流表的建立与更新。 3. **SDN架构**:描述了典型的SDN架构,包括网络设备(如交换机、路由器)、控制器以及应用层的构成,分析了各部分的角色和交互方式。 4. **SDN的优势**:讨论了SDN带来的好处,如提高网络的灵活性、可扩展性,简化网络管理,以及支持创新的网络服务和策略。 5. **安全性与挑战**:探讨了SDN在安全方面可能面临的问题,如集中式控制器的安全隐患、数据平面的攻击面扩大等,并提出了相应的解决方案。 6. **SDN的应用场景**:列举了SDN在数据中心网络、云计算、虚拟化环境、广域网优化、网络安全等领域中的实际应用案例,展示了SDN技术的广泛影响力。 7. **控制器平台与框架**:介绍了一些主流的SDN控制器,如OpenDaylight、ONOS等,以及相关的开发框架和工具,帮助读者理解如何构建和部署SDN解决方案。 8. **未来发展趋势**:分析了SDN技术的未来发展方向,包括NFV(网络功能虚拟化)、边缘计算、5G网络等,预示了SDN在下一代网络中的关键作用。 本书不仅适合网络工程师、研究人员和学者深入学习SDN,也适合作为高校相关专业的教材,通过理论与实践相结合的方式,帮助读者掌握SDN技术并应用于实际网络环境中。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

PHP图片上传扩展应用:实现图片裁剪、水印和压缩功能

![PHP图片上传扩展应用:实现图片裁剪、水印和压缩功能](https://st0.dancf.com/market-operations/market/side/1701682825707.jpg) # 1. PHP图片上传扩展介绍 PHP提供了多种图片上传扩展,允许开发者轻松地将图片上传到服务器。这些扩展包括: - **GD库:**一个用于处理图像的标准PHP扩展,提供基本的图片操作功能,如裁剪、缩放和添加水印。 - **ImageMagick:**一个功能强大的命令行工具,可用于执行更高级的图像处理任务,如复杂的裁剪、颜色校正和格式转换。 # 2. PHP图片裁剪技术 ### 2
recommend-type

sentinel 热点限流nacos配置

Sentinel 是阿里巴巴开源的一个流量控制框架,它支持热点限流功能。要通过 Nacos 配置 Sentinel 的热点限流,首先需要在 Nacos 中管理 Sentinel 相关的服务发现配置。 1. **创建Nacos配置**: - 登录到 Nacos 控制台,进入 `配置` 或者 `Config Center` 页面。 - 创建一个新的数据源,用于存放 Sentinel 的配置文件,比如命名空间为 `sentinel-config`。 2. **配置热点规则**: - 编辑一个名为 `hot_rule.yaml` 或类似名称的配置文件,添加如下内容: `
recommend-type

HP9000服务器宝典:从入门到进阶

"HP9000非常宝典.pdf" 这篇文档是关于HP9000服务器的详尽指南,涵盖了从基础概念到高级操作的多个方面。以下是文档中提到的一些关键知识点: 1. HP9000服务器:这是惠普公司生产的一系列高性能、可靠性高的企业级服务器,主要面向大型企业和组织。 2. 服务器产品分类:服务器通常按照功能、性能和规模进行分类,如入门级、部门级、企业级等,HP9000可能包括其中的不同型号。 3. CPU:服务器的核心组件,文档中可能介绍了HP9000所使用的处理器类型及其特性。 4. 配置相关信息:这部分内容涉及如何配置服务器硬件,如内存、硬盘、网络接口等,以及如何检查系统配置信息。 5. 维护相关信息:包括如何进行日常维护,如监控系统状态、错误日志分析、硬件更换等。 6. ModelString、SWID和ssconfig:这些是HP服务器特有的标识符和工具,用于识别和管理硬件及软件。 7. 操作系统:文档可能详细介绍了支持HP9000的多种操作系统,如HP-UX、Linux等,并可能涉及启动流程。 8. 启动过程:从开机到操作系统加载的整个流程,包括PDC(Processor Dependent Code)、ISL、LoadKernel、Startsubsystem、初始化脚本如/etc/init、/sbin/bcheckrc、/etc/rc.config、/sbin/rc等。 9. Init进程问题:讨论了当命令反复启动过快时,系统如何处理,如"Init: Command is Respawning Too Rapidly"。 10. 登录与权限:描述了用户登录系统的过程,以及权限管理和认证。 11. Patches和应用软件安装:讲述了如何列出、安装和验证补丁,以及补丁评级和打包安装方法。还提到了补丁光盘和标准补丁包-SupportPlus。 12. 系统核心(Kernel):核心是操作系统的核心部分,文档可能讲解了其作用、如何手工编译生成新的核心。 13. LVM (Logical Volume Manager):一种磁盘管理技术,允许动态扩展和管理磁盘空间。文档给出了创建镜像、LVM磁盘结构、pvcreate、mkboot、vgcfgbackup/vgcfgrestore、vgchange等操作的实例。 14. 集群和高可用性:如MC/ServiceGuard,介绍了节点(node)、共享存储、心跳线、备份网卡和锁盘的概念,以及如何实现高可用性。 15. CrashDump与HPMC:CrashDump是系统崩溃时保存的内存转储,用于故障分析。HPMC(Machine Console)提供了远程监控和管理服务器的功能。文档介绍了如何配置DumpDevice、保存和分析CrashDump,以及收集和分析HPMC数据。 此文档对于理解和管理HP9000服务器系统具有极高的参考价值,无论是对于初学者还是经验丰富的管理员,都能从中获得宝贵的信息。