BAT機器學習面試1000題系列(66-70題)
66.說說共軛梯度法 @wtq1993,http://blog.csdn.net/wtq1993/article/details/51607040
共軛梯度法是介於梯度下降法(最速下降法)與牛頓法之間的一個方法,它僅需利用一階導數信息,但克服了梯度下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hessian矩陣並求逆的缺點,共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的演算法之一。在各種優化演算法中,共軛梯度法是非常重要的一種。其優點是所需存儲量小,具有逐步收斂性,穩定性高,而且不需要任何外來參數。下圖為共軛梯度法和梯度下降法搜索最優解的路徑對比示意圖:
註:綠色為梯度下降法,紅色代表共軛梯度法
67.對所有優化問題來說, 有沒有可能找到比現在已知演算法更好的演算法? @抽象猴,來源:https://www.zhihu.com/question/41233373/answer/145404190
沒有免費的午餐定理: 對於訓練樣本(黑點),不同的演算法A/B在不同的測試樣本(白點)中有不同的表現,這表示:對於一個學習演算法A,若它在某些問題上比學習演算法 B更好,則必然存在一些問題,在那裡B比A好。
也就是說:對於所有問題,無論學習演算法A多聰明,學習演算法 B多笨拙,它們的期望性能相同。 但是:沒有免費午餐定力假設所有問題出現幾率相同,實際應用中,不同的場景,會有不同的問題分布,所以,在優化演算法時,針對具體問題進行分析,是演算法優化的核心所在。68.什麼最小二乘法?
我們口頭中經常說:一般來說,平均來說。如平均來說,不吸煙的健康優於吸煙者,之所以要加「平均」二字,是因為凡事皆有例外,總存在某個特別的人他吸煙但由於經常鍛煉所以他的健康狀況可能會優於他身邊不吸煙的朋友。而最小二乘法的一個最簡單的例子便是算術平均。
最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和為最小。用函數表示為:
使誤差「所謂誤差,當然是觀察值與實際真實值的差量」平方和達到最小以尋求估計值的方法,就叫做最小二乘法,用最小二乘法得到的估計,叫做最小二乘估計。當然,取平方和作為目標函數只是眾多可取的方法之一。
最小二乘法的一般形式可表示為:
有效的最小二乘法是勒讓德在 1805 年發表的,基本思想就是認為測量中有誤差,所以所有方程的累積誤差為
我們求解出導致累積誤差最小的參數即可:
勒讓德在論文中對最小二乘法的優良性做了幾點說明:
- 最小二乘使得誤差平方和最小,並在各個方程的誤差之間建立了一種平衡,從而防止某一個極端誤差取得支配地位
- 計算中只要求偏導後求解線性方程組,計算過程明確便捷
- 最小二乘可以導出算術平均值作為估計值
對於最後一點,從統計學的角度來看是很重要的一個性質。推理如下:假設真值為 θ, x1,?,xn為n次測量值, 每次測量的誤差為ei=xi?θ,按最小二乘法,誤差累積為
求解
使
達到最小,正好是算術平均
。
由於算術平均是一個歷經考驗的方法,而以上的推理說明,算術平均是最小二乘的一個特例,所以從另一個角度說明了最小二乘方法的優良性,使我們對最小二乘法更加有信心。
最小二乘法發表之後很快得到了大家的認可接受,並迅速的在數據分析實踐中被廣泛使用。不過歷史上又有人把最小二乘法的發明歸功於高斯,這又是怎麼一回事呢。高斯在1809年也發表了最小二乘法,並且聲稱自己已經使用這個方法多年。高斯發明了小行星定位的數學方法,並在數據分析中使用最小二乘方法進行計算,準確的預測了穀神星的位置。
對了,最小二乘法跟SVM有什麼聯繫呢?請參見http://blog.csdn.net/v_july_v/article/details/762483769.看你T恤上印著:人生苦短,我用Python,你可否說說Python到底是什麼樣的語言?你可以比較其他技術或者語言來回答你的問題。 @David 9, http://nooverfit.com/wp/15%E4%B8%AA%E9%87%8D%E8%A6%81python%E9%9D%A2%E8%AF%95%E9%A2%98-%E6%B5%8B%E6%B5%8B%E4%BD%A0%E9%80%82%E4%B8%8D%E9%80%82%E5%90%88%E5%81%9Apython%EF%BC%9F/
這裡是一些關鍵點:Python是解釋型語言。這意味著不像C和其他語言,Python運行前不需要編譯。其他解釋型語言包括PHP和Ruby。
Python是動態類型的,這意味著你不需要在聲明變數時指定類型。你可以先定義x=111,然後 x=」I』m a string」。
Python是面向對象語言,所有允許定義類並且可以繼承和組合。Python沒有訪問訪問標識如在C++中的public, private, 這就非常信任程序員的素質,相信每個程序員都是「成人」了~
在Python中,函數是一等公民。這就意味著它們可以被賦值,從其他函數返回值,並且傳遞函數對象。類不是一等公民。
寫Python代碼很快,但是跑起來會比編譯型語言慢。幸運的是,Python允許使用C擴展寫程序,所以瓶頸可以得到處理。Numpy庫就是一個很好例子,因為很多代碼不是Python直接寫的,所以運行很快。
Python使用場景很多 – web應用開發、大數據應用、數據科學、人工智慧等等。它也經常被看做「膠水」語言,使得不同語言間可以銜接上。
Python能夠簡化工作 ,使得程序員能夠關心如何重寫代碼而不是詳細看一遍底層實現。
@July:Python目前早已成為AI時代的第一語言,為幫助大家更好的學習Python語言、數據分析、爬蟲等相關知識,七月在線特開一系列Python課程,有需要的親們可以看下,比如《Python數據分析集訓營》http://www.julyedu.com/weekend/python
70.Python是如何進行內存管理的? @Tom_junsong,來源:http://www.cnblogs.com/tom-gao/p/6645859.html
從三個方面來說,一對象的引用計數機制,二垃圾回收機制,三內存池機制一、對象的引用計數機制
Python內部使用引用計數,來保持追蹤內存中的對象,所有對象都有引用計數。引用計數增加的情況: 1,一個對象分配一個新名稱 2,將其放入一個容器中(如列表、元組或字典)引用計數減少的情況: 1,使用del語句對對象別名顯示的銷毀 2,引用超出作用域或被重新賦值 sys.getrefcount( )函數可以獲得對象的當前引用計數 多數情況下,引用計數比你猜測得要大得多。對於不可變數據(如數字和字元串),解釋器會在程序的不同部分共享內存,以便節約內存。二、垃圾回收
1,當一個對象的引用計數歸零時,它將被垃圾收集機制處理掉。 2,當兩個對象a和b相互引用時,del語句可以減少a和b的引用計數,並銷毀用於引用底層對象的名稱。然而由於每個對象都包含一個對其他對象的應用,因此引用計數不會歸零,對象也不會銷毀。(從而導致內存泄露)。為解決這一問題,解釋器會定期執行一個循環檢測器,搜索不可訪問對象的循環並刪除它們。三、內存池機制 Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統。 1,Pymalloc機制。為了加速Python的執行效率,Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放。 2,Python中所有小於256個位元組的對象都使用pymalloc實現的分配器,而大的對象則使用系統的malloc。 3,對於Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。也就是說如果你分配又釋放了大量的整數,用於緩存這些整數的內存就不能再分配給浮點數。推薦閱讀:
※最小均方誤差和最小二乘有什麼區別?
※矩陣轉換最優化怎麼求?
※你從未這樣理解矩陣----從新認識矩陣
※多元線性模型下的最小二乘法