Python 最小二乘法在实践中的应用

Python 最小二乘法在实践中的应用,python,numpy,machine-learning,scipy,regression,Python,Numpy,Machine Learning,Scipy,Regression,非常简单的回归任务。我有三个变量x1,x2,x3,带有一些随机噪声。我知道目标方程:y=q1*x1+q2*x2+q3*x3。现在我想找到目标COEF:q1、q2、q3评估 使用平均相对平方误差(RSE)(预测/Real-1)^2评估我们预测方法的性能 在研究中,我发现这是一个普通的最小二乘问题。但我无法从互联网上的示例中获得如何用Python解决这个特定问题的方法。假设我有数据: import numpy as np sourceData = np.random.rand(1000, 3) k

非常简单的回归任务。我有三个变量
x1,x2,x3
,带有一些随机噪声。我知道目标方程:
y=q1*x1+q2*x2+q3*x3
。现在我想找到目标COEF:
q1、q2、q3
评估 使用平均相对平方误差(RSE)
(预测/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)

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

@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
估计的θ
将接近
真θ
。如果不在测量中添加噪声,它们将是相等的

我使用了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)
您可以在此处阅读最小二乘法:

更新:

或者您可以使用以下功能:

np.linalg.lstsq(data, noisy_measurements)

除了@lhk答案,我还发现了很棒的scipy。使用它很容易获得请求的行为

通过这种方式,我们可以提供一个自定义函数,该函数返回残差并形成相对平方误差,而不是绝对平方差:

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
参数函数提供自定义损失,该函数将处理残差并形成最终损失。

No,这不是普通的最小二乘问题。在普通最小二乘法中,最小化平方误差之和。你的损失函数是不同的。对于平均绝对偏差,有,但我不确定当你采用百分比时,估计值是否会以同样的方式表现。你的问题似乎更适合(统计部分——可能不是图书馆建议部分)。@ayhan在多元线性(ML)模型部分重新表述后,这里给出了一些证据。“这是一个普通的最小二乘(OLS)问题,可以通过奇异值分解来解决”损失函数不是平均绝对百分比误差。你是对的,我已经将平均绝对百分比误差更改为相对平方误差非常酷,谢谢。。它和numpy.linalg.lstsq一样吗?不幸的是,我不能提供loss来处理dataNice中的异常值,我不知道这个函数。你的评论似乎是最好的答案;)-是的,这个函数是一样的。可能更好。我不知道他们的执行情况