❶ 程序員必備的一些數學基礎知識
作為一個標準的程序員,應該有一些基本的數學素養,尤其現在很多人在學習人工智慧相關知識,想抓住一波人工智慧的機會。很多程序員可能連這樣一些基礎的數學問題都回答不上來。
作為一個傲嬌的程序員,應該要掌握這些數學基礎知識,才更有可能碼出一個偉大的產品。
向量 向量(vector)是由一組實數組成的有序數組,同時具有大小和方向。一個n維向量a是由n個有序實數組成,表示為 a = [a1, a2, · · · , an]
矩陣
線性映射 矩陣通常表示一個n維線性空間v到m維線性空間w的一個映射f: v -> w
註:為了書寫方便, X.T ,表示向量X的轉置。 這里: X(x1,x2,...,xn).T,y(y1,y2,...ym).T ,都是列向量。分別表示v,w兩個線性空間中的兩個向量。A(m,n)是一個 m*n 的矩陣,描述了從v到w的一個線性映射。
轉置 將矩陣行列互換。
加法 如果A和B 都為m × n的矩陣,則A和B 的加也是m × n的矩陣,其每個元素是A和B相應元素相加。 [A + B]ij = aij + bij .
乘法 如A是k × m矩陣和B 是m × n矩陣,則乘積AB 是一個k × n的矩陣。
對角矩陣 對角矩陣是一個主對角線之外的元素皆為0的矩陣。對角線上的元素可以為0或其他值。一個n × n的對角矩陣A滿足: [A]ij = 0 if i ̸= j ∀i, j ∈ {1, · · · , n}
特徵值與特徵矢量 如果一個標量λ和一個非零向量v滿足 Av = λv, 則λ和v分別稱為矩陣A的特徵值和特徵向量。
矩陣分解 一個矩陣通常可以用一些比較「簡單」的矩陣來表示,稱為矩陣分解。
奇異值分解 一個m×n的矩陣A的奇異值分解
其中U 和V 分別為m × m和n×n 的正交矩陣,Σ為m × n的對角矩陣,其對角 線上的元素稱為奇異值(singular value)。
特徵分解 一個n × n的方塊矩陣A的特徵分解(Eigendecomposition)定義為
其中Q為n × n的方塊矩陣,其每一列都為A的特徵向量,^為對角陣,其每一 個對角元素為A的特徵值。 如果A為對稱矩陣,則A可以被分解為
其中Q為正交陣。
導數 對於定義域和值域都是實數域的函數 f : R → R ,若f(x)在點x0 的某個鄰域∆x內,極限
存在,則稱函數f(x)在點x0 處可導, f'(x0) 稱為其導數,或導函數。 若函數f(x)在其定義域包含的某區間內每一個點都可導,那麼也可以說函數f(x)在這個區間內可導。連續函數不一定可導,可導函數一定連續。例如函數|x|為連續函數,但在點x = 0處不可導。
加法法則
y = f(x),z = g(x) 則
乘法法則
鏈式法則 求復合函數導數的一個法則,是在微積分中計算導數的一種常用方法。若 x ∈ R,y = g(x) ∈ R,z = f(y) ∈ R ,則
Logistic函數是一種常用的S形函數,是比利時數學家 Pierre François Verhulst在 1844-1845 年研究種群數量的增長模型時提出命名的,最初作為一種生 態學模型。 Logistic函數定義為:
當參數為 (k = 1, x0 = 0, L = 1) 時,logistic函數稱為標准logistic函數,記 為 σ(x) 。
標准logistic函數在機器學習中使用得非常廣泛,經常用來將一個實數空間的數映射到(0, 1)區間。標准 logistic 函數的導數為:
softmax函數是將多個標量映射為一個概率分布。對於 K 個標量 x1, · · · , xK , softmax 函數定義為
這樣,我們可以將 K 個變數 x1, · · · , xK 轉換為一個分布: z1, · · · , zK ,滿足
當softmax 函數的輸入為K 維向量x時,
其中,1K = [1, · · · , 1]K×1 是K 維的全1向量。其導數為
離散優化和連續優化 :根據輸入變數x的值域是否為實數域,數學優化問題可以分為離散優化問題和連續優化問題。
無約束優化和約束優化 :在連續優化問題中,根據是否有變數的約束條件,可以將優化問題分為無約束優化問題和約束優化問題。 ### 優化演算法
全局最優和局部最優
海賽矩陣
《運籌學裡面有講》,前面一篇文章計算梯度步長的時候也用到了: 梯度下降演算法
梯度的本意是一個向量(矢量),表示某一函數在該點處的方向導數沿著該方向取得最大值,即函數在該點處沿著該方向(此梯度的方向)變化最快,變化率最大(為該梯度的模)。
梯度下降法
梯度下降法(Gradient Descent Method),也叫最速下降法(Steepest Descend Method),經常用來求解無約束優化的極小值問題。
梯度下降法的過程如圖所示。曲線是等高線(水平集),即函數f為不同常數的集合構成的曲線。紅色的箭頭指向該點梯度的反方向(梯度方向與通過該點的等高線垂直)。沿著梯度下降方向,將最終到達函數f 值的局部最優解。
梯度上升法
如果我們要求解一個最大值問題,就需要向梯度正方向迭代進行搜索,逐漸接近函數的局部極大值點,這個過程則被稱為梯度上升法。
概率論主要研究大量隨機現象中的數量規律,其應用十分廣泛,幾乎遍及各個領域。
離散隨機變數
如果隨機變數X 所可能取的值為有限可列舉的,有n個有限取值 {x1, · · · , xn}, 則稱X 為離散隨機變數。要了解X 的統計規律,就必須知道它取每種可能值xi 的概率,即
稱為離散型隨機變數X 的概率分布或分布,並且滿足
常見的離散隨機概率分布有:
伯努利分布
二項分布
連續隨機變數
與離散隨機變數不同,一些隨機變數X 的取值是不可列舉的,由全部實數 或者由一部分區間組成,比如
則稱X 為連續隨機變數。
概率密度函數
連續隨機變數X 的概率分布一般用概率密度函數 p(x) 來描述。 p(x) 為可積函數,並滿足:
均勻分布 若a, b為有限數,[a, b]上的均勻分布的概率密度函數定義為
正態分布 又名高斯分布,是自然界最常見的一種分布,並且具有很多良好的性質,在很多領域都有非常重要的影響力,其概率密度函數為
其中, σ > 0,µ 和 σ 均為常數。若隨機變數X 服從一個參數為 µ 和 σ 的概率分布,簡記為
累積分布函數
對於一個隨機變數X,其累積分布函數是隨機變數X 的取值小於等於x的概率。
以連續隨機變數X 為例,累積分布函數定義為:
其中p(x)為概率密度函數,標准正態分布的累計分布函數:
隨機向量
隨機向量是指一組隨機變數構成的向量。如果 X1, X2, · · · , Xn 為n個隨機變數, 那麼稱 [X1, X2, · · · , Xn] 為一個 n 維隨機向量。一維隨機向量稱為隨機變數。隨機向量也分為離散隨機向量和連續隨機向量。 條件概率分布 對於離散隨機向量 (X, Y) ,已知X = x的條件下,隨機變數 Y = y 的條件概率為:
對於二維連續隨機向量(X, Y ),已知X = x的條件下,隨機變數Y = y 的條件概率密度函數為
期望 對於離散變數X,其概率分布為 p(x1), · · · , p(xn) ,X 的期望(expectation)或均值定義為
對於連續隨機變數X,概率密度函數為p(x),其期望定義為
方差 隨機變數X 的方差(variance)用來定義它的概率分布的離散程度,定義為
標准差 隨機變數 X 的方差也稱為它的二階矩。X 的根方差或標准差。
協方差 兩個連續隨機變數X 和Y 的協方差(covariance)用來衡量兩個隨機變數的分布之間的總體變化性,定義為
協方差經常也用來衡量兩個隨機變數之間的線性相關性。如果兩個隨機變數的協方差為0,那麼稱這兩個隨機變數是線性不相關。兩個隨機變數之間沒有線性相關性,並非表示它們之間獨立的,可能存在某種非線性的函數關系。反之,如果X 與Y 是統計獨立的,那麼它們之間的協方差一定為0。
隨機過程(stochastic process)是一組隨機變數Xt 的集合,其中t屬於一個索引(index)集合T 。索引集合T 可以定義在時間域或者空間域,但一般為時間域,以實數或正數表示。當t為實數時,隨機過程為連續隨機過程;當t為整數時,為離散隨機過程。日常生活中的很多例子包括股票的波動、語音信號、身高的變化等都可以看作是隨機過程。常見的和時間相關的隨機過程模型包括貝努力過程、隨機遊走、馬爾可夫過程等。
馬爾可夫過程 指一個隨機過程在給定現在狀態及所有過去狀態情況下,其未來狀態的條件概率分布僅依賴於當前狀態。
其中X0:t 表示變數集合X0, X1, · · · , Xt,x0:t 為在狀態空間中的狀態序列。
馬爾可夫鏈 離散時間的馬爾可夫過程也稱為馬爾可夫鏈(Markov chain)。如果一個馬爾可夫鏈的條件概率
馬爾可夫的使用可以看前面一篇寫的有意思的文章: 女朋友的心思你能猜得到嗎?——馬爾可夫鏈告訴你 隨機過程還有高斯過程,比較復雜,這里就不詳細說明了。
資訊理論(information theory)是數學、物理、統計、計算機科學等多個學科的交叉領域。資訊理論是由 Claude Shannon最早提出的,主要研究信息的量化、存儲和通信等方法。在機器學習相關領域,資訊理論也有著大量的應用。比如特徵抽取、統計推斷、自然語言處理等。
在資訊理論中,熵用來衡量一個隨機事件的不確定性。假設對一個隨機變數X(取值集合為C概率分布為 p(x), x ∈ C )進行編碼,自信息I(x)是變數X = x時的信息量或編碼長度,定義為 I(x) = − log(p(x)), 那麼隨機變數X 的平均編碼長度,即熵定義為
其中當p(x) = 0時,我們定義0log0 = 0 熵是一個隨機變數的平均編碼長度,即自信息的數學期望。熵越高,則隨機變數的信息越多;熵越低,則信息越少。如果變數X 當且僅當在x時 p(x) = 1 ,則熵為0。也就是說,對於一個確定的信息,其熵為0,信息量也為0。如果其概率分布為一個均勻分布,則熵最大。假設一個隨機變數X 有三種可能值x1, x2, x3,不同概率分布對應的熵如下:
聯合熵和條件熵 對於兩個離散隨機變數X 和Y ,假設X 取值集合為X;Y 取值集合為Y,其聯合概率分布滿足為 p(x, y) ,則X 和Y 的聯合熵(Joint Entropy)為
X 和Y 的條件熵為
互信息 互信息(mutual information)是衡量已知一個變數時,另一個變數不確定性的減少程度。兩個離散隨機變數X 和Y 的互信息定義為
交叉熵和散度 交叉熵 對應分布為p(x)的隨機變數,熵H(p)表示其最優編碼長度。交叉熵是按照概率分布q 的最優編碼對真實分布為p的信息進行編碼的長度,定義為
在給定p的情況下,如果q 和p越接近,交叉熵越小;如果q 和p越遠,交叉熵就越大。
❷ 數學建模比賽中,程序員具體需要做些什麼,以及程序員的數學水平應該達到什麼程度
在本科階段,我本人參與過數學建模,我們團隊最終也獲得了全國一等獎的榮譽。在數學建模比賽中,程序員起到的是至關重要的作用,因為大部分工作都是由程序員去完成的。
程序員具體應做好以下工作:
1、你要去建模(要會微分方程, 機器學習演算法, 圖論);
2、寫程序搞定你的模型(做A題的話你要會數值分析, 有些地方也叫計算方法. 至於決策樹, 圖論, PCA降維, 聚類分析什麼的, 那就是程序員的老本行了);
3、debug你的程序得到看上去正確的結果;
4、在論文裡面詳細的描述你的演算法和實現過程。
總結
個人認為,程序員在數學建模中起到最重要的作用,如果一個團隊裡面只有一個程序員,那麼這個人的工作量無疑是最大的。
❸ 程序員的數學-讀書筆記
計數法分為 按位計數法 和 羅馬計數法
按位計數法常用的有2進制、8進制、10進制、16進制等幾種。
理論上多少進制在數學上都可以存在,瑪雅人用20進制,巴比倫人用10進制和60進制的混合計數法。瑪雅人20進制可能是和手腳趾加起來的數量有關。巴比倫人採用60進制也可能是因為記錄數字的黏土版比較難記錄文字記號,為了在大數的書寫上少佔位便採用了60進制。
從這一點來看,環境對文明和文化的形成真的是有決定性的影響。假如巴比倫人掌握了造紙術或者在竹子上書寫文字的話,60進制這種違反人類天性的計數方法一定不會出現。話說,漢莫拉比法典就是寫在黑色的玄武岩上的。能夠記錄的文字也就屈指可數吧。
作者提到了其實人也是可以採用2進制計數法的,可是同樣大小的數字用2進制書寫起來位數太多,一來書寫不方便,二來計算時易發生馬虎出現錯誤。而10進制的數天生就是順應人類人性的,即使是幼兒也可以通過數手指頭的方式來計數。
相反對於計算機的物理構造來講,0代表開關斷開,1代表開關連接,這種二極體的物理限制正好決定了計算機較為適用2進制。不過如果你想做出一個10進制的計算機也不是沒有可能的。
這一章比較有趣的是羅馬計數法,我以前也沒有接觸過超過20的羅馬數字,也不知道羅馬數字各個數位上的數字相加之和為數字本身所代表的量。例如:
反觀阿拉伯數字
由此引發作者在兩個程序領域上的思考:
關鍵詞:真值表、文氏圖、邏輯表達式、卡諾圖、三值邏輯、完整性、排他性
- 能夠判斷對錯的陳述句叫做命題(proposition)
邏輯非 --不是A
逆命題
逆否命題
德摩根定律
卡諾圖 (二燈游戲、三燈游戲引出)
未定義邏輯(undefined)
三值邏輯的德摩根定律
本章探討的是通過余數來解決存在規律、周期性的問題。通過規律和周期性的重復,將大問題簡化成容易解決的小問題。
首先作者通過解決星期幾問題,引入了余數的思考概念。
上面的問題在 大問題通過余數規律簡化為小問題 這個方法上表現的還不明顯,於是引入了第三個問題:1234567^7654321的個位數是多少。
以上三個問題是小學奧賽便涉及到的問題,然而其思想在解決真實面對的復雜問題或具象的實際問題時卻很好用。
將一個數字除以2,他的余數應該為0或者1二者之一。我們也可以叫 奇偶問題 。
書中有幾個案例:
這樣分析過來就很好解決七橋問題,確定每個點所連接的橋的點數,與上述結論做對比。
A點為3,B點為,C點為3,D點為3.
由此可以得出七橋問題不可能實現。這個問題的解決也是通過奇偶性來解決的。
作者舉了高斯求和的故事來講如何用數學歸納法來解決無窮數列的求和問題。
兩個小例子便是從0開始到N的和,以及1開始的奇數和。
數學歸納法 是證明[ 有關整數的斷言對於0以上的所有整數(0,1,2...)是否成立 ]所用的方法。
證明方法歸結為兩歩:
根據上述方法,假若某個假設成立,那麼P(0)成立,因為P(0)成立,所以P(0+1)即P(1)也成立。反復如此,對於無窮數列遵守這個規律的證明,就像多米諾骨牌,推到第一個,後面的都會按照第一個的規則倒下去。
然而要避免整個證明出錯,就要重視第二個步驟,也就是歸納。歸納在證明時一定要考慮 是否在所有定義條件下均成立 ,尤其要注意的是在P(0)的條件下是否實現。
課後對話很有意思:
計數是人類每天生活都要運用的方法。
計數的關鍵就在於 注意「遺漏」和「重復」
例如:
綜上,在計數時要發現事物的規則。
要 認清計數對象的本質
要 認清計數對象的本質
要 認清計數對象的本質
重要的事情說三遍。
將計數對象進行 歸納總結 ,使其作為普通規則來掌握。這樣一般不容易出錯。
接下來,作者在 加法法則 里寫到:
乘法法則 的概念比較有意思。
接下來,本章提到了置換、排列、組合3個概念。以下是幾個小例子。
最後提到的 重復組合 里的思考問題比較有趣。
解答的思想是:
這是一種典型的將復雜問題簡單化,並規律化的解答方法。
最後還是要強調下:
要 認清計數對象的本質
遞歸與歸納的區別
歸納(inctive) 是從個別性前提推出一般性結論。
本質上都是 將復雜問題簡化 ,但方向不同。
個人理解是
遞歸是發現第n項和前一兩項之間的關系,實證確定後,往回不斷遞推的一種個別性結論。
即這個結論不是在n為任何自然數時都成立的。需要注意n為0和1的兩項。
通過遞歸解決問題的線路是: 找到遞歸結構——建立遞推公式——找到解析式(只帶n的式子) ,如果不能以解析式的方式描述遞歸結構,也可以用遞推公式的方法描述。如下圖所示的漢諾塔的遞推公式:(它也可以描述成解析式的方式)
歸納所謂的個別性前提是指
斐波那契數列就是運用了遞歸的思想。通過研究和思考復雜問題,抓住事務本質,得到f(n)=f(n-1)+f(n-2)
所以當我們想要用遞歸的方法解決問題時,注意思考第n元素與前後元素的關系。由一個點推開,成一條貫穿始終的線。
利用帕斯卡三角形來研究Cnk=Cn-1(k-1) + Cn-1k的思考方式另闢蹊徑。將兩個加數假設成組合問題里含一個元素和不含那個元素的兩個情況。從而證明了式子。利用的便是組合的數學分析法。(這句話組合的意思不是數學意義上的)。
所以以上將復雜問題簡化的方法是遞歸解法之一,是為了在復雜問題中找到隱含的遞歸結構。其思路是:
通過思考一張1mm的紙,折多少次能夠有地月距離那麼厚,作者引出指數的概念。
這一章的內容比較簡單,對於 指數爆炸 大家應該都不陌生。而 對數 估計也很熟悉。之前接觸到的漢諾塔問題的解析式和斐波那契數列都屬於指數的范疇。
然而在解決 測試所有設定選項的程序時,檢查次數也是一個指數問題 。所以我們應該如何輕松的解決這類問題呢?
利用二分法查找
利用二分法,先詢問最中間的人,如果在左邊,就繼續在左邊的范圍內重復此項方法,直到找到罪犯。這便被稱為 2分法 。他和漢諾塔的解析式如出一轍,可以利用指數原理經過很少的步驟便可找到目標。
二分法本身也是 遞歸結構 ,經過n次詢問,可以在2^n-1人中確定目標。每判斷一次就可以查找近一半的對象。
二分法需要注意的是,所有元素一定要 按順序排列 ,這點至關重要。
指數思想也被用於加密的實現中。因為每多加密一位,暴力破解就需要指數次的運算能力的提升。原則上有限時間里根本不可能破解。指數以其數字的巨大增長能力在加密領域有基本性的作用。
對於指數問題的解決方法,主要有4種,但均不太容易應付規模大的數字。
作為指數函數的逆函數,文章涉及了對數。同時也簡單介紹了古代科學家用過的計算尺。
無窮可以分為 可數無窮 和 不可數無窮 。
所謂 可數無窮 是指 可以按照一定的規律或者表達方式來表達 。
即集合中所有元素都與正整數一一對應。如果每一個元素都可以與1.2.3....等數字對應,也就是說可以按規律表達出來就是可數無窮。
例如:
所以有不可數的集合嗎?
此時運用到了 對角論證法 和 反證法(也叫歸謬法)
假設我們要證明 所有整數數列的集合是不可數的 ,那麼反證就是 假設所有整數數列的集合是可數的 ,此處是運用的反證法。
現在我們按下圖的方式來列出所有整數數列,編號為k的整數列在表的k行。
如果按照圖中第k行的第k個元素ak單獨組出一組數列{a1,a2,a3......}的話,他也是應該包含在所有整數數列里的,然而並沒有,他是游離在所有整數數列之外的。此處得出矛盾,說明命題錯誤,命題 所有整數數列的集合是不可數的 為真。此方法被稱為 對角論證法
除此之外
-所有實數的集合是不可數的
-所有函數的集合也是不可數的
隨後書中討論到了不可解的問題
對於不可解的問題的定義是
事實上,不能寫成程序的函數是存在的。
有些函數不能用文字表達,而且要寫成程序的函數必須 嚴謹定義確切和文字表達 兩個概念。
停機問題
不可解問題的一例。定義是
有限時間並不指時間長短,而是指無論耗時多長,只要能有終止的一刻就好。
事實上,程序本身並不能判斷某一程序是否可以在有限時間內結束運行
所以停機問題也是 不可解問題 之一。
這一章是對之前8章的回顧和總結。
前幾章作者分別對 0的意義、邏輯、余數、數學歸納、排列組合、遞歸、指數爆炸、不可解問題 進行了簡單的介紹和探討。其實所有的章節最後都是在引領讀者產生如何解決問題的思考。
1.認清模式,進行抽象化
2.由不擅長催生出的智慧
3.幻想法則
本書比較適合作為第一本接觸演算法的書籍。目前開始在上 Khan的Algorithms ,9月份跟上 coursera的Algorithms Part I 的開課。
前方的路註定不好走,但是要慢慢嘗試和堅持。
❹ 程序員需要數學很厲害嗎
程序員不需要數學特別優秀,但需要有一定的數學基礎。
程序員(英文Programmer)是從事程序開發、程序維護的基層工作人員。一般將程序員分為程序設計人員和程序編碼人員,但兩者的界限並不非常清楚。
數學是人類對事物的抽象結構與模式進行嚴格描述的一種通用手段,可以應用於現實世界的任何問題,所有的數學對象本質上都是人為定義的。從這個意義上,數學屬於形式科學,而不是自然科學。不同的數學家和哲學家對數學的確切范圍和定義有一系列的看法。
程序員崗位職責:
1、對項目經理負責,負責軟體項目的詳細設計、編碼和內部測試的組織實施,對小型軟體項目兼任系統分析工作,完成分配項目的實施和技術支持工作。
2、協助項目經理和相關人員同客戶進行溝通,保持良好的客戶關系。
3、參與需求調研、項目可行性分析、技術可行性分析和需求分析。
4、熟悉並熟練掌握交付軟體部開發的軟體項目的相關軟體技術。
❺ 程序員需要怎樣的數學基礎
離散數學對程序員來說非常重要,還有組合數學、線性代數、概率論、數論等等,即使你將來不做研究,這些基礎知識也能極大地提高你的水平。計算機科學對離散數學的要求很高,建議你先學習前面提到的這些課程,然後學習計算機演算法和數據結構,再配合到網上的在線題庫做題,過程很艱辛,但是對你的幫助會很大。
推薦書目:
《具體數學》(先學完前面的數學課程,罩衫在水平有一定進步以後再看)
《演算法導論》(應該人手一本的好書)
簡單來說,學數學的目的,一方面是活躍你的思維;另一方面是為了深入學習演算法打基礎,設畢老想物數腔一下,同樣的問題,普通人的程序要幾十分鍾甚至幾小時幾天才能解決出來,甚至根本無法解決,而你精心設計的程序卻能在1秒內解決出來,這就是數學的魅力、演算法的魅力。
其實,一切取決於你是否想做一個高級程序員。如果你做體力活(其實一般編程別人都認為是體力活),那你可以不學,因為你用不到,但是,你要是做技術上的創新,做個很強的程序員,沒有數學的支持,很難。
你既然學習了C,c++,你也知道演算法的重要性,同樣一個問題,我用13行程序解決了,我的同學居然用了33行,因為他不懂的用數學。你要達到什麼高等,取決於你的數學修養。當然,要做一個普通的程序員就不用學習了。要挑戰自己,做個好的,優秀的,學習數學吧!