㈠ 程序員需要怎樣的數學基礎
LZ不要杞人憂天了,那些說數學重要的,首先數學你會嗎?數學包含的范疇太多了,常見的有高等幾何 微積分 線性代數 概率論 離散數學 數論 圖論等等你指的是具體哪一樣呢?就算是前人科學巨匠泰鬥牛頓,毆幾里德,愛因斯坦,他也只是擅長自己從事的那領域,要說所有數學領域都精通我想他們也不敢吹這樣的牛逼。
所以對大多數人來說,在數學方面都不太可能取得什麼很深的造詣。等到你所謂的把數學學好,那鬍子都快白完了,數學是又深奧又費解學習成本巨大需要耗費大量時間學完不用立馬就忘的學科。所以說數學重要,先問問你自己能不能學會。
其次,計算機學科跟數學根本就不是一門學科, 包含內容極其有限。計算機編程有自己的理論知識體系,很多跟數學關系不大。學好編程尤其對新手來說最重要的是對你學的編程語言的熟練運用和工具SDK的爛熟於心。每個語言都有自己獨特的設計理念,不存在什麼好學的編程語言。
所以說,題主, 你想得太遠了。軟體開發需要用到的知識比數學重要的太多了。拋開計算機不說,英語比起數學的重要性就大的多的多。英語不好你看不懂函數API說明你一切就是白瞎。而數學對於大多數人來說是最難學也是最不重要的知識,基本上是學了就忘忘了就扔扔了也沒感覺的那種,很多搞編程的可能一輩子也用不到數學知識。為什麼?理解C++的指針和多態需要數學嗎?一個復雜的系統架構也不需要半點數學知識,而你就是看不懂。
還有就是程序調試技術,很多IDE給出的出錯語句非常費解,什麼指針為空,數組越界,內存溢出,SDK找不到, 你沒經驗時打死你也看不懂你的編程工具提示的是什麼。這時你那高大上的數學真是P用沒有,它能幫你排查錯誤找出程序崩掉的原因嗎?我看不行吧,你還是得到論壇網路去問人家這些基本的問題。
在你擔心數學好不好之前,你更應該關心編程環境怎麼搭建,連IDE都搞不定不知道程序怎麼跑起來你還搞什麼呀,下一步就是程序基本的語法和SDK庫函數的掌握,基本SDK都不知道什麼意思怎麼去用,如字元串函數,文件讀寫和資料庫常用操作,這些你都不會你還有學下去的必要嗎?還有更重要的更基本的程序調試技術,程序老出錯老崩潰怎麼辦呀,哪裡變數為空了內存寫錯了?為什麼程序老編不過去呀,誰能幫幫我呀!!!這個時候你發現那牛逼的數學知識真是屁用沒有,你還是感嘆自己基本功底不行經驗太少,這個時候打死你也不會再關心數學好不好的問題了。
如果說用到數學的大概只有3D游戲引擎,很智能的人工智慧,如格鬥游戲的電腦應對玩家的復雜AI,生化危機中僵屍怪物的配合商量運用策略包抄玩家和記憶功能,還有航空航天領域這樣高精尖技術學科才會用到復雜一點的數學知識。而這些都是計算機專家才要掌握的內容。所以題主你是想多了,還是先關心下自己程序為什麼編不過老是報錯的問題吧
㈡ 程序員必備的一些數學基礎知識
作為一個標準的程序員,應該有一些基本的數學素養,尤其現在很多人在學習人工智慧相關知識,想抓住一波人工智慧的機會。很多程序員可能連這樣一些基礎的數學問題都回答不上來。
作為一個傲嬌的程序員,應該要掌握這些數學基礎知識,才更有可能碼出一個偉大的產品。
向量 向量(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越遠,交叉熵就越大。
㈢ 學編程要怎樣水平的數學基礎
你既然喜歡編程,就應該認認真真的學習一門語言,學習微軟的就先從VB開始,VB是比較好的入門語言,可視化的,比較簡單,是非常好的入門語言。書籍最少應該准備兩本,不可能一本書籍會包含VB的所有內容,在看書的時候,可以交叉的看,一本書籍中沒有講到的內容可以在另一本中看到,這樣對學習是很有好處的,也能保證所學知識的完整性。學編程是一個很漫長的過程,不要著急,要理論與實踐想結合,常式書籍也是很重要的,看源代碼對學習也是很有幫助的,等你學完這門VB語言之後,學習別的語言是非常簡單,可以嘗試C語言,按照C——C++——VC的順序學習,有助於知識的連貫性,我也希望你能學好的。
或者學習Delphi,入門較為簡單類似於VB,但比VB強大,即可作為入門又能做強、做大
怎樣學編程
1.明確學習目的
學習編程對大多數IT業人員來說都是非常有用的。學編程,做一名編程人員,從個人角度講,可以解決在軟體使用中所遇到的問題,改進現有軟體,可以為自己找到一份理想的工作添加重要得砝碼,有利於在求職道路上謀得一個好的職位;從國家的角度,可以為中國的軟體產業做出應有的貢獻,一名優秀的程序員永遠是被爭奪的對象。學習編程還能鍛煉思維,使我們的邏輯思維更加嚴密;能夠不斷享受到創新的樂趣,將一直有機會走在高科技的前沿,因為程序設計本身是一種創造性的工作。知識經濟時代給我們帶來了無限的機會,要想真正掌握計算機技術,並在IT行業里干出一番事業來,有所作為,具有一定的編程能力是一個基本條件和要求。
2.打好基礎
學編程要具備一定的基礎,總結之有以下幾方面:
(1)數學基礎 從計算機發展和應用的歷史來看計算機的數學模型和體系結構等都是有數學家提出的,最早的計算機也是為數值計算而設計的。因此,要學好計算機就要有一定的數學基礎,出學者有高中水平就差不多了。
(2)邏輯思維能力的培養學程序設計要有一定的邏輯思維能力,「邏思力」的培養要長時間的實踐鍛煉。要想成為一名優秀的程序員,最重要的是掌握編程思想。要做到這一點必須在反復的實踐、觀察、分析、比較、總結中逐漸地積累。因此在學習編程過程中,我們不必等到什麼都完全明白了才去動手實踐,只要明白了大概,就要敢於自己動手去體驗。誰都有第一次。有些問題只有通過實踐後才能明白,也只有實踐才能把老師和書上的知識變成自己的,高手都是這樣成材的。
(3)選擇一種合適的入門語言 面對各種各樣的語言,應按什麼樣的順序學呢?程序設計工具不外乎如下幾類: 1)本地開發應用軟體開發的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;資料庫開發工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台開發 開發工具如 Java 等。 3)網路開發對客戶端開發工具如:Java Script 等;對伺服器開發工具如:PHP 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。以上不同的環境下幾種開發工具中 VB 法簡單並容易理解,界面設計是可設化的,易學、易用。選 VB 作為入門的方向對出學者是較為適合的。
3. 注意理解一些重要概念
一本程序設計的書看到的無非就是變數、函數、條件語句、循環語句等概念,但要真正能進行編程應用,需要深入理解這些概念,在理解的基礎上應用,不要只簡單地學習語法、結構,而要吃透針對這些語法、結構的應用例子,做到舉一反三,觸類旁通。
4.掌握編程思想
學習一門語言或開發工具,語法結構、功能調用是次要的,最主要是學習它的思想。例如學習 VC 就要學習 Windows 的內在機理、什麼是線程......;學習 COM 就要知道 VTALBE 、類廠、介面、idl......,關鍵是學一種思想,有了思想,那麼我們就可以觸類旁通。
5.多實踐、多交流
掌握編程思想必須在編程實際工作中去實踐和體會。編程起步階段要經常自己動手設計程序,具體設計時不要拘泥於固定的思維方式,遇到問題要多想幾種解決的方案。這就要多交流,各人的思維方式不同、角度各異,各有高招,通過交流可不斷吸收別人的長處,豐富編程實踐,幫助自己提高水平。親自動手進行程序設計是創造性思維應用的體現,也是培養邏輯思維的好方法。
6.養成良好的編程習慣
編程入門不難,但入門後不斷學習是十分重要的,相對來說較為漫長。在此期間要注意養成一些良好的編程習慣。編程風格的好壞很大程度影響程序質量。良好的編程風格可以使程序結構清晰合理,且使程序代碼便於維護。如代碼的縮進編排、變數命令規則的一致性、代碼的注釋等。
7.上網學編程
在網上可以學到很多不同的編程思想、方法、經驗和技巧,有大量的工具和作品及相關的輔導材料供下載。例如網站「編程課堂」(http://best.yeah.net/)主要以 VB 和 Delph;教學和交流為主,提供大量實用技巧;網站「現在時編程學園」(http://pshool.yeah.net/)是專門介紹C、VC、VB、Delphi 等的綜合編程網站;網站「 VB 編程樂園 」(http://www.vbeden.com/)提供內容豐富而且實用的編程技術文章、精選控制項、源代碼下載、計算機考試、相關軟體以及編程書籍推薦等等。
8.加強計算機理論知識的再學習
學編程是符合「理論→實踐→再理論→再實踐」的一個認識過程。一開始要具有一定的計算機理論基礎知識,包括編程所需的數學基礎知識,具備了入門的條件,就可以開始編程的實踐,從實踐中可以發現問題需要加強計算機理論知識的再學習。程序人人皆可編,但當你發現編到一定程度很難再提高的時候,就要回頭來學習一些計算機科學和數學基礎理論。學過之後,很多以前遇到的問題都會迎刃而解,使人有豁然開朗之感。因此在學習編程的過程中要不斷地針對應用中的困惑和問題深入學習數據結構、演算法、計算機原理、編譯原理、操作系統原理、軟體工程等計算機科學的理論基礎和數理邏輯、代數系統、圖論、離散數學等數學理論基礎知識。這樣經過不斷的學習,再努力地實踐,編程水平一定會不斷提高到一個新高度。
㈣ 編程與數學的關系
編程和數學,本質上來說,它們之間的聯系是非常緊密的,最核心的說法就在於,數學是理論,編程是使用理論的工具。但是孩子學習編程,是能夠反哺數學的。更准確地說,就是在學習編程知識的同時,也能對數學概念進行更直觀的理解。
軟體編程是基於數學模型的基礎上面的,所以,數學是計算機科學的主要基礎。軟體編程中不僅許多理論是用數學描述的,而且許多技術也是用數學描述的。從計算機各種應用的程序設計方面考察,任何一個可在存儲程序式電子數字計算機上運行的程序,其對應的計算方法首先都必須是構造性的,數據表示必須離散化,計算操作必須使用邏輯或代數的方法進行,這些都應體現在演算法和程序之中。此外,到現在為止,演算法的正確性、程序的語義及其正確性的理論基礎仍然是數理邏輯,或進一步的模型論。真正的程序語義是模型論意義上的語義。於是軟體編程思想運行的嚴密性、學科理論方法與實現技術的高度一致是計算機科學與技術學科同數學學科密切相關的根本原因。從學科特點和學科方法論的角度考察,軟體編程的主要基礎思想是數學思維,特別是數學中以代數、邏輯為代表的離散數學,而程序技術和電子技術僅僅只是計算機科學與技術學科產品或實現的一種技術表現形式。
讓孩子更早的接觸編程,無疑是最大的優勢。孩子在學習編程知識的同時培養孩子邏輯思維能力、試錯能力、專注能力和動手解決問題的能力。
選擇編程,受益一生。愛編程,會學習。了解編程就來愛上編程智能學習中心。