一.软间隔SVM目标函数推导

SVM假定存在一个超平面能够将两类样本完全分隔开来,但在实际情况中,数据是不能被一个平面完全分隔的,因此,为了使得问题可解,我们需要在原SVM的优化问题上加入松弛变量ε,ε是一个大于等于0的数,引入松弛变量后,原优化问题转化为:

其中,C是正则化常数,其取值越大,则表示对误分类的惩罚越大,即要求越严格。不难看出,当ε=0时,该问题将会成为标准的SVM优化问题.

引入松弛变量后,其约束条件变为:

由于标签y的取值为-1或1,则其约束条件可以简化为:

那么,我们应该如何求得该目标函数的最优解呢?

首先,需要构建损失函数,我们通过惩罚错误分类的数目来实现,在这里,采用hinge损失函数:

则松弛变量ε可以用该损失函数来表示:

其含义为,当分类正确时,即时,松弛变量为0,即不进行惩罚,当分类失败时,对其进行惩罚。

则目标函数可以简化为:

令C = 1/(nλ), 给公式整体xλ得到目标函数:

对于一个随机选择的样本点,目标函数为:

二. 佩加索斯算法

对于该目标函数,我们可以使用梯度下降法来求解该目标函数。

<1时,,则:

>1时,,则:

此时,我们得到了目标函数对两个参数的梯度,则我们可以通过梯度下降的方式来优化参数:

其中η_t为学习率,η_t = 1/(λt),t为训练的轮次,其作用是控制参数优化的步长,当训练轮数越多时,参数优化步长越小。

得到参数的更新公式后,我们采用随机梯度下降的方式训练模型,训练步骤如下:

这便是佩加索斯算法,使用该算法,可以在O(N)的时间复杂度内训练模型,十分高效。

三. 佩加索斯算法代码实现

def svm(data,label,lamda,n):row,col = np.shape(data)w = np.zeros(col)b = 0.0for i in range(1,n+1):r = random.randint(0,row-1)eta = 1.0/(lamda*i)predict = forward(w,b,data[r])if label[r] * predict < 1:w = w - w/i + eta * label[r] * data[r]b = b + eta * label[r]else:w = w - w/ireturn w,b

预测时,只需要计算WX+b即可:

def forward(w,b,x):return w*x.T + b

在这里,贴上一段使用svm分类垃圾邮件的代码,邮件数据集中训练样本已转换为词向量,原始标签为(0,1),因此,在使用SVM分类时需要先将标签转为(-1,1)。

'''
返回测试数据,test_data['Xtest']为数据,test_data['ytest']为标签
'''
def load_test_data():test_data = loadmat('./data/spamTest.mat')test_label = []for item in test_data['ytest']:if item[0] == 0:test_label.append([-1])else:test_label.append([1])return np.mat(test_data['Xtest']),np.mat(test_label)

完整代码如下:

import random
import numpy as np
from scipy.io import loadmat'''
返回训练数据,train_data['X']为数据,train_data['y']为标签
'''
def load_train_data():train_data = loadmat('./data/spamTrain.mat')label = []for item in train_data['y']:if item[0] == 0:label.append([-1])else:label.append([1])return np.mat(train_data['X']),np.mat(label)'''
返回测试数据,test_data['Xtest']为数据,test_data['ytest']为标签
'''
def load_test_data():test_data = loadmat('./data/spamTest.mat')test_label = []for item in test_data['ytest']:if item[0] == 0:test_label.append([-1])else:test_label.append([1])return np.mat(test_data['Xtest']),np.mat(test_label)def forward(w,b,x):return w*x.T + bdef svm(data,label,lamda,n):row,col = np.shape(data)w = np.zeros(col)b = 0.0for i in range(1,n+1):r = random.randint(0,row-1)eta = 1.0/(lamda*i)predict = forward(w,b,data[r])if label[r] * predict < 1:w = w - w/i + eta * label[r] * data[r]b = b + eta * label[r]else:w = w - w/ireturn w,bdef test(w,b):test_data,test_label = load_test_data()pre_list = []for item in test_data:y_pre = forward(w,b,item)if y_pre[0][0]>0:pre_list.append(1)else:pre_list.append(-1)count = 0for i in range(len(pre_list)):if(pre_list[i] == test_label[i][0]):count += 1print("The accuracy is:",count/len(pre_list))def train():train_data, train_label = load_train_data()w,b = svm(train_data,train_label,0.1,2000)return w,bif __name__ == '__main__':for i in range(10):w,b = train()test(w,b)

在λ = 0.1时,分类准确率最高可以达到97.7%。

四. 数据集

数据集链接如下:

链接:https://pan.baidu.com/s/1LkAZaw-gPc4FXRmD8jpGJQ 
提取码:8h82

Python使用佩加索斯(Pegasos)算法实现软间隔SVM相关推荐

  1. SMO算法在软间隔SVM分类中的应用

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

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

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

  3. 代码验证约瑟夫环百科词条中的故事(Python)——约瑟夫斯的故事、数学家加帕斯讲的故事,体验算法模板的奇妙。

    [点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...

  4. Python:实现chudnovsky algorithm楚德诺夫斯基算法(附完整源码)

    Python:实现chudnovsky algorithm楚德诺夫斯基算法 from decimal import Decimal, getcontext from math import ceil, ...

  5. 贝叶斯优化算法python实例_贝叶斯优化/Bayesian Optimization

    最近心情不好,写篇文章让大家开心一下吧.介绍一下世界上最好的算法:贝叶斯优化. 背景介绍 近年来深度神经网络大火,可是神经网络的超参(hyperparameters)选择一直是一个问题,因为大部分时候 ...

  6. python贝叶斯优化算法_自动调参——贝叶斯优化算法hyperopt

    注:转载请注明出处. 本篇文章主要记录了贝叶斯优化算法hyperopt的学习笔记,如果想看自动化调参中的网格调参和遗传优化算法TPOT,请查看我另外两篇文章:网格搜索gridSearchCV和遗传优化 ...

  7. python贝叶斯优化算法_【干货】手把手教你Python实现自动贝叶斯调整超参数

    [导读]机器学习中,调参是一项繁琐但至关重要的任务,因为它很大程度上影响了算法的性能.手动调参十分耗时,网格和随机搜索不需要人力,但需要很长的运行时间.因此,诞生了许多自动调整超参数的方法.贝叶斯优化 ...

  8. 一致性算法之paxos(帕克索斯)算法

    1:帕克索斯算法 paxos : 参考文档:分布式系列文章--Paxos算法原理与推导 - lzslbd - 博客园 问题产生的背景: 分布式系统出现节点宕机或者网络异常,导致消息延迟.丢失.乱序等情 ...

  9. 帕索斯算法在zookeeper的应用体现

    本文知识体系: 1. 前言 Zookeeper这个框架很特殊也很重要,可以说是我们所有的分布式,或者说微服务的一个基石,没有这个zookeeper或者说没有他这个思想我们分部是和微服务是镜花水月.Zo ...

最新文章

  1. 机器学习工程师正在失业,但学习依旧是唯一的出路
  2. 专访盛大创始人陈天桥:未来的杀手级应用必将诞生于脑科学
  3. UA MATH571A QE练习 R语言 非参数回归 上
  4. 客户端相关知识学习(三)之Android原生与H5交互的实现
  5. 终于可以放下心来了,呜呜...
  6. android linux截图库,Android中截图(surfaceView)源码
  7. 大地震!某大厂“硬核”抢人,放话:只要AI人才,高中毕业都行!
  8. 机器学习速成课程 | 练习 | Google Development——编程练习:Pandas 简介
  9. 【Java】利用递归求阶乘
  10. flex布局导致拉伸的问题
  11. %3c php $str1=,ThinkPHP5.0.215.1.* 代码执行和命令执行漏洞利用
  12. jquery 判断是否是浮点数_jquery或者js获取到元素宽高精确到小数
  13. 最少拍控制系统设计(一)-- 最少拍无纹波系统的设计方法
  14. win11怎么隐藏任务栏图标?
  15. 数字电视机顶盒ATSC制式详细介绍
  16. 乡村黄昏[原创诗一首]
  17. 医院云PACS管理系统源码
  18. 二进制炸弹实验bomb-whu 拆弹
  19. Java下载excel模板
  20. 单位组织机构代码提取和补零操作

热门文章

  1. C语言:字符串的定义(也叫字符数组)
  2. C语言中定义字符串的几种方法
  3. 2023年度全球品牌价值500强榜单公布,苹果失去头把交椅,亚马逊重新登顶第一 | 美通社头条...
  4. 白盒测试方法之判定覆盖测试/分支覆盖测试
  5. Webots 机器人仿真平台(十) 添加camera相机
  6. 语音识别 | kaggle鸟叫识别新赛赛题解析
  7. [转载] 七龙珠第一部——第062话 超神水的效果
  8. 必需品、消费品与奢侈品
  9. java实现对数组按中文名称排序
  10. 10-28 查询选修张老师讲授所有课程的学生(对自己来说有难度的一道题)