说明:ailearn是一个人工智能算法包。包含了粒子群算法、人工鱼群算法、萤火虫算法、进化策略、强化学习等多种人工智能算法的实现。
1.项目网址
ailearn的项目网址在下面的网址:axi345/ailearngithub.com
看这个小猫,多萌啊O(∩_∩)O好了,话不多说,我们接下来马上对ailearn进行介绍!
2.安装和更新
安装方式很简单,Linux和Mac用户在终端中、Windows用户在cmd窗口中输入以下语句:
pip install ailearn
依赖库为numpy和pandas。但是不用管这些,如果没有安装它们,计算机会自动帮你完成这些库的安装。而更新只要在终端中输入下面一行代码:
pip install ailearn --upgrade
简单吧!
3.基础操作
使用ailearn的方式非常简单,比如我们要使用粒子群算法寻找使函数
取得最小值时的
和
,只需定义一个方程(因为是取得极小值,所以要加一个负号表示函数越小结果越好):
def func(x, y):
return -(x ** 2 + y ** 2)
然后调用ailearn集成的粒子群算法进行寻优:
from ailearn.Swarm import PSO
p = 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函数,其定义如下:
这个函数在
处取得极小值
。假设参数的维度为5,则我们可以通过下面的代码对其进行优化:
from ailearn.Evaluation import Ackley
from ailearn.Swarm import PSO
f = 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_iris
from sklearn.model_selection import train_test_split
data = 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 SVC
model = 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 PSO
def 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.35647095104872056
0.9866666666666667
较刚才有了一定提高。
5.强化学习模块
强化学习模块是0.1.8版本新加入的模块,目前实现了几种经典的强化学习算法:Q学习、Sarsa、Q(λ)、Sarsa(λ)和Dyna-Q,并且集成了三种经典的测试环境:CliffWalking环境、FrozenLake环境与GridWorld环境。利用ailearn,我们可以轻松地创建一个强化学习agent:
from ailearn.RL.Environment import FrozenLake
from ailearn.RL.TabularRL import QLearning
env = 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 教程系列 | 莫烦Pythonmorvanzhou.github.io
莫烦的教程还是非常的浅显易懂,能够完美的完成从入门到精通。
当前ailearn的强化学习模块还不是很完善,仅仅包括了一些传统的强化学习算法。我们计划在接下来的几个版本当中,逐步增加强化学习模块的内容,添加一些新的环境,以及一些最新的深度强化学习算法,来供大家更好地学习和使用。
6.结束语(拉票时间)
ailearn作为一个全新的项目,还有许多不完善和待优化的地方。如果ailearn帮助到大家了,欢迎大家积极star和fork,如果有什么好的建议也可以向我们提出来,我们会对ailearn进行进一步完善,使它能够适应大家的使用需求^_^