|
数学建模系列文章:以下是个人在准备数模国赛时候的一些模型算法和代码整理,有空会不断更新内容:评价模型(一)层次分析法(AHP),熵权法,TOPSIS分析及其对应PYTHON实现代码和例题解释评价模型(二)主成分分析、因子分析、二者对比及其对应PYTHON实现代码和例题解释优化模型(零)总述,分类,解析各类优化模型及普适做题步骤优化模型(一)线性规划详解,以及例题,用python的Pulp库函数求解线性规划优化模型(二)非线性规划详解,以及例题,Scipy.optimize求解非线性规划文章1.1层次分析法层次分析法介绍:问题引入:评价类模型是最基础的模型之一,往往对应着生活中一些很实际的问题。例如,高考结束了,你是选择南大还是武大呢?已知今天空气中几种污染气体的浓度,如何确定空气质量等级呢?放假想要出去旅游,有好几个备选目的地,如果只能选一个,该去哪里呢?基本思想:是定性与定量相结合的多准则决策、评价方法。将决策的有关元素分解成目标层、准则层和方案层(层次的来源),并通过人们的判断对决策方案的优劣进行排序,在此基础上进行定性和定量分析。它把人的思维过程层次化、数量化,并用数学为分析、决策、评价、预报和控制提供定量的依据。基本步骤:1.构建层次结构模型;2.构建成对比较判断矩阵;这n个指标的重要程度肯定是不一样的,我们需要定出这n个指标的权重。由于指标比较多,直接定权重难度较大,且主观因素太强,故我们采用的方法是对这些指标两两进行比较,从而在一定程度上削弱主观因素3.一致性检验(即判断主观构建的成对比较矩阵在整体上是否有较好的一致性);一致性检验结果要求CR值(CR=CI/RI)小于0.1,用于判断人们在构建判断矩阵时,是否存在逻辑错误,例如有ABC三个指标,我们判断A比B重要,B比C重要,因此逻辑上A肯定比C重要,但是如果在构建判断A比C时,认为C比A重要,那么就犯了逻辑错误,无法通过一致性检验。具体方法如下:计算权重;求权重有三种方法,一般用第三种方法会多一些,但在实际应用中,也可以把三种方法得到的结果取平均值,得到最终的权重。算数平均法求权重几何平均法求权重特征值法求权重求解得分(指标权重计算后的每个方案的得分)。举例:高考后选择南大还是武大呢?评价的目标就是选择学校,达成目标的方案就是选择南大或者选择武大,相关的指标有学科实力,校园景色,男女比例(指标)等等假设指标权重已经通过一致性检验并且计算得知按照每个指标给南大和武大打分(打分可以是百分制的,也可以是针对每一个目标比如学习氛围、就业前景再按照层次分析法确定南大和武大的权重得分),最后再加权求和,便可以给出两个学校比较合理的得分。考虑到对于不同的评价问题存在不同的指标,其量纲往往是不同的,不一定都是以分数都是衡量标准。因此对于某个指标,给不同的方案进行打分时,我们依然以“权重”作为其衡量的标准,其权重之和为1即可。如上图所示,相同颜色的单元格和为1,指标权重比较好理解,给予指标以不同的权重以加权。打分也是以“权重”来衡量,南大在学习氛围方面是0.6,武大便是0.4。如果再加一个东南,那学习氛围方面可能就是0.3,0.25,0.45,其加和依然是1。当然,我们也可以将正常打分作为衡量标准,例如学习氛围分数分别为95,90。但是为了整体更方便计算,这里选择“权重”作为衡量的标准,特此说明。优缺点:优点:它完全依靠主观评价做出方案的优劣排序,所需数据量少,决策花费的时间很短。从整体上看,AHP在复杂决策过程中引入定量分析,并充分利用决策者在两两比较中给出的偏好信息进行分析与决策支持,既有效地吸收了定性分析的结果,又发挥了定量分析的优势,从而使决策过程具有很强的条理性和科学性,特别适合在社会经济系统的决策分析中使用。缺点:用AHP进行决策主观成分很大。当决策者的判断过多地受其主观偏好影响,而产生某种对客观规律的歪曲时,AHP的结果显然就靠不住了。适用范围:尤其适合于人的定性判断起重要作用的、对决策结果难于直接准确计量的场合。要使AHP的决策结论尽可能符合客观规律,决策者必须对所面临的问题有比较深入和全面的认识。另外,当遇到因素众多,规模较大的评价问题时,该模型容易出现问题,它要求评价者对问题的本质、包含的要素及其相互之间的逻辑关系能掌握得十分透彻,否则评价结果就不可靠和准确。改进方法:(1)成对比较矩阵可以采用德尔菲法获得。(2)如果评价指标个数过多(一般超过9个),利用层次分析法所得到的权重就有一定的偏差,继而组合评价模型的结果就不再可靠。可以根据评价对象的实际情况和特点,利用一定的方法,将各原始指标分层和归类,使得每层各类中的指标数少于9个。补充:德尔菲法,也称专家调查法,1946年由美国兰德公司创始实行,其本质是一种反馈匿名函询法,其大致流程是在对所要预测的问题征得专家的意见之后,进行整理、归纳、统计,在匿名反馈给各专家,再次征求意见,再集中,再反馈,直至得到一致的意见。在评价中目的:确立评价指标。对评价类问题建模,往往需要考虑三个方面:评价的目标是什么?达成目标的方案有哪些?评价的指标/准则是什么?PYTHON代码:importnumpyasnp#导入所需包并将其命名为npA=[[1,1,4,1/3,3],[1,1,4,1/3,3],[1/2,1/4,1,1/3,1/2],[3,3,3,1,3],[1/3,1/3,2,1/3,1]]defConsisTest(X):#函数接收一个如上述A似的矩阵#计算权重#方法一:算术平均法##第一步:将判断矩阵按照列归一化(每个元素除以其所在列的和)X=np.array(X)#将X转换为np.array对象sum_X=X.sum(axis=0)#计算X每列的和(n,n)=X.shape#X为方阵,行和列相同,所以用一个n来接收sum_X=np.tile(sum_X,(n,1))#将和向量重复n行组成新的矩阵stand_X=X/sum_X#标准化X(X中每个元素除以其所在列的和)##第二步:将归一化矩阵每一行求和sum_row=stand_X.sum(axis=1)##第三步:将相加后得到的向量中每个元素除以n即可得到权重向量print("算数平均法求权重的结果为:")print(sum_row/n)#方法二:特征值法##第一步:找出矩阵X的最大特征值以及其对应的特征向量V,E=np.linalg.eig(X)#V是特征值,E是特征值对应的特征向量max_value=np.max(V)#最大特征值#print("最大特征值是:",max_value)max_v_index=np.argmax(V)#返回最大特征值所在位置max_eiv=E[:,max_v_index]#最大特征值对应的特征向量##第二步:对求出的特征向量进行归一化处理即可得到权重stand_eiv=max_eiv/max_eiv.sum()print("特征值法求权重的结果为:")print(stand_eiv)print("———————————————————————————————")#一致性检验##第一步:计算一致性指标CICI=(max_value-n)/(n-1)##第二步:查找对应的平均随机一致性指标RIRI=np.array([15,0,0,0.52,0.89,1.12,1.26,1.36,1.41,1.46,1.49,1.52,1.54,1.56,1.58,1.59])##第三步:计算一致性比例CRCR=CI/RI[n]ifCR极大型指标defMintomax(datas):returnnp.max(datas)-datasdf['细菌总数(个/mL)']=Mintomax(df['细菌总数(个/mL)'])#极小型指标->极大型指标df.head()#查看#中间型指标->极大型指标defMidtomax(datas,x_best):temp_datas=datas-x_bestM=np.max(abs(temp_datas))answer_datas=1-abs(datas-x_best)/Mreturnanswer_datasdf['PH值']=Midtomax(df['PH值'],7)#中间型指标->极大型指标7为最佳值#区间型指标->极大型指标defIntertomax(datas,x_min,x_max):M=max(x_min-np.min(datas),np.max(datas)-x_max)answer_list=[]foriindatas:if(ix_max):answer_list.append(1-(i-x_max)/M)else:answer_list.append(1)returnnp.array(answer_list)df['植物性营养物量(ppm)']=Intertomax(df['植物性营养物量(ppm)'],10,20)#区间型指标->极大型指标#正向化矩阵标准化(去除量纲影响)defStandard(datas):k=np.power(np.sum(pow(datas,2),axis=0),0.5)foriinrange(len(k)):datas[:,i]=datas[:,i]/k[i]returndataslabel_need=df.keys()[1:]data=df[label_need].values#刨除变量名后的数据值sta_data=Standard(data)#正向化矩阵标准化(去除量纲影响)#正向化和标准化print(sta_data)#10为下界,20为上界#计算得分并归一化defScore(sta_data):z_max=np.amax(sta_data,axis=0)z_min=np.amin(sta_data,axis=0)#计算每一个样本点与最大值的距离tmpmaxdist=np.power(np.sum(np.power((z_max-sta_data),2),axis=1),0.5)tmpmindist=np.power(np.sum(np.power((z_min-sta_data),2),axis=1),0.5)score=tmpmindist/(tmpmindist+tmpmaxdist)score=score/np.sum(score)#归一化处理returnscoresco=Score(sta_data)#计算得分print(sco)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263641.4参考资料:数学建模笔记——评价类模型(一)数学建模之评价类问题AHP代码层次分析法,实例例子PYthon实现熵权TOPSIS法——利用原始数据进行综合评价归一化和标准化机器学习面试之归一化与标准化机器学习数据特征标准化和归一化标准化和归一化,请勿混为一谈,透彻理解数据变换数学建模之评价类问题
|
|