基于numpy实现线性回归问题分析
生活随笔
收集整理的這篇文章主要介紹了
基于numpy实现线性回归问题分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
線性回歸問題是機器學習的入門,本次介紹的是一元線性回歸問題。對data數據集中的點進行線性回歸問題分析。
data數據集中的數據:
線性回歸分析的目的:
找到一條直線:y=w*x+b,使得點均勻的分布在直線的兩端。
對于初始的w和b值,我們需要設立一個初始的值,這個值一般是隨機的。然后再根據梯度去不斷的調整w和b的值,直到達到我們設定的迭代次數或者梯度為0.
線性回歸分析的步驟:
①計算loss的值
ps:圖中的那兩個微分,分別為loss函數對w求偏導,loss函數對b求偏導。
代碼如下:
②計算梯度和更新參數
代碼如下:
③將更新后的w值賦值給原來的w,并且再次代入運算,直到到達設定的迭代次數
代碼如下:
最終代碼:
import numpy as np##計算loss值 def compute_error_for_line_given_points(b,w,points):#b和w為一開始的初始值,是隨機的,points為numpy的一個二維數組[100,2]totalError=0for i in range(0,len(points)):x=points[i,0]y=points[i,1]totalError += (y-(w*x+b)) ** 2##** 2代表的是平方值return totalError/float(len(points)) ##計算梯度和更新參數 def step_gradient(b_current,w_current,points,learningRate):b_gradient=0w_gradient=0N=float(len(points))for i in range(0,len(points)):x=points[i,0]y=points[i,1]#grad_b=2(wx+b-y)#b_gradient+=(2/N)*((w_current*x+b_current)-y)#grad_w=2(wx+b-y)*xw_gradient+=(2/N)*x*((w_current*x+b_current)-y)new_b=b_current-(learningRate*b_gradient)new_w=w_current-(learningRate*w_gradient)return [new_b,new_w] ##循環若干次使得參數趨于穩定 def gradient_descent_runner(points,starting_b,starting_w,learning_rate,num_iterations):b=starting_bw=starting_w#更新若干次for i in range(num_iterations):##循環次數b,w=step_gradient(b,w,np.array(points),learning_rate)##得到新的b和wreturn [b,w] def run():points=np.genfromtxt("data.csv",delimiter=",")learning_rate = 0.0001#學習率initial_b=0initial_w=0##初始的b和wnum_iterations=1000##迭代次數print("Starting gradient descent at b={0},w={1},error={2}".format(initial_b,initial_w,compute_error_for_line_given_points(initial_b,initial_w,points)))print("Running...")[b,w]=gradient_descent_runner(points,initial_b,initial_w,learning_rate,num_iterations)print("After {0} iterations b={1},w={2},error={3}".format(num_iterations,b,w,compute_error_for_line_given_points(b,w,points)))if __name__ == '__main__':run()結果如圖所示:
我們可以看到,經過1000次的迭代之后,loss值已經變小很多了。
圖像如下圖所示:
我們可以發現,點均勻的分布在直線的兩側。
繪圖步驟:
總結
以上是生活随笔為你收集整理的基于numpy实现线性回归问题分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最小花费(最短路变形+中南大学复试机试)
- 下一篇: FGO梵高是什么外神