線性回歸(Linear Regression)和最小二乘法(ordinary least squares)


下面是對Andrew Ng的CS229機器學習課程講義note1做的一部分筆記,按照自己的理解,對note1進行部分翻譯,英文水平和知識水平不夠,很多認識都不夠深刻或者正確,請大家不吝賜教!

一、基本知識

  作為“input”variables(在這個例子中是living area),也叫做input features(輸入特征),作為“output”或者target variables,我們將用來預測(price)。是一個training example,並且用來學習的dataset是m個training examples{,i=1,…m},叫做一個training set。注意,這里的右上角的“i”只是說明這個training dataset中的index而已,和exponentiation(求冪)無關。X=Y=R(X作為輸入空間,Y作為輸出空間)

  為了更好的描述監督學習的問題,我們的目標是,給定一個訓練集(training set),學習一個函數h:X->Y,因此h(x)對y而言是要一個好的predicator。將這個過程用流程圖來形象的表示:

 

       如果我們將要預測的target variable是連續的,就像我們的房屋例子一樣,我們將這個學習問題叫做回歸問題。當y只可以取少量的離散值的時候,就像這個例子中已知了living area的時候,我們想要預測一個dwelling是一個house還是一個apartment的時候,我們將這個問題叫做分類問題。

二、線性回歸(Linear Regression)-------斯坦福公開課ML筆記note1

    線性回歸的目的就是使得預測值與實際值的殘差平方和最小。【注:殘差在數理統計中是指實際觀察值與估計值(擬合值)之間的差】

為了讓我們的房屋例子更加有趣,讓我們考慮一個稍微豐富一些的數據集,在這個數據集中,每個房屋的bedrooms的數量是已知的。

 

 

  現在X是R^2中的二維向量,是訓練集中的第i個房子的living area,是訓練集中的第i個房子的bedrooms。(通常來說,當設計一個學習問題的時候,是由你自己來決定選取什么作為features的,比如當你收集房屋數據的時候,可能會決定將房屋是否有fireplace或者bedrooms的數量作為features。)

  為了實行監督學習,我們必須要考慮我們將如何在計算機中進行表示functions/hypotheses。作為初始選擇,假設我們將決定將y近似為x的線性函數:

這里的是參數,代表的是weights,通過這個線性函數從X映射到Y。

 

這里的等式右邊的θ和 x都是向量,n是輸入變量的數量(但是不包括x0,取x0=1)。

    現在給定一個訓練集,那我們如何選取和學習得到θ?一個合理的方案是使h(x)接近y,至少在我們的訓練例子中是這樣的。我們定義了要給關於該方案的函數,對每一個θ,measure出之間的聯系。我們定義了cost function(損失函數):

  如果你以前學過線性回歸,你可能認為這個函數和最小均方損失函數(least-squares cost function )很類似,並提出普通最小二乘法回歸模型(ordinary least squares regression model)。

三、普通最小二乘法(ordinary least squares)

  最小二乘法(又稱最小平方法)是一種數學優化技術,它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和最小,該方法還可以用於曲線擬合。

  離差(deviation)即標志變動度,是觀測值或估計量的平均值與真實值之間的差,是反映數據分布離散程度的量度之一,或說是反映統計總體中各單位標志差別大小的程度或離差情況的指標,常寫作,即參與計算平均數的變量值與平均數之差。

  殘差(residual)在數理統計中是指實際觀察值與估計值(擬合值)之間的差。

  Python代碼,普通最小二乘法(Ordinary Least Squares)的簡單應用。(該代碼來源於:https://blog.csdn.net/claroja/article/details/70312864)代碼的基本思想:先載入數據集dataset,將X變量分割成訓練集和測試集,將Y目標變量分割成訓練集和測試集,接着創建線性回歸對象,並使用訓練數據來訓練模型,接着可以查看相關系數、殘差平方的均值和方差得分,最后可以將測試點和預測點都直觀地畫在圖上。

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model#載入數據集“datasets”
diabetes = datasets.load_diabetes()#獲取糖尿病的數據集
diabetes_X = diabetes.data[:, np.newaxis, 2]#使用其中的一個特征,np.newaxis的作用是增加維度
diabetes_X_train = diabetes_X[:-20]#將X變量數據集分割成訓練集和測試集
diabetes_X_test = diabetes_X[-20:]
diabetes_y_train = diabetes.target[:-20]#將Y目標變量分割成訓練集和測試集
diabetes_y_test = diabetes.target[-20:]

regr = linear_model.LinearRegression()#創建線性回歸對象
regr.fit(diabetes_X_train, diabetes_y_train)#使用訓練數據來訓練模型

print('Coefficients: \n', regr.coef_)#查看相關系數Coefficients
print("Residual sum of squares: %.2f"% np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2))#查看殘差residual平方的均值(mean square error,MSE)
# Explained variance score: 1 is perfect prediction
# 解釋方差得分(R^2),最好的得分是1:
# 系數R^2=1 - u/v, u是殘差平方,u=(y_true - y_pred) ** 2).sum()
# v是離差平方和,v=(y_true - y_true.mean()) ** 2).sum()
print('Variance score: %.2f' % regr.score(diabetes_X_test, diabetes_y_test))#Returns score : float R^2 of self.predict(X) wrt. y.
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')#畫出測試的點
plt.plot(diabetes_X_test, regr.predict(diabetes_X_test), color='blue',linewidth=3)#畫出預測的點
# plt.xticks(())#刪除X軸的標度
# plt.yticks(())#刪除Y軸的標度
plt.show()

效果圖:

 


免責聲明!

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



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