數學專業轉機器學習,需要哪些計算機和編程方面的積累?
RT, 非常非常感謝眾位指教。
本人本科數學和統計背景,修過國內大部分數學和統計的基礎課。自認為基礎馬馬虎虎還算紮實。但是計算機非常薄弱,本科以前無計算機知識。大學修過C語言,但是對非專業計算機要求非常低,指針內存管理這些差不多都算沒學,後來修過演算法課,大部分的編程經驗也是MATLAB和R這種科學計算語言,做的基本都屬於數值優化、模擬的東西。讀研開始接觸機器學習相關的一些東西,個人非常感興趣,也希望以後能從事這方面工作(看自已能力,研究與應用均可)。最近一年,修過和旁聽的相關課程包括:機器學習、計算機視覺、自然語言處理、深度學習、神經網路(Coursera). 自認為在模型的理論理解上還行,演算法都能理解,自己課餘看一些課本以及應用類的paper對把握中心意思也沒有問題。但計算機水平的局限卻很大,大概有以下幾件事情令我捉急:1, 深度學習需要用theano實現,但安裝的時候就有問題,我讀不懂錯誤信息,只能copy到google上一個一個找再對照調試,非常累。2,shell、 vim等等這些工具的使用非常不熟練,其中的配置文件很多都是同學幫忙調的,同學問我github時不知道為何物,深感慚愧。3,代碼能力很弱。大部分作業是python完成,但發現自己寫碼時比別人慢很多,需要在紙上寫比較詳細的偽代碼。很多時候代碼很慢。例如:nlp寫hmm都比別人慢。同學10s可以跑完的代碼我需要2、3分鐘。找一些同學的代碼看需要很長時間看懂,而且用了一些我不知道的數據結構和method。 如果按我目前的計算機水平,想通過數年時間(合理安排,越短越好),達到一名合格的(優秀的)機器學習研究者/工作者的要求,具備獨立解決機器學習問題的能力需要彌補哪些計算機知識(感覺其實基本沒有)?如果有更為具體的學習課程、書籍、視頻、方法推薦,感激不盡。
PS: 了解凡事應循序漸進,自己學習傾向先有個大體理解和框架,再對框架內的知識各個擊破、緩步積累。PS: 朋友建議編程慢是因為不懂編程的思想和精髓,需要學OOP和functional programming, 不知有無必要。朋友建議我學好C, 再學一下scala。
The Open Source Data Science Masters by datasciencemasters
對照相關課程查缺補漏?轉行數據挖掘和機器學習
半年前從數學專業轉行到了互聯網行業做數據挖掘和推薦系統,在做具體的業務的時候遇到了一些知識點,於是自己整理出來。如果有後來人需要轉行的話,可以用這份資料來參考一下。大牛請忽視以下的內容,小白可以參考下。
最好會python,c/c++,或者java,至少一種。做機器學習的話感覺用python會多一些。
3. 操作系統Linux系統,腳本語言Shell。
4. 數據挖掘和機器學習的基礎知識和演算法邏輯回歸演算法 Logistic Regression(LR),支持向量機演算法 Support Vector Machine(SVM),
物質擴散和熱傳導演算法(Heat Spreading),
Gradient Boosting Decision Tree(GBDT),
聚類演算法,神經網路演算法,決策樹,隨機森林,異常值檢測等常用演算法需要掌握。
特徵工程的基礎知識:根據相應的產品進行必要的特徵構造,物品特徵,交叉特徵等。
其中LR使用廣泛:由於LR是使用線性方法來處理非線性的問題,導致特徵工程十分複雜,交叉項多(二維或者三維的交叉)。
工程上的最優化論文推薦:Ad Click Prediction a View from the Trenches需要了解的是相關論文的背景SGD演算法,Truncated Gradient演算法,RDA演算法,FOBOS演算法,FTRL演算法等。5. 統計學時間序列模型,變數的相關係數,ROC和AUC,交叉驗證,主成分分析。6. 業務背景
大數據,推薦系統,計算廣告學的科普書籍。
以上就是筆者在公司工作半年了的一些簡單的總結,如果有啥不正確的地方,還希望大家賜教。答主加油,數學系的背景已經領先一大截了。我還想問通信專業想轉機器學習,要學哪些數學統計學計算機或者編程的知識呢
(╯°□°)╯︵ ┻━┻哈哈 我也是數學系的 也在搞機器學習的方向 。題主的情況正常,太正常了。不是所有人一出生就會code的好吧,都是積累起來的。
我就是看了演算法導論,CSAPP後才在成為數學系編程比較厲害的,計算機系裡數學比較厲害的「水貨」。題主是需要看一些計算機的書籍,但更多的是需要練,練,練!!!沒辦法的,短板就是要靠努力往上沖的。過了這個坎,憑藉你的數學功底,說不定就能成為大神呢。所以給自己一個跨過這個坎的理由,然後往上沖吧。
至於編程語言。題主,python很厲害好嗎,雖然不如PHP,但是在做小型項目的時候已經夠用了。至於是C C++還是Java什麼的,得按照你的項目需求來做,語言只是工具,其實你python學得好,其他的你也能很快上手,很多高校都把python作為入門的編程語言,而且不得不說python在文本處理的能力確實很厲害也很好用。所以啊,不用貪多,專心學學python就好了。以上個人淺薄之見,歡迎題主一起交流。我也是本科數學狗,今年9月份開始計算機的研究生旅程,樓主理論方面學的東西已經比我多了很多,我也只能說說一些可能對樓主有幫助的。我本科的編程基礎也就比樓主多一門數據結構,不過當時由於對編程比較感興趣所以學的還算可以,我跟樓主也有一樣的疑問,諮詢過的老師和師兄基本都是說玩好C語言、一門面向對象的語言(我這邊主要是JAVA)和數據結構就沒多大問題,其他的遇到的時候再查資料補補,數學狗很多時候都不缺理論,(樓主既然能在紙上弄完偽代碼目測也不是思想方面的問題)在實踐中玩多了代碼能力就自然上來了,個人覺得最鍛煉代碼能力的是在假期找碼農實習,現在本人也是這麼做的,之前找了一份SQL的,現在閉著眼睛不用怎麼想都能快速打出代碼,當然SQL比較簡單也是一個原因,不過真心覺得在企業裡面是最講究工作效率的,如果要說碼代碼的速度,企業里的碼農絕對是可以學習的榜樣,並且在那樣的環境下也會有足夠的壓力讓你快速碼代碼。就這些了,希望對樓主有用!
『1, 深度學習需要用theano實現,但安裝的時候就有問題,我讀不懂錯誤信息,只能copy到google上一個一個找再對照調試,非常累。』
錯誤訊息一大堆是正常的(常見的),經驗多了就不必細看訊息內容,很快估計到是什麼錯誤,例如版本不對,etc。 這是經驗累積的,或者請教別人安裝,讓他帶一帶你。
『2,shell、 vim等等這些工具的使用非常不熟練,,其中的配置文件很多都是同學幫忙調的,同學問我github時不知道為何物,深感慚愧。』
vim 和 emacs 都很舊了,我從來不用這些,用較新的 editors(任何一個也可以)。 vim 和 emacs 要記住很多 control codes,那模式很老土的了。 你只要能 edit 檔案就達到目的。
初學 shell 的時候 manual 要放在手邊經常查閱(或者在視窗開 PDF)。其實初學任何語言也是經常看 manual 的。
注意: 這些其實不叫 "computer science",更確切地說是「用電腦的技巧」,也是熟能生巧罷了。 找個有經驗的人從頭至尾帶你一下會好很多。
『3,代碼能力很弱。大部分作業是python完成,但發現自己寫碼時比別人慢很多,需要在紙上寫比較詳細的偽代碼。很多時候代碼很慢。例如:nlp寫hmm都比別人慢。同學10s可以跑完的代碼我需要2、3分鐘。找一些同學的代碼看需要很長時間看懂,而且用了一些我不知道的數據結構和method。』
你熟悉的其實是 R 和 matlab,在這方面,很多 CS 系的人可能比你還差,因為他們較少處理 vector, matrix 那些。
你不熟悉的是那些 non-math 的語言,那些是注重 symbolic manipulations 的(即所有主流語言 C++, python 等)。 這些語言處理的是 data structures,例如: stack, tree, linked list, queue, etc.
所有這些數據結構其實都是儲存 symbolic data 用的,而不是 maths 的 data,後者是 array (for storing vectors and matrices)。
「數據結構」(data structures) 是CS必修科,找幾本好的教科書看看(有些書寫得比較淺,有些較差,不便自學,看不懂就丟開它看另一本,你目的是 get the gist of it,越 dummy 的書越好)。
你的問題可能是,當 math data 要和別的 data 混合使用時,你不熟悉 data structures。
=====================
或者更重要的可能是和一些寫代碼更在行的人合作。 你的強項應該是設計 numerical algorithms 方面?
我也是一名數學專業的研究生,本科弄計算,現在搞代數。半年前發現自己在機器學習方面很感興趣,現在也在努力入門,在coursera上跟了ml和數據挖掘幾門課程。竊以為我們數學專業的學生最大的缺點就是一個問題證通了原理搞懂了就過去了,其實在一個問題上可能需要更多的編程訓練才能變成自己熟練掌握的技能(自己也存在這樣的缺點,也在敦促自己改正)。另外斯坦福的演算法I和演算法II覺得很不錯,講的都是我們計算數學專業不注重的數據結構方面的東西,建議樓主看看可能對於演算法加速很有幫助。以上。和樓主一起努力。
能說是你對演算法上面需要的內存優化,和設計到數據結構沒有理解透,有這麼好的數學基礎,可不能浪費!在很多轉機器學習方向的人中,你可是屬於高富帥級別的,不能因為小小的這些編程破壞你的形象!不行就像前面說,找個培訓唄~
我的建議是c++和cuda,編程從0開始學起的話,我個人花了2年時間
編程的思想、精髓、課程、教材,等等,全部都不應該學,而應該直接編程,持續不斷的編
編程是實踐,不是科學,這是我個人的看法推薦閱讀:
※C++ Primer與C++ 大學教程(C++ How to Programming)哪個更好些,應當選擇怎樣的教材?
※計算機科學與技術本科專業有哪些核心課程?應該如何安排學習順序?各個課程推薦哪些經典教材?
※你所在的計算機科學領域的 big picture 是怎樣的?
※計算機網路該如何深入學習?
※為什麼研究生階段有一大堆 EE 轉 CS 的但卻很少聽說有 CS 轉 EE 的?