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 中输入三次多项式回归值时出现错误,因为此代码适用于二次函数,但我找不到它。
问题就在这一行:
return 2 / len(X) * X.T @ (X @ w - y)
请注意,您的人数已经很大;指数为 150 的数字并不容易处理。当您运行上面的行时,它将
2/len(X)
乘以 X.T @ (X @ w - y)
,这使得这个数字变得更大。返回的 inf
实际上并不是无穷大,但它大得令人难以置信,并且您的程序无法使用它,因此它称之为无穷大。