【问题标题】:Floating point problems in matlabmatlab中的浮点数问题
【发布时间】:2012-01-16 07:10:36
【问题描述】:

我在下面有一些代码循环一个简单贝叶斯分类器的评论和词汇文档。结果是0,所以我认为结果格式有问题。

%Loop the termdoc to find the word no.
    for k = 1: dlength 
        %Sum the records for that number
        if wordCount == d(k,1)
            result = result * ((sum(d(k,:)))-d(k,1))/n;
        end 
    end
end
%Multiply by the probability d/a
result = result * 0.5;

我已经调试了代码,所有正确的值都存储在结果中,它们似乎正在四舍五入,我不太确定 matlabs 在这里做什么

【问题讨论】:

  • 如果result或者你的((sum(d(k,:)))-d(k,1))中只有一个词的初始化为空,那么结果将为空。你检查了吗?

标签: matlab


【解决方案1】:

考虑下溢的可能性。您将许多数字相乘,如果每个数字都小于 1,则乘积可能小于 realmin,因此为零。

记录产品可能是正确的做法,因为这样您将使用不会下溢的日志总和。

如果不是这样,那么您没有提供足够的信息来做出更好的猜测。

【讨论】:

  • 我将如何记录结果?我认为这是要走的路!
  • 您将如何记录它? matlab中有一个log函数。用它。什么是数字乘积的对数?
  • 如果 wordCount == d(k,1) s = ((sum(d(k,:)))-d(k,1)); if(s > 0) 结果 = 结果 * log(s/n);结果 end end 仍然给出 0
【解决方案2】:

你检查过result的初始值吗?

这会返回什么?

I = (d(:,1) == wordCount);
values = sum(d,2) - d(:,1);
result = prod(values(I)/n)

【讨论】:

    【解决方案3】:

    另外一点可能是double的精确度

    对于(sum(d(k,:)))-d(k,1),如果条目d(k,i >1) 是eps(d(k,1))(d(k,1) 中的最低有效数字的值,可以大于 realmin),它们将不会对求和(sum(d(k,:)))-d(k,1) = 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2010-11-14
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多