機器學習演算法基礎 梯度下降法之二元線性回歸

2021-09-29 15:00:58 字數 2651 閱讀 7225

import numpy as np

import matplotlib.pyplot as plt

from numpy import genfromtxt

from mpl_toolkits.mplot3d import axes3d # 可以用來畫3d圖

# 匯入資料

data = genfromtxt(r"c:\\ml\\chapter-1\\delivery.csv",delimiter=",")

print(data)

# 切分資料

x_data = data[:,:-1] # 行,列

y_data = data[:,-1] # 行,列

print(x_data)

print(y_data)

# 學習率 learning rate

lr = 0.0001

# 引數

theta0 = 0

theta1 = 0

theta2 = 0

# 最大迭代次數

epochs = 1000

# 最小二乘法

def compute_error(theta0,theta1,theta2,x_data,y_data):

totalerror = 0

for i in range(0,len(x_data)):

totalerror += (y_data[i] - (theta1 * x_data[i,0] + theta2*x_data[i,1] + theta0)) ** 2

return totalerror / float(len(x_data))

def gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs):

# 計算總資料量

m = float(len(x_data))

# 迴圈epochs次

for i in range(epochs):

theta0_grad = 0 # 梯度0

theta1_grad = 0 # 梯度1

theta2_grad = 0 # 梯度2

# 計算梯度總和再求平均

for j in range(0,len(x_data)):

theta0_grad += -(1/m) * (y_data[j] - (theta1*x_data[j,0] + theta2*x_data[j,1] + theta0))

theta1_grad += -(1/m) * x_data[j,0] * (y_data[j] - (theta1*x_data[j,0] + theta2*x_data[j,1] + theta0))

theta2_grad += -(1/m) * x_data[j,0] * (y_data[j] - (theta1*x_data[j,0] + theta2*x_data[j,1] + theta0))

# 更新引數

theta0 = theta0 - (lr*theta0_grad)

theta1 = theta1 - (lr*theta1_grad)

theta2 = theta2 - (lr*theta2_grad)

return theta0,theta1,theta2

print('staring theta0 = ,theta1 = ,theta2 = ,error = '.format(theta0,theta1,theta2,compute_error(theta0,theta1,theta2,x_data,y_data)))

print('running...')

theta0,theta1,theta2 = gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs) # 開始建模

print('after iterations theta0 = ,theta1 = ,theta2 = , error = '.format(epochs,theta0,theta1,theta2,compute_error(theta0,theta1,theta2,x_data,y_data)))

ax = plt.figure().add_subplot(111,projection = "3d")

ax.scatter(x_data[:,0],x_data[:,1],y_data,c = 'r',marker = 'o',s = 100) # 點為紅色三角形 s代表點的大小

x0 = x_data[:,0]

x1 = x_data[:,1]

# 生成網路矩陣

x0,x1 = np.meshgrid(x0,x1)

z = theta0 + x0*theta1 + x1*theta2

# 畫3d圖

ax.plot_su***ce(x0,x1,z)

# 設定座標軸

ax.set_xlabel('miles')

ax.set_ylabel("num of deliveries")

ax.set_zlabel('time')

# 顯示影象

機器學習之梯度下降法 梯度下降法分析

梯度下降法的基本思想是函式沿著其梯度方向增加最快,反之,沿著其梯度反方向減小最快。在前面的線性回歸和邏輯回歸中,都採用了梯度下降法來求解。梯度下降的迭代公式為 j j j j 在回歸演算法的實驗中,梯度下降的步長 為0.01,當時也指出了該步長是通過多次時間找到的,且換一組資料後,演算法可能不收斂。...

機器學習 梯度下降法

梯度下降法,一般用來求解線性回歸方程,我的理解是根據一組形如 特徵1,特徵2.結果 的資料來找到這些對應的特徵和結果之間的聯絡 例如,我們利用一組 銷量的資料判斷乙個物品的銷量和 之間的關係 我們要求的線性回歸方程可以表示為 銷量 引數 實質上其實就是找到對應的 引數 而當影響乙個結果的特徵不只有乙...

機器學習 梯度下降法

1 梯度下降法的邏輯思路 的取值影響獲得最優解的速度 取值不合適,甚至得不到最優解 是梯度下降法的乙個超引數 一般需要調參找到最適合的 太小,減慢收斂學習速度 太大,導致不收斂 2 梯度下降法的問題 3 其它1 具體實現 模擬損失函式 y x 2.5 2 1 資料集特徵值 plot x np.lin...