利用梯度下降法求解一元线性回归和多元线性回归
生活随笔
收集整理的這篇文章主要介紹了
利用梯度下降法求解一元线性回归和多元线性回归
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 原理以及公式
- 【1】一元線性回歸問題
- 【2】多元線性回歸問題
- 【3】學習率
- 【4】流程分析(一元線性回歸)
- 【5】流程分析(多元線性回歸)
- 歸一化原理以及每種歸一化適用的場合
- 一元線性回歸代碼以及可視化結果
- 多元線性回歸代碼以及可視化結果
- 總結
原理以及公式
【1】一元線性回歸問題
原函數是一元函數(關于x),它的損失函數是二元函數(關于w和b)
這里介紹兩種損失函數:平方損失函數和均方差損失函數
【2】多元線性回歸問題
X和W都是m+1維的向量,損失函數是高維空間中的凸函數
【3】學習率
學習率屬于超參數(超參數:在開始學習之前設置,不是通過訓練得到的)
可以選擇在迭代次數增加時減少學習率大小.
下圖是學習率正常或較小、稍大、過大的迭代圖。
【4】流程分析(一元線性回歸)
過程分析:
1、加載樣本數據x,y
2、設置超參數學習率,迭代次數
3、設置模型參數初值w0, b0
4、訓練模型w, b
5、結果可視化
【5】流程分析(多元線性回歸)
歸一化原理以及每種歸一化適用的場合
線性歸一化:適用于樣本分布均勻且集中的情況,如果最大值(或者最小值)不穩定,和絕大數樣本數據相差較大,使用這種方法得到的結果也不穩定.為了抑制這個問題,在實際問題中可以用經驗值來代替最大值和最小值
標準差歸一化適用于樣本近似正態分布,或者最大最小值未知的情況,有時當最大最小值處于孤立點時也可以使用標準差歸一化
非線性映射歸一化,通常用于數據分化較大的情況(有的很大有的很小)
總結:樣本屬性歸一化需要根據屬性樣本分布規律定制
過程分析:
加載樣本數據area,room,price
數據處理歸一化,X,Y
設置超參數學習率,迭代次數
設置模型參數初值W0(w0,w1,w2)
訓練模型W
結果可視化
一元線性回歸代碼以及可視化結果
#解析法實現一元線性回歸 # #Realization of one variable linear regression by analytic method #導入庫 import numpy as np import matplotlib.pyplot as plt #設置字體 plt.rcParams['font.sans-serif'] =['SimHei'] #加載樣本數據 x=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21]) y=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30]) #設置超參數,學習率 learn_rate=0.00001 #迭代次數 iter=100 #每10次迭代顯示一下效果 display_step=10 #設置模型參數初值 np.random.seed(612) w=np.random.randn() b=np.random.randn() #訓練模型 #存放每次迭代的損失值 mse=[] for i in range(0,iter+1):#求偏導dL_dw=np.mean(x*(w*x+b-y))dL_db=np.mean(w*x+b-y)#更新模型參數w=w-learn_rate*dL_dwb=b-learn_rate*dL_db#得到估計值pred=w*x+b#計算損失(均方誤差)Loss=np.mean(np.square(y-pred))/2mse.append(Loss)#顯示模型#plt.plot(x,pred)if i%display_step==0:print("i:%i,Loss:%f,w:%f,b:%f"%(i,mse[i],w,b)) #模型和數據可視化 plt.figure(figsize=(20,4)) plt.subplot(1,3,1) #繪制散點圖 #張量和數組都可以作為散點函數的輸入提供點坐標 plt.scatter(x,y,color="red",label="銷售記錄") plt.scatter(x,pred,color="blue",label="梯度下降法") plt.plot(x,pred,color="blue")#設置坐標軸的標簽文字和字號 plt.xlabel("面積(平方米)",fontsize=14) plt.xlabel("價格(萬元)",fontsize=14)#在左上方顯示圖例 plt.legend(loc="upper left")#損失變化可視化 plt.subplot(1,3,2) plt.plot(mse) plt.xlabel("迭代次數",fontsize=14) plt.ylabel("損失值",fontsize=14) #估計值與標簽值比較可視化 plt.subplot(1,3,3) plt.plot(y,color="red",marker="o",label="銷售記錄") plt.plot(pred,color="blue",marker="o",label="梯度下降法") plt.legend() plt.xlabel("sample",fontsize=14) plt.ylabel("price",fontsize=14) #顯示整個繪圖 plt.show()多元線性回歸代碼以及可視化結果
#解析法實現多元線性回歸 #Realization of multiple linear regression by analytic method #導入庫與模塊 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D #=======================【1】加載樣本數據=============================================== area=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21]) room=np.array([3,2,2,3,1,2,3,2,2,3,1,1,1,1,2,2]) price=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30]) num=len(area) #樣本數量 #=======================【2】數據處理=============================================== x0=np.ones(num) #歸一化處理,這里使用線性歸一化 x1=(area-area.min())/(area.max()-area.min()) x2=(room-room.min())/(room.max()-room.min()) #堆疊屬性數組,構造屬性矩陣 #從(16,)到(16,3),因為新出現的軸是第二個軸所以axis為1 X=np.stack((x0,x1,x2),axis=1) print(X) #得到形狀為一列的數組 Y=price.reshape(-1,1) print(Y) #=======================【3】設置超參數=============================================== learn_rate=0.001 #迭代次數 iter=500 #每10次迭代顯示一下效果 display_step=50 #=======================【4】設置模型參數初始值=============================================== np.random.seed(612) W=np.random.randn(3,1) #=======================【4】訓練模型============================================= mse=[] for i in range(0,iter+1):#求偏導dL_dW=np.matmul(np.transpose(X),np.matmul(X,W)-Y) #XT(XW-Y)#更新模型參數W=W-learn_rate*dL_dW#得到估計值PRED=np.matmul(X,W)#計算損失(均方誤差)Loss=np.mean(np.square(Y-PRED))/2mse.append(Loss)#顯示模型#plt.plot(x,pred)if i % display_step==0:print("i:%i,Loss:%f"%(i,mse[i])) #=======================【5】結果可視化============================================ plt.rcParams['font.sans-serif'] =['SimHei'] plt.figure(figsize=(12,4)) #損失變化可視化 plt.subplot(1,2,1) plt.plot(mse) plt.xlabel("迭代次數",fontsize=14) plt.ylabel("損失值",fontsize=14) #估計值與標簽值比較可視化 plt.subplot(1,2,2) PRED=PRED.reshape(-1) plt.plot(price,color="red",marker="o",label="銷售記錄") plt.plot(PRED,color="blue",marker="o",label="預測房價") plt.xlabel("sample",fontsize=14) plt.ylabel("price",fontsize=14) plt.legend() plt.show()總結
注意點:選擇歸一化方式
喜歡的話點個贊和關注唄!
總結
以上是生活随笔為你收集整理的利用梯度下降法求解一元线性回归和多元线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大宋惊世奇案剧情介绍
- 下一篇: 【视觉项目】【day6】8.26关于ma