機器學習第5章第3節 LMS的學習率退火演算法

2021-08-13 06:31:35 字數 4609 閱讀 7682

模擬退火演算法**於固體退火原理,退火就是講材料加熱後再經過特定速率冷卻,目的是增大晶粒的體積,並且減少晶格的缺陷。材料中的原子原來會停留在使內能有區域性最小值的位置,加熱使能量變大,原子會離開原來的位置,而隨機在其他位置中移動。退火冷卻時速度較慢,徐徐冷卻時粒子漸趨有序,原子有可能找到內能比原先更低的位置,最後在常溫時達到基態,內能減為最小。

根據metropolis準則,粒子在溫度t時趨於平衡的概率為e-△e/(kt),其中e為溫度t時的內能,△e 為其改變量,k為boltzmann常數。用固體退火模擬組合優化問題,將內能e模擬為目標函式值f,溫度t演化成控制引數t,即得到解組合優化問題的模擬退火演算法: 由初始解i和控制引數初值t開始,對當前解重複進行「產生新解 –>計算目標函式差 –> 接受或捨棄」的迭代,並逐步衰減t值,演算法終止時的當前解即為所得近似最優解,這是基於蒙特卡羅迭代求解法的一種啟發式隨機搜尋過程。退火過程由冷卻進度表控制,包括控制引數的初值t及其衰減因子△t,每個t值時的迭代次數l和停止條件s。

針對學習率不變化、收斂速度較慢的情況,即可使用退火演算法方案,讓學習率隨時時間而變化。學習率計算公式為:

我們針對機器學習第5章第2節 : lms演算法-二值分類 應用退火演算法進行改動。

# -*- coding: utf-8 -*-

"""created on sat dec 9 15:05:13 2017

@author: oscar

針對學習率不變化、收斂速度較慢的情況,即可使用退火演算法方案,讓學習率隨時時間而變化。

針對 機器學習第5章第2節 : lms演算法-二值分類 應用退火演算法進行改動.

使用lms演算法實現在輸入矩陣中,如果x向量的整除結果為6,則表示一類,輸出為1;

如果整除結果為3,則表示另一類,輸出為-1.

"""import numpy as np

import math

#-------------------------------開始定義變數-------------------------------#

#最小誤差精度

min_error_signal = 0.05

#學習率的初始值

learn_speed_start = 0.1

#學習率

learn_speed = 0.0

#衰減因子

r = 5.0

#當前學習次數

current_try_count = 0

#最大學習次數

max_try_count = 20

#偏置b = 1

#最終的權值

weight = np.array([b,0,0])

#學習的資料

x = np.array([

[1,1,6], #1

[1,2,12], #1

[1,3,9], #-1

[1,8,24] #-1

])#期望輸出,對應的是學習資料的分類

d = np.array([1,1,-1,-1])

#測試資料

test_data1 = np.array([1,9,27]) #-1

test_data2 = np.array([1,11,66])#1

#-------------------------------開始定義函式-------------------------------#

#感知器

defsgn

(v):

if v > 0 :

return

1else:

return -1

#拿到感知器的返回值

defget_sgn

(current_weight,current_x):

#當前權值矩陣轉置後與當前的學習的資料進行矩陣相乘,得到乙個實數,然後呼叫sgn函式得到感知器的返回值

return sgn(np.dot(current_weight.t,current_x))

#獲取誤差訊號

defget_error_signal

(current_weight,current_x,current_d):

return current_d - get_sgn(current_weight,current_x)

#更新權值和誤差訊號值

defupdate_weight_and_error_signal

(old_weight,current_d,current_x):

current_error_signal = get_error_signal(old_weight,current_x,current_d)

current_learn_speed = learn_speed_start / (1 + float(current_try_count) / r) #這裡請見上面的學習率計算公式.

return ((old_weight + current_learn_speed * current_error_signal * current_x),(current_error_signal))

#--------------------------------開始訓練--------------------------------#

while

true:

final_error_signal = 0.0

i = 0

for xn in x:

weight,current_error_signal = update_weight_and_error_signal(weight,d[i],xn)

i += 1

final_error_signal += pow(current_error_signal,2)

final_error_signal = math.sqrt(final_error_signal)

current_try_count += 1

print("第",current_try_count,"次調整,調整後的權值為:",weight,",誤差訊號值為:",final_error_signal)

if (abs(final_error_signal) < min_error_signal) or (current_try_count > max_try_count) : break

#--------------------------------訓練完畢,開始檢視分類情況--------------------------------#

for xn in x:

print("當前資料:",xn,",當前分類:",get_sgn(weight,xn))

#--------------------------------開始驗證--------------------------------#

print("當前驗證資料:",test_data1,",當前分類:",get_sgn(weight,test_data1))

print("當前驗證資料:",test_data2,",當前分類:",get_sgn(weight,test_data2))

第 1 次調整,調整後的權值為: [ 0.8 -0.6 -1.8] ,誤差訊號值為: 2.0

第 2 次調整,調整後的權值為: [ 0.96666667 -0.6 -0.3 ] ,誤差訊號值為: 3.4641016151377544

第 3 次調整,調整後的權值為: [ 0.96666667 -0.88571429 -0.72857143] ,誤差訊號值為: 2.8284271247461903

第 4 次調整,調整後的權值為: [ 0.96666667 -1.88571429 -2.60357143] ,誤差訊號值為: 4.0

第 5 次調整,調整後的權值為: [ 1.18888889 -1.55238095 -0.60357143] ,誤差訊號值為: 2.8284271247461903

第 6 次調整,調整後的權值為: [ 1.28888889 -1.55238095

0.29642857] ,誤差訊號值為: 3.4641016151377544

第 7 次調整,調整後的權值為: [ 1.28888889 -1.55238095

0.29642857] ,誤差訊號值為: 0.0

當前資料: [1

16] ,當前分類: 1

當前資料: [ 1

212] ,當前分類: 1

當前資料: [1

39] ,當前分類: -1

當前資料: [ 1

824] ,當前分類: -1

當前驗證資料: [ 1

927] ,當前分類: -1

當前驗證資料: [ 1

1166] ,當前分類: 1

上次的資料為:第 9 次調整後的權值為: [ 1.4 -2.8 0.6] 誤差訊號值為: 0.0本次的資料為:第 7 次調整,調整後的權值為: [ 1.28888889 -1.55238095 0.29642857] ,誤差訊號值為: 0.0

兩次誤差訊號值都達到了0,但是本次訓練次數為7次,相比而言,減少了兩次的訓練,達到了我們想要的優化效果。

機器學習第3章第4節 隨機畫素點的繪製

本次教程是使用到了opencv的庫,如果沒有安裝請先根據安裝教程安裝.opencv庫中,顏色不是rgb 而是bgr,也就是說,乙個畫素點由 藍色值,綠色值,紅色值 組成.比如 我想讀取a影象 假設a的影象矩陣變數為img a 第150行第20列處的畫素值,可使用 img a 150,20,又如 我想...

第3章 第2 2節 預編譯

2.1 函式宣告整體提公升 2.2 變數宣告提公升 2.3 預編譯前奏 1.imply global 暗示全域性變數 即任何變數,如果變數未經宣告就賦值,此變數就為全域性物件所有。eg a 123 eg var a b 123 2.一切宣告的全域性變數,全是window的屬性。eg var a 12...

第3章 第2 2節 預編譯

2.1 函式宣告整體提公升 2.2 變數宣告提公升 2.3 預編譯前奏 1.imply global 暗示全域性變數 即任何變數,如果變數未經宣告就賦值,此變數就為全域性物件所有。eg a 123 eg var a b 123 2.一切宣告的全域性變數,全是window的屬性。eg var a 12...