11. NumPy范数计算
监督机器学习问题规则化参数的同时最小化误差,最小化误差是为了让我们的模型拟合我们的训练数据,而规则化参数是防止我们的模型过分拟合我们的训练数据。但训练误差小并不是我们的最终目标,我们的目标是希望模型的测试误差小,也就是能准确的预测新的样本。机器学习、深度学习等计算机领域内用的比较多的就是迭代过程中收敛性质的判断,一般迭代前后步骤的差值的范数表示其大小,常用的是二范数,差值越小表示越逼近实际值,可以认为达到要求的精度,收敛。
范数本质是距离,存在的意义是为了实现比较。
11.1 向量的范数
假设x是向量:
$$ x = (x_1, x_2,\dots, x_n)$$
那么p-范数的计算公式如下:
$$\vert\vert x \vert\vert_p = \sqrt[p]{\sum_{i = 1}^{n}|x_i|^p}$$
x向量的各元素绝对值的p次方之和的p方根。
11.2 常见的范数计算
依据范数的定义,可以计算各阶的范数,机器学习领域内常见、常用的范数有:
1). 0-范数,表示向量中非零元素的个数。
$$\vert\vert x \vert\vert_0 = \sqrt[0]{\sum_{i = 1}^{n} \vert x_i\vert^0}$$
import numpy as np
x = np.array([1, 0, -2])
n0 = np.linalg.norm(x, ord = 0)
print n0
程序执行结果:
2.0
x向量为(1, 0, -2)非0值共2个。
2). 1-范数,计算方式为向量所有元素的绝对值之和。
$$\vert\vert x \vert\vert_1 = \sum_{i = 1}^{n}\vert x_i\vert$$
import numpy as np
x = np.array([2, 0, -4])
n1 = np.linalg.norm(x, ord = 1)
print n1
程序执行结果:
6.0
3). 2-范数,计算方式跟欧式距离的方式一致即向量各元素的平方和然后求平方根。
$$\vert\vert x \vert\vert_2 = \sqrt[2]{\sum_{i = 1}^{n} x_i^2}$$
import numpy as np
x = np.array([3, 0, -4])
n2 = np.linalg.norm(x, ord = 2)
print n2
程序执行结果:
5.0
4). $+\infty$-范数,所有向量元素绝对值中的最大值。
$$\vert\vert x \vert\vert_{+\infty} = \max_{i = 1}^{n}\vert x_i\vert$$
import numpy as np
x = np.array([3, 0, -4])
n = np.linalg.norm(x, ord = np.inf)
print n
程序执行结果:
4.0
5). $-\infty$-范数,所有向量元素绝对值中的最小值。
$$\vert\vert x \vert\vert_{-\infty} = \min_{i = 1}^{n}\vert x_i\vert$$
import numpy as np
x = np.array([3, 0, -4])
n = np.linalg.norm(x, ord = -np.inf)
print n
程序执行结果:
0.0
11.3 矩阵的范数
和向量的范数一样,矩阵也有范数,假设矩阵A的大小为$m * n$,即m行n列。
1). 1-范数,又名列和范数。顾名思义,即矩阵列向量中绝对值之和的最大值。
$$
\vert\vert A\vert\vert_1 = \max_{j = 1}^{n}\sum_{i = 1}^{m}\vert a_{ij}\vert
$$
import numpy as np
x = np.array([[-1, 1, 0],[-4, 3, 0],[1, 0, 2]])
print x
n1 = np.linalg.norm(x, ord = 1)
print 'norm_1 ', n1
程序执行结果:
[[-1 1 0]
[-4 3 0]
[ 1 0 2]]
norm_1 6.0
X的三个列向量$(-1, -4, 1)^T$、$(1, 3, 0)^T$、$(0, 0, 2)^T$的绝对值之和为6、4、2,最大值是6即为矩阵A的1-范数。
2). 2-范数,又名谱范数,计算方法为$A^TA$矩阵的最大特征值的开平方。
$$
\vert\vert A\vert\vert_2 = \sqrt{max(\lambda_i)}
$$
其中,$\lambda_i$ 是$A^TA$矩阵的特征值。
import numpy as np
x = np.array([[-1, 1, 0],[-4, 3, 0],[1, 0, 2]])
print x
xtx = np.matmul(x.T, x)
print "lambda ", np.linalg.eigvals(xtx)
n2 = np.linalg.norm(x, ord = 2)
print 'norm_2 ', n2, np.sqrt(27.71086452)
程序执行结果:
[[-1 1 0]
[-4 3 0]
[ 1 0 2]]
lambda [ 27.71086452 0.03392256 4.25521292]
norm_2 5.26411099011 5.2641109904712309
矩阵X的2-范数计算是先计算$X^TX$的特征值$\lambda_i$,然后找$\lambda_i$中的最大值,再开方。代码里xtx即为$X^TX$,eigvals函数的返回值就是各个$\lambda_i$。
3). F-范数,Frobenius范数,计算方式为矩阵元素的绝对值的平方和再开方。
$$
\vert\vert A\vert\vert_F = \sqrt[2]{\sum_{i=1}^m \sum_{j=1}^n \vert a_{ij}\vert^2}
$$
4). $\infty$-范数,又名行和范数, 即矩阵行向量中绝对值之和的最大值。
$$
\vert\vert A\vert\vert_{\infty} = \max_{i = 1}^{m}\sum_{j = 1}^{n}\vert a_{ij}\vert
$$
#coding:utf-8
import numpy as np
x = np.array([[-1, 1, 0],[-4, 3, 0],[1, 0, 2]])
print x
# oo-范数
ninf = np.linalg.norm(x, ord = np.inf)
print 'norm_inf', ninf
# F-范数
nfro = np.linalg.norm(x, ord = 'fro')
print 'norm_fro', nfro
程序的执行结果
[[-1 1 0]
[-4 3 0]
[ 1 0 2]]
norm_inf 7.0
norm_fro 5.65685424949
$\infty$-范数是从X矩阵的三个行向量求得的,$(-1, 1, 0)$、$(-4, 3, 0)$、$(1, 0, 2)$三个行向量的元素绝对值之和分别为2、7、3,最大值为7。
11.4 学习范数的意义
通过NumPy计算向量、矩阵的范数为后续学习深度学习打下夯实的基础,因为深度学习里的求最小损失函数时就用到了2-范数,所以本章节需要理解并掌握范数的求解。