一、簡單過一下算法流程
'''
梯度下降法實現一元線性迴歸
一元線性函數: y = ax + b
實際數據服從: y = x + 2
初始模型: y = 0.1*x + 0.1
'''
import numpy as np
#1 構造訓練數據 y = x + 2
x = np.array([0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
yy = x + 2
print('準確的訓練數據 = ',yy)
#2 構建初始模型
a = 0.1
b = 0.1
y = a*x + b
print('模型的生成數據 = ',y)
#3 損失函數 對應差值的總合 除以 參數個數的2倍
loss = np.sum(np.square(y - yy))/20
print('損失函數 = ',loss)
#4 梯度函數 損失函數對參數a b求偏導
gradient_a = np.dot((y - yy),x.transpose()) / 10
gradient_b = np.sum(y - yy) / 10
#5 迭代更新 參數和模型生成數據 學習率爲0.01
a = a - 0.01 * gradient_a
b = b - 0.01 * gradient_b
y = a*x + b
loss = np.sum(np.square(y - yy))/20
print("一次訓練之後:a=%f b=%f loss=%f "%(a,b,loss))
二、使用numpy庫實現
import numpy as np
#1 構造訓練數據 y = x + 2
x = np.array([0.,1.,2.,3.,4.,5.,6.,7.,8.,9.])
yy = x + 2
print('準確的訓練數據 = ',yy)
#2 構建初始模型
a = 0.1
b = 0.1
y = a*x + b
print('模型的生成數據 = ',y)
#3 迭代更新 數據只有十個 所以迭代次數多一些
for i in range(10000):
a = a - 0.01 * np.dot((y - yy), x.transpose()) / 10
b = b - 0.01 * np.sum(y - yy) / 10
y = a * x + b
loss = np.sum(np.square(y - yy)) / 20
print("%d:a=%f b=%f loss=%f "%(i+1,a,b,loss))
if(loss < 0.0001):
break
三、使用tensorflow實現
import tensorflow as tf
#1 正確數據
x = tf.constant([[0.,1.,2.,3.,4.,5.,6.,7.,8.,9.]])
yy = x + 2
#2 模型
a = tf.Variable(0.1)
b = tf.Variable(0.1)
y = tf.matmul([[a]],x) + b
#3 損失函數
loss = tf.reduce_mean(tf.square(y - yy)) / 2
#4 優化訓練
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(loss)
#5 開啓會話
with tf.Session() as sess:
# 初始化
sess.run(tf.global_variables_initializer())
# 訓練
for i in range(10000):
sess.run(optimizer)
print("tf_%d:a=%f b=%f loss=%f" %(i+1,a.eval(),b.eval(),loss.eval()))
if(loss.eval() < 0.0001):
break
梯度下降算法詳解可參考:https://baijiahao.baidu.com/s?id=1639202882632470513&wfr=spider&for=pc 等