基于一个微分对策问题的机器学习能力定量评价
由于用机器学习方法求解诸如最优控制、微分对策这样具有连续动作和状态的问题时,效率(效果/算力)较低,特殊的微分对策问题将是测试机器学习方法的竞争案例。
一个古老的羊-犬博弈问题:羊在半径为 R 的圆形圈内具有定常速率 v 和满足以下限制的任意转弯能力:逃逸路径上每一点与圆心的距离随时间单调不减。羊逃出圆形圈则胜。犬沿着圆周以定常速率 V 围堵以防止羊逃逸,任何时刻具有选择圆周的两个方向之一的能力。
任务:
- 通过运动学精确建模求解犬的最优围堵策略;
- 假设犬以最优策略围堵,基于精确建模求解羊可以逃逸胜出
的条件; - 假设羊理解自己的能力、限制和躲避犬围堵而逃逸的目标,
但不具备基于运动学的最优化决策知识,假设 2 中羊可以逃
逸的条件被满足,给出一种机器学习方法,使得羊通过学习
训练后实现逃逸; - 设计一套评价体系,定量评价 3 中给出的机器学习方法的学
习能力; - 提出并定量评价更多的羊逃逸机器学习方法
问题分析:
对于问题一,通过对犬的运动进行分析,可以将其看作匀速圆周运动,对于羊,可以看作原理圆心的运动。通过对比羊犬的速度与场地半径之间的关系,分别建立犬的圆周运动微分方程以及羊的随机运动微分方程,通过羊全的运动范围确定犬的最优围堵方案。(需要列出具体的方程求解)。
对于问题二,在问题一的条件下,结合羊犬的运动进行分析,分析极限情况下羊被犬抓住的概率,由此确定羊在犬的最优化策略下的胜出条件。
对于问题三,通过对羊的运动轨迹进行分析,结合犬对于羊的限制条件,结合问题一与问题二中的条件,结合随机森林算法对羊的路线进行分析,以羊的运动轨迹坐标作为数据集,建立随机森林模型,使用matlab进行求解,最终得到羊通过训练后实现逃逸的路线。
对于问题四,对羊逃逸学习的随机森林模型进行分析,对羊的运动轨迹、犬的限制以及数据集选取(随机森林模型选取部分数据进行学习)进行分析,采用模糊综合评价分析不同影响因素的判断矩阵,结合matlab得到不同影响因素的权重。并通过影响因素自身的得分得到最终的评价。
对于问题五,通过最优化模型对羊犬博弈问题进行分析,结合问题四建立的模糊综合评价模型进行评价,得到不同的机器学习方法定量评价。对比不同的评价方法,得到适合本文的评价方法。
模型的求解
通过对羊的运动轨迹进行分析,结合犬对于羊的限制条件,结合问题一与问题二中的条件,结合随机森林算法对羊的路线进行分析,以羊的运动轨迹坐标作为数据集,建立随机森林模型,使用 matlab 进行求解,最终得到羊通过训练后实现逃逸的路线。
部分程序如下所示:
import pandas as pd
from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_boston
boston_house = load_boston()
boston_feature_name = boston_house.feature_names
boston_features = boston_house.data
boston_target = boston_house.target
rgs = RandomForestRegressor(n_estimators=15) ##随机森林模型
rgs = rgs.fit(boston_features, boston_target)
rgs.predict(boston_features)
from sklearn import tree
rgs2 = tree.DecisionTreeRegressor() ##决策树模型,比较两个模型的预测结果!
rgs2.fit(boston_features, boston_target)
rgs2.predict(boston_features)
#构造data子集
def get_subsample(dataSet,ratio):
subdataSet=[]
lenSubdata=round(len(dataSet)*ratio)
while len(subdataSet) < lenSubdata:
index=randrange(len(dataSet)-1)
subdataSet.append(dataSet[index])
#print len(subdataSet)
return subdataSet
# 训练数据集并作图
#选取任意的n个特征,在这n个特征中,选取分割时的最优特征
def get_best_spilt(dataSet,n_features):
features=[]
class_values=list(set(row[-1] for row in dataSet))
b_index,b_value,b_loss,b_left,b_right=999,999,999,None,None
while len(features) < n_features:
index=randrange(len(dataSet[0])-1)
if index not in features:
features.append(index)
#print 'features:',features
for index in features:
for row in dataSet:
left,right=data_spilt(dataSet,index,row[index])
loss=spilt_loss(left,right,class_values)
if loss < b_loss:
b_index,b_value,b_loss,b_left,b_right=index,row[index],loss,left,right
#print b_loss
#print type(b_index)
return {'index':b_index,'value':b_value,'left':b_left,'right':b_right}