【问题标题】:How to handle number overflow?如何处理号码溢出?
【发布时间】:2015-10-25 13:57:29
【问题描述】:

我正在使用 numpy 计算趋势线斜率:

xs = []
ys = []
my_x = 0
for i in range(2000):
    my_x += 1
    ys.append(5*my_x+random.rand())
    xs.append(my_x)

A = matrix(xs).T;
b = matrix(ys).T;
N = A.T*A
U = A.T*b
print N,U
a = (N.I*U)[0,0]    
print a

我得到的结果是a=-8.2053307679,而不是预期的5。可能是因为变量N 中的数字太大了。

如何克服这个问题?任何帮助将不胜感激。

【问题讨论】:

    标签: python numpy curve-fitting integer-overflow


    【解决方案1】:

    当我运行代码时,答案如你所料:

    [[2668667000]] [[  1.33443472e+10]]
    5.00037927592
    

    这可能是因为您使用的是 32 位系统,而我使用的是 64 位系统。相反,您可以使用

    A = matrix(xs, dtype='float64').T;
    b = matrix(ys, dtype='float64').T;
    

    仅供参考,使用 numpy 时,如果您致力于对算法进行矢量化处理,效率会更高。例如,您可以将前几行替换为:

    xs = np.arange(2000)
    ys = 5 * xs + np.random.rand(2000)
    

    编辑——还有一件事:在数值上,在进行此类计算时显式反转矩阵是一个坏主意。最好在算法中使用a = np.linalg.solve(N, U)[0, 0] 之类的东西。在这里不会有太大的不同,但如果你转向更复杂的问题,它肯定会!有关此问题的一些讨论,请查看this article

    【讨论】:

      【解决方案2】:

      :) 问题通过使用解决:

      A = matrix(xs,float64).T;
      b = matrix(ys,float64).T;
      

      【讨论】:

        猜你喜欢
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2012-11-02
        • 1970-01-01
        相关资源
        最近更新 更多