math.log上的Math Domain错误

时间:2017-11-30 13:28:01

标签: python math logarithm

我已尝试过已有的解决方案,但无法解决此问题。

原始代码:

 prob = n / self.totaldocs # 0.7445791360764896
 self.classpriorprob[cls] = math.log(prob) 

解决方案:(但我更喜欢采用普通日志)

prob = n / self.totaldocs
d = Decimal(prob) 
self.classpriorprob[cls] = d.ln()

如上所述here:我试图将数字四舍五入到小数点后3位。

prob = n / self.totaldocs
number = round(prob, 3) # 0.744
self.classpriorprob[cls] = math.log(number)

但我仍然遇到数学域错误。

编辑:我直接传递了值,即math.log(0.744),它可以正常工作。 当我在python控制台中尝试math.log()函数时,它也有效。

请告知。

功能
python 3.6.3
pycharm

2 个答案:

答案 0 :(得分:0)

我得到0.0。

就我而言,解决方案是跳过0.0值。

if number > 0:
     self.classpriorprob[cls] = math.log(number)

答案 1 :(得分:0)

尝试使用log sum exp技巧:

 def findMaxArray(self,arr):
        maxValue = arr[0]
        for i in range(0, len(arr)):
            if(maxValue <arr[i]):
                maxValue = arr[i]
        return maxValue


    def logExpSum(self, arr ):
        #find maximum of array assuming the array passed is already containg log values
        maxVal =0
        maxVal= self.findMaxArray(arr)
        res = 0
        for i in range(0, len(arr)):
            res += math.exp (arr[i] - maxVal) 
        return (math.log(res)+ maxVal)