svm+python实现

一.svm概述

svm是一种二分类模型,学习策略是通过间隔最大化来实现分类的目的,最终转化为了凸二次规划求解,即:

的确我们可以单纯的通过求解凸二次规划问题来获得答案,但是当训练样本量很大时,这些算法就会变的低效,从上面的公式就可以直观看出,有多少样例就有多少乘子,如何高效求解拉格朗日乘子成为了关键——smo。

浏览了很多博文总结一下具体的求解过程(smo):

1.寻找违背KKT条件的,即:

其中:

2.寻找第二个乘子,通过:max|E1-E2|

3.求解约束前的,公式为:

其中,,Ei=f(xi)-yi

4.对进行约束:

5.通过求解

6.对b的更新

7.启发式迭代具体方法:后续补充

二.python实现

#利用svm求解逻辑回归,然后画图(详细版)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#读取数据
traindata=pd.read_csv("E:\\caffe\\study\\3_data.csv")
traindata=traindata.iloc[0:100,:]

#准备函数
def ui(No,traindata,alpha,b):#求ui
    a=0
    for i in range(len(traindata)):
        a=a+alpha[i]*traindata.iloc[i,2]*(traindata.iloc[i,0]*traindata.iloc[No,0]+traindata.iloc[i,1]*traindata.iloc[No,0])
    a=a+b
    return a
def Ei(No,traindata,alpha,b):#求Ei=ui-yi
    a=ui(No,traindata,alpha,b)-traindata.iloc[No,2]
    return a
def alpha2(i,traindata,alpha,b):#找第二个alpha2在alpha向量中的位置,通过max|Ei-Ej|
    ei=Ei(i,traindata,alpha,b)
    a=0
    c=0
    for j in range(len(traindata)):
        ej=Ei(j,traindata,alpha,b)
        bi=abs(ei-ej)
        if bi>a:
            a=bi
            c=j
    return c
def eta(traindata,i,j):#求分母eta
    a=traindata.iloc[i,0]**2+traindata.iloc[i,1]**2+traindata.iloc[j,0]**2+traindata.iloc[j,1]**2-2*(traindata.iloc[i,0]*traindata.iloc[j,0]+traindata.iloc[i,1]*traindata.iloc[j,1])
    return a
def alpha2new(traindata, i,j,alpha,b):#求alpha2new,这里直接做约束
    a=alpha[j]+traindata.iloc[j,2]*(Ei(i,traindata,alpha,b)-Ei(j,traindata,alpha,b))/eta(traindata,i,j)
    if traindata.iloc[i,2]==traindata.iloc[j,2]:
        L=0
        H=alpha[i]+alpha[j]
        if a>H:
            return H
        elif a<L:
            return L
        else:
            return a
    else:
        L=np.array([0,alpha[j]-alpha[i]]).max()
        if a<L:
            return L
        else:
            return a
def alpha1new(traindata, i,j,alpha,b):#把alpha2new带进去求alpha1new
    a=alpha[i]+traindata.iloc[i,2]*traindata.iloc[j,2]*(alpha[j]-alpha2new(traindata, i,j,alpha,b))
    return a
def bnew(traindata, i,j,alpha,b):#更新b
    ei=Ei(i,traindata,alpha,b)
    ej=Ei(j,traindata,alpha,b)
    yi=traindata.iloc[i,2]
    yj=traindata.iloc[j,2]
    alphai=alpha1new(traindata, i, j, alpha, b)
    alphaj=alpha2new(traindata, i,j,alpha,b)
    b1=b-ei-yi*(alphai-alpha[i])*(traindata.iloc[i,0]**2+traindata.iloc[i,1]**2)-yj*(alphaj-alpha[j])*(traindata.iloc[i,0]*traindata.iloc[j,0]+traindata.iloc[i,1]*traindata.iloc[j,1])
    b2=b-ej-yi*(alphai-alpha[i])*(traindata.iloc[i,0]*traindata.iloc[j,0]+traindata.iloc[i,1]*traindata.iloc[j,1])-yj*(alphaj-alpha[j])*(traindata.iloc[j,0]**2+traindata.iloc[j,1]**2)
    if alphai>0:
        return b1
    elif alphaj>0:
        return b2
    else:
        return (b1+b2)/2

#上面的所有函数只需要加载一下即可,重点在下面的实际运行

alpha = np.zeros(len(traindata))  # 初始化alpha向量,零向量,长度为数据的长度
alphav = alpha.copy()#alphav相当于经过一次更新后的alpha向量,目的在于下面运行的时候会和更新前的alpha做比较
b = 0  # 初始化b为0
for i in range(len(alpha)):  # 对所有违反kkt的alpha做更新,最后输出alpha为更新后的alpha,中间的b也是更新好的
    if (alpha[i]==0 and traindata.iloc[i,2]*ui(i,traindata,alpha,b)>=1)+(alpha[i]>0 and traindata.iloc[i,2]*ui(i,traindata,alpha,b)<=1)==0:
        j = alpha2(i, traindata, alpha, b)
        t = alpha2new(traindata, i, j, alpha, b)
        if t >= 0:
            alphav[j] = t
            alphav[i] = alpha1new(traindata, i, j, alpha, b)
            if alphav[i]!=alpha[i]:
                b = bnew(traindata, i, j, alpha, b)
    alpha = alphav
#下面是用来临时检验alpha和b的结果是否正确,方法是计算出w,初始化一组x,将w,b带入计算y,看y的结果是否合理,可以和原始数据作图对比
    w=np.zeros(2)#初始化w
    for i in range(len(alpha)):
        w=w+alpha[i]*traindata.iloc[i,2]*np.array(traindata.iloc[i,:2])
    w=list(w)
    x=[1,10]#初始化x
    y=[((-1)*b-w[0]*plot_x[0])/w[1],(b-w[0]*plot_x[1])/w[1]]#计算y

  附原始数据:链接:http://pan.baidu.com/s/1miT3Dzi 密码:cipe

时间: 2024-08-14 11:51:31

svm+python实现的相关文章

SVM python小样例

SVM有很多种实现,但是本章只关注其中最流行的一种实现,即序列最小化(SMO)算法在此之后,我们将介绍如何使用一种称为核函数的方式将SVM扩展到更多的数据集上基于最大间隔的分割数据优点:泛化错误率低,计算开销不大,结果易解释缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题适用数据类型:数值型和标称型数据寻找最大间隔:分割超平面的形式可以写成W^T *x+b,要计算点A到分割超平面的距离,就必须给出点到分割面的法线或垂线的长度,该值为|w^T+b|/||w||.这里的常数

基于Triplet loss函数训练人脸识别深度网络(Open Face)

Git:  http://cmusatyalab.github.io/openface/ FaceNet's innovation comes from four distinct factors: (a) thetriplet loss, (b) their triplet selection procedure, (c) training with 100 million to 200 million labeled images, and (d) (not discussed here)

Python图像处理(15):SVM分类器

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在opencv中支持SVM分类器,本文尝试在python中调用它. 和前面的贝叶斯分类器一样,SVM也遵循先训练再使用的方式,我们直接在贝叶斯分类器的测试代码上做简单修改,完成两类数据点的分类. 首先也是先创建训练用的数据,需要注意的是这里的train_label必须是整数类型,而不是float: # 训练的点数 train_pts = 30 # 创建测试的数据点,2类 # 以(-1.5, -1

基于SMO—RBF的SVM手写体识别分类之Python

今天看了Python语言写的使用SVM中的SMO进行优化,使用RBF函数进行手写体识别,下面简单整理一下整个过程及思路,然后详细介绍各个部分. (1)获取训练数据集trainingMat和labelMat: (2)利用SMO进行优化获得优化参数alphas和b,这一步即是进行训练获得最优参数 (3)使用alphas和b带入RBF高斯核函数计算训练集输出并计算训练错误率: (4)获取测试数据集testMat和labelMat1: (5)使用(2)的参数alphas和b带入RBF高斯核函数计算输出,

利用Python sklearn的SVM对AT&amp;T人脸数据进行人脸识别

要求:使用10-fold交叉验证方法实现SVM的对人脸库识别,列出不同核函数参数对识别结果的影响,要求画对比曲线. 使用Python完成,主要参考文献[4],其中遇到不懂的功能函数一个一个的查官方文档和相关资料.其中包含了使用Python画图,遍历文件,读取图片,PCA降维,SVM,交叉验证等知识. 0.数据说明预处理 下载AT&T人脸数据(http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html),解压缩后为40个文件夹

【机器学习算法-python实现】svm支持向量机(2)—简化版SMO算法

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景知识 通过上一节我们通过引入拉格朗日乗子得到支持向量机变形公式.详细变法可以参考这位大神的博客--地址 参照拉格朗日公式F(x1,x2,...λ)=f(x1,x2,...)-λg(x1,x2...).我们把上面的式子变型为: 约束条件就变成了: 下面就根据最小优化算法SMO(Sequential Minimal Optimization).找出距离分隔面最近的点,也就是支持向量集.如下图的蓝色点所示.

机器学习算法与Python实践之(三)支持向量机(SVM)进阶

机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 [email protected] http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了. 在这一节我们主要是

机器学习算法与Python实践之(四)支持向量机(SVM)实现

机器学习算法与Python实践之(四)支持向量机(SVM)实现 机器学习算法与Python实践之(四)支持向量机(SVM)实现 [email protected] http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了. 在这一节我们主要是

python 实现 svm算法

svm算法,说到底就是二次优化问题. 带有约束的二次优化问题. 1.线性优化问题,课件Leture5-QP 参考 https://www.coin-or.org/PuLP/CaseStudies/a_blending_problem.html python代码: # problemdef qp_test1(): prob = LpProblem("qp_test1", LpMinimize) x1 = LpVariable("x1", 0, None, LpInte