什么是线性回归的正确成本函数

数据挖掘 机器学习 线性回归 成本函数 套索 岭回归
2022-03-08 01:46:19

众所周知,线性回归的成本函数是:

在此处输入图像描述

当我们使用岭回归时,我们只需添加 lambda*slope**2 但我总是看到下面的线性回归的成本函数,它是not divided by the number of records.: 在此处输入图像描述

所以我只想知道什么是正确的成本函数,Ik 都是正确的,但是在 ding Ridge 或 Lasso 为什么我们忽略除法部分?

1个回答

有趣的问题。由于以下原因,我会说不划分是正确的......

对于线性回归,没有区别。成本函数的最优值保持不变,无论它如何缩放。

在做 Ridge 或 Lasso 时,除法会影响成本函数的最小二乘和正则化部分之间的相对重要性。如果没有足够的数据,我们通常使用正则化来避免过度拟合。我们拥有的数据越多,我们希望正则化对模型的影响就越小。通过划分,如果有很多记录,最小二乘项将支配正则化项。

简而言之,使用恒定的 lambda:

  • 通过除法,成本函数的最优值或多或少与记录数无关,这通常不是我们想要的。

  • 在没有除法的情况下,成本函数的最优值会随着记录数的增加而接近真实参数。

为了说明这一点,我计算了一个简单线性回归的成本函数,该回归具有岭正则化和真正的斜率为 1。

如果我们除以记录数,即使对于大量记录,最优值仍低于真实斜率: 在此处输入图像描述

没有除法,最优值接近真实斜率: 在此处输入图像描述

import numpy as np
import scipy.optimize as spo
import matplotlib.pyplot as plt

np.random.seed(123)


def make_data(n, noise=0.2):
    x = np.random.randn(n)
    y = x + noise * np.random.randn(n)
    return x, y


def cost(w, lam, x, y, divide_by_n=False):
    y_hat = w[:, None] * x[None, :]    
    least_squares = np.sum((y_hat - y)**2, axis=1)
    ridge = lam * w**2
    
    factor = 0.5/len(x) if divide_by_n else 1
    return ridge + least_squares * factor
    


w = np.linspace(0, 2)

for do_div in [True, False]:
    plt.figure()
    for n in [10, 100, 1000]:
        plt.plot(w, cost(w, 5, *make_data(10), divide_by_n=do_div), label=f"n={n}")
    
    plt.xlabel('weight')
    plt.ylabel('cost')
    plt.legend()
    plt.title(f'divide by N = {do_div}')