层次分析法的Python实现--数学建模学习日志
<p>数学建模比赛即将到来,大家应该都投身于学习当中了,b站上比较热门的一个课程是<br>b站数学建模学习视频</p>
<p>在这里讲解了数学建模常见的方法和写论文的要点,同时up主贴心地有所有方法的源码实现,但是全部都是matlab的代码。作为计算机人,python对我肯定是要比matlab熟悉的,所以我自己在学习过程中研究了如何用python实现这些方法,在这里分享给各位!</p>
<h1 id="一层次分析法">一、层次分析法</h1>
<p>层次分析法(Analytic Hierarchy Process)是一种由美国运筹学家托马斯·萨蒂(Thomas L. Saaty)于20世纪70年代提出的多准则决策方法。它将复杂问题分解为层次结构,通过定量与定性结合的方式,对备选方案进行优先排序。核心思想是通过构建判断矩阵,量化决策者的主观判断,最终计算各元素的权重。</p>
<p>主要分为以下几个步骤:(图片内容来自up主的 ppt)<br>
<img src="https://img2024.cnblogs.com/blog/3669812/202506/3669812-20250630130804832-762532359.png"><br>
当然,讲解这个方法不是我这篇文章的重点,详细方法请到视频中观看,下面介绍如何使用python实现层次分析方法。</p>
<h1 id="二python实现层次分析法">二、Python实现层次分析法</h1>
<h2 id="1导入相关库">1.导入相关库</h2>
<p>层次分析法主要对矩阵进行操作,所以主要使用的是numpy库,各位如果想详细了解numpy库的各种操作,可以见我的这篇博客:</p>
<p>(https://blog.csdn.net/2401_83372039/article/details/146212725?spm=1001.2014.3001.5501)</p>
<p>接下来主要就是代码的实现展示,我就不一一讲解numpy的操作了,大家可以照着我上面的博客来查用法,当作字典用即可。所有涉及用法上面均有!!!</p>
<pre><code>import numpy as np
</code></pre>
<h2 id="2读取矩阵">2.读取矩阵</h2>
<p>A.size返回的是矩阵的尺寸是长乘宽的结果,shape是返回以元组形式储存的长和宽。层次分析法的矩阵都是方阵,所以随便保存一个即可。<br>
输入矩阵:<br>
[,,]</p>
<pre><code>A=np.array(eval(input("请输入矩阵A=")))
print(A)
n=A.size #这里的size结果是3*3=9
n=A.shape#这里才是获取了行数
</code></pre>
<p>[<br>
<br>
]</p>
<h2 id="3算数平均法求权重">3.算数平均法求权重</h2>
<pre><code>#按照列求总值
A_sum=np.sum(A,axis=0)
stand_A=A/A_sum
print(stand_A)
print("算数平均法求权值的结果为:")
w1=np.sum(stand_A,axis=1)/n
print(w1)
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3669812/202506/3669812-20250630130955086-1407731144.png"></p>
<h2 id="4特征值法求权重">4.特征值法求权重</h2>
<pre><code>A_elg=np.linalg.eig(A)
print(A_elg)#eigenvalues是特征值,eigenvectors是特征向量
max_elg=np.max(A_elg).real
print(max_elg)
#获取最大特征值处的特征向量
w2=A_elg[:,A_elg==max_elg]
print("特征值法求权值的结果为:")
#归一化
print(w2/np.sum(w2.real))
#我们可以将两种方法平均
w3=(w1+w2)/2
w3
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3669812/202506/3669812-20250630131031912-1948151466.png"></p>
<p>层次分析法中,我们可以将两种方法结合起来,求个均值来作为我们的权重,当然要是不结合,更推荐使用特征值法求权重。</p>
<p>特征值和特征向量的计算会带上虚数,这里使用A.real来只是用实数部分。</p>
<p>注意, np.linalg.eig()函数会返回两个值,第一个是特征值第二个是特征向量,和matlab的相反。</p>
<h2 id="5计算一致性比例cr">5.计算一致性比例CR</h2>
<ul>
<li>注意:第一步就应该要检验矩阵是否符合一致性,写此处只是为了编程方便!!!</li>
</ul>
<pre><code>CI=(max_elg-n)/(n-1)
RI=np.array( )#注意RI最大支持RI是n=15!!!
CR=CI/RI
if CR<0.1:
print("一致性检验通过")
print(CR)
else:
print("一致性检验未通过")
print("请重新输入数据")
</code></pre>
<p>一致性检验通过<br>
0.0047716480504293775</p>
<p>当然,RI是查表得到的,这个数据根据文献不同数值上可能有微小差距,影响不会太大。</p><br><br>
来源:https://www.cnblogs.com/YBR-crime/p/18957621
頁:
[1]