上一篇写了除分类之外的例4.1代码,这一篇开始实现分类部分:
先上运行结果:
上代码,大部分程序跟上一篇一样,只是增加了一个分类函数:
#author:xinxinzhang
def loadDataSet(): x1=[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3] x2=['S','M','M','S','S','S','M','M','L','L','L','M','M','L','L'] Y=[-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1] return x1,x2,Y def nb(x1,x2,Y): py1=Y.count(1)/len(Y) # print('py1=',py1) py2=1-py1 # print('py2=',py2) x1_s=set(x1) x2_s=set(x2) for xi in x1_s: p(x1,xi,Y) for xj in x2_s: p(x2,xj,Y) return py1,py2 def p(xj,value,Y): xcount = 0 _xcount=0 for i in range(15): if Y[i]==1 and xj[i]==value: xcount+=1 elif Y[i]==-1 and xj[i]==value: _xcount+=1 # print('x=%s,Y=%d,p=%f' % (value, 1, xcount / Y.count(1))) # print('x=%s,Y=%d,p=%f' % (value, -1, _xcount / Y.count(-1))) pxy1=xcount / Y.count(1) pxy2=_xcount / Y.count(-1) return pxy1,pxy2 def classify(x1,x2,inX,Y): px1y1,px1y2=p(x1,int(inX[0]),Y) #传入特征一 px2y1,px2y2=p(x2,inX[1],Y) #传入特征2 py1,py2=nb(x1,x2,Y) p1Vec=py1*px1y1*px2y1 p2Vec=py2*px1y2*px2y2 if p1Vec>p2Vec: #看y=1概率大还是y=-1概率大 print('x=(%s,%s)被分为Y=1'%(inX[0],inX[1])) else:print('x=(%s,%s)被分为Y=-1'%(inX[0],inX[1])) x1,x2,Y=loadDataSet() nb(x1,x2,Y) inX=input('').split() classify(x1,x2,inX,Y)