2020年8月18日 / 416次阅读 / Last Modified 2021年1月17日
NumPy
np.liealg.norm函数用来计算所谓的范数,可以输入一个vector,也可以输入一个matrix,我想记录,当输入为matrix的时候,可以更快速的计算cost function。
我们最常见的范数,恐怕就是一个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的时候(quadratic),cost表示成了所有vector长度的平方和,此时如果你的代码充分利用了matrix的计算优点,就不会一个个计算vector的长度,然后平方后再求和;而是将所有vector拼接成一个大的matrix,使用np.linalg.norm函数计算所有entry平方和开根号的特点。这两个计算是等效的,而且matrix-based计算可以更加快速!
>>> np.linalg.norm(np.hstack((a,a,a,a)))**2
1140.0000000000002
>>> 285*4
1140
这是代码计算上的一个取巧,可以节省不少生命......
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
前一篇:np.array的stack操作
后一篇:Email批量发送工资条的方案
Ctrl+D 收藏本页
©Copyright 麦新杰 Since 2019 Python笔记