線性代數01 線性的大腦

2021-09-06 14:43:23 字數 4657 閱讀 5102

線性代數是一門大學課程,但也是相當「慘烈」的一門課程。在大學期間,我對這門學科就沒怎麼學懂。先是掙扎於各種行列式、解方程,然後又看到奇怪的正交矩陣、酉矩陣。還沒來得及消化,期末考試轟然到來,成績自然悽悽慘慘。

概念直觀化

為「資料科學」系列文章做準備,沒有線性代數基礎,沒法深入統計和機器學習。

線性代數運算的**實現。這是經典的程式設計師挑戰。參看一天能學會的計算機技術

線性代數是現代數學、自然科學的基礎工具。在計算機領域,資料探勘、機器學習、圖形處理,數值運算這幾塊兒都與線性代數緊密相關。如果你對這些技術感興趣,這些線性代數的文章可以作為你的參考讀物。

這一篇,我將引入線型代數的核心:線性系統。讓人驚奇的是,這一核心概念,早就根植在我們的思維中。 

我們想象乙個只賣兩個商品的超市,銷售青菜、黃豆。青菜每捆5元,黃豆每盒3元。此外,這個超市還有個積分系統,每捆青菜積分2分,每包黃豆積4分。需要乙個結算系統,為客戶計算總價和積分。

這對程式設計師來說不算挑戰。每個語言都可以輕鬆的實現,比如用python:

#

by vamei

defbill(x1, x2):

y1 = 5*x1 + 3*x2y2 = 2*x1 + 4*x2

return y1

, y2

x1,x2分別為青菜和黃豆的數目。y1,y2為總價和積分。通過輸入不同品種的購買數目,我們得到輸出。這裡的輸出有兩個元素:總價和積分。

上面的計算,還可以寫成一組簡單的數學方程:

$$y_1 = 5 \times x_1 + 3 \times x_2 $$

$$y_2 = 2 \times x_1 + 4 \times x_2 $$

我們試想這樣一種情況:一對夫妻去超市買菜。丈夫買了1捆青菜,2盒黃豆,結賬的時候,為11元和10個積分。妻子買了2**青菜,3盒黃豆,結賬的時候,為19元和16積分。

但如果妻子結賬前碰到丈夫了,倆人把東西放在一起,總共3捆青菜,5盒黃豆。按照我們的結算系統,總價為[$5 \times 3 + 3 \times 5 = 30 $]元,總積分為[$2 \times 3 + 4 \times 5 = 26$]積分。

你可能會反駁我,為什麼要那麼麻煩呢?把剛才的兩個單子加在一起不就可以了。[$11 + 19 = 30$]元,[$10 + 16 = 26$]積分。這通過結算系統的計算結果完全相同。

這想法沒錯。你已經在運用線性系統(linear system)

的思維了:

幾個購物車裡的東西,分開結賬的幾張小票的總和,和一次算總帳的結果相同。

線性系統還有更複雜的情況。把兩個購物車給銷售員,讓銷售員按相同的配比,丈夫的來3車,妻子的來2車。那麼,新的總價,應該是丈夫的小票乘3,加上妻子的小票乘2。

線性的思維方式是如此的普遍,以致於我們要多想一下,才能想出非線性的例子。下面是乙個非線性的情況:超市更改積分系統,積分超過20的話,將獲得雙倍積分。這個時候,如果分開結賬,丈夫和妻子的積分都不到20,那麼積分分別為10和16,總和為26。而合在一起結賬,由於積分超過了20,積分將是52。有生活經驗的夫妻們,一定是合在一起結賬,而不是分開結賬了。

我們創造了乙個非線性的系統。把這個新的結算系統編成函式,依然用python:

#

by vamei

defnon_linear_bill(x1, x2):

y1 = 5*x1 + 3*x2

y2 = 2*x1 + 4*x2

if y2 > 20:

y2 = y2 * 2

return y1, y2

非線性並不是人們的慣常思維方式。超市和商場常有複雜的打折、贈券、積分系統, 這些系統很多時候是非線性的。大腦需要耗費很大能量,才能處理得過來。於是,作為超級線性的男生,我通常的想法都是:去它媽的,老子不要那麼麻煩的合單或拆單了。

(奇怪的是,妹紙可以超級熟練的處理各種非線性的購物系統,甚至並行處理多個。上帝拿走的那根肋骨,一定是非線型的……)

我們即將要改變我們對乙個單位的資料的理解。舉出乙個資料

做為程式設計師,最直接會列舉出乙個資料,比如乙個整數,乙個浮點數。

那乙個結構體呢?c語言中的結構體可以包含有多個元素。我們知道,每個元素分開寫出來,並不是結構體的完整資料。比如:

typedef struct

cart;

再繼續,乙個物件的資料呢?乙個物件可以有多個屬性。當我們說乙個物件的資料時,我們指的是這個物件的多個屬性。比如:

public

class

cart

再比如,我們在說乙個人的資料時,包括姓名,身高、體重、iq多個值。這多個值可以構成這個人的「乙個」資料。我們可以在sql資料庫中建立這樣乙個person(name, height, weight, iq)的表。每一行,也就是乙個記錄(record),算是乙個資料單位。

即使是列表這樣的資料容器,如果固定每個位置資料的意義,那麼乙個列表也可以算是「乙個」資料。比如丈夫購物車為[1,2],妻子的購物車為[2,3]。

這種包含了多個元素的資料,稱為

向量(vector)。與之對應,乙個單一的數值,稱為標量(scalar)。

乙個向量

我們用帶小箭頭字母表示,來表示乙個向量。比如丈夫的購物車:

$$ \vec = \left[ \begin 1 \\ 2 \end \right]$$

向量可以相加減,這時只需要對應行的元素相加就可以,相當於合併或分開購物車。比如丈夫和妻子的購物車合併:

$$\begin 1 \\ 2 \end + \begin 2 \\ 3 \end = \begin 3 \\ 5 \end$$

向量也可以與乙個標量相乘。比如[$\vec \times 5$]表示5個購物車的量。這時只需將標量與向量的各行元素相乘。

$$ 5 \begin 1 \\ 2 \end = \begin 5 \\ 10 \end$$ 

伴隨著向量,有乙個簡單的概念,即維度(dimension)。上面的購物車向量,包含了兩個數值,即青菜的數目和黃豆的數目。我們因此說該向量是二維的。而結構體中元素的個數、物件的屬性個數,都是維度。我會在以後的文章中深入維度這一概念。

有了對資料的深入理解,那麼線性系統的特點可以總結如下: 

$$l(a\vec + b\vec) = al(\vec) + bl(\vec)$$  

[$\vec$]和[$\vec$]是向量,分別是丈夫和妻子的購物車。而a, b為兩個標量,比如a為2,b為3,表示丈夫那樣的購物車乘2,妻子的購物車乘3。l為結算系統。方程右邊表示,合在一起結賬。方程右邊表示,丈夫和妻子分開小票,相乘再相加。方程的兩邊相等。

在數學上,我們已經有一組方程表示出了乙個線性系統。上面的方程組有些不方便的地方:

數學家是偷懶的動物,這點和程式設計師很像。他們最後找到了一種省事的記述方式。利用剛才的向量。分離的表示輸入、線性系統和輸出的關係:

$$\begin 11 \\ 10 \end = \begin 5 & 3 \\ 2 & 4 \end \begin 1 \\ 2 \end$$

方程最左是個向量,最右是個向量。奇怪的是中間用括號括住的一堆數字。這被稱為乙個矩陣(matrix)。可以看到,這個矩陣中有四個元素,包含了各個物品的單價和各個物品可獲得的積分。這通常是結算系統所包含的資料。我們可以猜測到,這個矩陣相當於乙個結算系統。左邊的向量是輸出,右邊的向量是輸入。

結算系統

這個結算系統運作時,把輸入向量放橫,再和結算系統的每一行元素分別相乘,即獲得對應的輸出元素。比如輸出的第乙個元素:

根據這一運算規則,乙個線性系統就完全用乙個矩陣表示出來了。

可以把矩陣表示成字母a,那麼用代數的形式,寫出輸出和矩陣、輸入的關係:

$$\vec = a\vec$$

我們可以用程式來實現上面的計算過程。編寫類似的c程式並不複雜。更方便的是呼叫現有的庫函式,比如python中的numpy: 

#

by vamei

import

numpy as np

#matrix

a = np.matrix([[5, 3],[2, 4]])

#input vector

x = np.array([[1], [2]])

#multiplication

y =np.dot(a, x)

print(y)

矩陣這個東西把結算系統的表示方式大大縮減。更重要在於,線性系統和矩陣是互通的。矩陣表示的是乙個線性系統。乙個線性系統也總可以表示乙個矩陣(證明從略)。

繞了半天,矩陣 = 線性系統。

線性代數的核心是線性系統的概念。線性系統與矩陣的等同性,讓線性代數後面的內容,轉入到對矩陣的研究中。但核心要牢記。

線性系統的概念在生活中非常常見。人的思維很多時候也是線性的。思考生活中線性和非線性的例子。

廣義的資料可以表示成多維的向量。

線性代數 線性代數的本質

線性代數在機器學習的領域中扮演者十分重要的角色,所以這裡岔開先整理一些線性代數的基本概念和計算方法。這裡是3blue1brown的線性代數課程的截圖和筆記。作為快速複習的網路筆記。本課程的特點 通過影象展現線性代數計算在幾何圖形上意義。這樣能更好的理解線性代數為什麼叫做線性代數。線性代數為什麼採用這...

線性代數入門 1 什麼是線性代數?

線性代數幾乎是每個學理工科的大學生都會學的一門課,然而我感覺大家對這門課的感覺都不怎麼好,很多人都覺得不知道線性代數是做什麼的,或者為了應付考試學會了一些計算和解題的方法。但在其他課程學習中卻常常看到那些矩陣 向量等等,便頭疼萬分,對線性代數更是深惡痛絕。最後乙個大學學下來,還是沒明白線性代數是什麼...

線性代數入門 1 什麼是線性代數?

線性代數幾乎是每個學理工科的大學生都會學的一門課,然而我感覺大家對這門課的感覺都不怎麼好,很多人都覺得不知道線性代數是做什麼的,或者為了應付考試學會了一些計算和解題的方法。但在其他課程學習中卻常常看到那些矩陣 向量等等,便頭疼萬分,對線性代數更是深惡痛絕。最後乙個大學學下來,還是沒明白線性代數是什麼...