首先明確學習的概念,學習是系統為了適應環境而做出的長久的變化,以便在未來更有效率的處理類似的問題。
強化學習就是通過演算法和訓練,讓程式的產生相應的變化,未來更好地處理類似問題。
學習系統本身(即學習程式)
環境(即學習程式要解決的問題所處的環境)
系統判定當前狀態,根據策略採取行動
系統獲得環境的反饋
系統根據反饋,更新策略
重複上述步驟,直到問題解決
強化學習是一種無監督學習
在狀態s下,不同的行動a會有不同的反饋r
反饋r的獲得,通常是有延時的
當前行動a,會對系統後續的行為產生影響
q-learning就是其中一種簡單的系統實現,通過q-table的不斷更新,來產生長久的變化。
在強化學習中,通常用q(s, a)來表示狀態s下,採取動作a所帶來的價值,所以這個演算法就用q-learning作了它的名字。
關鍵點:狀態、策略、行動、反饋
q(s,a)←q(s,a)+α[r+γmaxa′q(s′,a′)−q(s,a)]
引數說明:
α是學習速率,在[0,1]區間取值,表示反饋對當前策略的影響程度。0表示完全不考慮反饋,1表示只看反饋,不看歷史經驗。
r表示r(s, a),通過「反饋表」或者「反饋演算法」獲得的反饋值
maxa′q(s′,a′) 解釋:s′是狀態s時採取行動a之後到達的狀態;maxa′q(s′,a′) 表示在s′狀態時,能獲得的最大q值,即歷史經驗,或者說是記憶中的利益
γ表示折扣因子,代表歷史經驗中未來利益的重要性,如果為0,表示只看眼前利益r
初始化q-table
定義reward獲取方法
制定策略,即在狀態s下,如何通過q-table選取行動a
初始化狀態s,可以固定,也可以隨機
根據當前狀態s,採取行動a,並獲得反饋r
使用更新公式,對q-table進行更新
重複步驟5,6,直到命中退出條件(比如成功、失敗、走出了迷宮、到達了目的地等等)
重複4-7流程n次,n代表訓練的回合數
"-----t"
比如上面的乙個字串,機械人從任意一點進入字串,可以向左或者向右走一步,最終的目標是走到字母t的位置。
我們的code進行20次訓練,得到更新後q-table,這時機械人再進入字串,就能以最效率的方式,走到字母t
importnumpy as np
#by jarek.tan
alpha = 0.1gamma = 0.9epsilon = 0.9epoch = 20n_state = 6actions = ["
left
", "
right"]
np.random.seed(2)
q_table =np.zeros((n_state, len(actions)))
defget_reward(s, a):
if s == 5:
r = 1
elif s == 4 and a == '
right
': #
s!=5
r = 1
else
: r =0
return
rdef
take_action(s):
if s ==0:
return 1, '
right
', np.max(q_table[1, :])
maxq =np.max(q_table[s, :])
if maxq == 0 or np.random.uniform() >epsilon:
if maxq ==0:
print("
maxq is 0")
else
:
print("
random 0.1 hit")
action =np.random.choice(actions)
else
: idx =np.argmax(q_table[s, :])
print("
idx:
", idx)
action =actions[idx]
if action == '
left':
sn = s - 1
else
: sn = s + 1maxq =np.max(q_table[sn, :])
return
sn, action, maxq
defget_value(s, a):
if a == '
left':
return
q_table[s, 0]
else
:
return q_table[s, 1]
defset_value(s, a, v):
if a == '
left':
q_table[s, 0] =v
else
: q_table[s, 1] =v
defupdate_q(s, a, mq):
value = (1 - alpha) * get_value(s, a) + alpha * (get_reward(s, a) + gamma *mq)
set_value(s, a, value)
for loop in
range(epoch):
print("
loop:
", loop)
s =0
step =0
steps =
while s != 5:
sn, action, maxq =take_action(s)
update_q(s, action, maxq)
s =sn
print("
state:
", s, "
totalsteps:
", step, "
\ndetail:
", steps)
print("
q_table:
", q_table)
的python實現 python實現檔案自動歸類
這幾天和幾個小夥伴,在一起做乙個ppt。那我想,可不可以做乙個指令碼實現檔案按照副檔名自動分類呢?這樣,就可以相對輕鬆的找到檔案了。效果展示 使用方法很簡單,只要把python指令碼檔案,放到待處理的資料夾目錄下,執行python檔案即可。這個指令碼實現比較簡單,我把涉及的知識點列了出來。1 相對路...
用python實現棧 Python實現棧的方法
usr bin env python 定義乙個列表來模擬棧 stack def pu 出棧,用到了pop 函式 def popit if len stack 0 print cannot pop from an empty stack else print removed stack.pop 編歷棧...
pypy 用python實現的python
pypy 分為兩部分 乙個 python 的實現 和 乙個編譯器 pypy provides infrastructure for building interpreters in r python.this infrastructure makes it much easier than star...