【机器学习算法专题(蓄力计划)】十三、机器学习中线性回归
文章目錄
- 線性回歸
- 什么是線性回歸
- 線性回歸要解決什么問題
- 線性回歸的一般模型
- 回歸的經驗誤差
- 如何使用模型
- 模型計算
- 過擬合與欠擬合(underfitting and overfitting)
- 解決方法
- Code(源碼實現)
- 簡單線性回歸(最小二乘法)
- 線性回歸(梯度下降法)
線性回歸
什么是線性回歸
我們首先用弄清楚什么是線性,什么是非線性。
-
線性:兩個變量之間的關系是一次函數關系的——圖象是直線,叫做線性。
注意:題目的線性是指廣義的線性,也就是數據與數據之間的關系。
-
非線性:兩個變量之間的關系不是一次函數關系的——圖象不是直線,叫做非線性。
相信通過以上兩個概念大家已經很清楚了,其次我們經常說的回歸回歸到底是什么意思呢。
- 回歸:人們在測量事物的時候因為客觀條件所限,求得的都是測量值,而不是事物真實的值,為了能夠得到真實值,無限次的進行測量,最后通過這些測量數據計算回歸到真實值,這就是回歸的由來。
通俗的說就是用一個函數去逼近這個真實值,那又有人問了,線性回歸不是用來做預測嗎?是的,通過大量的數據我們是可以預測到真實值的。
線性回歸要解決什么問題
對大量的觀測數據進行處理,從而得到比較符合事物內部規律的數學表達式。也就是說尋找到數據與數據之間的規律所在,從而就可以模擬出結果,也就是對結果進行預測。解決的就是通過已知的數據得到未知的結果。例如:對房價的預測、判斷信用評價、電影票房預估等。
線性回歸的一般模型
大家看上面圖片,圖片上有很多個小點點,通過這些小點點我們很難預測當x值=某個值時,y的值是多少,我們無法得知,所以,數學家是很聰明的,是否能夠找到一條直線來描述這些點的趨勢或者分布呢?答案是肯定的。
假設數據就是x,結果是y,那中間的模型其實就是一個方程,這是一種片面的解釋,但有助于我們去理解模型到底是個什么東西。以前在學校的時候總是不理解數學建模比賽到底在做些什么,現在理解了,是從題目給的數據中找到數據與數據之間的關系,建立數學方程模型,得到結果解決現實問題。其實是和機器學習中的模型是一樣的意思。那么線性回歸的一般模型是什么呢?
模型神秘的面紗已經被我們揭開了,就是以上這個公式,不要被公式嚇到,只要知道模型長什么樣就行了。假設i=0,表示的是一元一次方程,是穿過坐標系中原點的一條直線,以此類推。
回歸的經驗誤差
數據集D中所有點與該直線的誤差加起來,再進行算術平均就是該直線在數據集D上的經驗誤差:
R^D(h)=1∣D∣∑i(yi?h(xi))2=1∣D∣∑i(yi?(w?xi+b))2\hat{R}_D(h) =\frac{1}{|D|}\sum_{i}\Big(y_i-h(x_i)\Big)^2=\frac{1}{|D|}\sum_{i}\Big(y_i-(\boldsymbol{w}\cdot\boldsymbol{x_i}+b)\Big)^2R^D?(h)=∣D∣1?∑i?(yi??h(xi?))2=∣D∣1?∑i?(yi??(w?xi?+b))2
其中|D|表示該數據集的大小。
根據經驗誤差最小原則,只需要求出使得該經驗誤差函數取得最小值的w^和b^\hat{\boldsymbol{w}}和\hatw^和b^:
w^,b^=*?argminw,bR^D(h)\hat{\boldsymbol{w}},\hat=\operatorname*{argmin}_{\boldsymbol{w},b}\hat{R}_D(h)w^,b^=*argminw,b?R^D?(h)
如何使用模型
我們知道x是已知條件,通過公式求出y。已知條件其實就是我們的數據,以預測房價的案例來說明:
上圖給出的是某個地區房價的一些相關信息,有日期、房間數、建筑面積、房屋評分等特征,表里頭的數據就是我們要的x1、x2、x3……… 自然的表中的price列就是房屋的價格,也就是y?,F在需要求的就是theta的值了,后續步驟都需要依賴計算機來訓練求解。
模型計算
當然,這些計算雖然復雜,但python庫中有現成的函數直接調用就可以求解。我們為了理解內部的計算原理,就需要一步一步的來剖析計算過程。
為了容易理解模型,假設該模型是一元一次函數,我們把一組數據x和y帶入模型中,會得到如下圖所示線段。
是不是覺得這條直線擬合得不夠好?顯然最好的效果應該是這條直線穿過所有的點才是,需要對模型進行優化,這里我們要引入一個概念。
- 損失函數:是用來估量你模型的預測值 f(x)與真實值 YY 的不一致程度,損失函數越小,模型的效果就越好。
不要看公式很復雜,其實就是一句話,(預測值-真實值)的平法和的平均值,換句話說就是點到直線距離和最小。用一幅圖來表示:
解釋:一開始損失函數是比較大的,但隨著直線的不斷變化(模型不斷訓練),損失函數會越來越小,從而達到極小值點,也就是我們要得到的最終模型。
這種方法我們統稱為梯度下降法。隨著模型的不斷訓練,損失函數的梯度越來越平,直至極小值點,點到直線的距離和最小,所以這條直線就會經過所有的點,這就是我們要求的模型(函數)。
以此類推,高維的線性回歸模型也是一樣的,利用梯度下降法優化模型,尋找極值點,這就是模型訓練的過程。
過擬合與欠擬合(underfitting and overfitting)
在機器學習模型訓練當中,模型的泛化能力越強,就越能說明這個模型表現很好。什么是模型的泛化能力?
- 模型的泛化能力:機器學習模型學習到的概念在它處于學習的過程中時模型沒有遇見過的樣本時候的表現。
模型的泛化能力直接導致了模型會過擬合與欠擬合的情況。讓我們來看看一下情況:
我們的目標是要實現點到直線的平方和最小,那通過以上圖示顯然可以看出中間那幅圖的擬合程度很好,最左邊的情況屬于欠擬合,最右邊的情況屬于過擬合。
- 欠擬合:訓練集的預測值,與訓練集的真實值有不少的誤差,稱之為欠擬合。
- 過擬合:訓練集的預測值,完全貼合訓練集的真實值,稱之為過擬合。
欠擬合已經很明白了,就是誤差比較大,而過擬合呢是訓練集上表現得很好,換一批數據進行預測結果就很不理想了,泛化泛化說的就是一個通用性。
解決方法
使用正則化項,也就是給梯度下降公式加上一個參數,即:
加入這個正則化項好處:
- 控制參數幅度,不讓模型“無法無天”。
- 限制參數搜索空間
- 解決欠擬合與過擬合的問題。
Code(源碼實現)
簡單線性回歸(最小二乘法)
### 0.引入依賴 import numpy as np import matplotlib.pyplot as plt ### 1.導入數據(data.csv) points = np.genfromtxt( "data.csv", delimiter="," ) # points# 提取points里面的兩列數據為X,Y x = points[:, 0] y = points[:, 1]# 調用plt畫出散點圖 plt.scatter( x, y ) plt.show() ### 2.定義損失函數(損失函數是系數的函數,傳入數據) def compute_cost( w, b, points ):total_cost = 0M = len( points )# 逐點計算平方損失誤差,然后求平均值for i in range( M ):x = points[i, 0]y = points[i, 1]total_cost += ( y - w * x -b ) ** 2return total_cost / M### 3.定義算法擬合函數#先定義一個求平均值的函數 def average( data ):sum = 0num = len( data )for i in range( num ):sum += data[i]return sum / num# 定義核心擬合函數 def fit( points ):M = len( points )x_bar = average( points[:, 0] )sum_yx = 0sum_x2 = 0 sum_delta = 0for i in range( M ):x = points[i, 0]y = points[i, 1]sum_yx += y * ( x - x_bar )sum_x2 += x ** 2# 根據公式計算ww = sum_yx / ( sum_x2 - M *( x_bar**2 ) )for i in range( M ):x = points[i, 0]y = points[i, 1]sum_delta += ( y - w * x )b = sum_delta / Mreturn w, b### 4.測試 w, b = fit(points)print("w is :", w) print("b is :", b)cost = compute_cost(w, b, points)print("cost is :", cost) ### 5.畫出擬合曲線 plt.scatter(x, y) # 針對每一個x,計算預測的y之 pred_y = w * x + b plt.plot(x, pred_y, c = "r") plt.show()線性回歸(梯度下降法)
### 0.引入依賴 import numpy as np import matplotlib.pyplot as plt### 1.導入數據(data.csv) points = np.genfromtxt( "data.csv", delimiter="," ) # points# 提取points里面的兩列數據為X,Y x = points[:, 0] y = points[:, 1]# 調用plt畫出散點圖 plt.scatter( x, y ) plt.show() ### 2.定義損失函數(損失函數是系數的函數,傳入數據) def compute_cost( w, b, points ):total_cost = 0M = len( points )# 逐點計算平方損失誤差,然后求平均值for i in range( M ):x = points[i, 0]y = points[i, 1]total_cost += ( y - w * x -b ) ** 2return total_cost / M### 3.定義模型的超參數 alpha = 0.0001 initial_w = 0 initial_b = 0 num_iter = 10### 4.定義核心梯度下降算法函數 def grad_desc(points, initial_w, initial_b, alpha, num_iter):w = initial_wb = initial_b# 定義一個list保存所有的損失函數值,用來顯示下降的過程cost_list = []for i in range(num_iter):cost_list.append( compute_cost(w, b, points) )w, b = step_grad_desc( w, b, alpha, points )return [w, b, cost_list]def step_grad_desc( current_w, current_b, alpha, points ):sum_grad_w = 0sum_grad_b = 0M = len(points)# 對每個點,代入公式求和for i in range(M):x = points[i, 0]y = points[i, 1]sum_grad_w += ( current_w * x + current_b - y ) * xsum_grad_b += current_w * x + current_b - y# 用公式求當前梯度grad_w = 2/M * sum_grad_wgrad_b = 2/M * sum_grad_b# 梯度下降,更新當前的w和bupdated_w = current_w - alpha * grad_wupdated_b = current_b - alpha * grad_breturn updated_w, updated_b### 5.測試,運行梯度下降算法,計算最優的w和b w, b, cost_list = grad_desc( points, initial_w, initial_b, alpha, num_iter )print("w is: ", w) print("b is: ", b)cost = compute_cost(w, b, points)print("cost is: ", cost)plt.plot(cost_list) plt.show() ### 繪制擬合曲線 plt.scatter(x, y) # 針對每一個x,計算出預測的y值 pred_y = w * x + bplt.plot(x, pred_y, c='r') plt.show()總結
以上是生活随笔為你收集整理的【机器学习算法专题(蓄力计划)】十三、机器学习中线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部队开除会影响孩子报考警校吗
- 下一篇: 【机器学习算法专题(蓄力计划)】十四、机