np.linalg.norm的使用

2020年8月18日 / 9次阅读 / Last Modified 2020年8月19日
NumPy

np.liealg.norm函数用来计算所谓的范数,可以输入一个vector,也可以输入一个matrix,我想记录,当输入为matrix的时候,可以更快速的计算cost function。

L2范数

我们最常见的范数,恐怕就是一个vector的长度,这属于2阶范数,对vector中的每个component平方,求和,在开根号。这也被称为欧几里得范数(Euclidean norm)。

>>> import numpy as np
>>> a = np.arange(10).reshape(10,1)
>>> np.linalg.norm(a)
16.881943016134134
>>> np.linalg.norm(a)**2
285.00000000000006
>>> dd = 0
>>> for i in range(10):
...   dd += i**2
...
>>> dd
285
>>> np.sqrt(285)
16.881943016134134

在没有别的参数的情况下,np.linalg.norm输入一个vector,就是计算vector的长度:vector的每个component的平方相加后开根号。

当输入是一个matrix的时候,在没有其他参数的情况下,np.linalg.norm的动作就是将此matrix的每一个参数平方相加后开根号,相当于对每一个column vector的长度的平方和,后开根号。

在神经网络计算cost function的时候,cost表示成了所有vector长度的平方和,此时如果你的代码充分利用了matrix的计算优点,就不会一个个计算vector的长度,然后求和在平均;而是将所有vector拼接成一个大的matrix,使用np.linalg.norm函数计算所有column vector的长度的平方和。这两个计算是等效的,而且matrix-based计算可以更加快速!

>>> np.linalg.norm(np.hstack((a,a,a,a)))**2
1140.0000000000002
>>> 285*4
1140

这是代码计算上的一个取巧,可以节省不少生命......

L1范数

vector中每个元素的绝对值之和。

>>> a
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
>>> np.linalg.norm(a,1)
45.0
>>> np.linalg.norm(np.hstack((a,a,a,a,a)),1)
45.0
>>> np.linalg.norm(np.vstack((a,a,a,a,a)),1)
225.0
>>> 45*5
225

貌似L1范数对matrix不起作用,以后再深入研究。

-- EOF --

本文链接:https://www.pynote.net/archives/2371

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top