李航统计学朴素贝叶斯例4.1python代码实现2

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值