python機器學習《回歸 一》


 

嘮嗑嘮嗑
依舊是每一次隨便講兩句生活小事。表示最近有點懶,可能是快要考試的原因,外加這兩天都有筆試和各種面試,讓心情變得沒那么安靜的敲代碼,沒那么安靜的學習算法。搞得第一次和技術總監聊天的時候都不太懂裝飾器這個東東,甚至不知道函數式編程是啥;昨天跟另外一個經理聊天的時候也是沒能把自己學習的算法很好的表達出來,真是飽暖思**啊。額,好像用詞不當,反正就是人的腦袋除了想着吃肉還要多運動運動,幸好的是每天晚上的瑜伽能夠讓自己足夠沉下心來冷靜冷靜。回想起當初的各種面試,現在的自己毫無疑問能夠很好的表達那些問題,但是很多時候貴在反應速度,所以自己雖然反應不遲鈍,但是回答的不完美也是平時沒有反復鞏固知識的結果,不扯了,寫筆記咯。

 

接着上一篇文章python機器學習《入門》

 

正文:
在前面的入門文章中主要介紹了機器學習任務重的兩個算法:監督學習和非監督學習。其中,在監督學習中最重要的兩個東西分別是回歸和分類預測。這里,我們主要講回歸預測。上一節中,估計很多人看到一大堆文字描述就很頭疼,表示這一節會盡量以例子講解,其中例子的實現也是python編程求得結果哦。下一篇的文章將會具體的實現一個數據的爬取、分析以及訓練最終預測流程。

 

1、回歸的來源
“回歸”這一詞的是達爾文的表兄弟發明的(天才都一家去了),話說這個表兄弟一開始是利用豌豆種子(雙親)來預測下一代的尺寸,后來就發現有一些規律可循,因此就觀察到人類的遺傳上面,發現如果雙親的身高比平均高度高的話,子女的身高也傾向於較高的高度,但不會超過雙親(話說這句話在我身邊完美體現,害我苦惱為啥是家里最矮的)。這種現象即孩子的高度向着平均身高回退(回歸)。雖然說數值預測與回退現象關系不是很大,但是人家是達爾文的表兄弟,所以就引用了人家的指定學術用名啦~

 

上一節我們講到的房價月預測問題,實際上就是輸入變量“房價”x並映射輸出到一個連續的預期結果函數f(x)中。具體來說,假設我們有這么一群數據組合(x(i),y(i));其中i=1,...,m;也就是一共有m個數據組合樣本,現在借助《機器學習實戰》這本書給出的數據ex0.zip文件來實現該數據集的回歸預測。

 

一、首先,在附件中下載並打開數據文件ex0.txt,觀察到:

 

 

  • 數據中的第一列都是1,那么很明顯我們可以將后面的兩列作為x,y值,雖然目前並不知道這些數據在實際應用中的名稱。
  • 所有的數據(列與列之間)的間隔都是tab符號分割,每一個樣本數據各占一行,這方便我們后期的數據讀取。

 

好的,分析數據,最方便的方式就是可視化數據,那么畫個圖看看數據的趨勢如何:

 

1.1 准備數據:使用Python從文本文件中導入數據

 

創建名為“reg.py”文件,本節所有的代碼都保存在該文件中;在畫圖之前,我們需要將准備一下,步驟包括:讀取數據,將數據解析保存到矩陣中。代碼如下:

 1 # coding=utf-8
 2 __author__ = 'wing1995'
 3 
 4 
 5 from numpy import *
 6 
 7 
 8 
 9 def file2matrix(filename):
10   f = open(filename)
11   contents = f.readlines()
12   length = len(contents) # 得到文件內容的行數
13   Mat = zeros((length, 3)) # 創建一個空矩陣用於存儲文件內容
14   index = 0
15   for line in contents:
16     line = line.strip() # 去除每一行的換行符
17     data = line.split('\t')
18     Mat[index, :] = data # 將每一列數據按照行索引存放到空矩陣
19     index += 1
20 return mat(Mat)

好的,現在你有了矩陣,可以通過任何方式索引矩陣,例如索引第二列數據:

1 data_file = "C:\Users\wing1995\Desktop\machinelearninginaction\Ch08\ex0.txt"
2 dataMat = file2matrix(data_file)
3 print dataMat[:, 1]

 

ps:關於數據中的第一列數據為啥全是1后面會講到,它屬於默認的特征值x0。

 

1.2 分析數據:使用Matplotlib創建散點圖

 

主要繪圖用到了以下函數:

 

繪制用基本函數:plt.scatter(),plt.plot(),plt.bar()
自定義軸和標題函數:plt.xlabel(),plt.ylabel(),plt.title()
基本圖形顯示,清除函數:plt.show(),plt.clf()

 

具體函數的畫法可以通過“help”命令查看,基礎知識這里就不再贅述,直接在“reg.py”文件中添加畫圖函數:

1 def my_scatter(dataMat):
2   x = dataMat[:, 1]
3   y = dataMat[:, 2]
4   plt.xlabel('x')
5   plt.ylabel('y')
6   plt.scatter(x, y)
7   plt.show()

 

效果圖如下:

 

可以很明顯的看得出來圖片呈現上升的趨勢,而且如果想用一條線來擬合該趨勢的話,應該是一條直線。因此,我們給出擬合曲線的“假設函數”:

 

所謂的擬合,就是嘗試建立並調用函數h(x),讓輸入數據x映射到輸出結果y。
以上樣本有點大,舉個小例子:

 

現在,隨機猜測假設函數的兩個參數theta0=2和theta1=2,此時假設函數h(x)=2+2*x。得到的映射結果如下:

 

這樣子是無法了解我們的假設函數是否能很好的預測y值。因此,有了“成本函數”這個概念。

 

成本函數J(theta):我們可以通過成本函數來衡量假設函數的精確度,這里的精度指的是預測值h(x)與真實值y之間的差值。由於樣本量往往是大於一個的,因此需要將樣本中的輸入值x依次代入到假設函數中得到的函數值與實際值y作比較求得樣本的預測誤差的平均值,具體公式如下:

 

作為學數學的人,看這個就無比熟悉,工科的童鞋可能看公式不太習慣。通俗來講,大家應該都知道平均值的定義,那么以上J(theta0,theta1)實際上就是1/2*M,這里的M就是誤差平方的均值。其中m是指m個樣本,例如上面表格中樣本數據的m=4。這個成本函數的另外一個名字或許更為大家所知——“平方誤差函數”或者“均方誤差”,這里的均值減半也是梯度下降算法的簡易實現,因為對平方求導得到的2會和這里的1/2抵消。還有一個問題是為啥當初設計誤差的人不直接講誤差正負抵消而要做平方也是我一直沒弄清的問題,上次研究圖像處理的混合互補模型ROF中也有這么一個誤差平方和的表示,導師問我為什么,我沒回答出來,只覺得是固定的定義而已,希望知道的朋友解釋一下。

 

有了這個成本函數,我們就可以根據上面的表格得出假設函數的擬合精度了,那么問題來了:前面的假設函數中theta值也是我們假設的,對於大樣本數據,我們主觀的給定theta的值很多時候擬合的精度都不夠高。如何求解這個最優theta得到擬合效果最好的假設函數?

 

梯度下降算法:現在我們有了假設函數以及衡量它的精度的方式(成本函數)。現在需要一個方法來改善我們的假設函數,該方法即梯度下降法。

 

1.3 用python畫個圖讓你們更好的理解這個代價函數J(theta)。
1.3.1 編程實現計算代價函數

 1 def computeCost(X, y, m, theta):
 2     pre = X*theta # 預測值
 3     s = 0
 4     for i in range(m):
 5         s += (pre[i] - y[i])**2
 6         J = 1/(2*m)*s # 代價函數
 7     return J
 8 
 9 
10 X = dataMat[:, 0:2]
11 y = dataMat[:, 2]
12 m = len(y) # 樣本數量
13 theta = zeros((2, 1)) # 初始化theta
14 iterations = 1500 # 迭代次數
15 
16 J = computeCost(X, y, m, theta)

 

上面的代碼已經很好的實現代價函數的算法,由於我們的初始化theta值為0,因此J的初始值也是0,接下來需要運用梯度下降算法計算theta0和theta1,因此先上一個coursera上面布置的作業里面我用matlab畫的圖(數據不一樣),后面貼python代碼實現該類型圖的畫法:

 

上圖是theta0和theta1在整個迭代過程中收斂到最佳假設函數的情況(J0—>J3)這個過程就是初始值theta0=theta1=0到最優值J3的多次迭代的結果,上圖的紅叉叉就是J(theta)的一個全局最優解的對應的最優theta的值。此時,成本最小,最能預測結果;講此時的theta代入到假設函數得到的假設函數正是我們需要的回歸函數,擬合度最高。

 

從J0走向J1的這個過程就是成本函數J(theta0, theta1)分別對theta0和theta1求偏導,例如從J0走向J1的斜率就是theta0和theta1的偏導,就好比人走下坡路,斜率就是選擇下坡的方向,角度;而theta0和theta1就是兩個同時下坡的小人,邁開的步伐的大小就是學習速度alpha。因此兩個小人能否走到坡底是由它們的初始位置(初始位置一半被初始化為0)和下坡的方向(偏導)以及下坡的步伐(學習速度alpha)所決定。

 

總的來說,梯度下降的公式為:
重復步驟,直至收斂:

 

哎呀,看官可能看累了,接下來都有考試,就先寫這么多,后面給出梯度下降算法的具體實現代碼~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM