Python人工智慧庫ailearn使用說明0.1.8

說明:ailearn是一個人工智慧演算法包。包含了粒子群演算法、人工魚群演算法、螢火蟲演算法、進化策略、強化學習等多種人工智慧演算法的實現。

1.項目網址

ailearn的項目網址在下面的網址:

axi345/ailearn?

github.com圖標

看這個小貓,多萌啊O(∩_∩)O好了,話不多說,我們接下來馬上對ailearn進行介紹!

2.安裝和更新

安裝方式很簡單,Linux和Mac用戶在終端中、Windows用戶在cmd窗口中輸入以下語句:

pip install ailearn

依賴庫為numpy和pandas。但是不用管這些,如果沒有安裝它們,計算機會自動幫你完成這些庫的安裝。而更新只要在終端中輸入下面一行代碼:

pip install ailearn --upgrade

簡單吧!

3.基礎操作

使用ailearn的方式非常簡單,比如我們要使用粒子群演算法尋找使函數 f(x,y)=x^2+y^2, ( -5<x<5,-5<y<5 ) 取得最小值時的 xy ,只需定義一個方程(因為是取得極小值,所以要加一個負號表示函數越小結果越好):

def func(x, y): return -(x ** 2 + y ** 2)

然後調用ailearn集成的粒子群演算法進行尋優:

from ailearn.Swarm import PSOp = PSO(func=func, param_len=2, x_min=[-5, -5], x_max=[5, 5])x, y = p.solve()print(x, y)

p = PSO(func=func, param_len=2, x_min=[-5, -5], x_max=[5, 5])這一句當中,func表示待優化的函數,param_len代表參數個數,x_min表示待優化參數的下界,x_max代表待優化參數的上界。對於x_min與x_max而言,如果各個參數的下界或上界是一致的,則可以簡寫成一個數字。例如上面的第二行代碼,可以簡寫成:

p = PSO(func=func, param_len=2, x_min=-5, x_max=5)

最後找到的結果已經很接近於0了:

-0.0015879250803923634 0.0007797339214444029

另外,在上面的第三行代碼x,y=p.solve()中,還可以通過solve()函數的參數控制迭代次數和是否實時輸出當前最優值。例如,我們可以把迭代次數設置為20次,並實時列印當前最優結果:

x, y = p.solve(epoch=20, verbose=True)

則輸出的結果為:

已完成第1次尋找,最優參數值為 [-1.23618084 -1.39514355] 目前最優適合度為-3.4746已完成第2次尋找,最優參數值為 [-1.23618084 -1.39514355] 目前最優適合度為-3.4746已完成第3次尋找,最優參數值為 [-1.0435181 -1.21133809] 目前最優適合度為-2.5563已完成第4次尋找,最優參數值為 [-0.5935181 -0.9070398] 目前最優適合度為-1.1750已完成第5次尋找,最優參數值為 [-0.1885181 -0.63317134] 目前最優適合度為-0.4364已完成第6次尋找,最優參數值為 [ 0.1759819 -0.38668973] 目前最優適合度為-0.1805已完成第7次尋找,最優參數值為 [ 0.1759819 -0.38668973] 目前最優適合度為-0.1805已完成第8次尋找,最優參數值為 [ 0.1759819 -0.38668973] 目前最優適合度為-0.1805已完成第9次尋找,最優參數值為 [ 0.07364577 -0.13585497] 目前最優適合度為-0.0239已完成第10次尋找,最優參數值為 [-0.14273468 -0.05481245] 目前最優適合度為-0.0234已完成第11次尋找,最優參數值為 [-0.14273468 -0.05481245] 目前最優適合度為-0.0234已完成第12次尋找,最優參數值為 [-0.09273468 -0.00481245] 目前最優適合度為-0.0086已完成第13次尋找,最優參數值為 [-0.09273468 -0.00481245] 目前最優適合度為-0.0086已完成第14次尋找,最優參數值為 [-0.09273468 -0.00481245] 目前最優適合度為-0.0086已完成第15次尋找,最優參數值為 [-0.09273468 -0.00481245] 目前最優適合度為-0.0086已完成第16次尋找,最優參數值為 [-0.09273468 -0.00481245] 目前最優適合度為-0.0086已完成第17次尋找,最優參數值為 [-0.09273468 -0.00481245] 目前最優適合度為-0.0086已完成第18次尋找,最優參數值為 [-0.09273468 -0.00481245] 目前最優適合度為-0.0086已完成第19次尋找,最優參數值為 [-0.09273468 -0.00481245] 目前最優適合度為-0.0086已完成第20次尋找,最優參數值為 [-0.08161265 0.00630957] 目前最優適合度為-0.0067-0.08161265187640543 0.006309573062982521

此外,我們還可以對PSO演算法中的參數進行調節。關於PSO演算法的參數,不太了解的同學可以看這篇文章:

粒子群演算法詳解 - CSDN博客?

blog.csdn.net

這篇文章對PSO演算法講解的很好,同時給出了PSO演算法的matlab及Java實現。

ailearn.Swarm中還包括人工魚群演算法(AFSA)以及螢火蟲演算法(FA)的實現,調用方法與PSO演算法類似。不了解人工魚群演算法以及螢火蟲演算法演算法的童鞋可以閱讀以下兩篇文章:

人工魚群演算法詳解 - CSDN博客?

blog.csdn.net

螢火蟲演算法詳解 - CSDN博客?

blog.csdn.net

滿滿的都是乾貨。

另外,ailearn還集成了一些常用的智能演算法的測試函數。比如Ackley函數,其定義如下:

f(x)=-alphaspace expleft( -bsqrt{frac{1}{d}sum_{i=1}^{d}{x_{i}^2}} 
ight)-expleft( frac{1}{d}sum_{i=1}^{d}{cos(cx_{i})} 
ight)+alpha+exp(1)

這個函數在 x^{*}=(0,0,...,0) 處取得極小值 fleft( x^{*}
ight)=0 。假設參數的維度為5,則我們可以通過下面的代碼對其進行優化:

from ailearn.Evaluation import Ackleyfrom ailearn.Swarm import PSOf = Ackley()p = PSO(func=f.func, param_len=5, x_min=f.min, x_max=f.max)x = p.solve()print(x)

參數維數的指定在p = PSO(func=f.func, param_len=5, x_min=f.min, x_max=f.max)這一句當中param_len=5表示參數的維度為5,而x_min=f.min, x_max=f.max表示參數的取值範圍為Ackley函數的定義域[f.min,f.max]。最後的結果會因為一系列的原因(如參數的初始位置、初始速度設置等)有所不同。我們這次運行的結果為:

[-0.00267134 -0.01558313 -0.0162821 -0.00999858 0.01572605]

效果還是不錯的。

4.與其他機器學習庫的配合使用

除了上面的簡單應用,ailearn還可以與其他機器學習外部庫配合,進行一些超參數的尋優。說到機器學習,就不得不提sklearn這個庫,這個庫集成了KNN、樸素貝葉斯、支持向量機、神經網路、決策樹、隨機森林等若干機器學習演算法,調用起來也是非常方便。在機器學習領域,超參數的選定具有重要的意義,可能直接決定了演算法訓練的效果。而ailearn可以完美的與sklearn配合,進行超參數的尋優。

比如,我們想要利用sklearn中的SVM演算法對iris數據集進行分類,可以首先輸入以下語句:

from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitdata = load_iris()x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, shuffle=True, stratify=data.target, test_size=0.5, random_state=1)

這幾行代碼主要完成了iris數據集的引入、並且對iris數據集進行分層隨機採樣,劃分50%的數據作為訓練集、50%的數據作為測試集。

接下來對SVM進行訓練,並列印出訓練效果(準確率):

from sklearn.svm import SVCmodel = SVC()model.fit(x_train, y_train)print(model.score(x_test, y_test))

得到了此時的訓練準確率:

0.9733333333333334

這個準確率看似很高,但對於iris這種簡單的數據集而言,還是不夠的。接下來我們對svm的超參數進行優化。在使用高斯核時,svm的超參數主要有C和gamma。我們設定C的範圍為0到5,gamma的範圍為0到1。為了防止演算法執行時參數變化過大,我們把C的最大變化速度設置為0.25,gamma變化的最大速度設置為0.05。則可以用下面的代碼進行超參數的優化:

from ailearn.Swarm import PSOdef svm_score(C, gamma): model = SVC(C=C, gamma=gamma) model.fit(x_train, y_train) return model.score(x_test, y_test)p = PSO(svm_score, 2, x_min=[0, 0], x_max=[5, 1], v_min=[-0.25, -0.05], v_max=[0.25, 0.05])C, gamma = p.solve()

運行以上代碼,我們便找到了在當前條件下的最優C和gamma值。接下來我們看一下最優的C和gamma值,以及他們對應的score:

print(C=, C, gamma=, gamma)print(svm_score(C, gamma))

結果為:

C= 4.208290021821946 gamma= 0.356470951048720560.9866666666666667

較剛才有了一定提高。

5.強化學習模塊

強化學習模塊是0.1.8版本新加入的模塊,目前實現了幾種經典的強化學習演算法:Q學習、Sarsa、Q(λ)、Sarsa(λ)和Dyna-Q,並且集成了三種經典的測試環境:CliffWalking環境、FrozenLake環境與GridWorld環境。利用ailearn,我們可以輕鬆地創建一個強化學習agent:

from ailearn.RL.Environment import FrozenLakefrom ailearn.RL.TabularRL import QLearningenv = FrozenLake(4)agent = QLearning(n_actions=env.n_actions, n_states=env.n_states)

其中,env = FrozenLake(4)代表我們創建了一個4*4的FrozenLake環境,而接下來的agent = QLearning(n_actions=env.n_actions, n_states=env.n_states)這一句創建了一個利用Q學習演算法進行學習的強化學習agent。

我們可以利用下面的語句進行強化學習agent的訓練,使agent掌握能夠快速通過冰湖的方法:

for episode in range(50): s = env.reset() while True: a = agent.choose_action(s) s_, r, done, _ = env.step(a) agent.learn(s, a, r, s_, done) s = s_ if done: break

上面的代碼快速地實現了Q學習演算法。如果大家對強化學習不是很了解,建議看一下這個網站:

強化學習 Reinforcement Learning 教程系列 | 莫煩Python?

morvanzhou.github.io

莫煩的教程還是非常的淺顯易懂,能夠完美的完成從入門到精通。

當前ailearn的強化學習模塊還不是很完善,僅僅包括了一些傳統的強化學習演算法。我們計劃在接下來的幾個版本當中,逐步增加強化學習模塊的內容,添加一些新的環境,以及一些最新的深度強化學習演算法,來供大家更好地學習和使用。

6.結束語(拉票時間)

ailearn作為一個全新的項目,還有許多不完善和待優化的地方。如果ailearn幫助到大家了,歡迎大家積極star和fork,如果有什麼好的建議也可以向我們提出來,我們會對ailearn進行進一步完善,使它能夠適應大家的使用需求^_^


推薦閱讀:

【轉載】演講丨周志華:關於人工智慧的探討
Google AI:如何破解AI學術研究的贏者詛咒?
作一名優秀的用戶運營,實在是太難了(上)
人工智慧學習筆記
「終結者」入侵現實:要麼反抗,要麼死!

TAG:機器學習 | 人工智慧 | Python |