博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数学之路(3)-机器学习(3)-机器学习算法-SVM[7]
阅读量:7003 次
发布时间:2019-06-27

本文共 3176 字,大约阅读时间需要 10 分钟。

 

本博客所有内容是原创,未经书面许可,严禁任何形式的转载

 

 

根据SMO的算法描述,用python实现,部分代码如下,定义了一个svm_pmcp类,所有的运算在svm_pmcp完成,这样便于封装和实际应用

 

#!/usr/bin/env python# -*- coding: utf-8 -*-#麦好:myhaspl@qq.com#http://blog.csdn.net/u010255642#svm算法import numpy as np import mathimport matplotlib.pyplot as plt#内积线性核函数def arraydot(x,y):    return x.T*y#svm参数与计算类class svm_pmcp:    def __init__(self):        '''初始化参数变量'''        self.alpha = []        self.samples=[]        self.labels=[]        self.boundalpha=[]    def samples_init(self,samples):        '''样子及乘子参数初始化'''        for (mysp,mylb) in samples:            self.samples.append(mysp)            self.labels.append(mylb)        #初始化拉格朗日乘子alpha为0        for i in xrange(0,len(self.samples)):            self.alpha.append(0)        #初始化b为0        self.b = 0    def kernel_init(self,func):        '''指定核函数'''        self.kernel_func=func    def lagrange_multiplier(self,i):        '''求拉格朗日乘子'''        pass    def svmoutput(self,i):        pass    def tol_init(self,mytol):        self.tol=mytol    def eps_inbit(self,myeps):        self.eps=myeps    def c_init(selfm,myc):        self.c=myc    def choicesecond_max(self,nte):        pass    def choicesecond_random(self):        pass    def get_lh(self,i,j):        pass    def update_b(self):        pass    def update_w(self):        pass    def alpha_nozero_noc(self):        pass    def store_alpha(self,i1,a1,i2,a2):        pass    def takestep(i1,i2,e2,alpha2):        if (i1==i2):            return False        alpha1=lagrange_multiplier(i1)        y1=labels[i1]        e1=svmoutput(i1)-y1        s=y1*y2        l,h=get_lh(i2,i1)        if l==h:            return False        k11=kernel_func(self.samples[i1],self.samples[i1])        k12=kernel_func(self.samples[i1],self.samples[i2])        k13=kernel_func(self.samples[i2],self.samples[i2])        eta=float(2*k12-k11-k22)        if (eta<0):            a2=alpha2-y2*(e1-e2))/eta            if a2
h: a2=h else: lobj=obfuncl() hobj=obfunch() if lobj>hobj+self.eps: a2=l elif lobj
self.tol and alpha2>0): if (len(self.boundalpha)>0): myj=choicesecond_max(e) if takestep(myj,myi,e2,alpha2): return 1 else: myj=choicesecond_random(myi) if takestep(myj,myi,e2,alpha2): return 1 return 0 def loop1(self,nc): for i in xrange(0,len(mysvm.samples)): nc+=examineexample(i) def loop2(self,nc): for i in alpha_nozero_noc(): nc+=examineexample(i) def mainroutine(self): numchanged=0 examineall=True while (numchanged>0 or examineall): numchanged=0 if examineall: numchanged=loop1(numchanged) else: numchanged=loop2(numchanged) examineall=not examinealldef mainsvm(mysamples): mysvm = svm_pmcp() mysvm.samples_init(mysamples) mysvm.kernel_init(arraydot) mysvm.tol_init(0.001) mysvm.eps_init(0.00001) mysvm.c_init(1) mysvm.mainroutine()

后面关于svm的章节将提供类下载地址及调用代码

 

 

你可能感兴趣的文章