上一篇写了除分类之外的例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)