日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于numpy实现线性回归问题分析

發布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于numpy实现线性回归问题分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線性回歸問題是機器學習的入門,本次介紹的是一元線性回歸問題。對data數據集中的點進行線性回歸問題分析。
data數據集中的數據:

線性回歸分析的目的:
找到一條直線:y=w*x+b,使得點均勻的分布在直線的兩端。

對于初始的w和b值,我們需要設立一個初始的值,這個值一般是隨機的。然后再根據梯度去不斷的調整w和b的值,直到達到我們設定的迭代次數或者梯度為0.

線性回歸分析的步驟:
①計算loss的值
ps:圖中的那兩個微分,分別為loss函數對w求偏導,loss函數對b求偏導。
代碼如下:

##計算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):#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)#除以N是將所有計算得到的梯度值取平均值new_b=b_current-(learningRate*b_gradient)new_w=w_current-(learningRate*w_gradient)return [new_b,new_w]

③將更新后的w值賦值給原來的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]

最終代碼:

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值已經變小很多了。
圖像如下圖所示:

我們可以發現,點均勻的分布在直線的兩側。
繪圖步驟:

points = np.genfromtxt("E:/機器學習數據/TensorFlow-2.x-Tutorials-master/深度學習與TensorFlow入門實戰-源碼和PPT/lesson04-回歸問題實戰/data.csv", delimiter=",") plt.plot(points[:,0],points[:,1],'o')#繪制點 x = np.linspace(0, 100, 100)#隨機生成100個處于[0,100]的點 y=1.4777440851894448*x+0.08893651993741346#根據計算出的斜率和截距得出對應的y坐標 plt.plot(x,y,c='orange')#繪制直線 plt.show()

總結

以上是生活随笔為你收集整理的基于numpy实现线性回归问题分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。