人工智能基础实践教程 习题及答案 刘伟 第5、6章_第1页
人工智能基础实践教程 习题及答案 刘伟 第5、6章_第2页
人工智能基础实践教程 习题及答案 刘伟 第5、6章_第3页
人工智能基础实践教程 习题及答案 刘伟 第5、6章_第4页
人工智能基础实践教程 习题及答案 刘伟 第5、6章_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章习题5.1简述遗传算法的基本流程,并详细说明选择、交叉、变异三种核心操作的作用。答:遗传算法的基本流程如下:对待求解问题进行编码;随机生成初始种群;计算每个个体的适应度;依次执行选择、交叉、变异操作;判断是否满足终止条件;满足则输出最优个体,不满足则继续迭代。核心操作的作用:(1)选择。根据个体适应度大小筛选优良个体,适应度越高被保留的概率越大,引导种群整体向最优方向进化。(2)交叉。对两个父代个体交换部分基因片段,产生新的子代个体,扩大搜索空间,保留优良基因组合。(3)变异。随机改变个体部分基因,保持种群多样性,防止算法早熟收敛,避免陷入局部最优解。5.2简述蚁群算法的基本原理,并说明信息素与信息素挥发的作用。答:蚁群算法基本原理为模拟蚂蚁觅食行为:蚂蚁在移动路径上释放信息素,路径越短,单位时间内信息素残留浓度越高,会吸引更多蚂蚁选择该路径,形成正反馈机制。经过多次迭代,最短路径被不断强化,最终所有蚂蚁趋于选择最短路径。基本过程包括:(1)初始化信息素浓度和蚂蚁参数;(2)蚂蚁行走。将所有蚂蚁分配到初始节点,每只蚂蚁依据信息素浓度以一定概率访问下一个节点,直到所有蚂蚁到达目标节点。(3)记录当前最优解,信息素更新。(4)若迭代次数达到最大值或解稳定不变,则成功退出,否则返回第2步。信息素的作用是实现蚂蚁之间的间接通信,记录历史最优路径,引导群体快速收敛。信息素挥发的作用是避免历史路径信息素无限累积,防止算法早熟收敛,保留对新路径的探索能力。5.3蚁群算法中信息素挥发系数的作用是什么?过大或过小分别会导致什么问题?答:信息素挥发系数,作用是控制历史信息素的保留程度,平衡历史路径经验与新路径探索。信息素更新公式为。如果过大,那么信息素衰减过快,历史路径经验被快速遗忘,算法难以收敛,搜索过程不稳定;如果过小,那么历史信息素残留过多,算法快速陷入局部最优,失去探索新路径的能力,易出现早熟收敛。5.4简述粒子群优化算法(PSO)的基本原理,并解释速度更新公式中三项的物理意义。答:粒子群算法基本原理是:模拟鸟群觅食行为,每个粒子代表问题的一个解,粒子在搜索空间中运动,通过追随自身历史最优位置和全局最优位置不断更新速度与位置,最终收敛到全局最优解。速度与位置更新公式为其中,惯性项保留粒子上一代的运动趋势,平衡全局探索与局部开发;认知项为粒子向自身历史最优位置学习,体现个体经验;社会项体现粒子向全局最优位置学习,体现群体协作。5.5粒子群算法中惯性权重的作用是什么?常用的设置策略是什么?答:惯性权重用于控制粒子保留上一代速度的比例,平衡算法的全局探索与局部开发能力。越大,全局搜索能力越强,收敛越慢;越小,局部搜索能力越强,收敛越快,但易陷入局部最优。常用设置策略是线性递减策略,即从较大值线性下降到较小的值,前期使用较大保证全局搜索,后期使用较小进行精细局部寻优。5.6简述模拟退火算法的基本思想和核心流程,并详细说明Metropolis准则的作用与物理意义。答:模拟退火算法的基本思想是:模拟固体材料的退火过程,先将固体加热至高温使其粒子充分无序,再缓慢降温,粒子逐渐趋于能量最低的稳定状态。算法在迭代中以一定概率接受比当前解更差的解,避免陷入局部最优,最终收敛到全局最优解。核心流程如下。(1)初始化:设置充分大的初始温度、初始解、每个温度下的迭代次数;(2)温度内迭代:对,执行局部调整产生新解、计算能量增量、按Metropolis准则判断是否接受新解;(3)降温:按照降温系数缓慢降低温度,使温度逐渐趋近于0;(4)终止:当温度低于终止阈值或达到最大迭代次数时,停止迭代,输出当前最优解。Metropolis准则核心思想是:在给定温度下,通过概率判断是否接受一个比当前解更差的解。如果新解对应更低的能量,则它将被接受;如果新解对应更高的能量,则它有一定概率被接受,以避免算法陷入局部最优解。该准则允许算法在高温下接受较差解,从而有利于跳出局部最优;低温下仅接受优良解,保证算法稳定收敛。其物理意义对应热力学中粒子在温度下达到热平衡的接受概率,是模拟退火算法中用于接受新解的重要机制。5.7利用蚁群算法编程求解旅行商问题,29个城市的坐标如本章中的表5.2所示。答:蚁群算法求解TSP的基本思路包括:1)初始化:信息素和启发式信息的初始化,以及蚂蚁的初始放置;2)蚂蚁行走:每只蚂蚁按照特定的规则选择下一个城市,并更新路径上的信息素;3)信息素更新:蚂蚁行走后,根据路径长度更新信息素的浓度;4)最优路径更新:记录全局最优路径,并根据信息素浓度调整策略;5)终止条件:达到预设的迭代次数或满足特定条件时结束搜索,返回最优路径。Python参考例程如下。"""题目:基于蚁群算法的TSP"""importnumpyasnpimportmatplotlib.pyplotaspltimporttimeplt.rcParams['font.sans-serif']=['MicrosoftYaHei']plt.rcParams['axes.unicode_minus']=False#初始城市位置的散点图defGetDistanceMatrix(X,Y,CityCount):plt.figure(1)plt.plot(X,Y,'ro')plt.xlabel("横坐标")plt.ylabel("纵坐标")plt.title("城市分布散点图")#在每个点上标注编号和坐标foriinrange(CityCount):plt.text(X[i]+5,Y[i]+5,f'{i}({X[i]},{Y[i]})',fontsize=8)#生成一个方阵作为任意两城市之间的距离矩阵DistanceMatrix=np.zeros((CityCount,CityCount))forrowinrange(CityCount):forcolinrange(CityCount):DistanceMatrix[row,col]=((X[row]-X[col])**2+(Y[row]-Y[col])**2)**0.5returnDistanceMatrix#算法实现defACO_TSP(X,Y):#根据城市个数生成城市距离矩阵DistanceMatrix=GetDistanceMatrix(X,Y,CityCount)start=time.time()#根据蚂蚁的数量为每一只蚂蚁随机分配初始城市AntPlaceVector=np.random.randint(0,CityCount,(1,AntCount))#接着生成初始信息素矩阵#首先随机生成一条周游路线以初始化每条边上的信息素RandomRoute=np.random.permutation(np.arange(CityCount))TempLength=0foriinrange(CityCount-1):TempLength+=DistanceMatrix[RandomRoute[i],RandomRoute[i+1]]TempLength+=DistanceMatrix[RandomRoute[0],RandomRoute[CityCount-1]]PheromoneMatrix=np.full((CityCount,CityCount),1/TempLength)#对角线上的元素初始化为零foriinrange(CityCount):PheromoneMatrix[i,i]=0global_best=float('inf')global_best_route=Noneglobal_history=np.zeros(MaxIteration)foriterationinrange(MaxIteration):print("迭代次数:%s"%(iteration+1))#创建一个禁忌表,用双重列表的形式进行定义TabooList=[]#首先定义禁忌表中的每一个元素都是一个列表,表示某一只蚂蚁的禁忌表foriinrange(AntCount):TabooList.append([])foriinrange(AntCount):TabooList[i].append(AntPlaceVector[0,i])#首先求出每一轮迭代中每一只蚂蚁进行下一目的地选择的概率向量foriinrange(CityCount-1):forantinrange(AntCount):ProbilityVector=np.zeros((1,CityCount))forcityinrange(CityCount):ifcityinTabooList[ant]:continuecurrent=TabooList[ant][-1]TempPheromone=PheromoneMatrix[current,city]TempNegDistance=1/DistanceMatrix[current,city]ProbilityVector[0,city]=(TempPheromone**Alpha)*(TempNegDistance**Beta)Pro_Sum=np.sum(ProbilityVector)#ifPro_Sum<=0:#available=[cforcinrange(CityCount)ifcnotinTabooList[ant]]#ProbilityVector=np.zeros((1,CityCount))#ProbilityVector[0,available]=1/len(available)#else:#ProbilityVector=ProbilityVector/Pro_SumifPro_Sum==0:Pro_Sum=1e-10ProbilityVector=ProbilityVector/Pro_Sum#求出概率向量后使用逐次轮盘法进行抽签得到每只蚂蚁下一次所到达的城市Next_City=np.random.choice(CityCount,p=ProbilityVector[0,:])TabooList[ant].append(Next_City)#至此已经得到了某一轮迭代中每一只蚂蚁的行进路线,用一个列表表示,接下来分别计算每只蚂蚁的周游路线的长度RouteLengths=[]forantinrange(AntCount):TempRouteLength=0foriinrange(CityCount-1):TempRouteLength+=DistanceMatrix[TabooList[ant][i],TabooList[ant][i+1]]TempRouteLength+=DistanceMatrix[TabooList[ant][0],TabooList[ant][-1]]RouteLengths.append(TempRouteLength)#记录此时的局部最优解best_idx=RouteLengths.index(min(RouteLengths))BestRoute=TabooList[best_idx]current_best=min(RouteLengths)RouteRecordMin[0,iteration]=current_bestRouteRecordMax[0,iteration]=max(RouteLengths)RouteRecordAve[0,iteration]=np.mean(RouteLengths)#更新全局最优ifcurrent_best<global_best:global_best=current_bestglobal_best_route=BestRoute.copy()#记录到收敛曲线global_history[iteration]=global_best#更新信息素矩阵New_PheromoneMatrix=np.zeros((CityCount,CityCount))forrowinrange(CityCount):forcolinrange(CityCount):ifrow==col:continuenew_info=0#如果某只蚂蚁经过了该条路径,则会增加该路径上的信息素forantinrange(AntCount):path=TabooList[ant]foriinrange(CityCount-1):a,b=path[i],path[i+1]if(a==rowandb==col)or(a==colandb==row):new_info+=Q/RouteLengths[ant]a,b=path[-1],path[0]if(a==rowandb==col)or(a==colandb==row):new_info+=Q/RouteLengths[ant]New_PheromoneMatrix[row,col]=(1-VolatilizationRate)*PheromoneMatrix[row,col]+new_infoPheromoneMatrix=New_PheromoneMatrixend=time.time()Time_Gap=end-start#迭代完成后最优环游路线的示意图BestRoute=global_best_routestart_city=BestRoute[0]end_city=BestRoute[-1]x_route=[X[i]foriinBestRoute]+[X[start_city]]y_route=[Y[i]foriinBestRoute]+[Y[start_city]]plt.figure(3,figsize=(10,7))plt.plot(x_route,y_route,'r-',linewidth=2)#普通城市:蓝foriinrange(CityCount):ifi!=start_cityandi!=end_city:plt.plot(X[i],Y[i],'bo',markersize=10)#起点:红plt.plot(X[start_city],Y[start_city],'ro',markersize=12,label='起点')#终点:绿plt.plot(X[end_city],Y[end_city],'go',markersize=12,label='终点')#标注编号+坐标foriinrange(CityCount):plt.text(X[i]+5,Y[i]+5,f'{i}({X[i]},{Y[i]})',fontsize=8,color='blue')plt.title("蚁群算法TSP最优路径图",fontsize=14)#绘制最短路径收敛曲线plt.figure(4,figsize=(10,5))iter_range=np.arange(MaxIteration)plt.plot(iter_range,global_history,'b-',linewidth=2,label='最短路径长度')plt.xlabel("迭代次数",fontsize=12)plt.ylabel("最短路径长度",fontsize=12)plt.title("蚁群算法TSP最短路径长度收敛曲线",fontsize=14)plt.grid(True,linestyle='--',alpha=0.7)plt.legend()plt.show()print("算法运行时间:",Time_Gap,"秒")#print("本次迭代最短路径长度:",RouteRecordMin[0,-1])#print("本次迭代最长路径长度:",RouteRecordMax[0,-1])#print("本次迭代平均路径长度:",RouteRecordAve[0,-1])print("最短路径顺序:",BestRoute)print("最短路径长度:",global_best)defread_tsp_data(filename):withopen(filename,'r')asf:lines=f.readlines()n=int(lines[0])cities=[]foriinrange(1,n+1):x,y=map(int,lines[i].split())cities.append((x,y))returncitiesif__name__=='__main__':#读取城市坐标数据cities=read_tsp_data('city.txt')CityCount=len(cities)City_X,City_Y=zip(*cities)#转为列表,防止索引报错City_X=list(City_X)City_Y=list(City_Y)AntCount=50#定义蚂蚁数量MaxIteration=200#定义最大迭代次数Alpha=1#定义信息素因子Beta=10#定义启发函数因子Q=2#定义算法信息素常数VolatilizationRate=0.3#定义算法中的挥发率np.random.seed(2)#固定随机数种子,方便多次进行验证RouteRecordMin=np.zeros((1,MaxIteration))#用于记录每一次迭代中的局部最优解RouteRecordMax=np.zeros((1,MaxIteration))#用于记录每一次迭代中的最长回路长度RouteRecordAve=np.zeros((1,MaxIteration))#用于记录每一次迭代中的蚂蚁周游的平均路径长度BestRoute=[]#用于记录最优环游路线中城市的经过顺序#执行蚁群算法,绘制最优路径图ACO_TSP(City_X,City_Y)TSP问题城市分布散点图、经200次迭代后的最短路径图以及最短路径长度收敛曲线如下所示,其中红色表示起点城市,绿色表示最后一个城市。最短路径为[13,17,14,3,9,19,1,20,4,25,28,2,8,5,11,27,0,23,7,22,15,12,18,24,6,26,10,21,16],路径长度为9804.17。5.8利用粒子群算法编程求解四维Rosenbrock函数的优化问题。答:算法流程如下:步骤1:初始化粒子群体参数,包括粒子数量、随机位置和速度、最大迭代次数、阈值、惯性权重、个体学习因子和全局因子等;步骤2:根据适应度评估函数(四维Rosenbrock函数),评价每个粒子的适应度;步骤3:对每个粒子,将其当前适应值与其个体历史最佳位置(pbest)对应的适应值做比较,如果当前的适应值更高,则将用当前位置更新历史最佳位置pbest;步骤4:对每个粒子,将其当前适应值与全局最佳位置(gbest)对应的适应值做比较,如果当前的适应值更高,则将用当前粒子的位置更新全局最佳位置gbest;步骤5:更新每个粒子的速度与位置;步骤6:如未满足结束条件,则返回步骤2。通常算法达到最大迭代次数或者最佳适应度值的增量小于某个给定的阈值时算法停止。Python参考例程如下。importnumpyasnpimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['MicrosoftYaHei']plt.rcParams['axes.unicode_minus']=False#4维Rosenbrock函数(理论最优:0,位置[1,1,1,1])defrosenbrock(x):returnnp.sum(100.0*(x[1:]-x[:-1]**2)**2+(1-x[:-1])**2)#=====================粒子群优化算法PSO=====================classPSO:def__init__(self,dim=4,pop_size=30,max_iter=1000,x_bound=30,v_bound=10,tol=1e-6):self.w=0.73#惯性权重self.c1=1.49#个体学习因子self.c2=1.49#全局学习因子self.dim=dim#维度=4self.pop_size=pop_sizeself.max_iter=max_iterself.x_bound=x_bound#位置范围self.v_bound=v_bound#速度范围self.tol=tol#停止精度np.random.seed(30)#固定随机数种子,方便多次进行验证#初始化粒子群self.x=np.random.uniform(-x_bound,x_bound,(pop_size,dim))self.v=np.random.uniform(-v_bound,v_bound,(pop_size,dim))#个体最优self.pbest_x=self.x.copy()self.pbest_val=np.array([rosenbrock(xi)forxiinself.x])#全局最优self.gbest_val=np.min(self.pbest_val)self.gbest_x=self.pbest_x[np.argmin(self.pbest_val)].copy()#收敛曲线self.history=[]defrun(self):print("PSO求解4维Rosenbrock函数")foriterinrange(self.max_iter):r1=np.random.rand(self.pop_size,self.dim)r2=np.random.rand(self.pop_size,self.dim)#更新速度self.v=self.w*self.v+self.c1*r1*(self.pbest_x-self.x)+self.c2*r2*(self.gbest_x-self.x)self.v=np.clip(self.v,-self.v_bound,self.v_bound)#更新位置self.x=self.x+self.vself.x=np.clip(self.x,-self.x_bound,self.x_bound)#更新个体最优current_val=np.array([rosenbrock(x)forxinself.x])mask=current_val<self.pbest_valself.pbest_x[mask]=self.x[mask].copy()self.pbest_val[mask]=current_val[mask]#更新全局最优current_best=np.min(self.pbest_val)ifcurrent_best<self.gbest_val:self.gbest_val=current_bestself.gbest_x=self.pbest_x[np.argmin(self.pbest_val)].copy()self.history.append(self.gbest_val)#每20代输出一次ifiter%20==0:print(f"迭代{iter:>3}|最优值={self.gbest_val:.8f}")#达到精度提前停止ifself.gbest_val<self.tol:print(f"\n达到精度{self.tol},提前停止!")breakreturnself.gbest_x,self.gbest_val,self.history#绘制3DRosenbrock曲面defplot_rosenbrock_3d():fig=plt.figure(figsize=(10,6))ax=fig.add_subplot(111,projection='3d')#固定x3=1,x4=1,只画x1,x2对应的曲面x1=np.linspace(-2,2,500)x2=np.linspace(-2,2,500)X1,X2=np.meshgrid(x1,x2)#4维Rosenbrock函数:后两维固定为最优值1Z=100*(X2-X1**2)**2+(1-X1)**2+\100*(1-X2**2)**2+(1-X2)**2ax.plot_surface(X1,X2,Z,cmap='jet',alpha=0.7)ax.set_xlabel('x1')ax.set_ylabel('x2')ax.set_zlabel('f(x)')ax.set_title('Rosenbrock函数3D曲面图(x3=1,x4=1)')plt.show()#主程序if__name__=='__main__':#运行PSO(dim=4固定为4维Rosenbrock函数)pso=PSO(dim=4,pop_size=30,max_iter=1000,x_bound=30,v_bound=10,tol=1e-6)best_x,best_val,history=pso.run()#输出结果print("\n"+"="*60)print("🎯4维Rosenbrock函数最优结果:")print(f"最优位置={np.round(best_x,4)}")print(f"最优值={best_val:.8f}")print(f"理论最优=0.0")print("="*60)#绘制收敛曲线plt.figure(figsize=(10,5))plt.plot(history,linewidth=2,color='#1f77b4',label='最优适应度')plt.xlabel('迭代次数',fontsize=12)plt.ylabel('函数值',fontsize=12)plt.title('PSO求解4维Rosenbrock函数收敛曲线',fontsize=14)plt.grid(True,linestyle='--',alpha=0.6)plt.legend()plt.show()#绘制3D曲面图plot_rosenbrock_3d()四维Rosenbrock函数在固定第三、四维为1时的三维曲面图以及1000次迭代后的适应度收敛曲线图如下所示,优化结果为最优位置为[0.99310.98620.97270.946],最优值为0.00098555,非常接近理论最优值,说明PSO算法对4维Rosenbrock函数具有极强的寻优能力。第6章习题6.1机器学习对数据集,特别是训练集有什么要求?答:数据是机器学习的基础,通常训练集规模越大、质量越高,数据越有代表性,训练得到的模型效果会越好。具有足够大规模和多样性的数据可以支撑复杂模型的表征能力,避免出现过拟合现象。当样本较少时,模型会误把数据的个性(样本的独特性)当成共性(待学习的规律),这里可以理解为“聪明的模型”不仅拟合数据中蕴含的规律,还主动去拟合那些看似规律的噪声模式。当数据库规模增大且数据多样性提高时,样本噪声是随机的,不像数据自身特征具有稳定性,这些随机噪声被消解掉了,不会被模型认为是统一的模式。因此,这些随机性的干扰不会被模型作为稳定特征而学习到。6.2试阐述分类模型选择并参数确定的一般过程。答:候选模型的选择取决于具体的任务和已有的经验,没有统一的标准,通常需要尝试从简单到复杂的多种模型,选择能够与训练集符合的尽可能简单的模型。在训练开始前,需要为模型确定超参数的取值,超参数调节是机器学习中优化模型性能的关键步骤,涉及多种方法。常见方法包括:网格搜索和随机搜索分别以系统性和随机性尝试不同超参数组合,但可能计算成本高昂或无法保证找到最优解;贝叶斯优化利用概率模型预测超参数的效果,更高效地指导搜索过程;手动调优依赖个人经验,而自动化机器学习(AutoML)旨在通过自动化流程寻找最优配置;进化算法模仿自然选择过程逐步改进超参数,梯度基准化适用于可微分的超参数优化;交叉验证用于准确评估模型泛化能力,同时需要根据任务选择合适的性能指标。在实际应用中,通常会结合这些方法来获取最优的模型性能。6.3有监督学习的性能评价指标如何选择?答:常见的回归性能评价指标有误差平方和(sumofsquaresduetoerror,SSE)、均方误差(meansquarederror,MSE)、均方根误差(rootmeansquareerror,RMSE)、平均绝对误差(meanabsoluteerror,MAE)和决定系数(coefficientofdetermination,R2)。前四个指标是基于拟合误差的,而决定系数是相对于输出值的均值来定义的。均方根误差容易受到少数异常点的影响而变得过大,误差平方和与均方误差也有类似的性质。平均绝对误差具有与预测输出值和真实值相同的量纲,比较直观。决定系数表征在因变量的变异中有多大比例可由其关于自变量的回归模型来解释。常见的分类性能评价指标有如下几种。准确率(Accuracy)准确率是最常用的指标之一,特别是当类别分布基本均衡时,它可以简单地度量模型正确分类样本的比例。(2)精确率(Precision)和召回率(Recall)精确率和召回率通常在面对类别不平衡或关注某个类别时使用。精确率指的是被分类器预测为正例的样本中实际为正例的比例,而召回率指的是所有正例中被分类器正确识别出来的比例。(3)F1值(F1-Score)。F1值是综合考虑了精确率和召回率的指标,可用于比较不同分类器的性能。(4)AUC值AUC是二元分类器性能的另一个重要指标,AUC是ROC曲线下的面积,反映了模型对正反样本的区分能力。适用于处理类别不平衡问题。6.4简述强化学习的主要分支和研究历程。答:强化学习是一种机器学习方法,主要研究如何在一个环境中,通过不断尝试和交互的过程,使Agent学会最优策略以达到某个目标。强化学习发展至今,已经涌现出很多分支。其中比较重要的有以下几个。(1)基于价值的强化学习,此类方法通过学习状态值函数或动作值函数来指导决策,常见的算法包括Q-learning和Sarsa等。(2)基于策略的强化学习,如策略梯度方法,此类方法直接学习策略函数,无需估计值函数,常见的算法包括REINFORCE、Actor-Critic等。(3)深度强化学习,此类方法将深度神经网络应用到强化学习中,以处理高维、非线性、连续动作空间等问题,常见的算法包括DQN、DDPG、A3C等。(4)逆强化学习,此类方法试图从专家的行为中反向推断其奖励函数,以此来理解其行为背后的动机和目标。(5)多Agent强化学习,此类方法研究多个Agent协同或竞争的问题,常见的算法包括马尔可夫博弈、Multi-AgentDeepQ-Learning(MADDPG)等。强化学习的研究历程起源于20世纪50年代到60年代的控制理论和应用研究,随着计算机技术的发展,强化学习开始在计算机科学领域得到广泛关注。20世纪80年代,Sutton和Barto等人提出了经典的强化学习框架,这个框架包括马尔可夫决策过程、价值函数、策略等概念,并提出了基于时序差分(TemporalDifference,TD)算法的Q-learning方法。之后,强化学习在控制、游戏、智能交通、机器人等领域得到了广泛应用。近年来,随着深度学习技术的发展,深度强化学习取得了一系列重要进展,应用于图像处理、自然语言处理、智能对话等方面。6.5试解释强化学习与其他机器学习方法的异同。答:强化学习与其他机器学习方法相比有以下不同。样本提供的信息以及反馈方式不同强化学习与有监督学习和无监督学习的学习方式不同。有监督学习通过训练数据对模型进行有监督的学习;无监督学习则是在没有人工标签的情况下从数据中学习特征。而强化学习不需要数据包含明确目标值或人工标签,而是通过奖励信号来反馈行为的好坏。强化学习需要权衡探索和利用因为强化学习没有训练数据集,所以它需要在环境中进行实时交互以获得经验。这就涉及到了探索和利用之间的权衡。探索是指尝试新的行动以更好地了解环境,而利用是指选择目前已知最优行动以最大化奖励。其他机器学习算法通常只需要在训练过程中做出决策,而不需要在实验环境中进行交互。强化学习适合于时间序列预测强化学习是一种时间序列预测方法,它通过学习如何在连续时间步之间做决策来最大化长期收益。其他机器学习算法通常对每个样本独立进行训练和预测,而不考虑时间序列中相邻样本之间的相关性。强化学习有奖励信号强化学习通过奖励信号来反馈行动的好坏,而其他机器学习算法通常使用损失函数或代价函数来度量模型在训练数据上的性能。总体而言,强化学习与其他机器学习方法区别较大,更适合解决连续的决策问题以及具有长期奖励的任务。它需要在实践中不断探索以学习最优策略,可用于解决很多现实问题,如机器人控制、自然语言处理等。然而,它的一个主要局限是学习过程较慢,并且对参数调整和环境建模较为敏感。6.6基于波士顿房价数据集,建立多元线性回归的房价预测模型,考察回归模型的性能。该数据集是在20世纪70年代收集建立的,包括506个样本,每个样本包括13个特征和一个房价值。数据下载地址为:/ml/machine-learning-databases/housing/housing.data。答:Python参考例程如下。已下载的housing.txt文件保存在本地文件夹中。importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportStandardScaler#加载数据data=pd.read_csv("D:/教学/人工智能/编程实验/机器学习/housing.txt",delim_whitespace=True,header=None)data.columns=['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PTRATIO','B','LSTAT','MEDV']#计算相关系数矩阵rho=data.corr(method='pearson')#绘制相关性热图plt.figure(1)plt.imshow(rho,cmap='coolwarm',interpolation='none')plt.colorbar()plt.xticks(range(len(rho)),rho.columns,rotation=90)plt.yticks(range(len(rho)),rho.columns)plt.title('CorrelationCoefficient')plt.xlabel('Features')plt.ylabel('Features')#绘制房价关于各特征的散点图plt.figure(2)foriinrange(4):forjinrange(4):number=4*i+j+1ifnumber>13:breakplt.subplot(4,4,number)plt.scatter(data[data.columns[number-1]],data['MEDV'])plt.xlabel(data.columns[number-1])plt.ylabel('MEDV')plt.tight_layout()#自动调整子图参数,使之填充整个图像区域#将数据划分为特征和标签X=data[['RM','LSTAT']].valuesY=data['MEDV'].values#数据归一化scaler=StandardScaler()X=scaler.fit_transform(X)X=np.hstack((np.ones((X.shape[0],1)),X))#添加偏置项#构建预测模型#采用梯度下降法plt.figure(3)alphas=[0.001,0.003,0.007,0.01,0.05,0.1,0.2]iterations=50m,n=X.shapetheta=np.random.randn(n)J_history=[]forainrange(len(alphas)):alpha=alphas[a]theta=np.random.randn(n)J=np.zeros(iterations)foriterinrange(iterations):H=X.dot(theta)J[iter]=(1/(2*m))*np.sum((H-Y)**2)gradients=(1/m)*X.T.dot(H-Y)theta-=alpha*gradientsJ_history.append(J)plt.subplot(3,3,a+1)plt.plot(range(iterations),J)plt.title(f"alpha={alpha}")plt.xlabel('Iterations')plt.ylabel('Cost')plt.tight_layout()#自动调整子图参数,使之填充整个图像区域#NormalEquation,利用正规方程计算参数值theta1=np.linalg.inv(X.T.dot(X)).dot(X.T).dot(Y)H=X.dot(theta1)J_normal=(1/(2*m))*np.sum((H-Y)**2)#绘制目标函数散点图plt.subplot(3,3,9)plt.scatter(range(iterations),[J_normal]*iterations)plt.title("NormalEquation")plt.xlabel('Iterations')plt.ylabel('Cost')#预测结果与真实值比较Z=np.hstack((X[:,1:],Y.reshape(-1,1)))plt.figure(4)plt.scatter(Y,H,color='blue')plt.plot([min(Y),max(Y)],[min(Y),max(Y)],'g--')plt.xlabel('ActualPrices')plt.ylabel('PredictedPrices')plt.title('ActualvsPredictedPrices')plt.show()变量间相关性热图如下。各变量与房价真实值分布的散点图如下。以误差平方和作为目标函数,下图中前7个子图为学习率分别为0.001、0.003、0.007、0.01、0.05、0.1、0.2时对应的目标函数值随迭代下降过程,最后一个子图显示了最终方程对应的目标函数值。模型拟合结果如下,蓝点为真实值,绿色直线为拟合线。6.7假设某数据集包括三个样本,输入为,输出为(见下表)。对于图中显示的三种线性回归模型,分别计算它们在数据集上的均方误差。输入/输出值023221答:均方误差的计算公式为其中,yi为真实值;f(xi)为预测值;n为样本数。三种线性回归模型分别为将各样本的预测值和真实值代入公式,得到三种模型的均方误差分别为6.5已知如下两类样本,第1类:{(4,2)T,(2,4)T,(2,3)T,(3,6)T,(4,4)T},第2类:{(9,10)T,(6,8)T,(9,5)T,(8,7)T,(10,8)T},每个样本包括两维特征,请利用线性判别分析算法求解该分类问题的判别函数。答:第1步计算均值第2步计算协方差第3步计算类间散度和类内散度第4步求特征值第5步求最大特征值对应的特征向量根据和得到,6.8用线性判别分析、支持向量机和CART决策树算法分别对下表中的数据进行分类。编号特征1特征2标签编号特征1特征2标签1108191170285110158035411120404811122190512611322160638114243207931151617087211618140答:对于二维特征,线性判别分析的思路是将数据投影到一维的新特征空间上,然后选择一个阈值来划分样本属于哪个类别。Python参考例程如下。importnumpyasnpimportmatplotlib.pyplotasplt#数据初始化data=np.array([[10,8,5,8,12,3,9,7,11,15,20,21,22,24,16,18],[8,5,4,1,6,8,3,2,7,8,4,9,16,32,17,14],[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0]]).Tm,n=data.shape#绘制散点图foriinrange(m):ifdata[i,2]==1:plt.plot(data[i,0],data[i,1],'g*',markersize=7)elifdata[i,2]==0:plt.plot(data[i,0],data[i,1],'ro',markersize=7)#计算均值向量cen1=np.zeros(2)cen0=np.zeros(2)sum1=np.zeros(2)sum0=np.zeros(2)num1=0num0=0foriinrange(m):ifdata[i,2]==1:sum1+=data[i,:2]num1+=1elifdata[i,2]==0:sum0+=data[i,:2]num0+=1cen1=sum1/num1cen0=sum0/num0#计算类内散度矩阵Sw和类间散度矩阵SbSw=np.zeros((2,2))Sb=np.outer(cen0-cen1,cen0-cen1)foriinrange(m):ifdata[i,2]==1:Sw+=np.outer(data[i,:2]-cen1,data[i,:2]-cen1)elifdata[i,2]==0:Sw+=np.outer(data[i,:2]-cen0,data[i,:2]-cen0)#计算最大特征值和特征向量L,D=np.linalg.eig(np.linalg.inv(Sw).dot(Sb))idx=np.argmax(np.abs(L))k=L[idx]/D[idx,idx]#显示投影线xx=np.linspace(-5,30,400)yy=k*xxplt.plot(xx,yy)#计算投影点并显示new_data=np.zeros((m,3))new_data[:,0]=(k*data[:,1]+data[:,0])/(k**2+1)new_data[:,1]=k*new_data[:,0]new_data[:,2]=data[:,2]foriinrange(m):ifnew_data[i,2]==1:plt.plot(new_data[i,0],new_data[i,1],'g+',markersize=7)elifnew_data[i,2]==0:plt.plot(new_data[i,0],new_data[i,1],'r+',markersize=7)plt.axis([-5,30,-5,35])plt.xlabel('x')plt.ylabel('y')plt.show()#初始化正确分类计数器correct_count=0#留一法交叉验证foriinrange(m):#分离出测试点和训练集test_point=data[i,:]train_data=np.delete(data,i,axis=0)#重新计算均值向量cen1=np.zeros(2)cen0=np.zeros(2)sum1=np.zeros(2)sum0=np.zeros(2)num1=0num0=0forjinrange(len(train_data)):iftrain_data[j,2]==1:sum1+=train_data[j,:2]num1+=1eliftrain_data[j,2]==0:sum0+=train_data[j,:2]num0+=1ifnum1>0:cen1=sum1/num1ifnum0>0:cen0=sum0/num0#计算类间散度矩阵SbSb=np.outer(cen0-cen1,cen0-cen1)#计算类内散度矩阵SwSw=np.zeros((2,2))forjinrange(len(train_data)):iftrain_data[j,2]==1:Sw+=np.outer(train_data[j,:2]-cen1,train_data[j,:2]-cen1)eliftrain_data[j,2]==0:Sw+=np.outer(train_data[j,:2]-cen0,train_data[j,:2]-cen0)#计算最大特征值和特征向量L,D=np.linalg.eig(np.linalg.inv(Sw).dot(Sb))idx=np.argmax(np.abs(L))k=L[idx]/D[idx,idx]#计算投影点projected_test_x=(k*test_point[1]+test_point[0])/(k**2+1)projected_test_y=k*projected_test_x#计算距离并分类distance_to_class1=np.sqrt((projected_test_x-cen1[0])**2+(projected_test_y-cen1[1])**2)distance_to_class0=np.sqrt((projected_test_x-cen0[0])**2+(projected_test_y-cen0[1])**2)predicted_label=0ifdistance_to_class0<distance_to_class1else1#检查预测是否正确ifpredicted_label==test_point[2]:correct_count+=1#计算准确率accuracy=correct_count/mprint("Leave-one-outcross-validationaccuracy:",accuracy)样本分布和投影结果如下。对于线性判别器模型进行留一法验证的平均准确率为93.75%。支持向量机是一种常用的二分类模型,通过寻找具有最大间隔的分类超平面以区分不同类别的样本。Python参考例程如下。importnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportsvm#数据和标签data=np.array([[10,8],[8,5],[5,4],[8,1],[12,6],[3,8],[9,3],[7,2],[11,7],[15,8],[20,4],[21,9],[22,16],[24,32],[16,17],[18,14]])labels=np.array([1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0])x,y=11.5,7.5test_data=np.array([x,y])#绘制数据点plt.plot(data[:8,0],data[:8,1],'g*',label='患病')plt.plot(data[8:,0],data[8:,1],'ro',label='不患病')plt.plot(x,y,'b+',label='新个体')plt.legend()plt.show()#留一法交叉验证traindatanum=len(data)correctnum=0foriiinrange(traindatanum):train_data=np.delete(data,ii,axis=0)train_label=np.delete(labels,ii)clf=svm.SVC(kernel='linear')clf.fit(train_data,train_label)predictlabel=clf.predict([data[ii]])[0]ifpredictlabel==labels[ii]:correctnum+=1accuracy=correctnum/traindatanumprint("留一法准确率:",accuracy)#训练最终模型并绘制决策边界clf=svm.SVC(kernel='linear')clf.fit(data,labels)#绘制决策边界xx,yy=np.meshgrid(np.linspace(0,25,500),np.linspace(0,40,500))Z=clf.decision_function(np.c_[xx.ravel(),yy.ravel()])Z=Z.reshape(xx.shape)plt.contourf(xx,yy,Z,levels=[Z.min(),0,Z.max()],colors=['red','green'],alpha=0.8)plt.scatter(data[:8,0],data[:8,1],c='green',marker='*')plt.scatter(data[8:,0],data[8:,1],c='red',marker='o')plt.plot(x,y,'b+')plt.title('SVMDecisionBoundarywithNewDataPoint')plt.xlabel('x')plt.ylabel('y')plt.show()对于支持向量机模型进行留一法验证的平均准确率为81.25%。由于选择了线性核,决策边界是线性的,分类结果如下。CART决策树是一种基于树结构的分类模型,通过递归地将数据集划分为子集并在每个子集上重复进行决策来分类。Python参考例程如下。importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.treeimportDecisionTreeClassifierfromsklearn.model_selectionimporttrain_test_split#设置中文字体plt.rcParams['font.sans-serif']=['SimHei']#用黑体显示中文plt.rcParams['axes.unicode_minus']=False#解决负号'-'显示为方块的问题#数据和标签data=np.array([[10,8],[8,5],[5,4],[8,1],[12,6],[3,8],[9,3],[7,2],[11,7],[15,8],[20,4],[21,9],[22,16],[24,32],[16,17],[18,14]])label=np.array([1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0])x,y=11.5,7.5test_data=np.array([x,y])#新个体的坐标#绘制数据点plt.plot(data[:8,0],data[:8,1],'g+',label='患病')plt.plot(data[8:,0],data[8:,1],'ro',label='不患病')plt.plot(x,y,'b*',label='新个体')plt.legend()#计算训练数据的数目traindatanum=len(data)//2correctnum=0#交叉验证foriiinrange(traindatanum):test_data=data[ii]test_label=label[ii]train_data=np.delete(data,ii,axis=0)train_label=np.delete(label,ii)clf=DecisionTreeClassifier()clf.fit(train_data,train_label)predictlabel=clf.predict([test_data])[0]ifpredictlabel==test_label:correctnum+=1accuracy=correctnum/traindatanumprint("Accuracy:",accuracy)#重新训练模型并绘制决策边界clf=DecisionTreeClassifier()clf.fit(data,label)fig,ax=plt.subplots()ax.plot(data[:8,0],data[:8,1],'gs',label='患病')ax.plot(data[8:,0],data[8:,1],'ro',label='不患病')xx,yy=np.meshgrid(np.arange(0,25,1),np.arange(0,40,1))Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])Z=Z.reshape(xx.shape)ax.contourf(xx,yy,Z,alpha=0.3)plt.xlabel('x')plt.ylabel('y')plt.show()对于CART决策树进行留一法验证的平均准确率为87.5%。决策边界如下。6.9用支持向量机方法构建判断肿瘤是良性还是恶性的分类器,样本特征为肿瘤体积和患者年龄。已知训练集如下表所示,标签为1表示该样本为良性,标签为0表示该样本为恶性。序号123456789101112131415肿瘤体积/cm1.261.31.281.241.361.381.381.381.41.481.541.56年龄/岁535956605960525249555751555562标签111111000000000答:程序基本流程如下:1)导入必要的库:导入numpy用于数组操作,svm模块用于支持向量机分类器,以及LeaveOneOut用于留一法交叉验证。2)定义数据和标签:定义给定的数据和对应的标签。3)创建SVM分类器:使用线性核函数创建一个SVM分类器。4)留一法交叉验证:使用LeaveOneOut进行留一法交叉验证。对于每一个训练/测试分割,训练模型并进行预测,然后检查预测结果是否与实际标签一致。如果一致,则增加正确计数。5)计算准确率:计算并打印留一法交叉验证的准确率。Python例程如下。importnumpyasnpfromsklearnimportsvmfromsklearn.model_selectionimportLeaveOneOutimport

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论