svm 核函数
2016-06-30 11:45
295 查看
#coding=utf-8 import re from numpy import * def load_data(): data=[];label=[] o=open('test.txt') for line in o.readlines(): line_arr=re.split(r'(-\d*|\d*)',line.strip()) data.append([1.0,float(int(line_arr[1])),float(int(line_arr[3]))]) label.append(int(line_arr[5])) return data,label def kernel_trans(x,a,k_tup): m,n=shape(x) k=mat(zeros((m,1))) if k_tup[0]=='lin':k=x*a.T elif k_tup[0]=='rbf': for j in range(m): delta_row=x[j,:]-a k[j]=delta_row*delta_row.T k=exp(k/(-1*k_tup[1]**2)) else: raise NameError('Houston we have a problem that kernel is not recognized') return k class self_var: """函数间传递变量用,省得定义全局变量""" def __init__(self,data_matrix,label_matrix,c,toler,k_tup): self.x=data_matrix self.y=label_matrix self.c=c self.toler=toler self.m,self.n=shape(data_matrix) self.alphas=mat(zeros((self.m,1))) self.b=0 self.ecache=mat(zeros((self.m,2))) self.k=mat(zeros((self.m,self.m))) for i in range(self.m): self.k[:,i]=kernel_trans(self.x,self.x[i,:],k_tup) def select_jrand(i,m): j=i while j==i: j=int(random.uniform(0,m)) return j def clip_alpha(aj,h,l): if aj>h: aj=h if l>aj: aj=l return aj def clac_ek(sv,k): fxk=float(multiply(sv.alphas,sv.y).T*sv.k[:,k]+sv.b) ek=fxk-float(sv.y[k]) return ek def select_j(i,sv,ei): max_k=-1;max_delta_e=0;ej=0 sv.ecache[i]=[1,ei] valid_ecache_list=nonzero(sv.ecache[:,0].A)[0] if len(valid_ecache_list)>1: for k in valid_ecache_list: if k==i:continue ek=clac_ek(sv,k) delta_e=abs(ei-ek) if delta_e>max_delta_e: max_k=k;max_delta_e=delta_e;ej=ek return max_k,ej else: j=select_jrand(i,sv.m) ej=clac_ek(sv,j) return j,ej def update_ek(sv,k): ek=clac_ek(sv,k) sv.ecache[k]=[1,ek] def inner_loop(i,sv): ei=clac_ek(sv,i) if ((sv.y[i]*ei<-sv.toler)and(sv.alphas[i]<sv.c)) or \ ((sv.y[i]*ei>sv.toler)and(sv.alphas[i]>0)): j,ej=select_j(i,sv,ei) alpha_iold=sv.alphas[i].copy() alpha_jold=sv.alphas[j].copy() if sv.y[i] != sv.y[j]: l=max(0,sv.alphas[j]-sv.alphas[i]) h=min(sv.c,sv.c+sv.alphas[j]-sv.alphas[i]) else: l=max(0,sv.alphas[j]+sv.alphas[i]-sv.c) h=min(sv.c,sv.alphas[j]+sv.alphas[i]) if l==h:print 'l==h';return 0 eta=2.0*sv.k[i,j]-sv.k[i,i]-sv.k[j,j] if eta>=0:print 'eta>=0';return 0 sv.alphas[j]-=sv.y[j]*(ei-ej)/eta sv.alphas[j]=clip_alpha(sv.alphas[j],h,l) update_ek(sv,j) if abs(sv.alphas[j]-alpha_jold)<0.0001: print 'j not moving enough';return 0 sv.alphas[i]+=sv.y[j]*sv.y[i]*(alpha_jold-sv.alphas[j]) update_ek(sv,i) b1=sv.b-ei-sv.y[i]*(sv.alphas[i]-alpha_iold)*sv.k[i,i]-sv.y[j]*\ (sv.alphas[j]-alpha_jold)*sv.k[i,j] b2=sv.b-ej-sv.y[i]*(sv.alphas[i]-alpha_iold)*sv.k[i,j]-sv.y[j]*\ (sv.alphas[j]-alpha_jold)*sv.k[j,j] if 0<sv.alphas[i] and sv.c>sv.alphas[i]:sv.b=b1 elif 0<sv.alphas[j] and sv.c>sv.alphas[j]:sv.b=b2 else:sv.b=(b1+b2)/2.0 return 1 else: return 0 def smop(data_matrix,label_matrix,c,toler,max_iter,k_tup=('lin',0)): sv=self_var(data_matrix,label_matrix.T,c,toler,k_tup) ite=0 entire_set=True;alpha_pairs_changed=0 while ite<max_iter and (alpha_pairs_changed>0 or entire_set): alpha_pairs_changed=0 if entire_set: for i in range(sv.m): alpha_pairs_changed+=inner_loop(i,sv) print 'fullset,iter:%d i:%d,pairs changed %d'%(ite,i,alpha_pairs_changed) ite+=1 else: non_boundis=nonzero((sv.alphas.A>0)*(sv.alphas.A<c))[0] for i in non_boundis: alpha_pairs_changed+=inner_loop(i,sv) print 'non-bound,iter:%d i:%d,paris changed %d'%(ite,i,alpha_pairs_changed) ite+=1 if entire_set:entire_set=False elif alpha_pairs_changed==0:entire_set=True print 'iteration number: %d'%ite return sv.b,sv.alphas def test(k1=1.3): data,label=load_data() data_matrix=mat(data);label_matrix=mat(label) m,n=shape(data_matrix) b,alphas=smop(data_matrix,label_matrix,200,0.0001,10000,('rbf',k1)) sv_ind=nonzero(alphas.A>0)[0] svs=data_matrix[sv_ind] label_sv=label_matrix.T[sv_ind] print 'there are %d support vectors'%shape(svs)[0] error_count=0 for i in range(m): kernel_eval=kernel_trans(svs,data_matrix[i,:],('rbf',k1)) predict=kernel_eval.T*multiply(label_sv,alphas[sv_ind])+b if sign(predict)!=sign(label[i]):error_count+=1 print 'the training error rate is : %f'%(float(error_count)/m)
test.txt:
[2, 4, '1'] [5, 8, '1'] [8, 5, '1'] [9, 9, '1'] [4, 1, '1'] [-1, -1, '1'] [5, 8, '1'] [9, 3, '1'] [1, 8, '1'] [7, 3, '1'] [9, 3, '1'] [3, 8, '1'] [4, 6, '1'] [9, 7, '1'] [7, 1, '1'] [5, 2, '1'] [9, 6, '1'] [6, 9, '1'] [9, 8, '1'] [7, -1, '1'] [4, 5, '1'] [9, 8, '1'] [-1, 4, '1'] [4, 3, '1'] [6, -1, '1'] [9, 9, '1'] [-1, 3, '1'] [9, 8, '1'] [1, 7, '1'] [5, 8, '1'] [7, 8, '1'] [1, 5, '1'] [-1, 7, '1'] [1, 9, '1'] [7, 8, '1'] [2, 5, '1'] [7, 4, '1'] [2, 1, '1'] [6, 1, '1'] [-1, 1, '1'] [2, 4, '1'] [6, -1, '1'] [8, -1, '1'] [4, 9, '1'] [8, 3, '1'] [9, 8, '1'] [8, 9, '1'] [5, 9, '1'] [9, 6, '1'] [4, 2, '1'] [8, 7, '1'] [1, 9, '1'] [3, 8, '1'] [-1, 1, '1'] [1, 1, '1'] [-1, 9, '1'] [-1, 6, '1'] [1, 5, '1'] [2, 6, '1'] [9, 5, '1'] [5, -1, '1'] [2, 4, '1'] [5, 9, '1'] [9, 5, '1'] [6, 3, '1'] [9, 3, '1'] [3, 6, '1'] [8, 6, '1'] [7, 7, '1'] [-1, -1, '1'] [5, 4, '1'] [2, 9, '1'] [5, 7, '1'] [3, 9, '1'] [6, 9, '1'] [8, 2, '1'] [8, 3, '1'] [8, -1, '1'] [2, 4, '1'] [9, 2, '1'] [-1, 3, '1'] [6, 8, '1'] [5, 4, '1'] [5, -1, '1'] [5, 3, '1'] [7, 6, '1'] [-1, 4, '1'] [3, 9, '1'] [7, 5, '1'] [8, 3, '1'] [9, 7, '1'] [8, 3, '1'] [3, 5, '1'] [2, 6, '1'] [1, 9, '1'] [6, 2, '1'] [3, 5, '1'] [9, 7, '1'] [5, 6, '1'] [7, 2, '1'] [11, -1, '-1'] [13, 7, '-1'] [16, 5, '-1'] [11, -1, '-1'] [17, 6, '-1'] [9, 5, '-1'] [15, 1, '-1'] [13, 7, '-1'] [12, 6, '-1'] [9, 5, '-1'] [17, 4, '-1'] [10, 8, '-1'] [10, 8, '-1'] [9, 5, '-1'] [13, 2, '-1'] [13, 6, '-1'] [9, -1, '-1'] [11, 9, '-1'] [17, 2, '-1'] [9, 7, '-1'] [16, 4, '-1'] [12, 1, '-1'] [11, 8, '-1'] [10, 1, '-1'] [17, 7, '-1'] [12, -1, '-1'] [16, 5, '-1'] [18, 2, '-1'] [15, 6, '-1'] [9, 5, '-1'] [13, 4, '-1'] [13, 2, '-1'] [11, 2, '-1'] [17, 7, '-1'] [16, 1, '-1'] [15, -1, '-1'] [9, 4, '-1'] [16, 7, '-1'] [13, 1, '-1'] [17, -1, '-1'] [18, 4, '-1'] [12, 3, '-1'] [11, 7, '-1'] [14, 6, '-1'] [9, 5, '-1'] [11, 9, '-1'] [12, 4, '-1'] [17, 8, '-1'] [11, 2, '-1'] [12, 5, '-1'] [13, -1, '-1'] [12, 2, '-1'] [11, 1, '-1'] [14, 1, '-1'] [17, -1, '-1'] [18, 3, '-1'] [11, 5, '-1'] [18, 2, '-1'] [12, 4, '-1'] [15, 8, '-1'] [17, 9, '-1'] [18, 5, '-1'] [14, 9, '-1'] [16, 9, '-1'] [18, 5, '-1'] [9, 1, '-1'] [14, 4, '-1'] [13, 2, '-1'] [12, 9, '-1'] [16, 8, '-1'] [15, 4, '-1'] [12, -1, '-1'] [16, 9, '-1'] [14, 3, '-1'] [12, 9, '-1'] [17, 5, '-1'] [11, 4, '-1'] [13, 6, '-1'] [16, 3, '-1'] [16, 2, '-1'] [11, 3, '-1'] [11, 1, '-1'] [17, 9, '-1'] [18, 2, '-1'] [11, 8, '-1'] [14, 3, '-1'] [11, -1, '-1'] [18, 6, '-1'] [12, 6, '-1'] [11, -1, '-1'] [14, -1, '-1'] [16, 5, '-1'] [12, 7, '-1'] [15, -1, '-1'] [15, 1, '-1'] [18, 9, '-1'] [9, -1, '-1'] [18, -1, '-1'] [18, 6, '-1'] [9, 3, '-1']
<
a9a2
p>
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法