微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scipy:如何用约束最小化最小残差平方和?

如何解决scipy:如何用约束最小化最小残差平方和?

当使用普通最小二乘线性回归方法拟合 xy 时,它会得到一个函数 y = a*x + b,但在我的情况下我需要制作 b <= 0

x = [139,162,147,110,145,144,131,132,135,85,77,90,103,163,102,31,71,95,143,94,81,82,79,64,122,130,117,109,46,26,36,105,14,63,93,75,128,86,107,137,49,99,96,112,124,129,68,111,11,13,104,127,98,87,76,119,69,91,100,116,126,61,83,97,120,66,80,92,62,118,115,123,57,51,60,65,113,18,88,39,25,37,27,108,55,78,50,89,72,38,35,30,101,33,73,56,24]

y = [151,170,53,182,188,181,186,149,156,168,150,148,151,152,155,157,136,142,45,171,67,139,34,159,106,164,125,140,160,22,169,167,153,178,154,179,146,44,138,59,74,121,28,141,172,43,161,134,48,58]

# Define the Model
f = lambda x,a,b: a * x + b

# The objective Function to minimize (least-squares regression)
obj = lambda x,y,b: np.sum(np.abs(y - f(x,b))**2)

我不确定 fobj 是否正确。如何定义使 b 小于零的约束条件?

解决方法

就像评论中已经提到的 sascha 一样,不需要 abs 函数,因为 (y - f(x,a,b))**2 总是正数。通过使用 scipy.optimize.minimize,您可以这样做:

from scipy.optimize import minimize
import numpy as np

# x = np.array([139,...])
# y = np.array([151,...])

# Define the Model
def f(x,b): return a * x + b

# The objective Function to minimize (least-squares regression)
def obj(x,y,b): return np.sum((y - f(x,b))**2)

# define the bounds -infty < a < infty,b <= 0
bounds = [(None,None),(None,0)]

# res.x contains your coefficients
res = minimize(lambda coeffs: obj(x,*coeffs),x0=np.zeros(2),bounds=bounds)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。