实践中的最小二乘法
Least Squares method in practice
非常简单的回归任务。我有三个变量 x1, x2, x3
和一些随机噪声。我知道目标方程:y = q1*x1 + q2*x2 + q3*x3
。现在我想找到目标系数:q1, q2, q3
评估
使用平均相对平方误差 (RSE) (Prediction/Real - 1)^2
来评估我们的预测方法的性能。
在研究中,我看到这是普通的最小二乘问题。但是我无法从 Internet 上的示例中获得如何解决 Python 中的这个特定问题。假设我有数据:
import numpy as np
sourceData = np.random.rand(1000, 3)
koefs = np.array([1, 2, 3])
target = np.dot(sourceData, koefs)
(在现实生活中,数据是嘈杂的,不是正态分布的。)如何在python中使用最小二乘法找到这个 koefs? 任何库使用。
@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)
除了@lhk 的回答,我还发现了很棒的 scipy Least Squares function。使用它很容易获得请求的行为。
这样我们可以提供一个自定义函数,该函数 returns 残差并形成相对平方误差而不是绝对平方差:
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
参数函数的自定义损失,该函数将处理残差并形成最终损失。
非常简单的回归任务。我有三个变量 x1, x2, x3
和一些随机噪声。我知道目标方程:y = q1*x1 + q2*x2 + q3*x3
。现在我想找到目标系数:q1, q2, q3
评估
使用平均相对平方误差 (RSE) (Prediction/Real - 1)^2
来评估我们的预测方法的性能。
在研究中,我看到这是普通的最小二乘问题。但是我无法从 Internet 上的示例中获得如何解决 Python 中的这个特定问题。假设我有数据:
import numpy as np
sourceData = np.random.rand(1000, 3)
koefs = np.array([1, 2, 3])
target = np.dot(sourceData, koefs)
(在现实生活中,数据是嘈杂的,不是正态分布的。)如何在python中使用最小二乘法找到这个 koefs? 任何库使用。
@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)
除了@lhk 的回答,我还发现了很棒的 scipy Least Squares function。使用它很容易获得请求的行为。
这样我们可以提供一个自定义函数,该函数 returns 残差并形成相对平方误差而不是绝对平方差:
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
参数函数的自定义损失,该函数将处理残差并形成最终损失。