摘要 : 本文講述瞭如何用Python實現Andrew Ng經典機器學習課程。
幾個月前,我在Coursera(免費大型公開在線課程項目)上完成Andrew Ng機器學習的MOOC教學。對於任何一個想進入人工智能和機器學習世界的人來說,這都是一個很好的入門課程,但其中的項目是用Octave語言編寫的。我一直想知道這門課如果用Python的話該有多麼神奇,最終我決定重做一遍,這次用Python來完成。
在這一系列的博文中,我打算用Python編寫程序。這麼做有以下幾個原因:
1、這會幫助那些想要Python版本課程的人;
2.、對於有些R語言愛好者來說,他們也願意學習熟悉的那些算法的Python實現,那會受益匪淺;
基礎知識
強烈建議你先看第1周的視頻講座,之後就應該對Python的體系結構有基本的瞭解。
在這一節中,我們將研究最簡單的機器學習算法。
僅有一個變量的線性迴歸
首先是關於場景的描述。在這裡,我們將僅用一個變量來執行線性迴歸以預測一個食品貨車的收益。假設你是一家餐廳的CEO,正在考慮在每個不同的城市開設一家分店,並且在各個城市都有貨車,你可以從這些分店獲得收益和顧客的相關數據。
ex1data1.txt文件包含了我們線性迴歸練習的數據集。第一列表示城市的人口,第二列是該城市的食品貨車的收益。如果收益為負則表示虧損。
首先,與執行任何機器學習任務一樣,我們需要導入一些庫
讀取數據並進行可視化
在開始任何任務之前,通過可視化數據來理解數據通常來說是非常有用的。對於這個數據集,可以利用散點圖來可視化數據,然而它只有兩個屬性(收益和用戶)。
(在現實生活中我們遇到的許多問題都是多維的,不能僅僅用二維圖來表示。要創建多維的表達方式,必須要靈活地運用各種表現形式,如色彩、形狀、深度等。)
這裡我們使用了pandas的read_csv函數來讀取以逗號分隔的一組值。此外,我們還使用了head函數來查看數據的前幾行。
添加攔截項
在下面的代碼中,我們給數據添加另一個維度以適應攔截項(這麼做的原因已在視頻中進行了解釋)。我們還將參數theta初始化為0,並把學習率alpha初始化為0.01。
使用np.newaxis可以將一維數組(shape: N elements)轉換為行向量(shape: N rows, 1 column)或列向量(shape: 1 row, N columns)。在這裡,我們將X和y重新排列到列向量裡。
下一步,我們將計算成本和梯度下降,Andrew Ng在視頻講座中很好地講解了這一操作過程。這裡我僅提供Andrew Ng在講座中使用的基於Python的偽代碼。
成本計算
你應該期望看到成本的計算結果是32.07。
用梯度下降法求最優參數
期望的theta值的範圍是[-3.6303, 1.1664]。
我們現在有了優化的theta值,利用上面的theta值來計算:
上面的輸出應該會給你一個比32.07更好的結果:4.483。
繪製最佳擬合線圖
讓我們用擴展線性迴歸的思路來處理多個獨立的變量。
多元線性迴歸
情景描述:
假設你正在出售房子,你想知道近期比較好的市場價格。一個方式是首先收集最近房子買賣的信息,並創建一個房子價格模型。你的任務是基於其它的變量來預測房價:
文件ex1data2.txt包含一組俄勒岡州波特蘭市的房子價格數據。第一列是房子的面積,第二列是臥室的數量,第三列是房子的價格。
在前一節中你已經創建了必要的基礎環境,這些基礎環境也可以很方便地應用在本節中。在這裡,將使用我們在上一節中所給的公式進行計算。
正如在上面看到的那樣,我們正在處理的不止是一個獨立變量(你在前一節中所學習的概念也適用於這裡)。
特徵標準化
通過觀察這些數據,我們注意到房子的面積大約是臥室數量的1000倍。當特徵量級不同的時候,首先執行特徵比例縮放操作可以使梯度下降收斂地更快。
我們的任務是:
· 從數據集中減去每個特徵的平均值;
· 在減去平均值之後,再按各自的“標準偏差”縮放(分配)特徵值;
增加攔截項和初始化參數
成本計算
你應該期望看到一個輸出的成本是65591548106.45744。
用梯度下降法求最優參數
你的最優參數應該是 [[334302.06399328],[ 99411.44947359], [3267.01285407]]。
我們現在有了優化過的theta值,使用上面輸出的theta值。
這應該會輸出一個比65591548106.45744好很多的值:2105448288.6292474。
現在你已經學會如何用一個或多個獨立變量執行線性迴歸了。
阿里云云棲社區 組織翻譯。
文章原標題《Python Implementation of Andrew Ng’s Machine Learning Course (Part1)》
閱讀更多 雲棲社區 的文章