[Modelado matemático] Proceso de jerarquía analítica (AHP): implementación de Python

1. Introducción

Este artículo explica principalmente la implementación en Python del proceso de jerarquía analítica (AHP) y realizará un seguimiento del análisis de ejemplo más adelante.

2 implementación de código

paquete de importación

import numpy as np

2.1 Construcción de matriz de juicio

La matriz de juicio generalmente adopta el método de opinión de expertos, es decir, el método Delphi. Sin embargo, no hay expertos durante la competencia, puede leerlo usted mismo y, por supuesto, hay muchos artículos que han mejorado el AHP y puede consultarlos usted mismo.
inserte la descripción de la imagen aquí
Este artículo define una matriz de juicio 4 * 4, es decir, hay 4 indicadores

A = np.array([[1,1/5,1/6,1/9],[5,1,1/2,1/6],[6,2,1,1/3],[9,6,3,1]])
print(A)

Ver el número de filas y columnas de la matriz.

#查看行数和列数
A.shape

inserte la descripción de la imagen aquí

2.2 Encontrar valores propios y vectores propios

El método para resolver valores propios y vectores propios se refiere principalmente al siguiente blog.

#求特征值和特征向量
'''
https://blog.csdn.net/Strive_For_Future/article/details/109631691
w,v = numpy.linalg.eig(a)  计算方形矩阵a的特征值和右特征向量
a : 待求特征值和特征向量的方阵。
w: 多个特征值组成的一个矢量。备注:多个特征值并没有按特定的次序排列。特征值中可能包含复数。
v: 多个特征向量组成的一个矩阵。每一个特征向量都被归一化了。第i列的特征向量v[:,i]对应第i个特征值w[i]。
'''
V,D = np.linalg.eig(A) # 求特征值和特征向量
print('特征值:')
print(V)
print('特征向量:')
print(D)

Genere el valor propio más grande y el vector propio más grande, que es lo que necesitamos

#最大特征值
tzz = np.max(V)
print('最大特征值为:\n', tzz)
#最大特征向量
k=[i for i in range(len(V)) if V[i] == np.max(V)]
tzx = -D[:,k]
print('最大特征值向量为:\n',tzx)

Obtenga el peso Q, este Q es la matriz de pesos que necesitamos al final, es decir, el peso de cada indicador.

# 赋权重
n = A.shape[1]
quan=np.zeros((n,1))
for i in range(0,n):
    quan[i]=tzx[i]/np.sum(tzx)
Q=quan
print(Q)

inserte la descripción de la imagen aquí

2.3 Verificación de coherencia

Esto es para probar si nuestra propia matriz de juicio es razonable. Si pasa la prueba de consistencia se puede utilizar, si falla significa que tenemos problemas a la hora de calificar por parte de los expertos y tenemos que modificar la matriz de juicio.
inserte la descripción de la imagen aquí

#一致性检验
CI=(tzz-n)/(n-1)
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59]
#判断是否通过一致性检验
CR=CI/RI[n-1]
if CR>=0.1:
    print('没有通过一致性检验, 判断矩阵需要进行修正\n')
else:
    print('通过一致性检验\n')

3 Análisis de ejemplo

Supongamos que hay dos objetos con puntuaciones:
Objeto A: [8 7 6 8]
Objeto B: [7 8 8 7]

# 假设有两个目标
p = np.mat('8 7 6 8;7 8 8 7') #每一行代表一个对象的指标评分
print(p)

Luego use el peso Q obtenido anteriormente para calificar estos dos objetos.

#显示出所有评分对象的评分值
score=p*Q
for i in range(len(score)):
    print('object_score {}:'.format(i),float(score[i]))

inserte la descripción de la imagen aquí
Se puede ver que la puntuación de A es mayor que la de B. Puede intentar definir diferentes matrices de juicio para ver los cambios en la puntuación.

Supongo que te gusta

Origin blog.csdn.net/qq_44319167/article/details/128824176
Recomendado
Clasificación