回归模型中成本函数的L1范数而不是L2范数

Sar*_*Eft 4 python regression machine-learning least-squares

我想知道Python中是否有一个函数可以做的工作与scipy.linalg.lstsq使用“最小绝对偏差”回归而不是“最小二乘”回归(OLS)相同。我想使用L1规范,而不是L2规范。

实际上,我有3d点,我想要它们中最适合的平面。常用的方法是通过最小二乘方法,如Github 链接。但是众所周知,这并不总是总能提供最佳的拟合度,尤其是当我们在数据集中拥有闯入者时。并且最好计算最小的绝对偏差。两种方法之间的差异将在此处详细说明。

MAD之类的函数无法解决该问题,因为它是一个Ax = b矩阵方程,并且需要循环以使结果最小化。我想知道是否有人知道Python中的相关功能-可能在线性代数包中-可以计算“最小绝对偏差”回归?

N. *_*uda 6

使用scipy.optimize.minimize和自定义滚动起来并不难cost_function

让我们首先导入必需品,

from scipy.optimize import minimize
import numpy as np
Run Code Online (Sandbox Code Playgroud)

并定义一个自定义成本函数(以及用于获取拟合值的便利包装),

def fit(X, params):
    return X.dot(params)


def cost_function(params, X, y):
    return np.sum(np.abs(y - fit(X, params)))
Run Code Online (Sandbox Code Playgroud)

然后,如果您有一些X(设计矩阵)和y(观察),我们可以执行以下操作:

output = minimize(cost_function, x0, args=(X, y))

y_hat = fit(X, output.x)
Run Code Online (Sandbox Code Playgroud)

x0最佳参数的适当初始猜测值在哪里(您可以在这里接受@JamesPhillips的建议,并使用OLS方法中的拟合参数)。

在任何情况下,当通过一些人为的示例进行测试运行时,

X = np.asarray([np.ones((100,)), np.arange(0, 100)]).T
y = 10 + 5 * np.arange(0, 100) + 25 * np.random.random((100,))
Run Code Online (Sandbox Code Playgroud)

我发现,

      fun: 629.4950595335436
 hess_inv: array([[  9.35213468e-03,  -1.66803210e-04],
       [ -1.66803210e-04,   1.24831279e-05]])
      jac: array([  0.00000000e+00,  -1.52587891e-05])
  message: 'Optimization terminated successfully.'
     nfev: 144
      nit: 11
     njev: 36
   status: 0
  success: True
        x: array([ 19.71326758,   5.07035192])
Run Code Online (Sandbox Code Playgroud)

和,

fig = plt.figure()
ax = plt.axes()

ax.plot(y, 'o', color='black')
ax.plot(y_hat, 'o', color='blue')

plt.show()
Run Code Online (Sandbox Code Playgroud)

拟合值为蓝色,数据为黑色。

在此处输入图片说明