避免浮点数下溢小方法

浮点数的下溢一般是由很多很小的数的连乘造成的,读者可以在 Python 中尝试用很多很小的数相乘,最后四舍五入后会得到 0.

一种解决办法是对乘积取自然对数,在对数中有:
lna⋅b=lna+lnbln∑ixx=∑ilnxi
ln⁡a⋅b=ln⁡a+ln⁡bln⁡∑ixx=∑iln⁡xi
避免了太小的数之间的连乘,通过求对数可以避免浮点数的下溢或者浮点数舍入导致的错误。采取自然对数进行处理不会有任何损失。

def trainNB0(trainMatrix,trainCategory):    #训练朴素贝叶斯模型 传入numpy数组类型 trainMatrix所有文档词汇向量矩阵(m*n矩阵 m个文档,每个文档都是n列,代表词汇向量大小),trainCategory每篇文档得标签
    numTrainDoc = len(trainMatrix)  #文档数量
    pC1 = np.sum(trainCategory)/numTrainDoc    #p(c1)得概率   p(c0)=1-p(c1)
    wordVecNum = len(trainMatrix[0])    #因为每个文档转换为词汇向量后都是一样得长度

    #初始化p1,p0概率向量---改进为拉普拉斯平滑
    p1VecNum,p0VecNum = np.ones(wordVecNum),np.ones(wordVecNum)
    p1Sum,p0Sum = 2.0,2.0   #N*1    N表示分类数

    #循环每一个文档
    for i in range(numTrainDoc):
        if trainCategory[i] == 1: #侮辱性文档
            p1VecNum += trainMatrix[i]  #统计侮辱性文档中,每个单词出现频率
            p1Sum += np.sum(trainMatrix[i]) #统计侮辱性文档中出现得全部单词数   每个单词出现概率就是单词出现频率/全部单词
        else:   #正常文档
            p0VecNum += trainMatrix[i]
            p0Sum += np.sum(trainMatrix[i])

    p1Vect = np.log(p1VecNum / p1Sum)   #统计各类文档中的单词出现频率
    p0Vect = np.log(p0VecNum / p0Sum)   #使用对数避免下溢

    return p1Vect,p0Vect,pC1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值