線性回歸相關知識點總結


線性學習中最基礎的回歸之一,本文從線性回歸的數學假設,公式推導,模型算法以及實際代碼運行幾方面對這一回歸進行全面的剖析~

一:線性回歸的數學假設

1.假設輸入的X和Y是線性關系,預測的y與X通過線性方程建立機器學習模型

2.輸入的Y和X之間滿足方程Y=X+e,e是誤差項,噪音項,假設e是獨立同分布的,服從IID(independent and identity distribution)和均值為0,方差為某一定數的正態分布(也叫高斯分布)e服從正態分布是由中新計值定理決定的

二、線性回歸建模

2.1方程式表示:

數學形式:

矩陣形式:
其中,X矩陣是m行(n+1)列的,每一行是一個樣本,每一列是樣本的某一個特征
矩陣(n+1)行一列的,它是X的權重,也是線性回歸要學習的參數


2.2 損失函數(Loss function)
對數極大似然和最小二乘的聯系:
由線性函數的假設知道,噪音項滿足高斯分布,其中一個樣本的正態分布的數學表達為:
那么,通過極大估計求得似然函數為所有樣本的乘積,如下:
經過數學運算和推導,求極大似然的最大值可以轉化為求其log函數的最大值,推導過程如下:
要使得極大似然取得極大值,上式中的后一項就要最小,也可以將求線性回歸的極大似然轉化為求最小二乘的最小值,也就是常見到的線性函數的最小二乘求損失函數的數學形式:
由此就得到了線性函數的loss function
三、線性函數算法:求解參數
機器算法的目的就是通過建立模型並通過選擇合適的算法來求出參數 下的y和實際的Y之間的差值盡量的小,也就是預測的准確率在訓練集和測試集足夠高
3.1 當矩陣 可逆(滿秩)時,通過normal equation可以直接求解
目標函數轉化為矩陣形式:
對其求導並求駐點
 
另上式為0,可求得
此算法的缺點是:當矩陣很大是,計算非常耗時且占用資源
3.2 當矩陣 不可逆(非滿秩)時,通過梯度下降求解
初始化 ,沿着負梯度方向進行迭代,知道 變化很小或者不變化
梯度下降中設計到的參數是,步長alpha,迭代次數t,這些對於計算最終的 都會影響,所以需要調參優化。
常用的梯度下降算法有SGD,BGD,mBGD,實際中以mBGD使用最多
四、線性回歸防止overfitting
機器學習最忌諱的是死記硬背,像考試一樣平時學習只記得死答案了,在考試的時候就不會做題目了,為了靈活變通,overfitting的方法就出現了,線性回歸中最常用的是引入正則化項,也就懲罰項,給損失函數的參數 賦予一個約束項,使其不能任意的無限大或者無限小,加入正則化損失函數變為:
 
4.1當矩陣滿秩時,引入正則項后的 變為:
4.2當矩陣不滿秩時,引入正則項后的 變為:
五、python代碼實現
數據:仍然使用上海2015的氣溫數據
分別作圖看2015上海的氣溫和氣壓的關系以及使用線性回歸擬合的結果,代碼如下:
import numpy as np  
import matplotlib.pyplot as plt  
from sklearn.linear_model import LinearRegression  
from sklearn.linear_model import RidgeCV  
from sklearn.cross_validation import train_test_split  
  
'''''#load data 
n=100 
x = np.arange(1,100,n)+np.random.randn(n) 
y = 4*x - 3 + np.random.randn(n) 
plt . figure () 
plt . plot(x, y, 'r*', label='X') 
plt . ylabel (" Y"  ) 
plt . xlabel (" X") 
plt . legend(loc="best") 
plt . tight_layout() 
plt . show() 
'''  
data = ['C:\\Users\\123\\Desktop\\weather\\2015.txt',]  
w = np. loadtxt ( data [0] , skiprows =1)  
y = w[:,7]/10  
x = w[:,10]  
plt . figure ()  
plt . plot(x,y,"b*",label="Atmospheric pressure")  
plt . ylabel (" Temperatures"  )  
plt . xlabel ("Atmospheric pressure "  )  
plt . title (' Temperatures trent chart of Shanghai in year 2015 ')  
plt . tight_layout()  
plt . legend(loc="best")  
plt . show()  
  
  
x = x.reshape(-1, 1)  
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)  
lr = LinearRegression()  
lr . fit ( x_train , y_train)  
y_lr = lr.predict ( x_test )  
cv = RidgeCV(alphas=np.logspace(-3, 2, 100))  
cv . fit ( x_train , y_train)  
y_cv = cv.predict ( x_test )  
print lr.coef_  
print lr.intercept_  
print "mes of Linear Regresion squares is", np. mean(( y_lr - y_test ) ** 2)  
print "accuracy of Linear regression is",lr.score(x_test,y_test)  
print cv.coef_  
print cv.intercept_  
print "mes of Linear Regresion+Ridge squares is", np. mean(( y_cv - y_test ) ** 2)  
print "accuracy of Linear regression is",cv.score(x_test,y_test)  
  
x1 = np.arange(len(x_test))  
plt.plot(x1,y_test,"y*-",label="Test")  
plt.plot(x1,y_lr,"ro-",label="Predict")  
plt.plot(x1,y_cv,"b^-",label="Predict+Ridge")  
plt . ylabel (" Temperatures"  )  
plt . xlabel (" Atmospheric pressure")  
plt . title (' Predict chart ')  
plt . legend(loc="best")  
plt . tight_layout()  
plt . show()  

 

運行代碼作圖如下:
圖一是2015年氣溫和氣壓的曲線圖,可以看到有比較明顯的線性趨勢的關系,說明我們可以用線性回歸來進行預測,接下來我們就進行預測
預測后的test和predict的圖如下:
 
上圖分別用了線性回歸的解析解以及基於Ridge 懲罰的線性回歸,從擬合結果看,兩種方法效果差不多,最后,將預測准確率輸出:
兩種方法的准確率大概都在~87%,Ridge回歸的效果稍好但不明顯。
原文地址:https://blog.csdn.net/july_sun/article/details/53223962


免責聲明!

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



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