最小二乘法的实践

Bra*_* Ds 5 python regression numpy machine-learning scipy

非常简单的回归任务。我有三个x1, x2, x3带有一些随机噪声的变量。我知道目标方程:y = q1*x1 + q2*x2 + q3*x3。现在我想找到目标系数:q1, q2, q3使用平均相对平方误差(RSE)(Prediction/Real - 1)^2来评估我们的预测方法的性能。

在研究中,我发现这是普通的最小二乘问题。但我无法从互联网上的示例中获取如何用 Python 解决这个特定问题。假设我有数据:

import numpy as np

sourceData = np.random.rand(1000, 3)
koefs = np.array([1, 2, 3])
target = np.dot(sourceData, koefs)
Run Code Online (Sandbox Code Playgroud)

(在现实生活中,数据是有噪声的,不符合正态分布。)如何在 python 中使用最小二乘法找到这个 koefs?任何库的使用。

lhk*_*lhk 4

@ayhan 提出了宝贵的评论。

您的代码存在问题:实际上您收集的数据中没有噪音。输入数据有噪声,但在乘法之后,您不会添加任何额外的噪声。

我在您的测量中添加了一些噪声,并使用最小二乘公式来拟合参数,这是我的代码:

data = np.random.rand(1000,3)

true_theta = np.array([1,2,3])
true_measurements = np.dot(data, true_theta)

noise = np.random.rand(1000) * 1

noisy_measurements = true_measurements + noise

estimated_theta = np.linalg.inv(data.T @ data) @ data.T @ noisy_measurements
Run Code Online (Sandbox Code Playgroud)

将会estimated_theta接近true_theta。如果不向测量结果添加噪声,它们将是相等的。

我使用了 python3 矩阵乘法语法。您可以使用np.dot而不是@

这使得代码更长,所以我拆分了公式:

MTM_inv = np.linalg.inv(np.dot(data.T, data))
MTy = np.dot(data.T, noisy_measurements)
estimated_theta = np.dot(MTM_inv, MTy)
Run Code Online (Sandbox Code Playgroud)

您可以在这里阅读最小二乘:https ://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)#The_general_problem

更新:

或者您可以只使用内置的最小二乘函数:

np.linalg.lstsq(data, noisy_measurements)
Run Code Online (Sandbox Code Playgroud)