1. 程式人生 > >向量範數與矩陣範數norm 向量範數與矩陣範數

向量範數與矩陣範數norm 向量範數與矩陣範數

向量範數與矩陣範數

2016年07月18日 20:35:26 閱讀數:42662
													<span class="tags-box artic-tag-box">
							<span class="label">標籤:</span>
															<a data-track-click="{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;向量範數&quot;}" class="tag-link" href="http://so.csdn.net/so/search/s.do?q=向量範數&amp;t=blog" target="_blank">向量範數																</a><a data-track-click="{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;矩陣範數&quot;}" class="tag-link" href="http://so.csdn.net/so/search/s.do?q=矩陣範數&amp;t=blog" target="_blank">矩陣範數																</a><a data-track-click="{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;0範數&quot;}" class="tag-link" href="http://so.csdn.net/so/search/s.do?q=0範數&amp;t=blog" target="_blank">0範數																</a><a data-track-click="{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;1範數&quot;}" class="tag-link" href="http://so.csdn.net/so/search/s.do?q=1範數&amp;t=blog" target="_blank">1範數																</a><a data-track-click="{&quot;mod&quot;:&quot;popu_626&quot;,&quot;con&quot;:&quot;2範數&quot;}" class="tag-link" href="http://so.csdn.net/so/search/s.do?q=2範數&amp;t=blog" target="_blank">2範數																</a>
						<span class="article_info_click">更多</span></span>
																				<div class="tags-box space">
							<span class="label">個人分類:</span>
															<a class="tag-link" href="https://blog.csdn.net/bitcarmanlee/article/category/6196173" target="_blank">matrix																</a>
						</div>
																							</div>
			<div class="operating">
													</div>
		</div>
	</div>
</div>
<article class="baidu_pl">
	<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
							<div class="article-copyright">
              					
				版權宣告:本文為博主原創文章,未經博主允許不得轉載。					https://blog.csdn.net/bitcarmanlee/article/details/51945271				</div>
							            <div id="content_views" class="markdown_views">
						<!-- flowchart 箭頭圖示 勿刪 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<h2 id="1範數norm的意義"><a name="t0"></a>1.範數(norm)的意義</h2>

要更好的理解範數,就要從函式、幾何與矩陣的角度去理解。
我們都知道,函式與幾何圖形往往是有對應的關係,這個很好想象,特別是在三維以下的空間內,函式是幾何影象的數學概括,而幾何影象是函式的高度形象化,比如一個函式對應幾何空間上若干點組成的圖形。
但當函式與幾何超出三維空間時,就難以獲得較好的想象,於是就有了對映的概念,對映表達的就是一個集合通過某種關係轉為另外一個集合。通常數學書是先說對映,然後再討論函式,這是因為函式是對映的一個特例。
為了更好的在數學上表達這種對映關係,(這裡特指線性關係)於是就引進了矩陣。這裡的矩陣就是表徵上述空間對映的線性關係。而通過向量來表示上述對映中所說的這個集合,而我們通常所說的基,就是這個集合的最一般關係。於是,我們可以這樣理解,一個集合(向量),通過一種對映關係(矩陣),得到另外一個幾何(另外一個向量)。
那麼向量的範數,就是表示這個原有集合的大小。
而矩陣的範數,就是表示這個變化過程的大小的一個度量。

總結起來一句話,範數(norm),是具有“長度”概念的函式。

2.範數滿足的三個特性

1.非負性: ||x||0||x||≥0

3.向量的範數

1-範數,計算方式為向量所有元素的絕對值之和。

||x||1=in|xi|||x||1=∑in|xi|

4.矩陣的範數

首先假設矩陣的大小為mnm∗n,即m行n列。

1-範數,又名列和範數。顧名思義,即矩陣列向量中絕對值之和的最大值。

||A||1=maxji=1m|aij|||A||1=maxj∑i=1m|aij| 的最大特徵值。

F-範數,Frobenius範數,計算方式為矩陣元素的絕對值的平方和再開方。

||A||F=(i=1mj=1n|aij|2)12||A||F=(∑i=1m∑j=1n|aij|2)12

5.在python裡計算範數

numpy包裡的linalg模組,是專門處理基本線性代數問題的模組。藉助該模組中的norm()函式可以輕鬆計算向量與矩陣的範數。

先看看norm()方法的原型:

def norm(x, ord=None, axis=None, keepdims=False):
    Matrix or vector norm.

    This function is able to return one of eight different matrix norms,
    or one of an infinite number of vector norms (described below), depending
    on the value of the ``ord`` parameter.

  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

再看看更為詳細的計算說明:

    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)
    =====  ============================  ==========================
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

看到上面這個表以後,同學們應該特別清楚了吧。

6.上程式碼

看了上面的說明以後,必須親自動手寫寫程式碼,驗證一下。前面全是理論,最後自然要實踐一把。talk is cheap, show me the code!

#!/usr/bin/env python
#coding:utf-8

'''
Created on 2016年7月17日

@author: lei.wang
'''

import numpy as np
import numpy.linalg as LA

def compute_norm():
    mat = np.matrix([[1,2],[3,4]])
    inv_mat = np.linalg.inv(mat)
    print inv_mat

def vector_norm():
    a = np.arange(9) - 4
    print LA.norm(a,np.inf) #無窮範數
    print LA.norm(a,-np.inf)
    print LA.norm(a,1) #1範數
    print LA.norm(a,2) #2範數

def matrix_norm():
    a = np.arange(9) - 4
    b = a.reshape(3,3)
    b_t = np.transpose(b)
    b_new = np.dot(b_t,b) #b_new矩陣為b^t * b
    x = np.linalg.eigvals(b_new) #求b_new矩陣的特徵值
    print x
    print LA.norm(b,1) #列範數
    print LA.norm(b,2) #譜範數,為x裡最大值開平方
    print LA.norm(b,np.inf) #無窮範數,行範數
    print LA.norm(b,"fro") #F範數

vector_norm()
print 
matrix_norm()
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

讓程式碼run起來:

4.0
0.0
20.0
7.74596669241

[  5.40000000e+01   6.00000000e+00   5.99792822e-16]
7.0
7.34846922835
9.0
7.74596669241
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

註釋已經寫得很詳細,相信大家都已經看明白。