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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

梯度下降与线性回归

發布時間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 梯度下降与线性回归 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于代價函數:
loss=∑i(y^?yi)2loss=\sum_i{(\hat{y}-y_i)}^2loss=i?(y^??yi?)2

loss=∑i(w?xi+b?yi)2loss=\sum_i{(w*x_i+b-y_i)}^2loss=i?(w?xi?+b?yi?)2

最常見的代價函數:均方差代價函數(Mean-Square Error,MSE):
loss=12N∑iN(w?xi+b?yi)2loss=\frac{1}{2N}\sum_i^N{(w*x_i+b-y_i)}^2loss=2N1?iN?(w?xi?+b?yi?)2

一 梯度下降(Gradient Descent)

在學習梯度下降原理之前首先我們需要知道這幾個數學概念:導數、偏導數、方向導數和梯度。關于梯度下面直接說結論:

  • 梯度是一個矢量,既有大小又有方向
  • 梯度的方向是最大的方向導數
  • 梯度的值是方向導數的最大值
  • 梯度下降算法基本原理:
    既然在變量空間的某一點處,函數沿著梯度方向具有最大的變化率,那么在優化代價函數的時候,就可以沿著負梯度方向去減小代價函數的值。

    梯度下降數學原理:

    w′=w?lr??loss?ww\prime=w-lr*\frac{\partial loss}{\partial w}w=w?lr??w?loss?

    b′=b?lr??loss?bb\prime=b-lr*\frac{\partial loss}{\partial b}b=b?lr??b?loss?

    其中lr表示的是學習率:LearningRate

    """" 用一元線性回歸解決回歸問題: y = wx + b """ import numpy as np import matplotlib.pyplot as plt # 畫圖正常顯示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號def compute_error(b, w, points):totalError = 0for i in range(0, len(points)):x = points[i, 0]y = points[i, 1]# computer mean-squared-errortotalError += (y - (w * x + b)) ** 2# average loss for each pointreturn 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) grad_w = 2(wx+b-y)*xb_gradient += (2 / N) * ((w_current * x + b_current) - y)w_gradient += (2 / N) * x * ((w_current * x + b_current) - y)# update w'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# update for several timesfor i in range(num_iterations):b, w = step_gradient(b, w, np.array(points), learning_rate)return [b, w]def plot_scatter(data):x_data = data[:, 0]y_data = data[:, 1]plt.scatter(x_data, y_data)plt.title("訓練數據集散點分布")plt.xlabel("自變量:x")plt.ylabel("因變量:y")plt.savefig("scatter.png")# plt.show()def plot_result(data, w, b):x_data = data[:, 0]y_data = data[:, 1]plt.scatter(x_data, y_data, c='b')plt.plot(x_data, w * x_data + b, 'r')plt.title("訓練擬合結果")plt.xlabel("自變量:x")plt.ylabel("因變量:y")plt.savefig("result.png")# plt.show()def run():# numpy讀取CSV文件points = np.genfromtxt("data.csv", delimiter=",")# 繪制數據散點圖plot_scatter(points)# 設置學習率learning_rate = 0.0001# 權值初始化initial_b = 0initial_w = 0# 迭代次數num_iterations = 1000print("Starting b = {0}, w = {1}, error = {2}".format(initial_b, initial_w,compute_error(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(b, w, points)))plot_result(points, w, b)if __name__ == '__main__':run()

    運行結果:
    Starting b = 0, w = 0, error = 5565.107834483211
    Running…
    After 1000 iterations b = 0.08893651993741346, w = 1.4777440851894448, error = 112.61481011613473
    數據集:

    訓練擬合結果:

    總結

    以上是生活随笔為你收集整理的梯度下降与线性回归的全部內容,希望文章能夠幫你解決所遇到的問題。

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