一元方程y=theta*x,通過梯度下降求theta
如果有常數項怎麼辦?
如:y=theta*x + b
下個部落格進行學習。
資料集根據y = 3x構造,並加一定的隨機數構造出資料集
import numpy as np
import matplotlib.pyplot as plt
len =
50x = np.arange(
0, len)
# 生成0,1,2...len-1整數
# rand從-5到+5
np.random.seed(1)
rand =
(np.random.random(len)*2
-1)*
5y = x *
3+ rand
# x、y分布如下圖所示
plt.scatter(x, y)
#plt.show() # 展示散點圖
# x、y 連線
劃分訓練集、測試集
# 隨機打亂資料集
np.random.shuffle(alldata)
# 劃分訓練集、測試集
ratio =
0.8index =
(int
)(alldata.shape[0]
* ratio)
traindata = alldata[
:index]
# 訓練集資料
testdata = alldata[index:
]# 測試集資料
超引數設定
# 超引數設定
# 學習率
lr =
0.0005
# 訓練集大小(每個batch隨機梯度下降迭代次數)
n = traindata.shape[0]
# 誤差大小
epsilon =
200
模型訓練
# 待估及引數(theta)
theta = np.random.rand(
)# 隨機初始化乙個值
# 迭代次數標識
iter=1
# 引數記錄列表,包括loss、迭代次數以及theta
loss_list =
iter_list =
theta_list =
loss = np.inf
while
true
:# 打亂訓練集順序
np.random.shuffle(traindata)
for i in
range
(n):
# 隨機樣本
x = traindata[i,0]
y = traindata[i,1]
# 計算梯度
grad =
(theta * x - y)
* x # 更新引數
theta = theta - lr * grad
#print("x: %.2f\t\t y:%.2f\t\t\tgrad: %.4f\t\t\ttheta: %.4f" % (x, y, grad, theta))
# 乙個batch結束後,對所有測試樣本進行loss求和
print
("current theta:%.3f"
% theta)
loss = np.
sum(
0.5*
(traindata[:,
0]* theta - traindata[:,
1])**
2)# ( (y_predict - y_true)^2 ) /2
iter
)print
("no.%d:\t grad = %f\t theta: %f\tloss: %f"%(
iter
, grad, theta, loss)
)iter+=1
# 達到允許的誤差,結束訓練
if loss < epsilon:
print
("traing completed!"
)break
訓練結果
結果展示
注:sgd演算法實現流程
參考:
梯度下降 隨機梯度下降 批梯度下降
下面的h x 是要擬合的函式,j 損失函式,theta是引數,要迭代求解的值,theta求解出來了那最終要擬合的函式h 就出來了。其中m是訓練集的記錄條數,j是引數的個數。梯度下降法流程 1 先對 隨機賦值,可以是乙個全零的向量。2 改變 的值,使j 按梯度下降的方向減少。以上式為例 1 對於我們的...
stanford 梯度 梯度下降,隨機梯度下降
一 梯度gradient 在標量場f中的一點處存在乙個向量g,該向量方向為f在該點處變化率最大的方向,其模也等於這個最大變化率的數值,則向量g稱為標量場f的梯度。在向量微積分中,標量場的梯度是乙個向量場。標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是這個最大的變化率。更嚴格的說,從歐氏...
梯度下降 隨機梯度下降和批量梯度下降
對比梯度下降和隨機梯度下降和批量梯度下降 之前看的知識比較零散,沒有乙個系統的解釋說明,看了一些網上的博主的分析,總結了一下自己的理解。例子這裡我參照其他博主的例子做了一些修改,首先是梯度下降 coding utf 8 import random this is a sample to simula...