【再回首Python之美】【numpy.linalg】计算矩阵/向量的三种范数:numpy.linalg.norm()

1.numpy.linalg.norm方法简介

numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)[source]

The following norms can be calculated:

ord	norm for matrices	norm for vectors
None	Frobenius norm	2-norm
‘fro’	Frobenius norm	–
‘nuc’	nuclear norm	–
inf	max(sum(abs(x), axis=1))	max(abs(x))
-inf	min(sum(abs(x), axis=1))	min(abs(x))
0	–	sum(x != 0)
1	max(sum(abs(x), axis=0))	as below
-1	min(sum(abs(x), axis=0))	as below
2	2-norm (largest sing. value)	as below
-2	smallest singular value	as below
other	–	sum(abs(x)**ord)**(1./ord)

使用np.linalg.norm很实用,比如用2-norm可以很容易求得欧式距离等

2.求矩阵的三种范数

# -*- coding: utf-8 -*-
"""
@author: 蔚蓝的天空Tom
Talk is cheap, show me the code
Aim:用numpy.linalg.norm方法求矩阵的三种范数
Note numpy.linalog.norm ---> return Norm of the matrix or vector(s)
"""

import numpy as np
from numpy import linalg as LA

def norm_matrix():
    '''求向量的三种范数
    '''
    A = np.array([[3,  -4],
                  [-6, 5]])
    
    #9.2736184954957039, 对象是矩阵,求矩阵元素平方和开方
    ret = np.linalg.norm(A, ord=None)
    #[ 5. 7.81024968],对象是逐行,求每行元素平方和开方
    ret = np.linalg.norm(A, ord=None, axis=1)
    #[ 6.70820393  6.40312424], 对象是逐列,求每列元素平方和开方
    ret = np.linalg.norm(A, ord=None, axis=0)
    
    #11.0,对象是矩阵,求矩阵中逐行元素绝对值和的最大值
    ret = np.linalg.norm(A, ord=np.Inf)    
    #[ 4.  6.], 对象是逐行,求每行元素绝对值的最大值
    ret = np.linalg.norm(A, ord=np.Inf, axis=1)
    #[ 6.  5.], 对象是逐列,求每列元素绝对值的最大者
    ret = np.linalg.norm(A, ord=np.Inf, axis=0)
    
    #7.0 对象是矩阵,求矩阵中逐行元素绝对值和的最小值
    ret = np.linalg.norm(A, ord=-np.Inf)
    #[ 3.  5.], 对象是逐行,求行的元素绝对值的最小值
    ret = np.linalg.norm(A, ord=-np.Inf, axis=1)
    #[ 3.  4.],对象是逐列,求列的元素绝对值的最小值
    ret = np.linalg.norm(A, ord=-np.Inf, axis=0)
    
    #raise ValueError("Invalid norm order for matrices.")
    #ret = np.linalg.norm(A, ord=0)
    A = np.array([[3,  -4, 1],
                  [-6, 5,  0]])
    #[ 3.  2.], 对象是逐行,求每行的非零元素个数
    ret = np.linalg.norm(A, ord=0, axis=1)
    #[ 2.  2.  1.],对象是逐列,求每列的非零元素个数
    ret = np.linalg.norm(A, ord=0, axis=0)
    
    A = np.array([[100,  -4],
                  [-6, 5]])
    #106.0, 对象是矩阵,求列的元素绝对值和的最大值
    ret = np.linalg.norm(A, ord=1)
    #[ 104.   11.], 对象是逐行,求行的元素绝对值和
    ret = np.linalg.norm(A, ord=1, axis=1)
    #[ 106.    9.],对象是逐列,求列的元素绝对值和
    ret = np.linalg.norm(A, ord=1, axis=0)

    A = np.array([[-4,  3, 1],
                  [-6,  5, -1]])
    #2.0, 对象是矩阵,求列的元素绝对值和的最小者
    ret = np.linalg.norm(A, ord=-1)      #1.71428571429, min(sum(abs(x), axis=0))    
    #[ 0.63157895  0.73170732], 对象是逐行
    ret = np.linalg.norm(A, ord=-1, axis=1)
    #[ 2.4    1.875  0.5  ],对象是逐列
    ret = np.linalg.norm(A, ord=-1, axis=0)    
    
    A = np.array([[-4,  3, 4],
                  [-6,  4, 3]])
    #10.0015300174, 对象是矩阵,求所有元素平方和开方,所有元素平方和102,开方=10.0015300174
    ret = np.linalg.norm(A, ord=2)
    #[ 6.40312424  7.81024968],对象是每行,求行的元素平方和开方
    ret = np.linalg.norm(A, ord=2, axis=1)
    #[ 7.21110255  5. 5.],对象是每列,求列的元素平方和开方
    ret = np.linalg.norm(A, ord=2, axis=0)
    
    A = np.array([[-4,  3, 4],
                  [-6,  4, 3]])
    #1.40335216944,对象是矩阵,smallest singular value
    ret = np.linalg.norm(A, ord=-2)
    #[ 2.05798302  2.22834406],对象是逐行
    ret = np.linalg.norm(A, ord=-2, axis=1)
    #[ 3.32820118  2.4  2.4],对象是逐列
    ret = np.linalg.norm(A, ord=-2, axis=0)
    
if __name__=='__main__':
    norm_matrix()

3.求向量的三种范数

# -*- coding: utf-8 -*-
"""
@author: 蔚蓝的天空Tom
Talk is cheap, show me the code
Aim:用numpy.linalg.norm方法求向量的三种范数
Note numpy.linalog.norm ---> return Norm of the matrix or vector(s)
"""

import numpy as np
from numpy import linalg as LA

def norm_vector():
    '''
    求向量的三种范数
    '''
    A = np.array([3, -4])
    #5.0,平方和开方
    ret = np.linalg.norm(A, ord=None)    
    
    #4.0, max(abs(x)),元素绝对值的最大者
    ret = np.linalg.norm(A, ord=np.Inf)  
    
    #3.0, min(abs(x)),元素绝对值的最小
    ret = np.linalg.norm(A, ord=-np.Inf) 
    
    #2.0, sum(x!=0),非0元素的个
    ret = np.linalg.norm(A, ord=0)       
    
    #7.0, max(sum(abs(x), axis=0)),元素绝对值的和的最大值
    ret = np.linalg.norm(A, ord=1)       
    
    #1.71428571429, min(sum(abs(x), axis=0))
    ret = np.linalg.norm(A, ord=-1)      
    
    #5.0, 平方和开方
    ret = np.linalg.norm(A, ord=2)       
    
    #2.4, smallest singular value
    ret = np.linalg.norm(A, ord=-2)      
    
if __name__=='__main__':
    norm_vector()

4.范数的应用:用2-norm求向量之间的欧氏距离

def norm_em():
    '''用2-norm求欧氏距离'''
    p1 = np.array([1, 1])
    p2 = np.array([4, 5])
    em = np.sqrt(sum(np.multiply(p1-p2, p1-p2))) #5.0     一般方法求欧氏距离, 欧氏距离就是两点连线距离
    em = np.linalg.norm(p1-p2, ord=2)            #5.0     用2-norm求欧氏距离

参考文献:

[1]https://blog.csdn.net/hqh131360239/article/details/79061535

[2]https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html

(end)

    原文作者:CV_ML_DP
    原文地址: https://blog.csdn.net/u012421852/article/details/80433463
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞