Python 中用有界响应变量 Y 进行最小二乘拟合

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

我有以下形式的问题:

Xb = y

其中 X2D 多项式的设计矩阵,b 是参数向量,y 是响应变量。

我想找到一个最佳参数向量 b,它可以最小化 2-范数

|y - X b|
,同时尊重 y 的约束,以便
c1 < y < c2
,具有
c1 > 0
c2 > 0
对于已知的c1c2。换句话说,y 应限制在正范围内。

我已经有了一个无界 y 的解决方案,使用

scipy.linalg.lstsq

有没有一种算法可以实现这一点?理想情况下,我想使用流行的 python 包之一:numpy、scipy、scikit-learn 等

python scipy regression
1个回答
0
投票

这个答案假设您的意思是:

  1. 对预测的某些限制(即
    Xb
    ,不是真实的
    y
    ,也不是系数)。
  2. 模型形式为
    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}")
© www.soinside.com 2019 - 2024. All rights reserved.