0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

線性代數(shù)是什么?為什么要有線性代數(shù)?

j4AI_wujianying ? 來源:lq ? 2019-02-04 09:25 ? 次閱讀

線性代數(shù)是什么?

在大學(xué)數(shù)學(xué)學(xué)科中,線性代數(shù)是最為抽象的一門課,從初等數(shù)學(xué)到線性代數(shù)的思維跨度比微積分和概率統(tǒng)計要大得多。很多人學(xué)過以后一直停留在知其然不知 其所以然的階段,若干年之后接觸圖形編程機(jī)器學(xué)習(xí)等領(lǐng)域才發(fā)現(xiàn)線性代數(shù)的應(yīng)用無處不在,但又苦于不能很好地理解和掌握。的確,多數(shù)人很容易理解初等數(shù)學(xué) 的各種概念,函數(shù)、方程、數(shù)列一切都那么的自然,但是一進(jìn)入線性代數(shù)的世界就好像來到了另一個陌生的世界,在各種奇怪的符號和運算里迷失了。

我在初接觸線性代數(shù)的時候簡直感覺這是一門天外飛仙的學(xué)科,一個疑問在我腦子里浮現(xiàn)出來:

線性代數(shù)到底是一種客觀的自然規(guī)律還是人為的設(shè)計?

如果看到這個問題,你的反應(yīng)是“這還用問,數(shù)學(xué)當(dāng)然是客觀的自然規(guī)律了”,我一點兒都不覺得奇怪,我自己也曾這樣認(rèn)為。從中學(xué)的初等數(shù)學(xué)和初等物理 一路走來,很少人去懷疑一門數(shù)學(xué)學(xué)科是不是自然規(guī)律,當(dāng)我學(xué)習(xí)微積分、概率統(tǒng)計時也從來沒有懷疑過,唯獨線性代數(shù)讓我產(chǎn)生了懷疑,因為它的各種符號和運算 規(guī)則太抽象太奇怪,完全對應(yīng)不到生活經(jīng)驗。所以,我還真要感謝線性代數(shù),它引發(fā)了我去思考一門數(shù)學(xué)學(xué)科的本質(zhì)。其實,不止是學(xué)生,包括很多數(shù)學(xué)老師都不清 楚線性代數(shù)到底是什么、有什么用,不僅國內(nèi)如此,在國外也是這樣,國內(nèi)的孟巖寫過《理解矩陣》,國外的Sheldon Axler教授寫過《線性代數(shù)應(yīng)該這樣學(xué)》,但都還沒有從根本上講清楚線性代數(shù)的來龍去脈。對于我自己來講,讀大學(xué)的時候沒有學(xué)懂線性代數(shù),反而是后來從編程的角度理解了它。很多人說數(shù)學(xué)好可以幫助編程,我恰好反過來了,對程序的理解幫助了我理解數(shù)學(xué)。

本文的目標(biāo)讀者是程序員,下面我就帶各位做一次程序員在線性代數(shù)世界的深度歷險!既然是程序員,在進(jìn)入線性代數(shù)的領(lǐng)域之前,我們不妨先從考察一番程序世界,請思考這樣一個問題:

計算機(jī)里面有匯編、C/C++、Java、Python等通用語言,還有Makefile、CSS、SQL等DSL,這些語言是一種客觀的自然規(guī)律還是人為的設(shè)計呢?

為什么要問這樣一個看起來很蠢的問題呢?因為它的答案顯而易見,大家對天天使用的程序語言的認(rèn)識一定勝過抽象的線性代數(shù),很顯然程序語言雖然包含了 內(nèi)在的邏輯,但它們本質(zhì)上都是人為的設(shè)計。所有程序語言的共同性在于:建立了一套模型,定義了一套語法,并將每種語法映射到特定的語義。程序員和語言實現(xiàn) 者之間遵守語言契約:程序員保證代碼符合語言的語法,編譯器/解釋器保證代碼執(zhí)行的結(jié)果符合語法相應(yīng)的語義。比如,C++規(guī)定用new A()語法在堆上構(gòu)造對象A,你這樣寫了C++就必須保證相應(yīng)的執(zhí)行效果,在堆上分配內(nèi)存并調(diào)用A的構(gòu)造函數(shù),否則就是編譯器違背語言契約。

從應(yīng)用的角度,我們能不能把線性代數(shù)視為一門程序語言呢?答案是肯定的,我們可以用語言契約作為標(biāo)準(zhǔn)來試試。假設(shè)你有一個圖像,你想把它旋轉(zhuǎn)60 度,再沿x軸方向拉伸2倍;線性代數(shù)告訴你,“行!你按我的語法構(gòu)造一個矩陣,再按矩陣乘法規(guī)則去乘你的圖像,我保證結(jié)果就是你想要的”。

實際上,線性代數(shù)和SQL這樣的DSL非常相似,下面來作一些類比:

模型和語義:SQL是在低級語言之上建立了關(guān)系模型,核心語義是關(guān)系和關(guān)系運算;線性代數(shù)在初等數(shù)學(xué)之上建立了向量模型,核心語義是向量和線性變換

語法:SQL為每種語義定義了相應(yīng)的語法,如select, where, join等;線性代數(shù)也定義了向量、矩陣、矩陣乘法等語義概念相應(yīng)的語法

編譯/解釋:SQL可以被編譯/解釋為C語言;線性代數(shù)相關(guān)概念和運算規(guī)則可以由初等數(shù)學(xué)知識來解釋

實現(xiàn):我們可以在MySQL、Oracle等關(guān)系數(shù)據(jù)庫上進(jìn)行SQL編程;我們也可以在MATLAB、Mathematica等數(shù)學(xué)軟件上進(jìn)行線性代數(shù)編程

所以,從應(yīng)用的角度看,線性代數(shù)是一種人為設(shè)計的領(lǐng)域特定語言(DSL),它建立了一套模型并通過符號系統(tǒng)完成語法和語義的映射。實際上,向量、矩陣、運算規(guī)則的語法和語義都是人為的設(shè)計,這和一門語言中的各種概念性質(zhì)相同,它是一種創(chuàng)造,但是前提是必須滿足語言契約。

為什么要有線性代數(shù)?

可能有人對把線性代數(shù)當(dāng)成一門DSL不放心,我給你一個矩陣,你就把我的圖形旋轉(zhuǎn)了60度沿x軸拉伸了2倍,我總感覺不踏實啊,我都不知道你“底 層”是怎么做!其實,這就像有的程序員用高級語言不踏實,覺得底層才是程序的本質(zhì),老是想知道這句話編譯成匯編是什么樣?那個操作又分配了多少內(nèi)存?別人 在Shell里直接敲一個wget命令就能取下一個網(wǎng)頁,他非要用C語言花幾十分鐘來寫一堆代碼才踏實。其實,所謂底層和上層只是一種習(xí)慣性的說法,并不 是誰比誰更本質(zhì)。程序的編譯和解釋本質(zhì)上是不同模型間的語義映射,通常情況下是高級語言映射為低級語言,但是完全也可以把方向反過來。Fabrice Bellard用JavaScript寫了一個虛擬機(jī),把Linux跑在JavaScript虛擬機(jī)上,這就是把機(jī)器模型往JavaScript模型上映射。

建立新模型肯定依賴于現(xiàn)有的模型,但這是建模的手段而不是目的,任何一種新模型的目的都為了更簡單地分析和解決某一類問題。線性代數(shù)在建立的時候,它的各種概念和運算規(guī)則依賴于初等數(shù)學(xué)的知識,但是一旦建立起來這層抽象模型之后,我們就應(yīng)該習(xí)慣于直接利用高層次的抽象模型去分析和解決問題。

說到線性代數(shù)是為了比初等數(shù)學(xué)更容易地分析和解決問題,下面我們通過一個例子來實際感受一下它的好處:

給定三角形的頂點(x1, y1), (x2, y2), (x3, y3),求三角形的面積。

初等數(shù)學(xué)中三角形面積最著名的計算公式是area = 1/2 * base * height,當(dāng)三角形有一條邊恰好在坐標(biāo)軸上時我們就很容易算出它的面積。但是,假如同樣一個三角形我們把坐標(biāo)軸旋轉(zhuǎn)一下,讓它的邊不在坐標(biāo)軸上,怎么辦?我們還能得到它的底和高嗎?答案肯定是可以的,但是就明顯復(fù)雜了,而且還要分很多種情況去分別討論。

相反,如果我們用線性代數(shù)知識來解決這個問題就非常輕松。在線性代數(shù)中兩個向量a,b的叉積(Cross Product)是一個向量,其方向與a,b垂直,其大小等于a,b構(gòu)成的平行四邊形的面積:

我們可以把三角形的邊視為向量,所以三角形的面積等于兩個邊向量的叉積除以二的絕對值:

area = abs(1/2 * cross_product((x2 - x1, y2 - y1), (x3 - x1, y3 - y1)))

注:abs表示取絕對值,cross_product表示兩個向量的叉積。

這樣一個在初等數(shù)學(xué)里面有點兒小難的問題在線性代數(shù)中瞬間搞定!可能有人會說,你直接基于叉積來做,當(dāng)然簡單了,但是叉積本身不是也挺復(fù)雜的嗎?你把它展開試試看呢?是的,模型的作用就是把一部分復(fù)雜性隱藏到模型中,使得模型的使用者可以更加簡單地解決問題。曾經(jīng)有人質(zhì)疑C++太復(fù)雜,C++之父Bjarne Stroustrup這樣回答:

Complexity will go somewhere: if not the language then the application code.

在特定環(huán)境下,問題的復(fù)雜性是由其本質(zhì)決定的,C++把一部分的復(fù)雜性納入了語言和標(biāo)準(zhǔn)庫,目的是使得應(yīng)用程序更為簡單。當(dāng)然,并非所有場合C++ 都使得問題更加簡單,但是從原理上講,C++的復(fù)雜性是有道理的。除了C++,Java、SQL、CSS等各種語言和框架莫不如是,想象一下,如果不使用 數(shù)據(jù)庫,動不動就自己去做數(shù)據(jù)存儲和管理是多么復(fù)雜??!這樣我們就不難理解為什么線性代數(shù)要定義叉積這樣奇怪的運算了,它和C++把很多常用的算法和容器 納入STL是同一道理。同樣的,甚至你還可以在線性代數(shù)中定義自己想要的運算拿來復(fù)用。所以,數(shù)學(xué)一點兒不死板,它和程序一樣是活活潑潑的,你理解了它的 來龍去脈就能駕馭自如。說到這里,我們就順便回答一個很常見的疑惑:

線性代數(shù)的點積、叉積還有矩陣運算都很奇怪,為什么要定義這些運算呢?它們的定義又為什么是這個樣子呢?

其實,和程序復(fù)用一樣,線性代數(shù)定義點積、叉積和矩陣運算是因為它們的應(yīng)用非常廣,有很大的復(fù)用價值,可以作為我們分析和解決問題的基礎(chǔ)。比如,很多問題都涉及到一個向量到另一個向量的投影或是求兩個向量的夾角,那么就會考慮專門定義點積(Dot Product)這個運算:

點積概念的提出屬于設(shè)計,有發(fā)揮創(chuàng)造的余地;一旦設(shè)計定了,具體公式就不能隨意發(fā)揮了,必須符合邏輯,保證它映射到初等數(shù)學(xué)模型的正確性。這就像一門高級語言可以定義很多概念,什么高階函數(shù)、閉包等等,但是它必須保證映射到底層實現(xiàn)時在執(zhí)行產(chǎn)生的效果符合其定義的規(guī)范。

線性代數(shù)好在哪里?

上面說了,線性代數(shù)是一種高層次抽象模型,我們可以采用學(xué)習(xí)一門程序語言的方法去學(xué)習(xí)它的語法和語義,但是這一認(rèn)識不只針對線性代數(shù),它是對每一門數(shù)學(xué)學(xué)科通用的,可能有人會有疑問

微積分、概率論也是高層次抽象,那么線性代數(shù)這種高層次抽象的特點在哪里呢?

這就問到了根本上,線性代數(shù)的核心:向量模型。我們在初等數(shù)學(xué)中學(xué)習(xí)的坐標(biāo)系屬于笛卡爾所提出的解析模型,這個 模型很有用,但同時也有很大的缺點。坐標(biāo)系是人為加上的虛擬參考系,但是我們要解決的問題,比如求面積,圖形旋轉(zhuǎn)、拉伸等應(yīng)用都是和坐標(biāo)系無關(guān)的,建立一 個虛擬的坐標(biāo)系往往無助于解決問題,剛才三角形面積的例子就是這樣。

向量模型很好地克服了解析模型的缺點,如果說解析模型代表了某種“絕對性”的世界觀,那么向量模型就代表了某種“相對性”的世界觀,我推薦把向量模型和解析模型看作對立的兩種模型。

向量模型中定義了向量和標(biāo)量的概念。向量具有大小和方向,滿足線性組合法則;標(biāo)量是只有大小沒有方向的量(注:標(biāo)量的另一種更深刻的定義是在坐標(biāo)變換中保持不變的量)。向量模型的優(yōu)點之一是其坐標(biāo)系無關(guān)性, 也就是相對性,它在定義向量和運算規(guī)則的時候從一開始就拋開了坐標(biāo)系的束縛,不管你坐標(biāo)軸怎么旋轉(zhuǎn),我都能適應(yīng),向量的線性組合、內(nèi)積、叉積、線性變換等 等運算全部都是坐標(biāo)系無關(guān)的。注意,所謂坐標(biāo)系無關(guān)性不是說就沒有坐標(biāo)系了,還是有的,剛才三角形例子的頂點就是用坐標(biāo)表示的,只是在解決問題的時候不同 的坐標(biāo)系不會構(gòu)成影響。用一個比喻,Java號稱平臺無關(guān),不是說Java就是空中樓閣,而是說你用Java編程時底層是Linux還是Windows往 往對你沒有影響。

向量模型有什么好處呢?除了剛才三角形面積問題是一個例子,下面我再舉一個幾何的例子:

給定三維坐標(biāo)系中的一點(x0, y0, z0)和一個平面a*x + b*y + c*z + d = 0,求點到平面的垂直距離?

這個問題如果是要從解析幾何的角度去解決幾乎復(fù)雜到?jīng)]法下手,除非是平面恰好是過坐標(biāo)軸的特殊情況,但是如果從向量模型考慮就很簡單:根據(jù)平面方程,平面的法向量(Normal Vector)是v=(a, b, c),設(shè)從平面上任意一點(x, y, z)到(x0, y0, z0)的向量為w,那么通過內(nèi)積dot_product(w, v)算出w到v的投影向量p,其大小就是(x0, y0, z0)到平面a*x + b*y + c*z + d = 0的垂直距離。這里用到了向量模型的基本概念:法向量,投影向量,內(nèi)積,整個問題解決過程簡潔明快。

下面再給大家留一道相似的練習(xí)題(熟悉機(jī)器學(xué)習(xí)的朋友可能會發(fā)現(xiàn)這是線性代數(shù)在線性分類中的應(yīng)用):

給定n維空間中的兩點(a1, a2, ... an),(b1, b2, ... bn)和一個超平面c1*x1 + c2*x2 ... + cn*xn + d = 0,請判斷兩點在超平面的同側(cè)或異側(cè)?

離開向量,下面我們要請出線性代數(shù)的另一個主角:矩陣(Matrix)。

線性代數(shù)定義了矩陣和向量、矩陣和矩陣的乘法,運算規(guī)則很復(fù)雜,用來做什么也不清楚,很多初學(xué)者都不能很好地理解,可以說矩陣是學(xué)好線性代數(shù)的攔路 虎。遇到復(fù)雜的東西,往往需要先避免一頭陷入細(xì)節(jié),先從整體上把握它。其實,從程序的角度看,無論形式多么奇怪,它無非是一種語法,語法必然對應(yīng)了語義, 所以理解矩陣的重點在于理解其語義。矩陣的語義不止一種,在不同的環(huán)境中有不同的語義,在同一環(huán)境中也可以有不同的解讀,最常見的包括:1)表示一個線性 變換;2)表示列向量或行向量的集合;3)表示子矩陣的集合。

矩陣作為一個整體對應(yīng)的是線性變換語義:用矩陣A乘以一個向量v得到w,矩陣A就代表了v到w的線性變換。比如,如果想要把向量v0按逆時針方向旋轉(zhuǎn)60度得到v',只需要用旋轉(zhuǎn)變換矩陣(Rotation Matrix)去乘v0就可以了。

除了旋轉(zhuǎn)變換,拉伸變換也是一種常見的變換,比如,我們可以通過一個拉伸矩陣把向量沿x軸拉伸2倍(請試著自己給出拉伸矩陣的形式)。更重要的是,矩陣乘法有一個很好的性質(zhì):滿足結(jié)合率。這就意味著可以對線性變換進(jìn)行疊加,比如,我們可以把“沿逆時針旋轉(zhuǎn)60度”的矩陣M和“沿x軸拉伸2倍”的矩陣N相乘,得到一個新矩陣T來代表“沿逆時針旋轉(zhuǎn)60度并沿x軸拉伸2倍”。這是不是很像我們Shell中把多個命令通過管道進(jìn)行疊加呢?

上面重點介紹了向量模型的坐標(biāo)系無關(guān)性,除此之外,向量模型的另一優(yōu)點是:線性性,因而它能用來表示線性關(guān)系,下面我們來看一個熟悉的Fibonacci數(shù)列的例子:

Fibonacci數(shù)列定義為:f(n) = f(n-1) + f(n-2), f(0) = 0, f(1) = 1;問題:輸入n,請給出求f(n)的時間復(fù)雜度不超過O(logn)的算法。

首先,我們構(gòu)造兩個向量v1 = (f(n+1), f(n))和v2 = (f(n+2), f(n+1)),根據(jù)Fibonacci數(shù)列性質(zhì),我們可以得到從v1到v2的遞推變換矩陣:

并進(jìn)一步得到:

這樣就把線性遞推問題轉(zhuǎn)化為了矩陣的n次冪經(jīng)典問題,在O(log n)時間復(fù)雜度內(nèi)解決。除了線性遞推數(shù)列,初等數(shù)學(xué)中著名的n元一次方程組問題也可以轉(zhuǎn)化為矩陣和向量乘法形式更容易地解決。這個例子是想說明,凡是滿足 線性關(guān)系的系統(tǒng)都是向量模型的用武之地,我們往往可以把它轉(zhuǎn)化為線性代數(shù)得到簡潔高效的解決方案。

總之,我的體會是向量模型是整個線性代數(shù)的核心,向量的概念、性質(zhì)、關(guān)系、變換是掌握和運用線性代數(shù)的重點。

總結(jié)

本文提出了一種觀點:從應(yīng)用的角度,我們可以把線性代數(shù)視為一門特定領(lǐng)域的程序語言。線性代數(shù)在初等數(shù)學(xué)基礎(chǔ)上建立了向量模型,定義了一套語法和語義,符合程序語言的語言契約。向量模型具有坐標(biāo)系無關(guān)性和線性性,它是整個線性代數(shù)的核心,是解決線性空間問題的最佳模型。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4235

    瀏覽量

    61965
  • 線性代數(shù)
    +關(guān)注

    關(guān)注

    5

    文章

    50

    瀏覽量

    11032

原文標(biāo)題:數(shù)學(xué)對于編程來說重要嗎?編程大佬眼里的線性代數(shù)

文章出處:【微信號:wujianying_danpianji,微信公眾號:單片機(jī)精講吳鑒鷹】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    線性代數(shù)要和科學(xué)計算結(jié)成好伙伴(稿)

    在科學(xué)研究中,逐漸發(fā)現(xiàn)線性代數(shù)用的越來越多,在老師的博客里發(fā)現(xiàn)了這篇文章,覺得很不錯,因此放在這里,希望大家能有所收獲。在此,也貼出我們矩陣?yán)碚摾蠋煹牟┛偷刂穐ttp
    發(fā)表于 10-29 22:03

    labview線性代數(shù)求解輸入控件如何輸入未知變量

    labview線性代數(shù)求解輸入控件如何輸入未知變量
    發(fā)表于 04-07 09:11

    線性代數(shù)超強(qiáng)總結(jié)

    線性代數(shù)超強(qiáng)總結(jié)
    發(fā)表于 05-26 07:26

    線性代數(shù)實踐及MATLAB入門》第二版《線性代數(shù)實踐》課件

    線性代數(shù)實踐及MATLAB入門》第二版《線性代數(shù)實踐》課件:第六章 用行階梯法解方程組第7章  矩陣運算法解方程第十章  后續(xù)課矩陣建模舉例第二篇  線性代數(shù)
    發(fā)表于 10-24 08:49 ?0次下載

    線性代數(shù)課程大綱的建議

    線性代數(shù)課程大綱的建議 致基礎(chǔ)數(shù)學(xué)分教指委一.問題的提出:現(xiàn)在的“線性代數(shù)”大綱不能滿足后續(xù)課的要求。為后續(xù)課程打好基礎(chǔ),應(yīng)該成為任何
    發(fā)表于 05-26 16:59 ?5次下載

    Matlab線性代數(shù)實驗

    Matlab線性代數(shù)實驗8.1 實驗(Ⅰ):用Matlab學(xué)線性代數(shù)8.1.1實驗與觀察:向量組的線性關(guān)系和解線性方程組1.  用線性
    發(fā)表于 10-17 00:36 ?1996次閱讀

    Linear_Algebra_線性代數(shù)(美版教材--習(xí)題答案)

    英文線性代數(shù)電子書
    發(fā)表于 09-04 10:42 ?0次下載

    工程線性代數(shù)matlab版

    MATLAB,工程線性代數(shù)matlab版。
    發(fā)表于 12-21 14:41 ?0次下載

    線性代數(shù)相關(guān)的基本知識

    線性代數(shù)包含了關(guān)于矩陣的所有相關(guān)的基本知識,可以快速學(xué)習(xí),適合自學(xué)。
    發(fā)表于 12-22 17:58 ?0次下載

    算法大全__Matlab在線性代數(shù)中的應(yīng)用

    算法大全__Matlab在線性代數(shù)中的應(yīng)用。
    發(fā)表于 01-14 17:56 ?0次下載

    線性代數(shù)教材(同濟(jì)四版)

    線性代數(shù)教材(同濟(jì)四版),有需要的下來看看
    發(fā)表于 03-22 11:13 ?0次下載

    機(jī)器學(xué)習(xí)線性代數(shù)基礎(chǔ)

    機(jī)器學(xué)習(xí)所需要的一些線性代數(shù)知識
    發(fā)表于 09-04 10:08 ?0次下載

    線性代數(shù)是什么?存在的意義是什么?

    在大學(xué)數(shù)學(xué)學(xué)科中,線性代數(shù)是最為抽象的一門課,從初等數(shù)學(xué)到線性代數(shù)的思維跨度比微積分和概率統(tǒng)計要大得多。
    的頭像 發(fā)表于 08-19 10:24 ?29.5w次閱讀
    <b class='flag-5'>線性代數(shù)</b>是什么?存在的意義是什么?

    PyTorch教程2.3之線性代數(shù)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程2.3之線性代數(shù).pdf》資料免費下載
    發(fā)表于 06-05 11:32 ?1次下載
    PyTorch教程2.3之<b class='flag-5'>線性代數(shù)</b>

    線性代數(shù)和矩陣計算

    MATLAB提供了豐富的功能來進(jìn)行線性代數(shù)和矩陣計算。下面是一些常用的示例。
    的頭像 發(fā)表于 07-07 09:56 ?1009次閱讀