为什么我的多项式回归得到“无穷大”?

问题描述 投票:0回答:1
import numpy as np
x = np.array([-9.93841085, -8.2398223 , -9.06505398, -7.35203062, -5.82847285,
        -5.08181713, -3.37174708, -3.6361873 , -0.06175255,  0.09106786,
         1.46721029,  0.41053496,  1.71012239,  1.84871104,  6.68526793,
         6.82543486,  6.64741998,  8.01775519,  8.57773967, 11.8291112 ])
y = np.array([ 0.99747243,  3.28729745,  2.0644648 ,  2.88068415, -0.05454181,
         0.63703982,  0.06238763,  0.25253028,  0.06582577,  0.05755049,
         0.20686123, -0.03885818,  0.40837474,  0.52833438,  0.25072492,
         0.26994154,  0.29157405,  0.52908138, -0.04000158, -0.98596774])
X = np.stack([x**3, x**2, x, np.ones(len(x))], axis =1)

#MSE
def f(X, y, w):
        return np.mean((X @ w - y)**2)
#gradient MSE
def grad(X, y, w):
    return 2 / len(X) * X.T @ (X @ w - y)

gamma = 1e-3
max_iter = 10000
eps = 1e-5
w = np.array([1, 1,1, 1])
#1

f_old = f(X, y, w)
w = w - grad(X, y, w) *gamma
f_new = f(X, y, w)
i =1
while abs(f_old - f_new) > eps and i<max_iter:
    i = i +1
    
    w = w - grad(X, y,w) * gamma
    f_old = f_new
    f_new = f(X, y, w)
    
result = w 
print(result)
print(f_new)

输出:

[2.77340360e+154 6.04142533e+152 2.97289620e+152 3.12203131e+150]
inf

我想得到一个小于 0.48 的函数值,但是即使我改变伽玛值,我仍然得到“无穷大”。可能在 X 中输入三次多项式回归值时出现错误,因为此代码适用于二次函数,但我找不到它。

python regression
1个回答
0
投票

问题就在这一行:

return 2 / len(X) * X.T @ (X @ w - y)

请注意,您的人数已经很大;指数为 150 的数字并不容易处理。当您运行上面的行时,它将

2/len(X)
乘以
X.T @ (X @ w - y)
,这使得这个数字变得更大。返回的
inf
实际上并不是无穷大,但它大得令人难以置信,并且您的程序无法使用它,因此它称之为无穷大。

© www.soinside.com 2019 - 2024. All rights reserved.