線性代數怎么學


作者:「已注銷」
鏈接:https://www.zhihu.com/question/311724817/answer/695067704
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

線性代數其實不難學,但是某些腦殘的教材導致了大家覺得線性代數難學。對,我說的就是同濟版,居然用行列式來起手線性代數學習,一開始逆序數定義就來得莫名其妙,然后那一大坨行列式的定義式更讓人望而生畏,后面再來一大篇幅的各種花式求行列式,當年作為一個萌新的我,直接就喪失了學習線性代數的信心以及興趣了。吐槽完畢。

要學好線性代數,最重要的是抓住線性代數的主線。線性代數的主線就是線性空間以及線性映射,整個線性代數的概念公式定義定理都是圍繞着線性空間以及線性映射展開的。你要做的,就是緊緊抓住這條主線,把線性代數的所有知識點串聯起來,然后融會貫通,自然就能學好線性代數了。

1,線性空間。線性空間的定義比較抽象,簡單的說,就是向量組成的一個集合,這個集合可以定義加法以及純量乘法,並且對加法以及乘法滿足交換律結合律以及分配率。這個集合以及定義在集合上的代數運算就是線性空間。

研究線性空間有幾個途徑,一是基與維數,二是同構,三是子空間與直和以及商空間,四是線性映射。

先講講基與維數。一個線性空間必定存在基,線性空間的任意元素都可以由基線性表出,且表出方式唯一,這個唯一的表出的組合就是這個元素在這個基下的坐標。線性表出且表出方式唯一的充分必要條件是什么?這里又引出了線性無關以及極大線性無關組的概念,極大線性無關組元素的個數又能引出秩的概念。由秩又能引出維度的概念。以上這些概念都是為了刻畫線性空間的基與維數而衍生出來的,並不是憑空出現無中生有的。

下面再談談同構。線性空間千千萬,應如何研究呢?同構就是這樣一個強大的概念,任何維數相同的線性空間之間是同構的,空間的維數是簡單而深刻的,簡單的自然數居然能夠刻畫空間最本質的性質。借助於同構,要研究任意一個n維線性空間,只要研究Rⁿ就行了。

n維線性空間作為一個整體,我們自然想到能不能先研究它的局部性質?所以自然而然的導出了子空間的概念以及整個空間的直和分解。直和分解要求把整個空間分解為兩兩不交的子空間之和,通過研究各個簡單的子空間的性質,從而得出整個空間的性質。

2,線性映射。

前面講了線性空間,舞台搭好了,輪到主角:線性映射登場了。

線性映射的定義這里就不贅述了。我們小學就學過正比例函數y=kx,這是一個最簡單的一維線性映射,也是一個具體的線性映射'模型',線性映射的所有性質對比着正比例函數來看,一切都是那么簡單易懂。現在把定義域從一維升級到多維,值域也從一維升級到多維,然后正比例系數k也升級為一個矩陣,那么這個正比例函數就升級為一個線性映射了。

1)線性映射的核空間。這是線性映射的一個重要的概念,什么是線性映射的核空間呢?簡單的說,就是映射到零的原像的集合,記作KER。用正比例函數來類比,顯然當k不等於0時,它的核是零空間,當k為零時,它的核空間是整個R。

有時候需要判定一個線性映射是不是單射,按照定義來還是沒那么好證的,這時我們可以從它的核來判定,只要它的核是零,那么這個線性映射必然是單射。

2)線性映射的像。當自變量取遍整個定義域時,它的像的取值范圍成為一個線性子空間,稱為像空間,記作IM。

3)線性映射的矩陣表示。一個抽象的線性映射應如何'解析'的表達出來呢?這個表達式寫出來就是一個矩陣,且這個矩陣依賴於基的選擇。也就是說在不同的基下,線性映射有不同的矩陣。基有無窮個,相應的矩陣有無窮個。這就給用矩陣研究線性映射帶來了麻煩。

幸好我們有相似矩陣。同一個線性映射在不同的基下的矩陣是相似關系,相似不變量有秩,行列式,跡,特征值,特征多項式等。所以可以通過相似矩陣來研究線性映射的秩,行列式,跡,特征值,特征多項式等性質。

線性映射的矩陣有無窮多,那么這其中有哪些是值得關注的呢?第一就是標准正交基下的矩陣了,這也是最常見的。

然而一個線性映射的矩陣在標准正交基下可能特別復雜,所以需要選擇一組特殊的基,讓它的矩陣在這個基下有最簡單的矩陣表示。如果存在這樣的基,使得線性映射的矩陣為對角矩陣,則稱這個線性映射可對角化。

然而是不是所有線性映射都可以對角化呢,遺憾的是,並不是。那么就要問,如果一個線性映射不能對角化,那么它的最簡矩陣是什么?這個問題的答案是若爾當標准型。可以證明,在復數域上,任何線性映射都存在唯一的若爾當標准型。

 
=====================================================================
機器學習
=====================================================================
 

線性代數其實不難學,但是某些腦殘的教材導致了大家覺得線性代數難學。對,我說的就是同濟版,居然用行列式來起手線性代數學習,一開始逆序數定義就來得莫名其妙,然后那一大坨行列式的定義式更讓人望而生畏,后面再來一大篇幅的各種花式求行列式,當年作為一個萌新的我,直接就喪失了學習線性代數的信心以及興趣了。吐槽完畢。

要學好線性代數,最重要的是抓住線性代數的主線。線性代數的主線就是線性空間以及線性映射,整個線性代數的概念公式定義定理都是圍繞着線性空間以及線性映射展開的。你要做的,就是緊緊抓住這條主線,把線性代數的所有知識點串聯起來,然后融會貫通,自然就能學好線性代數了。

1,線性空間。線性空間的定義比較抽象,簡單的說,就是向量組成的一個集合,這個集合可以定義加法以及純量乘法,並且對加法以及乘法滿足交換律結合律以及分配率。這個集合以及定義在集合上的代數運算就是線性空間。

研究線性空間有幾個途徑,一是基與維數,二是同構,三是子空間與直和以及商空間,四是線性映射。

先講講基與維數。一個線性空間必定存在基,線性空間的任意元素都可以由基線性表出,且表出方式唯一,這個唯一的表出的組合就是這個元素在這個基下的坐標。線性表出且表出方式唯一的充分必要條件是什么?這里又引出了線性無關以及極大線性無關組的概念,極大線性無關組元素的個數又能引出秩的概念。由秩又能引出維度的概念。以上這些概念都是為了刻畫線性空間的基與維數而衍生出來的,並不是憑空出現無中生有的。

下面再談談同構。線性空間千千萬,應如何研究呢?同構就是這樣一個強大的概念,任何維數相同的線性空間之間是同構的,空間的維數是簡單而深刻的,簡單的自然數居然能夠刻畫空間最本質的性質。借助於同構,要研究任意一個n維線性空間,只要研究Rⁿ就行了。

n維線性空間作為一個整體,我們自然想到能不能先研究它的局部性質?所以自然而然的導出了子空間的概念以及整個空間的直和分解。直和分解要求把整個空間分解為兩兩不交的子空間之和,通過研究各個簡單的子空間的性質,從而得出整個空間的性質。

2,線性映射。

前面講了線性空間,舞台搭好了,輪到主角:線性映射登場了。

線性映射的定義這里就不贅述了。我們小學就學過正比例函數y=kx,這是一個最簡單的一維線性映射,也是一個具體的線性映射'模型',線性映射的所有性質對比着正比例函數來看,一切都是那么簡單易懂。現在把定義域從一維升級到多維,值域也從一維升級到多維,然后正比例系數k也升級為一個矩陣,那么這個正比例函數就升級為一個線性映射了。

1)線性映射的核空間。這是線性映射的一個重要的概念,什么是線性映射的核空間呢?簡單的說,就是映射到零的原像的集合,記作KER。用正比例函數來類比,顯然當k不等於0時,它的核是零空間,當k為零時,它的核空間是整個R。

有時候需要判定一個線性映射是不是單射,按照定義來還是沒那么好證的,這時我們可以從它的核來判定,只要它的核是零,那么這個線性映射必然是單射。

2)線性映射的像。當自變量取遍整個定義域時,它的像的取值范圍成為一個線性子空間,稱為像空間,記作IM。

3)線性映射的矩陣表示。一個抽象的線性映射應如何'解析'的表達出來呢?這個表達式寫出來就是一個矩陣,且這個矩陣依賴於基的選擇。也就是說在不同的基下,線性映射有不同的矩陣。基有無窮個,相應的矩陣有無窮個。這就給用矩陣研究線性映射帶來了麻煩。

幸好我們有相似矩陣。同一個線性映射在不同的基下的矩陣是相似關系,相似不變量有秩,行列式,跡,特征值,特征多項式等。所以可以通過相似矩陣來研究線性映射的秩,行列式,跡,特征值,特征多項式等性質。

線性映射的矩陣有無窮多,那么這其中有哪些是值得關注的呢?第一就是標准正交基下的矩陣了,這也是最常見的。

然而一個線性映射的矩陣在標准正交基下可能特別復雜,所以需要選擇一組特殊的基,讓它的矩陣在這個基下有最簡單的矩陣表示。如果存在這樣的基,使得線性映射的矩陣為對角矩陣,則稱這個線性映射可對角化。

然而是不是所有線性映射都可以對角化呢,遺憾的是,並不是。那么就要問,如果一個線性映射不能對角化,那么它的最簡矩陣是什么?這個問題的答案是若爾當標准型。可以證明,在復數域上,任何線性映射都存在唯一的若爾當標准型。

 

 

============================================================

https://xiaozhuanlan.com/LinearAlgebra/4950187326

  張雨萌-醬油哥 的《機器學習線性代數核心》 

這本書試讀了一章,還是值得推薦的,大家可以去在線購買,以上是鏈接

============================================================

 

作為寫在全書前面的序言,我們重點來回答這三個問題:

1、為什么要學習線性代數?
2、應該如何學習線性代數?
3、選擇在哪學習線性代數?

1.為什么要學習線性代數

當下,機器學習、人工智能的火爆程度可以說是無需多言,薪酬之高、職業發展道路之寬闊吸引着大量優秀的學子投身於這個領域進行學習和探索。

然而,與較為基礎的程序語言、編程框架不同,機器學習是一個更為綜合性的學科領域,一個零基礎的小白想要輕易涉足並非易事,因為他需要有大量的前序知識作為鋪墊,其中最核心的基礎就是以線性代數、概率統計等為代表的數學知識和思想方法。

線性代數作為利用空間來投射和表征數據的基本工具,可以方便的對數據進行各種變換,從而讓研究人員更為直觀、清晰的探查到數據的主要特征和不同維度的所需信息。因此,線性代數的核心基礎地位不言而喻,只有熟練的運用好這個工具,才能為自己搭建起攀登機器學習的牢固階梯。

初學者可能會問了,機器學習、數據分析中有哪些地方需要用到線性代數呢?有很多,我們略舉幾例,例如:

1、如何來量化描述日常生活中的事物,比如個體的不同屬性、自然語言的詞語句子等等,來支撐我們所要進行的算法分析?

2、如何將待處理的數據在不同維度的空間中進行變換處理,以尋找到最佳的觀測角度,使得數據處理達到最好的效果?

3、如何從采樣的海量數據中提取出主要特征成分,梳理出數據的主要脈絡,從而指導你對一個文本進行主題建模,幫助你利用協同過濾技術成功推薦給用戶最喜愛的菜餚?

4、如何用數字表示圖像,並且在不太影響觀察效果的前提下,利用很小的存儲空間就能近似的達到原有圖像的視覺效果?

5、如何對我們采集到的觀測數據進行擬合,找到其中暗含的規律,指導對未知數據的預測?

6、在實際的數據采樣分析過程中,如何在無法找到精確解的情況下,探索到最接近真相的近似解?

等等等等,還有很多......

這些實用而有趣的問題,我們在數據分析和機器學習中幾乎是每天都要遇到,而想要解決好這些問題,線性代數的核心概念和處理方法都是必須牢固掌握的。

2.應該如何學習線性代數

既然明確了線性代數的核心基礎地位,那么很多同學一定摩拳擦掌,磨刀霍霍准備大干一場,但是翻開大學里的線性代數教材,就會感覺有些迷茫,從教材里,似乎很難找到解決上述實際問題的方法。

絕大多數同學在大學學習的時候都會有這樣一個感覺,一門課學完了,考試過了,卻不知道學了有什么用,尤其是數學類的課程。因為傳統教材大多數是按照定義-例題-計算來大篇幅羅列數學概念,風格偏理論定義和運算技巧,沒有注重梳理學科內在的邏輯脈絡,更沒能深刻挖掘學科與當下前沿技術的交匯點,往往應付考試有余,但想以此高效的打下機器學習的數學基礎,針對性和可讀性不佳。

明確了不足,那就應該在傳統教材的薄弱環節做突破,設計一條有針對性的學習路徑:

一方面,緊緊圍繞空間變換這個線性代數的主要脈絡,從坐標與變換、空間與映射、近似與擬合、相似與特征、降維與壓縮這五個維度,環環相扣的展開線性代數與機器學習算法緊密結合的最核心內容,深刻理解如何用空間表示數據、用空間處理數據、用空間優化數據,用一條線索拎其整個學科主干內容。

另一方面,結合機器學習中的典型實戰案例,面向應用將線性代數這一數學工具用熟用好,同時以Python語言為工具進行數學思想和解決方案的有效實踐,無縫對接工程應用。

3.選擇在哪學習線性代數

學習的路徑明晰了,而傳統大學教材卻都不是按照這個套路來編寫,該怎么辦?別急,作者依照上述學習路徑並結合自身的思考與感悟,精心設計了《機器學習線性代數核心》這一全新教程。

來,我們一起看看這套教程吧!

3.1.作者簡介

作者:醬油哥,2014年清華大學計算機科學與技術系碩士畢業,主要研究興趣方向為數據分析、自然語言處理。專業基礎扎實,尤其擅長深入淺出的講解技術,知乎專欄《給妹子講python》關注量近14000,深受讀者的好評與期待。

3.2.全書內容安排如下:

第一部分 坐標與變換:高樓平地起。從空間坐標表示與線性變換入手,快速建立線性代數直觀感受,理解向量和矩陣運算的幾何本質;

第二部分 空間與映射:矩陣的靈魂。圍繞線性代數的概念基石---空間,詳細闡述空間中映射和變換的本質,深入剖析矩陣在其中的靈魂作用;

第三部分 近似與擬合:真相最近處。展現線性代數在近似與擬合中的理論基礎,並講述了最小二乘法的實際應用;

第四部分 相似與特征:最佳觀察角。重點分析矩陣的相似性以及特征的提取方法,打好數據降維的理論基礎;

第五部分 特征與降維:抓住主成分。作為全書知識脈絡的交匯,講解如何對數據進行降維和特征分析,深入剖析矩陣分析的核心內容:特征值分解和奇異值分解;

第六部分 實踐與應用。展現線性代數在圖像壓縮、推薦系統分析中的實際應用。

3.3.本書的三個特色:

第一,避免紙上談兵。全書以Python語言作為工具進行概念和方法的有效實踐,無縫對接機器學習工程應用,可操作性強;

第二,避免生硬枯燥。務求結合線性代數的幾何意義進行重點概念的剖析和演繹,避免傳統教材的既視感,強化邏輯性和可讀性;

第三,避免大水漫灌。以機器學習所急需的線性代數內容為立足點,精確打擊,提高效率。

如何你選擇和我們一起出征,去征服機器學習的線性代數核心,那就讓我們翻開新章節,一起出發吧!

 
=======================================================
 
 
 
第 2.1 章 描述空間的工具:向量

提示:如果在手機端或PC端,公式無法正常顯示,請再次刷新就可以了

1.行向量、列向量及python表示

1.1.重溫向量

向量對於大家而言一定不會陌生,向量的概念很簡單,把數字排成一行或一列就是向量。他可以作為對空間進行描述的有力工具。

比如:一個簡單的二維向量:[45],這個向量有兩個成分:第一個成分是數字 4 ,第二個成分是數字 5 ,一方面,我們可以把他理解成二維平面中 x 坐標為 4 ,y 坐標為 5 的一個點,也可以理解為以平面原點 (0,0) 為起點,到目標終點 (4,5) 的有向線段,如圖1.1所示。由此可見,向量中成分的個數就是向量的維數。因此,我們進一步推廣下去,還會有三維向量,如:[324] ,他用來表示三維空間中的一個點,或者在三維空間中以原點 (0,0,0) 為起點,到目標終點 (3,2,4) 的有向線段,如圖1.2所示。當然,以此類推還有更高維的向量。

圖1.1 二維向量的表示

圖1.1 二維向量的表示

 

圖1.2 三維向量的表示

圖1.2 三維向量的表示

 

當然,向量也不僅僅局限於描述空間中的點坐標和有向線段,他也可以作為描述事物屬性的一種便捷工具和基礎的數據表示形式。比如一次考試,你的成績為:語文85分,數學92分,外語89分。由於這三門課分屬於你的不同科目屬性,因此我們可以使用一個三維向量對其進行表示:score=[859289] 。

又如,在自然語言處理中,程序在進行文本閱讀時,首先就會進行文本分詞,然后使用向量進行表示。這是因為向量很適合在高維空間中進行表達和處理。在本書后續章節中將接觸到的機器學習有關概念:如投影、降維等等,都是在向量的基礎上實現的。

1.2.我們通常使用列向量

根據剛才我們所講的,把數字排成一行或一列就是向量。因此向量擁有兩種表達方式:像 [45], [−4156.7] 這種元素豎排的,稱為列向量,對應的元素橫排的自然稱為行向量,比如: [457]。

我們在實際使用向量工具進行描述和計算的時候,具體使用哪一種方式呢?在沒有特殊說明的情況下,我們提到向量,都是默認為列向量。在文字排版的時候,由於列向量比較占空間,因此一般將其寫成行向量的轉置:[−4156.7]T 。

如果我們從直覺上來看,似乎行向量更為直觀呀,這里為什么如此偏愛列向量呢?這么做主要是為了方便后續的向量坐標變換、映射等計算。這里只簡單提一句,大家有個直觀印象就好:將一個矩陣 A 所表示的線性映射作用於某向量 x 時,我們習慣於將其寫成矩陣乘以向量的形式: Ax ,而這種寫法的運算基礎便是:x 是一個列向量。這里一下子堆上來好幾個概念,比如轉置、矩陣、線性變換等等,都先不急着展開,后面會一一詳細描述。這里就請先記住:一般我們都用列的形式來表示向量。

1.3.用python來表示向量

那么好,現在我們把工具用起來。對應的,我們如何用python語言來表示行向量和列向量呢?這里我們需要解決python數據分析中的一個常用工具庫:Numpy。

先看一段代碼:

代碼片段:

  • import numpy as np
  •  
  • A = np.array([ 1,2,3,4])
  • print(A)

運算結果:

  • [ 1 2 3 4]

python中用Numpy庫來生成一個向量,默認生成的是行向量,但正如我們上面所說的,一般情況下我們通常使用的是列向量,因此還需要對其做一些處理。

你的第一感覺可能會想,用一用轉置這個概念(后面會詳細講解)是不是就可以了,也就是把向量的行索引和列索引交換位置,但是Numpy中的轉置方法在一維向量里是無效的。

代碼片段:

  • import numpy as np
  •  
  • A = np.array([ 1,2,3,4])
  • print(A.transpose())

運行結果:

  • [ 1 2 3 4]

我們發現,確實起到效果。那我們應該如何來表示一個列向量呢?具體的做法我們來演示一下:

代碼片段:

  • import numpy as np
  •  
  • A = np.array([ 1, 2, 3, 4])
  • A_t = A[:, np.newaxis]
  • print(A_t)
  • print(A_t.shape)

運行結果:

  • [ [1]
  • [ 2]
  • [ 3]
  • [ 4]]
  •  
  • ( 4, 1)

這樣,我們就把一個行向量轉換成列向量了。這里確實是用了轉置的想法,但是代碼看上去怪怪的,有點略復雜。那有沒有更簡單的方法?有,慢慢往下看。

1.4.如何簡單生成列向量

這里我們也事先用一點后面的知識,我們把向量看作是一維的數組,但是也可以看做是行為1或者列為1的二維數組,用后面的內容來描述,即向量可以看作是特殊的矩陣。行向量是 1×m 的矩陣,列向量是 n×1 的矩陣,我們用這個視角重新生成一個新的行向量和列向量。

代碼片段:

  • import numpy as np
  •  
  • A = np.array([[ 1, 2, 3]])
  • print(A)
  • print(A.T)

運行結果:

  • [[ 1 2 3]]
  •  
  • [[ 1]
  • [ 2]
  • [ 3]]

在這段代碼里,我們要注意:行向量初始化時,我們使用了Numpy庫中的二維向量初始化方法,因此多嵌套了一層中括號,在這種情況下,我們就可以直接通過行向量轉置的方法,來生成對應的列向量了,是不是簡單了許多!

2.用向量去計算:加法、數量積和向量乘法

明確了向量的表示方法,那么接下來我們來梳理一下向量的基本運算,我們逐一介紹向量的加法、向量的數量積和向量間的乘法。

2.1.向量的加法

兩個維數相同的向量才能進行加法運算,將相同位置上的元素相加即可,結果向量的維數保持不變:

[u1u2u3]T + [v1v2v3]T=[u1+v1u2+v2u3+v3]T

向量的加法運算很簡單,我們具體來舉個例子:

代碼片段:

  • import numpy as np
  •  
  • u = np. array([[1,2,3]]).T
  • v = np. array([[5,6,7]]).T
  • print(u + v)

運行結果:

  • [[ 6]
  • [ 8]
  • [ 10]]

2.2.向量的數量乘法

向量的數量乘法就是將參與乘法運算的數和向量的每個元素分別相乘,結果向量保持維數不變,數量乘法就是將向量沿着所在直線的方向拉長到相應的倍數,方向和參與運算的數字的正負號相關:

c[u1u2u3]T = [cu1cu2cu3]T

代碼片段:

  • import numpy as np
  •  
  • u = np.array([[ 1, 2, 3]]).T
  • print(3*u)

運行結果:

  • [[ 3]
  • [ 6]
  • [ 9]]

2.3.向量間的乘法

介紹完向量的加法和數量乘法,這里大家一定會問了,那向量和向量相乘呢?向量與向量的乘法分為所謂的點乘(內積)和叉乘(外積),我們先說內積。

2.3.1.向量的內積

向量 u 和向量 v 的內積定義如下:

u⋅v=[u1u2u3]T⋅[v1v2v3]T=u1v1+u2v2+u3v3

這個定義看上去很簡單,好像沒什么特殊含義。但是,他的另一種表示方法所含的物理意義就十分清晰:u⋅v=|u||v|cosθ,如圖1.3所示,即:向量 u 在向量 v 方向上的投影長度乘上向量 v 的模長,換句話說,如果 v 是單位向量的話,就可以直接描述為 u 在 v 方向上的投影長度。

圖1.3 向量內積的幾何表示

圖1.3 向量內積的幾何表示

 

需要注意的是,我們在實際計算向量內積時,無論是行向量間的內積還是列向量間的內積,其運算結果都是一樣的。

python中計算向量的內積非常方便。但是需要注意,如果我們直接使用numpy函數庫中的內積方法dot,那么python內積運算函數dot中的參數要求必須是一維行向量:

代碼片段:

  • import numpy as np
  •  
  • u = np. array([3, 5, 2])
  • v = np. array([1, 4, 7])
  • print(np.dot(u, v))

運行結果:

  • 37

那么有人可能會問了,在上文中我們學習了表示行列向量的通用方法(即用行或列為1的二維數組表示向量),用在這里行不行?我們可以看看:

代碼片段:

  • import numpy as np
  •  
  • u = np. array([[3, 5, 2]])
  • v = np. array([[1, 4, 7]])
  • print(np.dot(u,v))

運行結果:

  • Traceback (most recent call last):
  • File "E:/12homework/12homework.py", line 5, in <module>
  • print(np.dot(u,v))
  • ValueError: shapes ( 1,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)

代碼片段:

  • import numpy as np
  •  
  • u = np. array([[3, 5, 2]]).T
  • v = np. array([[1, 4, 7]]).T
  • print(np.dot(u,v))

運行結果:

  • Traceback (most recent call last):
  • File "E:/12homework/12homework.py", line 5, in <module>
  • print(np.dot(u,v))
  • ValueError: shapes ( 3,1) and (3,1) not aligned: 1 (dim 1) != 3 (dim 0)

看上去似乎有些問題,學完整個第一章大家就會知道,這種向量的表示方法本質上其實是矩陣,只不過是行數或者列數為1的特殊矩陣,將這種方法表示下的向量作為dot函數的參數,就需要依據矩陣的乘法法則來計算,依據矩陣乘法法則判定就會報錯,至於為什么會出錯,后面的小節會重點講述,那么怎么樣才能得到正確的結果呢,這里先提前預告一下:

代碼片段:

  • import numpy as np
  •  
  • u = np. array([[3, 5, 2]])
  • v = np. array([[1, 4, 7]]).T
  • print(np.dot(u,v))

運行結果:

  • [[ 37]]

看上去得到了一個正確的數值結果,至於為什么外面圍着兩層中括號,學完本章就會明白。

2.3.2.向量的外積

至於說向量的外積,我們只討論二維平面和三維空間中的向量外積:

在二維平面中:u×v=[u1u2]T×[v1v2]T=u1v2−u2v1

我們同樣的,還有另一種表達式,看起來物理意義會更直觀一些:u⋅v=|u||v|sinθ ,如圖1.4所示。這表示兩個向量張成的平行四邊形的面積,當然了這里的面積要打引號,因為如果兩個向量的夾角大於180°,則結果為負。

圖1.4 向量外積的幾何表示

圖1.4 向量外積的幾何表示

 

代碼片段:

  • import numpy as np
  • u = np. array([3, 5])
  • v = np. array([1, 4])
  • print(np.cross(u, v))

運行結果:

  • 7

而在三維空間中,外積的計算要相對復雜一些,其計算的結果是一個向量而不是一個數值。

u×v=[u1u2u3]T×[v1v2v3]T=[u2v3−u3v2u3v1−u1v3u1v2−u2v1]T

這個向量也是有物理含義的,即兩個向量所表示平面的法向量。

代碼片段:

  • import numpy as np
  • x = np. array([3, 3, 9])
  • y = np. array([1, 4, 12])
  • print(np.cross(x, y))

運行結果:

  • [ 0 -27 9]

3.先數乘后疊加,向量的線性組合

在向量加法和數量乘法的基礎上,我們將其組合應用,來介紹一下向量的線性組合。針對向量 u 和 v,我們先求數字 c 和向量 u 的數量積,再求數字 d 和向量 v 的數量積,最后將二者疊加,就得到了 u 和 v 的線性組合 cu+dv ,這里 c 和 d 可以取任意值(包括 0)。

我們再來舉一個實際例子來看一下三個三維向量的線性組合:u=[u1u2u3]T,v=[v1v2v3]T,w=[w1w2w3]T:

cu+dv+ew=c[u1u2u3]+d[v1v2v3]+e[w1w2w3]=[cu1+dv1+ew1cu2+dv2+ew2cu3+dv3+ew3]

其中,c , d , e 可以取包含 0 在內的任意值

在這里,我們也舉個例子來對幾個已知的向量進行線性組合:

代碼片段:

  • import numpy as np
  •  
  • u = np.array([[1, 2, 3]]).T
  • v = np.array([[4, 5, 6]]).T
  • w = np.array([[7, 8, 9]]).T
  •  
  • print(3*u+4*v+5*w)

運行結果:

  • [[ 54]
  • [ 66]
  • [ 78]]

那么進一步,我們思考一下如下的幾個線性組合的圖像是什么?我們知道,兩個向量相加,在幾何上就是將兩個向量首尾依次連接,結果向量就是最初的起點和最終的終點的有向連線。我們假定有三個非零的三維向量:u=[u1u2u3]T,v=[v1v2v3]T,w=[w1w2w3]T,我們討論他們的線性組合,

情況一, cu 的所有線性組合的圖像:
由於 c 可以取 0,因此 cu 的所有線性組合可以表示為三維空間中一條穿過原點(0,0,0) 的直線,如圖1.5所示:
圖1.5 $cu$ 所有線性組合構成的圖像

圖1.5  cu 所有線性組合構成的圖像

 

情況二, cu+dv 的所有線性組合的圖像:
當向量 u 和 v 不在一條直線上時, cu+dv 表示三維空間中的一個通過原點 (0,0,0) 的二維平面,如圖1.6所示;
圖1.6 向量u和v不共線時, $cu+dv$ 所有線性組合構成的圖像

圖1.6 向量u和v不共線時,  cu+dv 所有線性組合構成的圖像

 

當向量 u 和 v 處在一條直線上時,cu+dv 的圖像退化成第一種情況;

情況三,cu+dv+ew 的所有線性組合的圖像:
當向量 u , v , w 不在一個平面上時,cu+dv+ew可以表示整個三維空間;
當向量 u , v , w 處在一個平面上時,cu+dv+ew的圖像退化成第二種情況;
當向量 u , v , w 處在一條直線上時,cu+dv+ew的圖像退化成第一種情況;

不難發現,我們在討論上述多種情況時,反復提到了共線、共面的概念,這些性質會對一組向量線性組合的結果向量的空間位置分布產生較大影響,是線性代數中非常關鍵的概念,在后續章節中,我們會圍繞他開展深入的討論,不過我們會使用更加專業的詞匯來進行描述和介紹,即:線性相關和線性無關。

 
==================================================
只是試讀推薦,所以只推薦2篇,更多大家自己到上面鏈接去購買
==================================================
 
 
第 2.3 章 矩陣,讓向量動起來

1.矩陣:排列的向量,堆放的數

介紹完了向量,這一節我們開始介紹矩陣。對於矩陣而言,最直觀的描述就是一個 m×n 的數字方陣,他可以看作是 n 個 m 維列向量從左到右並排擺放,也可以看成是 m 個 n 維行向量從上到下進行疊放。

我們舉一個例子:一個 2×3 的矩陣 A=[1230.4−42]。顯而易見,他有 2 行 3 列,一共 6 個元素,每一個元素都對應矩陣中的一個數據項,例如第一行第二列的項是 2,我們也可以表示為 A12=2。

那如果我們想使用Python語言來表示上面這個矩陣,也是非常簡單的。可以使用NumPy中的嵌套數組來完成,這個矩陣本質上被表示成了一個二維數組:

代碼片段:

  • import numpy as np
  •  
  • A = np.array([[ 1, 2, 3],
  • [ 0.4, -4, 2]])
  • print(A)
  • print(A.shape)

運行結果:

  • [ [ 1. 2. 3. ]
  • [ 0.4 -4. 2. ]]
  •  
  • ( 2, 3)

我們着重強調一下,在形容矩陣規模的時候,一般采用其行數和列數來進行描述,對應到代碼中,我們通過矩陣 A 的shape屬性,就獲取了一個表示規模的元組: 2 行 3 列。

2.特殊形態的矩陣

初步接觸過上一小節里那個普普通通的 2×3 矩陣后,這里我們再補充一些特殊形態的矩陣,這些矩陣的特殊性不光體現在外觀形狀上,更在后續的矩陣實際應用中發揮重要的作用。

2.1.方陣

行數和列數相等的這類矩陣,我們稱之為方陣,其行數或列數稱之為他的階數,這里我們看到的就是一個 3 階方陣 [123456789]。
代碼片段:

  • import numpy as np
  •  
  • A = np.array([[ 1, 2, 3],
  • [ 4, 5, 6],
  • [ 7, 8, 9]])
  • print(A)
  • print(A.shape)

運行結果:

  • [ [1 2 3]
  • [ 4 5 6]
  • [ 7 8 9]]
  •  
  • ( 3, 3)

2.2.矩陣轉置與對稱矩陣

在說到對稱矩陣之前,我們先得說一下矩陣的轉置。對於矩陣 A=[123456],如果將其行列互換得到一個新矩陣 [142536],我們將其稱之為轉置矩陣 AT ,行列互換的矩陣操作稱之為矩陣的轉置。

代碼片段:

  • import numpy as np
  •  
  • A = np.array([[ 1, 2, 3],
  • [ 4, 5, 6]])
  • print(A)
  • print(A.T)

運行結果:

  • [[ 1 2 3]
  • [ 4 5 6]]
  •  
  • [[ 1 4]
  • [ 2 5]
  • [ 3 6]]

那么,如果原矩陣和轉置后新得到的矩陣相等,那么這個矩陣我們就稱其為對稱矩陣。顯然,矩陣對稱的前提必須得是一個方陣,其次在方陣 S 中的每一項元素,都必須滿足 Sij=Sji。我們舉一個實際例子看看。

代碼片段:

  • import numpy as np
  •  
  • S = np.array([[ 1, 2, 3],
  • [ 2, 5, 6],
  • [ 3, 6, 9]])
  •  
  • print(S)
  • print(S.T)

運行結果:

  • [[ 1 2 3]
  • [ 2 5 6]
  • [ 3 6 9]]
  •  
  • [[ 1 2 3]
  • [ 2 5 6]
  • [ 3 6 9]]

在對陣矩陣中我們發現,沿着從左上到右下的對角線相互對稱的元素都是彼此相等的。在后面的內容中你會不斷發現:將對稱矩陣稱之為最重要的矩陣之一,絲毫不為過。他在矩陣的相關分析中會扮演極其重要的角色。

2.3.向量:可以看作一維矩陣

前面在介紹向量的時候,我們提到過這個概念。現在介紹了矩陣之后,我們再着重回顧一下: n 維的行向量可以看做是 1×n 的矩陣,同理, n 維的列向量也同樣可以看做是 n×1 的特殊矩陣。

那么這樣做的目的是什么呢?一方面可以將矩陣和向量的python表示方法統一起來,另一方面,在馬上要介紹的矩陣與向量的乘法運算中,也可以將其看作是矩陣與矩陣乘法的一種特殊形式,將計算方式統一起來。我們再次用這個視角重新生成一個新的行向量和列向量。

代碼片段:

  • import numpy as np
  •  
  • p = np.array([[ 1, 2, 3]])
  • print(p)
  • print(p.T)

運行結果:

  • [[ 1 2 3]]
  •  
  • [[ 1]
  • [ 2]
  • [ 3]]

我們用生成矩陣的方法生成了一個 1×3 的矩陣,用他來表示一個 3 維的行向量。隨后將其轉置(因為是矩陣形式,所以可以運用轉置方法),就得到了 3 維的列向量。

2.4.零矩陣

顧名思義,所有元素都是 0 的矩陣稱之為零矩陣,記作 O ,像下面這個 3×5 的零矩陣 [000000000000000],他可以記作是 O3,5。

代碼片段:

  • import numpy as np
  •  
  • A = np.zeros([ 3, 5])
  • print(A)

運行結果:

  • [[ 0. 0. 0. 0. 0.]
  • [ 0. 0. 0. 0. 0.]
  • [ 0. 0. 0. 0. 0.]]

2.5.對角矩陣

非對角元素位置上全部為 0 的方陣,我們稱之為對角矩陣,例如: [100020003] ,python生成的方法如下:

代碼片段:

  • import numpy as np
  •  
  • A = np.diag([ 1, 2, 3])
  • print(A)

運行結果:

  • [[ 1 0 0]
  • [ 0 2 0]
  • [ 0 0 3]]

2.6.單位矩陣

單位矩陣並不是所有元素都為 1 的矩陣,而是對角元素均為 1 ,其余元素均為 0 的特殊對角矩陣。 n 階單位矩陣記作 In ,下面我們用python生成一個 4 階單位矩陣 I4 :[1000010000100001] 。

代碼片段:

  • import numpy as np
  •  
  • I = np.eye( 4)
  • print(I)

運行結果:

  • [[ 1. 0. 0. 0.]
  • [ 0. 1. 0. 0.]
  • [ 0. 0. 1. 0.]
  • [ 0. 0. 0. 1.]]

3.矩陣的簡單計算:加法與數量乘法

3.1.矩陣的加法

矩陣之間的加法必須運用到相等規模的兩個矩陣之間,即:行數和列數相等的兩個矩陣之間才能做加法運算。這個非常容易理解,將對應位置上的元素相加即可得到結果矩陣。

[a11a12a13a21a22a23]+[b11b12b13b21b22b23]=[a11+b11a12+b12a13+b13a21+b21a22+b22a23+b23]

我們還是看看實際的代碼:

代碼片段:

  • import numpy as np
  •  
  • A = np. array([[1, 2, 3],
  • [ 4, 5, 6]])
  • B = np. array([[10, 20, 30],
  • [ 40, 50, 60]])
  • print(A+B)

代碼片段:

  • [[ 11 22 33]
  • [ 44 55 66]]

3.2.矩陣的數量乘法

矩陣的數量乘法,描述起來也非常簡單:

c[a11a12a13a21a22a23]=[ca11ca12ca13ca21ca22ca23]

同樣,我們看一個代碼的例子:

代碼片段:

  • import numpy as np
  • A = np.array([[ 1, 2, 3],
  • [ 4, 5, 6]])
  • print(2*A)

運行結果:

  • [[ 2 4 6]
  • [ 8 10 12]]

4.矩陣與矩陣的乘法

矩陣與矩陣的相乘,過程要稍微復雜一點。例如下面舉例的矩陣 A 和矩陣 B 的相乘,對兩個矩陣的形態是有要求的。

[a11a12a21a22a31a32]×[b11b12b13b21b22b23]=[a11b11+a12b21a11b12+a12b22a11b13+a12b23a21b11+a22b21a21b12+a22b22a21b13+a22b23a31b11+a32b21a31b12+a32b22a31b13+a32b23]

仔細觀察這個計算公式,我們總結出以下的一些要求和規律:

1 左邊矩陣的列數要和右邊矩陣的行數相等
2 左邊矩陣的行數決定了結果矩陣的行數
3 右邊矩陣的列數決定了結果矩陣的列數

同樣,我們用python來演示下面這個例子:

[123456]×[345678]

代碼片段:

  • import numpy as np
  •  
  • A = np.array([[ 1, 2],
  • [ 3, 4],
  • [ 5, 6]])
  • B = np.array([[ 3, 4, 5],
  • [ 6, 7, 8]])
  •  
  • print(np.dot(A, B))

運行結果:

  • [[ 15 18 21]
  • [ 33 40 47]
  • [ 51 62 73]]

5.矩陣乘以向量,改變向量的空間位置

矩陣與向量的乘法,一般而言寫作矩陣 A 在左,列向量 x 在右的 Ax 的形式。這種 Ax 的寫法便於描述向量 x 的位置在矩陣 A 的作用下進行變換的過程(下面會詳細介紹)。矩陣與向量的乘法,其實可以看作是矩陣與矩陣乘法的一種特殊形式,只不過位於后面的矩陣列數為 1 而已。

[a11a12a21a22a31a32][x11x21]=[a11x11+a12x21a21x11+a22x21a31x11+a32x21]

我們對照前面講過的矩陣與矩陣的乘法,來對比一下矩陣與向量的乘法規則,我們把列向量看作是列數為 1 的特殊矩陣,那么就會非常明確:

1、矩陣在左,列向量在右,矩陣的列數和列向量的維數必須相等
2、矩陣和向量相乘的結果也是一個向量
3、矩陣的行數就是最終結果輸出的列向量的維數
4、乘法的規則如上所示,就是矩陣的每行和列向量進行對應元素分別相乘后相加

我們來看一個矩陣與列向量相乘的例子:

[123456][45]=[1×4+2×53×4+4×55×4+6×5]=[143250]

代碼片段:

  • import numpy as np
  • A = np. array([[1, 2],
  • [ 3, 4],
  • [ 5, 6]])
  • x = np. array([[4, 5]]).T
  •  
  • print(np.dot(A, x))

運行結果:

  • [[ 14]
  • [ 32]
  • [ 50]]

從結果看,原始向量表示二維空間中的一個點,坐標為 (4,5) ,經過矩陣 [123456] 乘法的作用,轉化為三維空間中坐標為 (14,32,50) 的點。

因此從這個例子中我們可以總結一下矩陣的作用:在特定矩陣的乘法作用下,原空間中的向量坐標,被映射到了目標空間中的新坐標,向量的空間位置(甚至是所在空間維數)由此發生了轉化。

 

 

============================================================

https://xiaozhuanlan.com/LinearAlgebra/4950187326

  張雨萌-醬油哥 的《機器學習線性代數核心》 

這本書試讀了一章,還是值得推薦的,大家可以去在線購買,以上是鏈接

============================================================

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM