對於一個編程基礎不是很好的學生來說,學習數據挖掘、機器學習之類的並以後從事這樣的工作靠譜嗎?

本題已加入知乎圓桌 ?「機器學習 · 學以致用」,更多「機器學習」相關話題討論歡迎關注。

計算機專業的研究生,本科落的太多,現在想好好學,不知道如何下手~~編過的代碼不超過千行,不知道該學什麼好了,完全失去信心~~


我是來反對排名第一的匿名用戶的一些觀點的。對題主的正面回答寫在最後


以下為對匿名用戶回答的引用【

你們以為上上公開課就夠的?那些東西我看過,Andrew Ng的課什麼的,以我的實力一兩天就解決了,你覺得能有啥用?那點簡單的東西與實際需要解決的問題相比根本不值一提,入門都算不上。覺得上兩門公開課實現兩個演算法就能找著好工作的純屬想多了


首先求同存異一下:機器學習這玩意容易不起來。畢竟是需要動腦子和經驗的東西,沒法容易。


但是,「上兩門公開課實現兩個演算法就能找著好工作純屬想多了」這個觀點不光不正確,而且很有打擊其它同學的傾向,我在下文會解釋為什麼。


首先為了符合匿名用戶對做過ML和DM的要求:筆者也算做過一些膚淺的數據挖掘應用,讀書的時候在一些還算靠譜的會議上水過一些文章,目前在Twitter的modeling team做model。找工作的時候常見的該拿的offer也都拿了,全是ML相關的工作。從匿名用戶提的問題來看,我該讀過的書也都讀過。


那麼筆者是什麼水平呢?


也就剛到上完公開課,有過一些經驗的水平。不是筆者自謙,事實就是這麼回事,因為我現在回頭去看公開課的時候,每次還會有新的收穫,學到新的技巧


說到這裡,匿名用戶的言論「老師還說了,你在面試時說自己學過這個課那個課,人家公司根本看不上。。。」已經完全不適用了,如果一個已經在「人家公司」里工作的人告訴你這句話不成立,那麼應該具有一定的說服力。


當然,匿名用戶可能會反駁說,你就一個樣本而已,也許是你長得特別帥人家公司才要你的呢?


非也,如果你仔細上過Andrew的課,他在結尾處提到:如果你認認真真學完了這些演算法,你已經比灣區絕大多數工程師在ML上的造詣高很多了。


此話半點不假。在樓主所在的公司(以及以前呆過的地方),絕大多數工程師不一定了解ML在幹些什麼。大家充其量了解一些基本的ML概念,僅此而已。但是這並不是說,他們就不能勝任我現在在乾的工作了,這也是我想提出與匿名用戶觀點相左的地方,原因如下

1) 對,你是在念ML的PhD,沒有人會懷疑你多聰明你能解多少最優化問題,但是有一點:你的這些特長並不是在日常工作中每時每刻會用上的。我並不是在說這些技能不重要,我只是在說,絕大多數跟ML或者DM相關的應用性工作中,太過於fancy的技能在日常工作中,是派不上太多用常的。按照80/20的原理,80%的日常工作你在倒騰數據,20%的時間才在折騰演算法(我猜很多data scientist也會同意我的觀點吧)。


如果你常讀ESL,那麼應該有印象,全世界所有的cpu time大概有80%左右在做linear regression這個簡單演算法。這很令人意外嗎?一點都不,因為LR確實就是最常用的ML技術之一。反過來講,如果你的LR可以用到了極致,那麼你不會KKT條件又怎樣,你不明白SVM推導又怎樣,難道這樣的同學就不可以從事跟LR相關的工作嗎?把LR用到極致,不光可以處理非線性的,還可以做大規模的,online的,distributed的,multi-label的,多了去了。可不要忘了,號稱最牛逼的Vowpal Wabbit不也就把LR做到了極致嗎?所以按照答者的理論,假設John Langford只做LR,他應該滾出ML界了?不是吧,多少公司(至少按照github上他聲稱的)都在用他寫的牛叉哄哄的vowpal wabbit啊


2)對於有數理思維的同學,尤其是編程特別好或者數學底子不錯的同學,學起ML來更加容易。即始沒有,也沒太大關係。說到底,ML里的演算法跟演算法導論上的演算法有很大差別嗎?本質上沒有,因為演算法導論里告訴你的多數是確定性演算法,而ESL或者PRML里告訴你的多數是不確定性的演算法,但是重點是,它們都是演算法,都是給定計算機一套指令,給定特定輸入,寫出特定輸出的過程而已。那麼,為什麼我們相信每個人都應該能明白演算法導論上的東西,但卻懷疑,「覺得上兩門公開課實現兩個演算法就能找著好工作純屬想多了」呢?奇怪


3)訓練並不是靠時間和地點堆砌的。這裡的時間指的是匿名用戶指的「每周十七八個小時」,地點則是指「頂級學校」。相反,有效的訓練才是真正讓人從一個境界到達另一個境界的地方。當然啦,每個階段都會有更厲害的人,這我見太多了,可是重點是,不能因為「跟那些專門搞機器學習模式識別的優秀研究生比仍然相去甚遠」就自認不如或者放棄掉吧?這是個什麼樣的奇怪理由。也說個個人相關的例子吧,之前的室友是做ML最厲害幾個人之一的弟子,他的NIPS的列表一個頁面裝不滿,vision界的publication更是裝不下,就這麼厲害。於是他碰到了我這個推個LDA還吭哧的弱室友。


但是問題是,這就是停止學習ML的理由嗎?


4)究竟機器學習這玩意有多難?是你匿名用戶說的那麼玄幻嗎?

沒多難,不是rocket science,認真學多花時間總是可以學成的。同樣的問題我以前問過「C語言這玩意有多難?」,後來發現把指針弄明白了以後沒多難,不像譚老師講那麼玄乎。「函數式編程這玩意有多難?」,也沒多難,坐下來把主要概念看明白了多寫寫也就會了。


同樣道理,機器學習需要的數學裡面,能把人繞進去的並不是那麼多。有難的嗎?有!你需要自己去創造一個演算法來beat已有的演算法的時候,那是真tm難,但是題主問的是什麼呢?「從事這樣的工作靠譜嗎」,如果我來說的話,靠譜,只要你肯學,把該學的磨會了,你就靠譜了。


重申一下:機器學習沒有那麼難,但是要創造個新的漂亮的能用的機器學習演算法很難。所有需要創新的東西幾乎都難,因為你得在沒有指導的前提下試很多種東西,恰好試出來一種能work的,這當然難了。問題在於,現實生活中的工作里哪裡需要這麼多新的東西?非常少,你有一個open mind能隨時接受新東西你就已經領先別人一大截了,如果你還能創造出來新的東西(並且是個實用的東西),那不管在哪個公司,你都是一顆新星了。我能想到的需要匿名用戶說的那樣高水準的機器學習技能的地方,也就那麼幾個,Google X, NASA, Yahoo labs, MSR。其它地方,題主好好加把勁,還是靠譜的。


5)嫌你打擊自信心?當然嫌,至少我嫌,給本身需要信心的人潑冷水這本身就不是什麼好事,何況還是在這樣公開的場合下。所謂聞道有先後,術業有專攻,你做你的,他做他的,先來後到而已。豈能是因為天資不堪作為理由就停止,尤其揚起鼻子讓別人停止

當然,之所以產生了以上這個略有點激動的反駁式答案,是因為我想到了作為一個小弱的自己。幸運的是路上碰到的人們都一直支持多於打擊。


然後對於樓主的問題的回答:


請多寫代碼,一定要寫到能嫻熟表達自己想法的地步,如果非要加個量的話,那麼寫個幾萬行有意義的代碼吧。


請多學數學,沒事把線性代數和概率都好好學學吧,MIT的這兩門公開課都很棒。之後可以入門讀讀統計學習入門:Introduction to Statistical Learning


再之後慢慢啃ESL:Elements of Statistical Learning: data mining, inference, and prediction.
2nd Edition.


上面兩本書都是免費的。


再之後可以慢慢啃PRML,搜搜都有。


然後最後匿名用戶說的絕大多數我不同意,但是有一點我仍然是贊同的,如果不花心思和時間,上面那幾步看似簡單的過程,是沒法完成的。


希望我的答案沒有太冒犯到匿名用戶同學,我只是想用強烈的語氣表達我的觀點,我希望知乎變成一個多一些支持的地方。每個人在某個階段都曾經是小白,有的人很幸運走對了方向,有的人不太好運走歪了,但是沒有必要因為別人走歪了想調整的時候就覺得人想走捷徑。每個人的情況都不一樣,你沒法知道別人的情況,我也沒法知道,premature judgements are bad


最最最後,我們在招intern,如果你是上完了Coursera上的兩門公開課(andrew的和Pedro的)而且代碼寫得還ok(尤其是會scala)的話,我覺得你算很靠譜,我的team歡迎你(用戶數據模型組),請私信我你的英文簡歷

================================================

抱歉簡歷已經收滿,謝謝各位。將不再回復私信


這個問題可以從兩個方面來看,首先我覺得需要找到編程不好的原因,無非是兩點。第一點對於計算機語言理解的不深,對於常用的一些指令還沒有掌握。這些問題可以通過增強練習來彌補,比如說當學習java的時候,可以做一個可視化的小程序,可以基於Android系統寫一點小應用,這種case多練習幾次可以提升對解編程語言的理解。第二點原因,如果是對於一些數據結構的邏輯理解不了,俗稱「數學底子薄」。那可能如果想實現解機器學習演算法就會比較困難了。如果邏輯性思維比較一般的同學,不建議去從事演算法開發這樣的工作,會比較吃力。PS:如果想學習了解機器學習,可以通過一些封裝好的雲服務快速上手,可以試試阿里雲機器學習PAI

當然,機器學習領域也不光只有演算法開發這一種崗位,還有機器學習相關的產品和運營的崗位,相對來講可能不需要有那麼深的演算法背景,如果對於產品設計、用戶體驗、流量轉換這項方面有特長的同學,也可以試試開發以外的崗位。


統計基礎比編程基礎更重要。


我是來反對排名第一的用戶的部分觀點的。
==================================================
引言:抱歉抄襲了第一名用戶的回復格式。上知乎很久了,沒有回復過任何一篇,這可以說是我的處女貼。為什麼要回復這個話題呢?因為我正好在上匿名用戶所說的《模式識別》課程。今晚用python自己實現Logistic Regression,遇到點小問題,索性回複本帖,明天再弄作業。

首先求同存異,世界上無論是多難的學科,只要你肯花時間,沒有先天性的障礙,憑藉普通人的能力都能理解80%。即便是相對論,慢慢磨個五六年,也能理解透徹,更何況屬於工科的機器學習。

其次,學完Andrew的課程,你確實能夠找到工作,甚至能夠去灣區,加入明星企業;又或者哪個大牛的start-up。最近聽的講座,那些所謂搞大數據的人,到過各種明星企業(LinkedIn,Google,Coursera)的人,其實連大數據是什麼都沒有搞清楚,只知道講怎麼存數據、取數據、處理數據,展示數據。核心的機器學習方法,一點都不會。無非是把各種架構、框架拿來組合,實踐的時候看看哪個部分出問題了,然後想想工程辦法去解決。如果你學完Andrew,簡直是他們眼中的牛人了。

既然我都同意了第一名用戶的主要觀點了,我為什麼要寫本文呢?答案是:我就是來打擊像第一名用戶的這種思想的人的。我首先講講自己對機器學習的理解:

  1. 機器學習究竟是是什麼:數學。 請注意,不是演算法,不是業務領域,是數學。如果要更詳細點,是數學分析、線性代數、概率論、拓撲學、矩陣分析、統計理論、凸優化、數值分析、實分析、泛函分析、隨機過程,微分流形等等。演算法僅僅是機器學習的最後一步,而且實際上是最簡單的一步。套用愛迪生的一句話,機器學習 = 1%的數學 + 9%的業務+ 90%的演算法。但是這1%的數學,甚至比餘下的99%都還要重要。
  2. 機器學習的領域(業務)知識是什麼:簡單來講,領域知識就是你所要處理的數據所蘊含的知識。這部分知識對於模型的好壞至關重要,因為這部分知識是被運用到機器學習的最早階段,即數據採集和處理。這一步沒有做好,遑論建模。特別是熱衷於從事生物、醫學、金融等方向的朋友,如果沒有一個好的領域專家加入團隊,請做好學習一年以上相關領域知識的打算。至於其他領域的知識,比如網路、LBS、推薦系統等等,由於和計算機關係很近,倒不必學這麼久的領域知識,看一本書、十幾篇論文足矣。
  3. 機器學習的演算法是什麼:這個問題其實可以擴展為,演算法是什麼?演算法,其實就是數學模型的現實應用。由於受到物理計算機模型的限制,一般所講的演算法都是基於隨機存取模型的。但實質上,馮諾伊曼體系結構不過是圖靈機的實現,而圖靈機本質上就是數學函數。我們所學的基礎演算法,其實也不過是可以抽象為數學函數的解法而已。計算機科學的偽科學成分,大多來源於此。

打臉開始,下面我針對每一處引文,進行反駁:

  1. 反過來講,如果你的LR可以用到了極致,那麼你不會KKT條件又怎樣,你不明白SVM推導又怎樣,難道這樣的同學就不可以從事跟LR相關的工作嗎?」:且不論人家沒有說LR不好,光是這樣的回答就難以自圓其說。 KKT條件基本上是解決一切凸優化問題的基礎,解凸優化問題大多數情況下就是解KKT條件,包括答主所說的LR問題也可以歸結為求解KKT條件。答主沒有仔細推導過KKT條件,自然無法理解KKT條件的重要性。另一方面,SVM不屬於LR的範疇,而是一個二次優化問題。推導SVM不在於說你能否重現SVM,這本來就沒啥意思,而在於說你是否了解這是一個二次優化問題,然後進一步通過優化問題的一般情況和二次優化的特殊情況,對SVM進行合理的擴展,例如加入懲罰函數、核函數、正則項。每一個擴展都是追求卓越的過程,就跟我們寫排序演算法,最開始是基礎歸併排序,然後是快排,然後是隨機快排,最後是加入了插入排序的隨機快排。如果你連最基礎的快排都無法理解、無法實現,怎麼考慮快速排序的其他形式呢?難道學演算法最後就只學了歸併排序?一個極致的歸併排序走天下
  2. 「把LR用到極致,不光可以處理非線性的,還可以做大規模的,online的,distributed的,multi-label的,多了去了。」:LR名字中就是Linear Regression,即便是廣義線性模型,也只能解決線性問題。哪怕說有指數,加個對數之後,目標函數自然也是線性的,根本不是典型的非線性問題。什麼是典型的非線性優化問題,請參考SVM。另一方面, 答主所說的三個方向,完全就是最為基礎的數學變換。online基本是做遞推學習或者並行計算,考慮樣本無關性之後進行相關數學變換就能得到; distributed基本是分離變數,或者說求一個近似的下降方向(SGD演算法),本質上還是數學; multi-label更是數學應用,無非是 one vs one, one vs rest, 和 all in one等幾種策略,前兩種策略是模型復用,最後一種是新建模型,本質上還是數學。如果朝著這個方向去學習,根本沒什麼意義。就像你用C++寫了一個排int數組的程序,又寫了一個排double數組的程序,但是就是不去學習如何編寫最短路徑演算法,還說排序問題是80%計算機所做的問題。
  3. 「可不要忘了,號稱最牛逼的Vowpal Wabbit不也就把LR做到了極致嗎?」: 我查了一下人家的Github Tutorial(Tutorial · JohnLangford/vowpal_wabbit Wiki · GitHub),拜託,人家實現了SVM,這還僅僅是把 LR做到極限?重申一遍,SVM是二次優化問題,不是線性優化問題
  4. 「訓練並不是靠時間和地點堆砌的。這裡的時間指的是匿名用戶指的「每周十七八個小時」,地點則是指「頂級學校」」任何一項技能的訓練,都基本遵循一萬小時定律。一個學期最多20周,每周就算你花了25個小時來學模式識別,也不過500小時。比起一萬小時,這才5%,都還沒有跨過門檻,還怎麼談時間的堆砌;地點的堆砌則更無厘頭了,人家也沒說什麼頂級學校,這樣批判很不好,沒什麼邏輯可言。在我看來,好學校最好的就是人,好的老師講得透徹,好的同學可以交流,《模式識別》課程配備了4個助教給我們改作業+答疑,老師還把自己多年來的心得發給我們,供我們課外閱讀。我不知道,真的還有哪種環境可以讓人更快地「讓人從一個境界到達另一個境界」。補充一點未查證但是流傳甚廣的消息, Andrew Ng在Standford授課的時候,可是要求他的學生24小時之類提交演算法實現的,我也不知道這是否是答主說的堆砌?
  5. 沒多難,不是rocket science,認真學多花時間總是可以學成的。同樣的問題我以前問過「C語言這玩意有多難?」,後來發現把指針弄明白了以後沒多難,不像譚老師講那麼玄乎。「函數式編程這玩意有多難?」,也沒多難,坐下來把主要概念看明白了多寫寫也就會了」: 我首先承認機器學習不難,但是真的是這麼簡單?我能說C語言指針我就學了一周,函數式編程看了一個月,就基本上入門了。但是我學機器學習,可是花了整整一年半的時間學習數學,外加自己課外勤奮,才能說勉強入門的?各行各業雖然沒有貴賤,但是總有一個知識密度的問題,有的領域知識密度大,比如數學、物理、化學、生物等等,有些領域知識密度相對較小,比如行政、駕駛、水電工、保安。 用一個知識密度如此之低的C語言指針和一個中等密度的函數式編程,去跟學科級難度的機器學習來比較,簡直是沒有邏輯,我看不出這跟說「駕駛汽車有多難?也沒多難,駕駛飛機又能難道那裡去呢?有什麼區別。真要比較,你得用計算機程序語言和機器學習比,而且個人認為前者還是稍微簡單一點的。
  6. 「問題在於,現實生活中的工作里哪裡需要這麼多新的東西?非常少,你有一個open mind能隨時接受新東西你就已經領先別人一大截了,如果你還能創造出來新的東西(並且是個實用的東西),那不管在哪個公司,你都是一顆新星了」:答主這種回答,不外乎有急於求成,誤人子弟之嫌。的確,如果你剛剛入職,怎麼可能創造出很多問題來呢?可是,你是想今後幾十年靠這門技術養家糊口還是僅僅去投機淘金?舉個例子,學計算機可以去北大青鳥,也可以去985高校。北大青鳥教你最實際的編程技巧,告訴你這沒多難,難的玩意你也遇不到。高校教你的全是理論,實踐基本靠自覺,還告訴你這玩意挺折磨人的。現在,這兩個選擇擺在你面前,你選哪個?我肯定選擇後者,雖然北大青鳥可以讓我3年不到畢業,還月薪8000,但是這些東西不過是膚淺的知識,人人都可以學會。不到3年,就基本上到頂了,不是永無止境的waiting-list,就是30歲後基本失業。如果選擇後者,那麼前景更廣,紮實的理論基礎將會成為我職業生涯的最好支持。
  7. 「嫌你打擊自信心?當然嫌,至少我嫌,給本身需要信心的人潑冷水這本身就不是什麼好事,何況還是在這樣公開的場合下。」:支持題主本是好事,但是掩蓋事實真相讓題主走向一條荊棘小路就不是什麼好事了。要知道,學習最忌諱半途而廢,因為你啥也沒學精通,還浪費了你學習其他東西的時間,這也就是所謂的機會成本。 把事實真真切切的講出來,才是回答問題的本質。 我雖然也覺得匿名用戶回答欠妥,但是排名第一用戶更欠妥。與其讓人家不知深淺而一頭扎進泳池,倒不如先告訴他水深3米5來得實際。我想要說的就是,機器學習本質上就是數學,如果你認為數學難,機器學習當然難,否則為啥大家都想招這種人才。如果你沒有什麼基礎,建議首先花半年到一年時間,重頭到尾好好複習三門基礎數學課(微積分、線性代數、概率),再好好學習高級課程(矩陣分析、統計理論、數值分析、凸優化)。到這裡,如果不想再深入,基本上就足夠了,至少看論文實現演算法沒問題。然後,再好好看看機器學習相關的書籍(PRML等),用數學證明演算法的正確性,用python、matlab、R等語言實現演算法。 這樣,才算是基本入門。 至於其後,想看數學就先看看拓撲,然後是實分析、泛函分析、隨機過程、微分流形等等。 想看機器學習,就去看看各個機器學習頂會的論文。想看領域知識,就去認真地翻閱領域課本。

==================================================
我沒有冒犯的意思,僅僅是希望表達自己的觀點。各位如能有所體會,我就覺得自己的回答是有價值的。premature judgements are bad, 這句話很對。


不太同意最高票的答案,這個思路是做機器學習理論研究的要求,業界只有極少數公司,比如Google等超一流的公司需要這樣的功底。大多數公司在處理現實中的真實問題,往往採用極其成熟的方法來解決問題,並不需要對原始演算法進行太大改動,只是可能對微小細節進行改進。最重要的仍然是調參數、清洗數據、特徵選擇等問題。

相比更基礎的優化、泛函分析等,每個演算法的特性,各個模型適用的場景,各種解法的優缺點、分析數據的方法等概念在實際工作中顯得更重要。

如果是計算機專業,代碼不過千行,不管是做工程師,還是數據科學家,都是說不過去的。

我自己在國內面試過上百人的機器學習工程師候選人,上過常見公開課、做過實際的相關競賽、項目、對各個模型的優缺點能夠準確理解、對常見評價模型的標準理解清楚的人已經鳳毛菱角。

目前機器學習、大數據很熱,但是大多數候選人的問題是沒有實際的經驗,關上過公開課還是太不夠,因為一門課程總是對一個模型、演算法點到即止,很多實際工作中涉及到問題——特別是feature engineering 涉及得非常少。所以想要勝任機器學習工程師,除了涉獵相關課程、論文,實際操作非常重要。


目前排名第一的答案說的部分正確,機器學習的確是博大精深的領域,對計算機和數學能力要求極高。但是,個人認為這個答案有一定誤導性,並不是所有機器學習相關的崗位都要求你掌握每一個演算法的細節,並不是只有專業搞機器學習的優秀研究生才能從事這個行業。

目前業界(我的了解僅限於金融和諮詢)還真的有非常多的工作是那位答主所說的「用幾個軟體調幾個library跑跑數據的工作」。我之前在互聯網公司從事的工作就是屬於data science的範疇,做的最難的也就僅限於用grid searchcross validation來確定演算法的參數,其餘大部分時候就是clean data和 "用幾個軟體調幾個library「。

個人體會,很多機器學習的相關崗位最看重的反而是對所在行業的business knowledge. 很多時候,features determines the upper limit of your model performance, 而business knowledge對於feature selection來說是非常重要的。舉個例子,讓你建模來預測某個客戶是否會違約,如果沒有信用風險相關經驗的話,你根本就不知道該選擇哪些feature,或者你選擇的feature一點都不informative, 在這種情況下任你用多牛逼多高深的演算法都是沒有用的。相反,假設你有信用風險領域多年的經驗,你選擇的feature信息量很大(甚至達到了一葉知秋的境界),即使你用很普通的model還是能夠跑出好得多得多的結果。

我就答主提的問題和排名第一的回答,和一個機器學習的PhD學長(目前在四大之一的諮詢部門工作)探討了下。以下是學長的回答:「(排名第一的答案)主要針對的是研究型工作例如research scientist,金融服務業沒人關心。關鍵是理解business,定義好問題,再找到好的feature。Domain knowledge is far more important than the technology. 試想你將來想說服客戶你的模型好,你覺得客戶會關心技術細節嗎?(排名第一的答案)和很多CS博士一樣,太迷信技術的力量,太把技術的細枝末節當回事了。保持好奇心,多多思考模型背後要解決的商業問題,是最重要的。」

綜上,我覺得題主現在努力還來得及。只是方向上要正確,研究性崗位(或許還包含純科技公司?)什麼的就不要考慮了,往金融、諮詢、製造等行業走,一邊積累行業知識,一邊完善機器學習方面的知識儲備(一定要嘗試自己寫代碼!作為計算機專業的學生,題主肯定清楚光看不編是絕對不行的)

最後推薦一個非常經典的帖子:How do I become a data scientist?

以上。

==================更新分割線=========================
強烈推薦@謝科的回答,他從IT從業者的角度給出了自己的看法。有一點我非常認同,就是不應該給需要信心的人潑冷水。


我小學寫的VB代碼都過千行了……更別說中學開始刷題和本科acm及各種項目的代碼量了。

現在我機器學習剛入門不久,勉強擔任演算法工程師。

你都對自己失去信心了,機器學習方向再靠譜也跟你沒關係了啊。


我覺得機器學習對編程的要求相對而言是比較小的,跟其他方向相比(比如系統、資料庫)。通常完成一個機器學習相關的task是這樣的:理解問題、定義模型、推導演算法、編程實現、實驗驗證。我個人的經驗,編程實現這一塊是最容易的。把公式推好之後,敲進代碼里即可,工作量比較輕,debug也較容易。不像分散式系統,代碼量很大,debug也很難。


1 首先你要感興趣,對數據,數據挖掘感興趣,而不是因為這個工作火爆才選擇
2 其次你數學功底要好
3 編程只是工具,不擅長可以慢慢學

update:
對於工作中的工程實踐來說,上了半年班,覺得編程還是很重要。編程、演算法各佔一半吧


機器學習需要一些數學基礎才能理解演算法背後的意義。通常這些數學基礎包含了

  • 微積分:比如知道怎麼通過導數來找函數的極值
  • 線性代數:機器學習裡面會經常用到矩陣的乘法,求導等
  • 基本的概率統計知識:知道一些常見概率分布的表達式和性質

對於計算機方面,需要一定的編程基礎和演算法數據結構等方面的知識。但是對於計算機專業的學生,這些應該不是問題

怎麼開始入門機器學呢?當然可以先在網上跟一些公開課。我推薦Andrew Ng的課程作為第一門課,因為這門課內容比較容易,數學也不深,跟起來比較容易。這門課用到的預言是Matlab,或Octave。
在這之後,有一門statistical learning的課程(Statistical Learning),比較不錯,介紹了常見的監督學習和非監督學習的演算法,沒有深入具體實現細節,但是介紹了具體的使用。這門課程的配套教材也是作者免費放在網上了的,可以下載來看看。這門課程用的語言是R。這個語言的好處在於有很多現成的函數,不需要自己實現演算法。

學了這兩門課就可以開始著手做一些小項目了。我現在做的是生物信息方面的工作,之前不是數學系的也不是計算機系的,基礎還不夠好,但是可以在工作中慢慢積累。沒有人是一開始什麼都會的,自己慢慢努力就好。最重要的有興趣。在這個基礎上,如果能夠找到一個好的社區,多和人討論,進步會很快的。


別補基礎了,跟不上的。
學好Sql和Excel,學學Python, 補充點統計基礎,往數據分析師的方向發展吧,這個編程要求低多了


部分同意現在最高票的答案。

同意的部分在於:我也對現在公開課圈子過於娛樂化,簡單化,忽悠圈地的行為有所不滿。簡單的課自己找個樂子就夠了,出去說是會被打臉的。

不同意的部分在於:公開課也能找到滿滿乾貨的內容。比如最高票答主所提的那幾個問題,大部分都能在如下這兩門課中找到答案:
機器學習技術
Convex Optimization

當然這樣的課總體上數量還比較少,有時候過了就不再開了。所以對於不是真正想學習的人來說,是很難注意到這樣的課程的。

最後還是贊同一下最高票答案。想學就從現在開始行動,要花費大量的時間,自己動手實現更多的方法,而不要妄想尋找捷徑。做技術的道路還是相對公平的,不花時間就不會有回報。


優達菌來簡單回答下,希望能幫到你。

對於數據挖掘,機器學習這樣的學科來說,如今市場上主要流行的是一些腳本語言,如Python和R。

這樣的腳本語言之所以流行,其中一重要原因就是在於其語法簡潔,易上手。對於有編程基礎的人來說,一兩天就可以把基礎的語法過一遍。對於新手來說,一周充分的學習時間也可以輕鬆拿下。再者,掌握一種編程語言,最好的方式就是多加練習,在項目中去提升自己的編碼能力。

如今網上有很多資源去學習Python以及R語言,並且有多種多樣基於這些語言的數據挖掘、機器學習課程。人工智慧是未來5年至20年的最熱門技術。人才得缺失是現如今最大的問題。

所以,從事人工智慧相關領域的工作在長遠角度來看也是非常有前景的工作。

還有個來自我們學員Flyaway Lin的不同角度的回答,希望也能幫到大家。

數據挖掘、機器學習等並不是必須要求有精通的編程能力,他們更多的是學習數學、演算法和解決問題的能力。

學習這些課程需要一定的編程能力,但不需要精通,甚至不需要熟練,只要具有一定的編程基礎就可以學習這些課程。

在以後的工作中,編程能力也不是衡量你的能力的標準,編程能力對一個計算機工作者來說是必須的,但不是評判優良的標準。

在工作中,編程也只是一個基本的工具,你們的工作價值並不局限在這裡,真正體現你們價值的是你們的思想,是你們解決問題的能力,所以你完全不必擔心編程能力在工作中的影響,那都是次要的。


感謝邀請。

其實我不是很明白樓主的問題?我覺得基礎的好與壞和你以後從事怎麼東西,並沒有任何關係

更多的是在於你自己的興趣在哪裡?

比如你喜歡移動開發,就先學JAVA或者OBJECTIVE-C或者SWIFT。
比如你喜歡前端,就多看下HTML, CSS這類的。

另外,作為過來人,希望樓主能夠放平心態,既然知道自己的代碼寫得很少,那麼就先好好鞏固基礎,與其在這裡自怨自艾,何不從現在開始努力呢?

要知道,努力永遠不會晚

加油


說到現在做機器學習的人編程都好厲害的樣子


我本人是數學系出生。數學要求就不提了,現在演算法哪有不用數學的。最起碼概率論,隨機過程,凸優化這些你得懂一些,基本機器學慣用這幾個領域的東西比較多。尤其是凸優化(非凸的也要懂一些),這東西不會,寫出能量函數都不知道怎麼優化就有點尷尬了。深度學習算數學用得少的不過(所以我個人對深度學習興趣其實不是很大,雖然我也用。沒有理論支撐的東西我不喜歡,最近有人用Mallat小波分解那套東西解釋深度學習不過)。機器學習對編程能力要求也挺高的,至少你要比較精通C/C++,還要會寫一些圖像處理的演算法,畢竟機器學習一大應用就是CV。幾千行代碼那確實是有點少了,我覺得你最起碼要有個幾萬行這樣的。而且你最好做過跨平台開發,會多核心/GPU編程這樣的。3年時間算起來夠的,3年只要你抓緊點(其實也不用特別抓緊,每天保證幹活8個小時就行了),人不蠢,出來又懂數學又懂計算機又有編程經驗並不是一件很難的事情。講白了一天幾百行代碼,幾萬行也就幾個月的事情。我一個數學系出來的3年都不止寫了幾萬行代碼了。

之前有人提到看公開課,我真覺得公開課有點不靠譜。一個人打算搞某個領域還去看科普視頻嗎?科普是給不搞這個領域的人看的,比如我不搞物理研究的去看看量子力學的公開課提升一下物理科普素養,那還成。你想搞這一塊我個人認為可以從這一塊專業的教材入手。先去看看經典的教材,比如SVM有一本很薄的中文名字叫什麼SVM導論還是什麼的,雖然講的不深,但是比公開課還是靠譜得多。基礎打紮實了,如果你想繼續做,那可以多看一些論文。每年的CVPR,NIPS,ICML這些會議的論文,oral的挑出來讀一讀就可以了,了解行業最新動向,好玩的實現一下,久而久之,水平自然就起來了。


我覺得任何一個領域都是這樣:做到頂尖極難,但入門還是不難的。尤其對於一個計算機背景學生來說。

對於要從事機器學習方面的工作,你可能只需要掌握:

-- 機器學習演算法的基本原理;

-- 統計學基本原理;

-- sql

-- 一門趁手的語言(R/python)

-- linux基本操作

-- 遇到問題能找到解決思路

無他,唯手熟爾。

當然,編程不是很好,只能加強了。


對數據感興趣的小夥伴,歡迎交流,微信公共號:一白侃數


多寫代碼。如果你認為從事這方面的工作就能夠掩蓋你代碼弱的事實。那就是不靠譜的。其他的謝科說的都有道理。ml.也好dm.也好,運用的本質都是編程。


看題主的個人定位吧:

自從38歲重新出來工作以後,發現一個規律:在二線城市,月薪2萬以下的程序員,基本上,只要能把自己工作中遇到的問題用更通用的形式描述出來,會用百度和必應,就能完成任務了 -- 如果您遇到的問題在網上搜不到,那說明您的工資應該超過2萬。

這個規律似乎和問題所屬的領域無關,列舉下這三年做過的工作:
Fortran66程序轉C++,手寫了個狀態機處理細節。

智能家電App的服務端,用cppnetlib庫做web服務,基本就是個改例子搜問題的活 -- 話說,實現了這個功能後,我對用C++實現業務功能持反對態度。

人力資源和大數據結合,各種演算法sk-learn、Networkx都實現了,對我來說,這部分工作甚至比做前端開發還容易【項目預算不足,沒有專職的前端,只好自己寫web界面】。
--上面這些活,都是會搜索就能完成任務。
有些人拿超過2萬的工資是有道理的,比如,有個建模的問題項目組一個月還沒找到用戶滿意的方案,技術總監過來20分鐘就解決了。


先把你的專業撿起來,如果考慮數據挖掘,建議你掌握C++和Java


推薦閱讀:

為什麼有些驗證碼看起來很容易但是沒人做自動識別的?
用 Linux 真的能學到很多平台無關的東西嗎?
國內人寫代碼的水平跟美國的差距在哪?
為什麼說讀代碼比寫代碼難?
是什麼阻礙了代碼的重用?問題是否應該只解決一次即可?

TAG:數據挖掘 | 編程 | 機器學習 |