如何使用 NumPy 的 Polynomial.fit() 函数强制线性拟合精确通过一个点(具体来说,原点)? 我尝试了一些权重,但我不清楚这是如何工作的(尽管numpy polyfit中使用的权重值是什么以及拟合的误差是什么),所以我不知道这是否是这种方法用于精确解决方案:
""" force fit through point """
import numpy as np
import matplotlib.pyplot as plt
x = np.array([0, 1, 2, 3])
y = np.array([0, 4, 5, 6])
fit, info = np.polynomial.polynomial.Polynomial.fit(
x, y, 1, full=True, w=[1, 0.1, 0.1, 0.1] #!?
)
print(fit)
fitfunc = fit.convert()
print(fitfunc)
print(fitfunc.coef)
print(info)
print(fitfunc(0)) # y-intercept should be zero
fig, ax1 = plt.subplots()
ax1.plot(x, y, ".")
ax1.plot(x, fitfunc(x), label=str(fitfunc))
plt.legend()
plt.show()
我不知道如何使用
np.polynomial.polynomial.Polynomial.fit
函数准确地管理它,但我会继续使用提供约束的 scipy.optimize.minimize
函数。
# 1-D linear function
def regression_line(x0, x1, x):
return x0 + x*x1
# loss function: root mean squared error
def rmse(y, t):
return np.sqrt(np.mean(y-t)**2)
# the point you want the line passes through
pivot = [0,0]
# minimize the loss function by taking into account the constraint
best_params = optimize.minimize(
lambda params: rmse(regression_line(params[0], params[1], x), y),
x0 = [0,0],
constraints=({"type":"eq", "fun":lambda params: regression_line(*params, pivot[0])-pivot[1]})
).x
结果:
fig, ax1 = plt.subplots()
ax1.plot(x, y, ".")
ax1.plot(x, regression_line(*best_params, x), label="%.2f + %.2f*x"%(best_params[0], best_params[1]))
plt.legend()
plt.show()
所需库:
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
当然,这是一个一维示例,但您也可以将此方法推广到多维线性回归。