我已尝试过已有的解决方案,但无法解决此问题。
原始代码:
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
答案 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)