最小二乘法在实践中

时间:2017-06-16 11:16:05

标签: python numpy machine-learning scipy regression

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

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

将numpy导入为np

sourceData = np.random.rand(1000, 3)
koefs = np.array([1, 2, 3])
target = np.dot(sourceData, koefs)

(在现实生活中,数据嘈杂,分布不正常。)如何在python中使用最小二乘法找到这个koefs? 任何lib使用。

2 个答案:

答案 0 :(得分:3)

@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

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)

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

<强>更新

或者您可以使用builtin least squares功能:

np.linalg.lstsq(data, noisy_measurements)

答案 1 :(得分:2)

除了@lhk的回答,我发现了很棒的Least Squares function。使用它很容易获得所请求的行为。

这样我们就可以提供一个自定义函数来返回残差并形成相对平方误差而不是绝对平方差:

import numpy as np
from scipy.optimize import least_squares
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
#noisy_measurements[-1] = data[-1]  @ (1000 * true_theta) - uncoment this outliner to see how much Relative Squared Error esimator works better then default abs diff for this case.


def my_func(params, x, y):
     res = (x @ params) / y - 1 # If we change this line to: (x @ params) - y - we will got the same result as np.linalg.lstsq
     return res

res = least_squares(my_func, x0,  args=(data, noisy_measurements) ) 
estimated_theta = res.x

此外,我们可以使用loss参数函数提供自定义损失,该函数将处理残差并形成最终损失。