學習神經網路、SVM等機器學習的知識,為了更好的投入到應用當中,用matlab還是c++好呢?


不應該按語言來選擇,而是看是否有很成熟的專業的庫。

Python 有非常流行的NumPy, SciPy, SymPy, Scikit-Learn 等庫,用來實現機器學習非常快捷。

Java有知名的Mahout, Weka

Scala有非常有名的Spark

綜上,Python, Java, Scala都是很不錯的選擇,按庫的豐富程度來,我會選擇 Python &> Scala &>Java. Scala排在Java前面,是因為Java的庫,Scala可以無縫調用,因此Java有多少庫那麼Scala就有多少庫,且Scala比Java更加具有表達力,寫出來的代碼非常簡潔優美,因此Scala優先於Java.

Matlab 不推薦,引用 余凱的微博: 一篇好文章,題目「Google"s Hybrid Approach to Research". 有一點建議特別想分享給有志於工業界發展的博士生們 - write production or near-production code from day one, do NOT use Matlab. http://weibo.com/1862459915/yFF9KwDj5

這裡是另一條反Matlab的微博:http://weibo.com/2496638594/BktUytySR

「重發一次:據說這是一個谷歌僱員關於Matlab的評論。我單位確實來過這樣的實習生,聲稱除了Matlab,其他語言都不會。但我們當時需要的是C++和Python,還有FORTRAN也行。結果此人混了一個夏天。」


如果是以後致力於投身工業界,建議還是基於C/C++建議自己的代碼庫,能夠在這個過程中提高自己Coding的水平,特別是抽象的能力。此外推薦可以搭配Python。後者有助於迅速實現演算法。僅就快速實現演算法而言,Matlab是一個很好的選擇,但是一般Matlab比較難形成產品級的代碼。


基本同意蒲江波的回答,補充幾句:

matlab自帶了神經網路的工具箱,svm也有libsvm這樣第三方提供的庫,所以作為學習/原型開發/研究用途的話,用matlab是更合適的。

實際上一般很少會自己獨立去開發這些演算法,許多語言都提供了相應的演算法庫,例如C++/Java/Python等都有。所以還是基於你自己的目的,去選擇相應的開發語言和工具——做研究那就matlab好了,做產品或項目那就根據需求和與其他部分的介面來選擇合適的語言和工具。


推薦python, 最近很多使用Matlab的實驗室都在轉用Python了,如果你對編程比較感興趣的話,學一下C++是很有幫助的,如果只是想熟悉一下演算法流程、公式推導,Python的抽象程度足夠了。對想學神經網路的人來說,學3、4門計算機編程語言,要求不高吧!

linux世界裡,社區community是軟體發展的重要力量,python社區近來比較火的原因有一部分就是因為緊跟科技界的發展,實時推出相關的應用包python:

機器學習包:http://scikit-learn.org/

深度學習包:http://deeplearning.net/software/pylearn2/

深度學習網站:http://deeplearning.net/

============半年過去了===================

我現在使用的是shogun,[github]shogun-toolbox/shogun · GitHub

介面是python,內核是C++,感覺挺好使,但也挺耗時的!不過現在上研期間時間也夠花,我就是愛寫寫代碼,以前理論知識太模糊,現在讀完代碼,清醒多了。


1 我的經驗是用Matlab,因為機器學習的難點是在理論,你學得心急如焚,火冒三丈的時候,哪有心情去調一個C++內存溢出。而且C++的語法沒有Matlab適合矩陣運算。最後就是貪多嚼不爛,兩樣都學不好。

2 我的實際情況供你參考,我是一個10多年的java程序員,研究生在英國念的人工智慧,Distinction 畢業,幾年前在網上重新看機器學習的課程溫習一遍,老師講解題目用octave(matlab)但是習題可以自己選語言。我有沒有用我精通的java語言去做習題?沒有,還是用octave寫的。為什麼?

舉個簡單的例子,你java程序寫好了,一對答案錯了,你看著自己的java程序和標準答案的matlab程序,以我的經驗我可以想像是非常難發現問題的,可能程序結構都不一樣,你怎麼比較? 有時候可能錯誤跟機器學習一點關係也沒有,完全是編程知識,可是如果你沒有幾年的編程經驗是很難快速發現問題的。比如java array index 從0開始,matlab matrix 從1開始,如果第一次學而不是真的做產品,完全沒有必要浪費時間在這上面。

3 理論搞懂了,翻譯成其他語言是不麻煩的,不就是數據導入導出,數學運算嗎?找到合適的lib,3天包會。

4 最近開始用java寫了,分享一些經驗,首先需要一個線性代數的庫(lib),然後要plot的庫,如果讀取matlab的數據,還需要一個專門的庫。這三個是主要的,其他小功能自己寫一些util方法都可以搞定,然後基本可以開始寫machine learning的部分,神經網路部分back propagation需要線性代數和鏈式求導的知識,SVM 還沒開始寫。感覺離產品級別的代碼還很遠,性能估計不行,用的庫是否合適(性能,版權)也不確定,一個人也沒時間寫一堆演算法。


我目前主要是從事NLP和神經網路相關開發。

兩者都應該學習,理由如下:

1. matlab語法簡單,矩陣計算優化好,文獻中有很多程序都是用matlab寫的。如果想要製作產品原型,或者閱讀別人的代碼,學習matlab都是很好的途徑。另外matlab也很好學,做幾個習題基本的方法就能學會了。

2. C++運算速度快,應用面廣,在計算量大的時候可以考慮使用C++作為產品開發的語言。可以配合一些優化較好的矩陣庫,比如Eigen。我在我的電腦(Phenom X4 + ddr2 8G + ubuntu 12.04)上benchmark過矩陣運算的速度,大致如下:

Matlab &<= C++Eigen優化 &< C++ Eigen &< C++ for循環優化 &< Numpy &< C++ for循環

編譯的時候用了-O3 -march=native之後,Eigen的運算速度比matlab要慢一點點。如果使用並行的話C++Eigen優化後的速度還是相當驚人的。

3. 產品用C++而不是matlab的另一個考慮是內存問題。Matlab的程序太吃內存,而C++可以很好的控制內存。

4. 計算量大的情況下,如非常深的RNN,不推薦用Python+numpy,運算速度太慢了,如果C++不熟練,不如直接用matlab寫,寫得快,算得快。python位於C++和matlab之間,在運算量大的情況下(比如需要連續運算超過一天時間)還是比較尷尬的。

5. 推薦將程序並行化,現在cpu都是多核的,如果是順序編程,有很多計算能力都閑置了。在ubuntu下可以用system monitor看看幾個核的使用情況。


為啥不用weka? (Weka 3 - Data Mining with Open Source Machine Learning Software in Java)

莫非樓主想自己寫神經網路、SVM等training優化/inference演算法?如果你真的有能力寫的話,應該都是C++,考慮到模型計算的計算複雜度,C++是不二之選。

俺們做NLP的無非用python寫寫自定義的特徵提取演算法。提取好特徵之後然後再交給現成的機器學習庫。當然如果用weka的話,有時候連特徵提取演算法都不用自己寫了


當你選擇放棄做生產任務時(產品級代碼,上線運行,實時預測,等等),應選擇matlab

當你選擇從事做生產任務時,應選擇c++

但通常是兼而有之,所以C++必須(盡量接近)精通,按照目前的趨勢,還應該掌握cuda,因為cpu,實在是太慢了,我本人是無法接受用cpu來跑大型演算法的。而matlab需要能看懂,這是為了方便理解別人寫的實驗室代碼。

python也是一種折衷的選擇,但並不推薦,因為做實驗不如matlab,做產品不如c++,雖然把兩者各自的缺點中和掉了,但優點也被中和掉了,那些庫像numpy、scipy,看起來很厲害很好用(確實是比較方便),但遇上大計算量還是只能做原型。當然這你的項目要是能拿原型系統就扛得住也沒話說。同樣,需要學一些python語法以看懂別人寫的代碼。

至於上面說「理論搞懂了,翻譯成其他語言是不麻煩的,不就是數據導入導出,數學運算嗎?找到合適的lib,3天包會。」這樣的答案,我只能用一個典故來評論,「天下姓字夥矣,奈何姓萬?自晨起至今,才完五百畫也」


我覺得實際應用,當然還是C++強於matlab。不過,對於新手,理解理論更重要。matlab可以方便快速學習和了解。

我平時都用腳本多一些,matlab, python, R。當然,有部分原因可能是我C++學得比較紮實,對我來說理解了原理之後寫個演算法,分分鐘的事兒(除了需要複雜數據結構的)。

我建議也是先從方便的腳本學起,最好是周圍大家都會的東西。應用當你在基本方面掌握差不多的時候,再搞C/C++之類的。

不過我學習從來也不按照什麼最優套路來,基本想的都會嘗試。有的也不知不覺學會了。


為啥不用python


我一般是Matlab做演算法驗證,做實驗,演算法成熟了 ,在用C/C++實現。用C/C++實現過了,你會對演算法理解特別深刻,基本上閉上眼睛,流程都在腦海里,因為你已經調試很多遍了,不熟悉調不通啊!!!!Python絕對好東西,我也學了,無奈用的少,老是忘。


理論學習階段用matlab,簡單快速有效。

同時,可以去學c++的基礎。

到了一定的境界,就可以自己用c++寫機器學習演算法了。

做實際應用時,c++比matlab使用更廣泛。


學習階段的話,就用matlab吧,它處理矩陣的能力太強大勒,而且易上手,有時候機器學習中科學演算法比如pca,它的函數都是現成的。學習你可以先懂它的原理,看看實現出來是什麼樣子。這樣有一些先驗經驗。以後用c++什麼的再說把。


Matlab用來快速實現一個模型或者演算法,大部分用在科研實踐中;工業界的話還是看語言是否對matrix運算有很好的支持,比如numpy,scipy就是Python中的常用的庫


首先我也很贊同蒲江波的回答。個人理解,matlab適合做學術研究,快速實現演算法,因為matlab本身就是弱語言類型的,重在測試idea的可行性,但是要形成產品幾乎不可能;要做應用或者產品的話必然是C/C++,而且如果是應用在實際設備上的演算法,一般就是linux C/C++。另外一些開源庫和工具也是挺不錯的選擇。最近在做產品上的機器視覺演算法,對於這一點深有體會。


java


實在不懂那些老是批評matlab慢的人是什麼心態,一樣的LAPACK庫,或者是MKL庫。自己在matlab裡面寫for循環的是什麼精神。

當然做產品會用C++,我想一個是基於對版權的考慮,考慮到用C++不依賴於matlab的runtime。還有C++對於非線性代數的操作自由度要大得多。

就題主的這種情況,當然是matlab沒跑。神經網路matlab有一個deep learning toolbox,可以幫你從零開始學習deep learning。什麼,你要學教材上那種只有一層Hidden Layer的神經網路?那種已經死掉的東西有什麼好學的。

SVM,台灣的組有LibSVM和LibLinear,有各種語言的介面。matlab的介面極其好用,簡直就是turn key solution.

當然,你也可以試試python,祝你不要迷失在package的汪洋大海里。


C++。從可移植性和速度上考慮。


我覺得是C++或Java


C#行不行?請教大牛們


推薦閱讀:

在數據量不足的情況下,用哪種數據挖掘模型效果會更好?
機器學習or電子,我該選哪個?
想從事大數據、海量數據處理相關的工作,如何自學打基礎?
PHP或者python進行數據採集和分析,有什麼比較成熟的框架?
超級菜鳥怎麼學習數據分析?

TAG:人工智慧 | 數據挖掘 | 數據分析 | 機器學習 | 神經網路 |