通过点进行线性拟合(使用 NumPy Polynomial.fit() 中的权重)

问题描述 投票:0回答:1

如何使用 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()
python numpy linear-regression
1个回答
0
投票

我不知道如何使用

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

当然,这是一个一维示例,但您也可以将此方法推广到多维线性回归。

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