python 梯度下降法實現一元線性迴歸

一、簡單過一下算法流程

'''
梯度下降法實現一元線性迴歸
一元線性函數: 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 等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章