范数及其机器学习中的应用

2020-05-15 16:52:56 浏览数 (1)

作者:老齐

与本文相关的图书推荐:《数据准备和特征工程》


向量的范数(norm),也称为长度,或大小。

mathbf u = begin{bmatrix}u_1\vdots\u_nend{bmatrix}

mathbb R^n

中的向量,其范数记作:

begin{Vmatrix} mathbf u end{Vmatrix}

l1

范数(注意:

l

是英文字母

L

的小写),也称为曼哈顿范数,记作:

begin{Vmatrix} mathbf u end{Vmatrix}_1

begin{Vmatrix} mathbf u end{Vmatrix}_1 = u_1 cdots u_n = sum_{r=1}^{r=n}u_i
l2

范数,也称为欧几里得范数,记作:

begin{Vmatrix} mathbf u end{Vmatrix}_2

begin{Vmatrix} mathbf u end{Vmatrix}_2 = sqrt {u_1^2 cdots u_n^2} = sqrt {mathbf u cdot mathbf u}

除了

l1, l2

范数,还有计算如下范数的可能:

begin{Vmatrix} mathbf u end{Vmatrix}_q = left(sum_{r=1}^n|u_i|^qright)^{1/q}

1 le q lt infty

begin{Vmatrix} mathbf u end{Vmatrix}_{infty} = max_i|u_i|

(数据中的绝对值最大值)

实现与应用

如果要计算向量的范数,可以使用Numpy提供的函数。

代码语言:javascript复制
import numpy as np
a = np.array([[3], [4]])
L1 = np.linalg.norm(a, 1)
print(L1)

输出:

代码语言:javascript复制
7.0

以上使用np.linalg.norm函数计算了向量

begin{bmatrix}3\4end{bmatrix}

l1

范数,使用这个函数还可以计算

l2

范数。

代码语言:javascript复制
L2 = np.linalg.norm(a)
L2

输出:

代码语言:javascript复制
5.0

np.linalg.norm上述两个范数,差别在于设置参数,默认计算

l2

范数。

除了计算之外,

l1,l2

范数还会经常被用于线性回归的正则化中。

所谓线性回归,就是利用数据集

mathbf x = [x_1, cdots, x_n]

x_i

是数据集中第

i

个属性的取值),找到一个各个属性线性组合的函数:

f(mathbf x)=w_1x_1 cdots w_nx_n b

并用这个函数进行预测。

一般可用向量形式写成

f(mathbf x)= mathbf{w}^T mathbf x b

假设已知训练集

mathbf D = [(x_1, y_1), (x_2, y_2), cdots, (x_m, y_m)]

,其中

y_i

在有监督学习中称为标签,利用此数据集对模型进行训练,期望能得到上述函数,即确定参数

mathbf w

b

的值。那么,应该如何“训练”呢?

先要明确训练的目的,就是要通过某些方法实现

f(x_i)=w_ix_i b

y_i

之间的的差别最小,如果为0就是最理想的了。在机器学习中,这种“差别”可以用某一个函数表示,此函数称为损失函数(Loss function),或代价函数、成本函数(Cost function):

Loss = sum_{i=1}^mL(f(x_i), y_i)

函数

L(f(x_i), y_i)

可以有多种形式,通常我们选择均方误差,即:

Loss = sum_{i=1}^m(f(x_i)-y_i)^2

在线性回归中,常用的“最小二乘法”就是求解

w

b

使

Loss

最小化的过程。此过程中,为了追求

Loss

最小化,不得不让模型复杂度提高,结果往往会让训练出来的模型对其他数据集(比如测试集)的误差增大,这种现象称为过拟合。在实际业务中,避免过拟合的方法比较多,比如增加数据量、交叉验证等,其中正则化是针对线性模型常用的一种方法。

Loss = sum_{i=1}^mL(f(x_i), y_i) lambda J(f)
  • 第一项依然是损失函数,用于衡量模型与数据的拟合程度。
  • 第二项中的
J(f)

表示模型的复杂度 ,它是一种定义域为函数,值域为实数的函数,即向量空间到实数的一个映射。模型

f

越复杂,复杂度

J(f)

就越大;反之,模型越简单,复杂度

J(f)

就越小。也就是说,复杂度表示了对模型的惩罚,因此我们也把它称为惩罚项

lambda

是不小于

0

的系数,用以平衡惩罚项的权重,

lambda J(f)

称为正则化项

如此,即实现了对线性回归模型的正则化,即考虑了训练集中模型与数据的拟合程度,又照顾到了模型的复杂度,从而能够让模型对测试数据也能有较好的预测。

对于函数

J(f)

,也会有不同的具体形式,一般地,可以选择:

l1

范数,结合函数

L(f(x_i), y_i)

的均方误差形式,可以表示为:

Loss = sum_{i=1}^m(f(x_i)-y_i)^2 lambda sum_{i=1}^m|w_i|

使用

l1

范数作为惩罚项的线性回归称为LASSO回归

l2

范数,可以表示为:

Loss = sum_{i=1}^m(f(x_i)-y_i)^2 lambda sum_{i=1}^mw_i^2

使用

l2

范数作为惩罚项的线性回归称为岭回归(Ridge回归)。

除此之外,还有其他实现正则化的方法,比如弹性网络(Elastic Net),就是通过平衡

l1

范数和

l2

实现了正则化项。

0 人点赞