我有以下形式的问题:
Xb = y
其中 X 是 2D 多项式的设计矩阵,b 是参数向量,y 是响应变量。
我想找到一个最佳参数向量 b,它可以最小化 2-范数
|y - X b|
,同时尊重 y 的约束,以便 c1 < y < c2
,具有 c1 > 0
和 c2 > 0
对于已知的c1,c2。换句话说,y 应限制在正范围内。
我已经有了一个无界 y 的解决方案,使用
scipy.linalg.lstsq
。
有没有一种算法可以实现这一点?理想情况下,我想使用流行的 python 包之一:numpy、scipy、scikit-learn 等
这个答案假设您的意思是:
Xb
,不是真实的 y
,也不是系数)。y = Xb
(即不是 GLM 或非参数模型)。这看起来像是一个约束优化问题。解决这个问题的一种方法是顺序最小二乘规划。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# Sample data
# You'll likely need a scaler and/or bias to ensure convergence
# for your actual data if you encounter 'Exit mode 8'.
X = np.random.uniform(0, 1, (100, 2))
y = np.dot(X, np.array([3, 4])) + np.random.normal(scale=1, size=100)
# Loss function (MSE):
def objective_function(b):
y_pred = np.dot(X, b)
return np.mean((y - y_pred)**2)
result = minimize(
objective_function,
# Starting coefs:
np.array([0, 0]),
constraints=
[
# Lower constraint 0.1: function result must be >= 0
{'type': 'ineq', 'fun': lambda b: np.dot(X, b) - 0.1},
# Upper constraint 6.0:
{'type': 'ineq', 'fun': lambda b: 6.0 - np.dot(X, b)},
],
# No restrictions for coefs:
bounds=((None, None), (None, None)),
# COBYLA should also work, so should trust-constr,
# but the latter might need a different notation.
method='SLSQP',
options={'disp':True},
)
print("Optimal coefficients:", result.x)
print(f"Pred. range: {np.dot(X, result.x).min():.3f}..{np.dot(X, result.x).max():.3f}")
print(f"Sample range: {y.min():.3f}..{y.max():.3f}")