python中加权最小二乘的多元回归?

机器算法验证 回归 最小二乘 Python 多元回归
2022-04-12 13:41:12

我有一个多元回归问题,我需要使用加权最小二乘法来解决。特别是,我有X一个二维数组的数据集。它由许多观察值组成,n每个观察值由一行表示。每个观察还包含许多特征,m这意味着每一行都有m列。因此我的数据集X是一个n×m数组。

给定一个测试数据观察,多元回归应该产生一个预测响应向量的函数y,它也是一个二维数组。该函数将由系数组成,即测试输入m的每个特征的一个系数/参数。m

此解决方案已在此处提供:Statsmodels' WLS,但它们尚不支持 2D 响应向量。换句话说,当我拟合数据时,我必须提供我的数据集X,但只能提供一维数组作为响应y

此外,我还需要一个二维权重向量,其维度与响应向量相似y

是否有 WLS 多元回归的 Python 实现,其中y可以weights是 2D 向量?

或者,如果不是直接实现,是否可以通过少量调整以某种方式将任何现有包用作实现?

编辑

为了让我的问题更清楚,这些是我要给出的参数和我需要得到的结果:

输入:

  • X:一个 2D 数据集,例如 10x3,它是 10 个观测值,每个观测值具有 3 个特征。

  • y: 这也是一个二维向量,在本例中为 10x2。换句话说,每个观测值都有一个 2 值响应向量。(我正在做分类,有两个可能的类别)。

  • weights: 一个 2D 响应向量,也是 10x2,如y.

以上10是任意数量的行。最终,无论我有多少观察结果,这就是上面所有向量的行数。

我需要的输出:

  • 回归的系数。鉴于我的响应和权重向量是二维的,我相信系数也将是二维数组,可能是 3x2 或 2x3。
2个回答

我仍然不完全清楚你想要做什么,但如果你的权重是 1d,你可以(ab)使用 sm.WLS 来做到这一点。

import numpy as np
import statsmodels.api as sm
np.random.seed(12345)

N = 30

X = np.random.uniform(-20, 20, size=(N,10))
beta = np.random.randn(11)
X = sm.add_constant(X)

weights = np.random.uniform(1, 20, size=(N,))
weights = weights/weights.sum()

y = np.dot(X, beta) + weights*np.random.uniform(-100, 100, size=(N,))

Y = np.c_[y,y,y]

mod = sm.WLS(Y, X, weights=1/weights).fit()

如果您的权重不是 1d,WLS 确实会损坏,因为它不是为这种情况设计的。您可以在 WLS 上使用循环,也可以根据您想要做什么来推出自己的解决方案。

weights = np.random.uniform(1, 20, size=(N,3))
weights = weights/weights.sum(0)
y = np.dot(X, beta)[:,None] + weights*np.random.uniform(-100, 100, size=(N,3))

这是每个方程的 WLS 解的全部,假设这是您想要做的

beta_hat = np.array([np.linalg.pinv(1/weights[:,i,None]**.5 * X).dot(y[:,i]) for i in range(3)])

在 modulesklearn中,linear_model提供了很多回归函数,可以满足你的需求。

例如,lasso.fit(X,y)where yhas shape =(n_samples,)(n_samples, n_targets)在您的情况下,n_targets= 2。