如何处理号码溢出?

时间:2015-10-25 13:57:30

标签: python numpy curve-fitting integer-overflow

我正在使用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中的数字太大而发生。

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

2 个答案:

答案 0 :(得分:2)

当我运行代码时,答案正如您所期望的那样:

[[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

答案 1 :(得分:0)

:)使用以下方法解决了问题:

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