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