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...