1. 程式人生 > >向量和矩陣的各種範數比較(1範數、2範數、無窮範數等等)

向量和矩陣的各種範數比較(1範數、2範數、無窮範數等等)

在剛入門機器學習中的低秩,稀疏模型時,被各種範數攪得一團糟,嚴重延緩了學習進度,經過一段時間的學習,現在將其完整的總結一下,希望遇到同樣麻煩的同學能有所幫助。。。

一、向量的範數

首先定義一個向量為:a=[-5,6,8, -10]

1.1 向量的1範數

向量的1範數即:向量的各個元素的絕對值之和,上述向量a的1範數結果就是:29,MATLAB程式碼實現為:norm(a,1);

1.2 向量的2範數

向量的2範數即:向量的每個元素的平方和再開平方根,上述a的2範數結果就是:15,MATLAB程式碼實現為:norm(a,2);

1.3 向量的無窮範數

1.向量的負無窮範數即:向量的所有元素的絕對值中最小的:上述向量a的負無窮範數結果就是:5,MATLAB程式碼實現為:norm(a,-inf);
2..向量的正無窮範數即:向量的所有元素的絕對值中最大的:上述向量a的負無窮範數結果就是:10,MATLAB程式碼實現為:norm(a,inf);

二、矩陣的範數

首先我們將介紹數學中矩陣的範數的情況,也就是無論哪個學科都統一的一種規定。。。
例如矩陣A = [ -1 2 -3;
4 -6 6]

2.1 矩陣的1範數

矩陣的1範數即:矩陣的每一列上的元素絕對值先求和,再從中取個最大的,(列和最大),上述矩陣A的1範數先得到[5,8,9],再取最大的最終結果就是:9,MATLAB程式碼實現為:norm(A,1);

2.2 矩陣的2範數

矩陣的2範數即:矩陣ATA的最大特徵值開平方根,上述矩陣A的2範數得到的最終結果是:10.0623,MATLAB程式碼實現為:norm(A,2);

2.3 矩陣的無窮範數

矩陣的1範數即:矩陣的每一行上的元素絕對值先求和,再從中取個最大的,(行和最大),上述矩陣A的1範數先得到[6;16],再取最大的最終結果就是:16,MATLAB程式碼實現為:norm(A,inf);

接下來我們要介紹機器學習的低秩,稀疏等一些地方用到的範數,一般有核範數,L0範數,L1範數(有時很多人也叫1範數,這就讓初學者很容易混淆),L21範數(有時也叫2範數),F範數。。。上述範數都是為了解決實際問題中的困難而提出的新的範數定義,不同於前面的矩陣範數。

2.4 矩陣的核範數

矩陣的核範數即:矩陣的奇異值(將矩陣svd分解)之和,這個範數可以用來低秩表示(因為最小化核範數,相當於最小化矩陣的秩——低秩),上述矩陣A最終結果就是:10.9287, MATLAB程式碼實現為:sum(svd(A))

2.5 矩陣的L0範數

矩陣的L0範數即:矩陣的非0元素的個數,通常用它來表示稀疏,L0範數越小0元素越多,也就越稀疏,上述矩陣A最終結果就是:6

2.6 矩陣的L1範數

矩陣的L1範數即:矩陣中的每個元素絕對值之和,它是L0範數的最優凸近似,因此它也可以表示稀疏,上述矩陣A最終結果就是:22,MATLAB程式碼實現為:sum(sum(abs(A)))

2.7 矩陣的F範數

矩陣的F範數即:矩陣的各個元素平方之和再開平方根,它通常也叫做矩陣的L2範數,它的有點在它是一個凸函式,可以求導求解,易於計算,上述矩陣A最終結果就是:10.0995,MATLAB程式碼實現為:norm(A,‘fro’)

2.8 矩陣的L21範數

矩陣的L21範數即:矩陣先以每一列為單位,求每一列的F範數(也可認為是向量的2範數),然後再將得到的結果求L1範數(也可認為是向量的1範數),很容易看出它是介於L1和L2之間的一種範數,上述矩陣A最終結果就是:17.1559,MATLAB程式碼實現為: norm(A(:,1),2) + norm(A(:,2),2) + norm(A(:,3),2)