機器學習篇——單變量線性迴歸問題(Tensorflow求解)

機器學習中的單變量線性迴歸問題其實就是用一個神經元解決的方法。


下面是一個簡單的線性迴歸案例
在這裏插入圖片描述

線性迴歸中的一些術語

標籤:
是我們要預測的真實事物,在上面例子線性迴歸中就是應變量y
特徵:
是用於描述數據的輸入變量,在上面例子線性迴歸中就是自變量x的取值集合{x1、x2、x3、…xn}
樣本:
是數據的特定實例:x的一個取值
有標籤樣本就是{特徵,標籤}:{x,y},用來訓練模型
無………………{特徵,?}:{x,?},用來對新數據進行預測
模型:
可以將樣本映射到預測標籤:y’是由模型的內部參數定義,內部參數則是通過不斷地學習而得到。
訓練:
訓練模型是指通過有標籤的樣本來學習所有的權重(x的係數)和偏差(截距)的理想值

在監督式學習中,機器學習算法可以通過檢查多個樣本並嘗試找出可最大限度地減少損失的模型。(也被稱之爲經驗風險最小化)
損失:
是對糟糕預測的懲罰,是一個對於單個樣本而言模型預測的準確程度的數值指標。

訓練模型的目標是從所有樣本中找到一組平均損失“較小”的權重和偏差。
在這裏插入圖片描述
損失函數:
L1損失:基於模型預測值與標籤的實際值之差的絕對值爲指標
L2損失:基於模型預測值與標籤的實際值之差的平均平方損失爲指標(均方誤差MSE)
在這裏插入圖片描述

模型訓練的迭代方法

在這裏插入圖片描述
由上圖可知,模型訓練的要點:(對於單變量線性迴歸問題y=wx+b)
1.對權重w和偏差b進行初始猜測;
2.反覆調整這些猜測;
3.一直迭代到獲得損失可能最低的權重和偏差爲止。

當不斷迭代,直到損失不再發生變化或十分緩慢,就說這個模型已收斂。

上述線性迴歸問題產生的損失與權重圖爲凸型,最低點斜率爲零處就是損失函數收斂之處。
在這裏插入圖片描述
這裏採用的是梯度下降法。
梯度:就是一個矢量,表示某一函數在該點處的方向導數沿着該方向取得最大值(即函數在該點處沿着該方向(梯度方向)變化最快,變化率最大)
到這裏小夥伴們是不是想起了當年高數A3的知識了呢。😉
在這裏插入圖片描述
注意梯度是一個矢量,因此具有方向和大小。
在這裏插入圖片描述
用梯度乘以一個名叫學習速率(也稱步長)的標量,用來確定下一個權重的取值。
比如梯度大小爲2.5,學習速率爲0.05,則梯度下降算法會選擇距離前一個點0.125的位置作爲下一個點。
選取需要適中。
在這裏插入圖片描述

超參數:
在機器學習中,超參數是開始學習過程之前設置的參數,而不是訓練得到的參數數據。
選擇一組好的超參數可以提高學習的性能和效果。可以這樣說:超參數是機器學習中用於調整的旋鈕。
典型的一些超參數:學習率、神經網絡隱含層的數量……

單變量線性迴歸機器學習求解

上面的基礎知識瞭解之後就可以解決這個單變量線性迴歸問題了。
使用Tensorflow進行算法設計與訓練的核心步驟:
(1)準備數據
(2)構建模型
(3)訓練模型
(4)進行預測

(1)準備數據
通過生成一個近似採樣隨機分佈人工數據集,使得w=2,b=1,並加入一個噪聲,最大振幅爲0.4

%matplotlib inline # 在瀏覽器直接生成
# 導入庫
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf

# 設置隨機數種子
np.random.seed(5)
# 使用numpy數值計算庫生成100個-1~1之間的點
x_data=np.linspace(-1,1,100)
y_data=2*x_data+1.0+np.random.randn(*x_data.shape)*0.4 # 加噪

使用matplotlib畫出結果

plt.scatter(x_data,y_data) # 畫出散點圖
plt.plot(x_data,2*x_data+1.0,color="blue",linewidth=3) # 畫出我們要學習的線性函數y=2x+1

在這裏插入圖片描述
(2)構建模型

# 定義佔位符
x=tf.placeholder("float",name='x')
y=tf.placeholder("float",name='y')
# 定義模型函數
def model(x,w,b):
    return tf.multiply(x,w)+b
# 創建變量(定義模型結構)
w=tf.Variable(1.0,name='w0')
b=tf.Variable(0.0,name='b0')
# 前向計算
pred=model(x,w,b)
# 訓練參數設置
train_epochs=60 #迭代次數
learning_rate=0.05 # 學習率
display_step=10  # 顯示的步長
loss_function=tf.reduce_mean(tf.square(y-pred)) #損失函數(這裏是L2)
# 定義優化器(這裏選擇梯度下降優化器)
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
# 創建會話
sess=tf.Session()
# 變量初始化
init=tf.global_variables_initializer()
sess.run(init)
# 開始訓練
step =0#記錄訓練的步數
loss_list=[] #保存loss值的列表
for epoch in range(train_epochs):
    for xs,ys in zip(x_data,y_data):
        _,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        loss_list.append(loss)
        step=step+1
        if step%display_step==0:
            print("訓練輪數:","%02d"%(epoch+1),"step:%03d"%(step),"loss={:.6f}".format(loss))
    b0temp=b.eval(session=sess)
    w0temp=w.eval(session=sess)
    plt.plot(x_data,w0temp*x_data+b0temp)# 畫圖         

在這裏插入圖片描述
……
在這裏插入圖片描述
在這裏插入圖片描述
從這個圖可以看出來,擬合模型較簡單,訓練了4次就接近了收斂,對於複雜模型,可能需要很多次的訓練。

 # 打印當前w,b的值
print(sess.run(w))
print(sess.run(b))

結果:
1.9823
1.04201

(4)進行預測

x_test=6.66

predict=sess.run(pred,feed_dict={x:x_test})
print("預測值是:%f"%predict)

target=2*x_test+1.0
print("目標值是:%f"%target)

結果:
預測值是:14.244107
目標值是:14.320000
可看出基本吻合。

損失值進行可視化處理:

plt.plot(lost_list)

在這裏插入圖片描述
列表推導式進行篩選損失大於1的:

[x for x in loss_list if x>1]

結果:
[1.0133754,
 1.2284044,
 1.0088208,
 1.2116321,
 2.3539772,
 2.3148305,
 1.3175836,
 1.0387748,
 1.5018207,
 1.547514,
 1.5513999,
 1.5517284,
 1.5517554,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581,
 1.5517581]

再次對上述數據可視化:

plt.plot([x for x in loss_list if x>1])

在這裏插入圖片描述

單元線性迴歸問題的步驟小結:
1.生成人工數據集
2.構建線性模型
3.定義損失函數
4.定義優化器、最小化損失函數
5.訓練結果可視化
6.利用機器學到的模型進行預測。

雖然單變量線性迴歸問題很簡單,但也是入門機器學習,瞭解機器學習步驟的好方法。
還是繼續加油!業精於勤而荒於嬉,行成於思而毀於隨!

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