第1章 坐標與變換:高樓平地起
作為全書內容的開篇部分,本章將從空間的角度出發,詳細介紹向量和矩陣的基本概念,並在空間思維的框架下描述矩陣和向量運算的基本法則,揭示其幾何意義,以求迅速幫助讀者搭建起關於空間的宏觀知識框架,奠定學習全書內容的思想方法。
在本章知識內容的演繹、推進過程中,會逐步引出基底的選取、空間的張成、基底的轉化與坐標的變換這些和空間緊密相關的概念,並使用Python語言,對相關概念和運算過程進行描述。
本章主要涉及的知識點
介紹向量的概念和基本運算
介紹基底的用途和構成條件
介紹坐標與基底之間的關繫
介紹矩陣的概念和基本運算
介紹矩陣對向量空間位置的改變
介紹在矩陣的作用下,向量的基變換原理及過程
1.1描述空間的工具:向量
空間是貫穿整個線性代數的主干脈絡和核心概念。那麼在全書開篇的第一節,我們將重點學習如何利用向量這個重要工具對空間進行描述,從而使讀者完成對“空間”從感性認識到定量描述的重要轉變。
首先,我們將在向量知識基礎上,開始學習行向量及列向量的基本概念,並且運用Python語言對向量進行代碼表示,這也是本書的一個重要特色;然後,我們會利用Python語言熟悉和掌握如何對多個向量進行加法和乘法運算;最後,綜合以上的這些知識和運算法則,引出向量線性組合的重要概念,使讀者了解線性組合的構成方法和基本形式。
1.1.1重溫向量
對於向量而言,我們一定不會感到陌生。向量的概念其實很簡單,直觀地說,把一組數字排列成一行或一列,就稱為向量。它可以作為對空間進行描述的有力工具。
例如,對於一個簡單的二維向量,這個向量有兩個成分:第一個成分是數字4,第二個成分是數字5。
向量可以理解為二維平面中x坐標為4、y坐標為5的一個點,也可以將其理解為以平面中的原點(0, 0)為起點,以(4, 5)為終點的一條有向線段,如圖1.1所示。
圖1.1二維向量的空間表示
由此可見,一個向量中成分的個數就是該向量的維數。因此,如果進一步推廣下去,還會有三維向量,如 。同理,這個三維向量可以用來表示三維空間中的一個指定點,或者用來表示在三維空間中以原點(0, 0, 0)為起點,以(3, 2, 4)為終點的一條有向線段,如圖1.2所示。
圖1.2三維向量的空間表示
當然,以此類推,自然還存在更高維的向量,隻不過不太好利用圖形化的方式進行描述,這裡就不繼續展開舉例了。
不過向量也不僅局限於用來直接描述空間中的點坐標和有向線段,也可以憑借基礎的數據表示功能,成為一種描述事物屬性的便捷工具。例如,在一次考試中,你的考試成績為:語文85分,數學92分,外語89分。由於這3門課具有不同科目屬性,因此,可以使用一個三維向量來對其進行表示,即。其實,這樣看來,此時不僅僅可以把向量score看作是一個盛放數據的容器,似乎也可以利用它將科目考試成績和空間建立起某種關聯。
又如,在自然語言處理的過程中,也少不了向量這個重要的工具。程序進行文本閱讀時,首先會對文本材料進行分詞處理,然後使用向量對詞彙進行表示。這是因為向量很適合將對像的屬性和特征對應到高維空間中進行定量表達,同時在此基礎上進行進一步的後續處理,如判斷詞彙之間的相似性等。
在本書的後續章節中,將會陸續接觸到一些數據處理的基本方法:如投影、降維等,這些方法都是在向量描述的基礎上實現的。
1.1.2通常使用列向量
根據上面所講述的向量的定義“把一組數字排列成一行或一列,就稱為向量”,向量對應地就擁有兩種表達方式素是縱向排列的,就將其稱為列向量,如 ,素是橫向排列的,就將其稱為行向量,如[4 5 7]。
在實際使用向量工具進行描述和計算時,應該具體使用哪一種方式呢?在沒有特殊說明的情況下,一般都默認為列向量。
從直覺上來看,似乎行向量顯得更為直觀,但是,這裡為什麼會如此偏愛列向量呢?這麼做主要是為了方便後續的向量坐標變換、空間之間的映射等計算過程的處理。
在這裡先不詳細展開討論,讀者對此有一個直觀的印像就可以了。將一個矩陣A所表示的映射作用於某個向量x上時,習慣上將其寫成矩陣乘以向量的表達形式,即Ax。而這種寫法的數據表示基礎便是:向量x必須是一個列向量。
目前出現好幾個概念,如轉置、矩陣、映射等,這裡先不做介紹,後面會一一詳細描述。需要記住的是:一般都用列的形式來表示向量。
1.1.3使用Python語言表示向量
了解了基本概念後,開始使用工具。對應地,應如何使用Python語言表示行向量和列向量呢?這裡,需要使用Python語言中的一個常用工具庫:numpy。先看如何用代碼描述行向量a = [1 2 3 4]。
代碼如下:
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)
這樣,就把一個行向量成功地轉換成了一個列向量。這裡確實用了轉置的思路和做法。但是,這段代碼有點復雜。
下面就來介紹一種更簡單、更直觀的Python語言實現方法。
1.1.4簡單生成列向量
這裡需要事先用到後面涉及的知識點。顯然,我們一直把向量看作是一個維數為1的數組,但是其實也可以看作是行數為1或列數為1的一個二維數組。從本書後面的內容中將會知道:二維數組對應的就是矩陣,因此向量還可以看作是一個特殊的矩陣,即可以把行向量看作是一個1×m的特殊矩陣,可以把列向量看作是一個n×1的特殊矩陣。在這個視角下,重新生成剛剛討論的四維行向量[1 2 3 4]和對應的列向量。
代碼如下:
import numpy as np
A = np.array([[1, 2, 3, 4]])
print(A)
print(A.T)
運行結果:
[[1 2 3 4]]
[[1]
[2]
[3]
[4]]
在這段代碼中,需要注意的是,在對行向量進行初始化時,使用了numpy中的二維數組的初始化方法,因此在語句中多嵌套了一層中括號。在這種情況下,就可以直接通過行向量轉置的方法來生成對應的列向量了。
明確了向量的表示方法後,再來梳理一下向量的基本運算。我們會逐一介紹向量的加法運算、向量的數量乘法運算、向量間的內積運算和外積運算,並且都會使用Python語言進行實現。
1.1.5向量的加法
兩個維數相同的向量纔能進行加法運算,隻要將相同位素相加即可,結果向量的維數保持不變。
兩個n維向量u和v的加法運算規則可以表示為
向量的加法運算規則非常簡單,下面舉一個例子,看一看如何求解向量與向量的加法運算結果。
代碼如下:
import numpy as np
u = np.array([[1,2,3]]).T
v = np.array([[5,6,7]]).T
print(u + v)
運行結果:
[[ 6]
[ 8]
[10]]
1.1.6向量的數量乘法
向量的數量乘法就是將參與乘法運算的標量同向量素分別相乘,以此得到最終的結果向量。很顯然,得到的結果向量的維數依然保持不變。向量的數量乘法從幾何意義上來看,就是將向量沿著所在直線的方向拉伸相應的倍數,拉伸方向和參與運算的標量符號一致。
例如,一個標量c和一個n維向量u的乘法運算規則可以表示為
同樣地,舉一個例子,看一看如何求解向量與數字3的數量乘法運算結果。
代碼如下:
import numpy as np
u = np.array([[1, 2, 3]]).T
print(3*u)
運行結果:
[[3]
[6]
[9]]
……