数学建模——TOPSIS综合评价模型Python代码
數(shù)學(xué)建模——TOPSIS綜合評價(jià)模型Python代碼
正常代碼
import numpy as np # 導(dǎo)入numpy包并將其命名為np
##定義正向化的函數(shù)
def positivization(x,type,i):
x:需要正向化處理的指標(biāo)對應(yīng)的原始向量
typ:指標(biāo)類型(1:極小型,2:中間型,3:區(qū)間型)
i:正在處理的是原始矩陣的哪一列
if type == 1: #極小型print("第",i,"列是極小型,正向化中...")posit_x = x.max(0)-xprint("第",i,"列極小型處理完成")print("--------------------------分隔--------------------------")return posit_x elif type == 2: #中間型print("第",i,"列是中間型")best = int(input("請輸入最佳值:"))m = (abs(x-best)).max()posit_x = 1-abs(x-best)/mprint("第",i,"列中間型處理完成")print("--------------------------分隔--------------------------")return posit_x elif type == 3: #區(qū)間型print("第",i,"列是區(qū)間型")a,b = [int(l) for l in input("按順序輸入最佳區(qū)間的左右界,并用逗號隔開:").split(",")]m = (np.append(a-x.min(),x.max()-b)).max()x_row = x.shape[0] #獲取x的行數(shù)posit_x = np.zeros((x_row,1),dtype=float)for r in range(x_row):if x[r] < a:posit_x[r] = 1-(a-x[r])/melif x[r] > b:posit_x[r] = 1-(x[r]-b)/melse:posit_x[r] = 1print("第",i,"列區(qū)間型處理完成")print("--------------------------分隔--------------------------")return posit_x.reshape(x_row)第一步:從外部導(dǎo)入數(shù)據(jù)
#注:保證表格不包含除數(shù)字以外的內(nèi)容
x_mat = np.loadtxt(‘river.csv’, encoding=‘UTF-8-sig’, delimiter=’,’) # 推薦使用csv格式文件
第二步:判斷是否需要正向化
n, m = x_mat.shape
print(“共有”, n, “個(gè)評價(jià)對象”, m, “個(gè)評價(jià)指標(biāo)”)
judge = int(input(“指標(biāo)是否需要正向化處理,需要請輸入1,不需要則輸入0:”))
if judge == 1:
position = np.array([int(i) for i in input(“請輸入需要正向化處理的指標(biāo)所在的列,例如第1、3、4列需要處理,則輸入1,3,4”).split(’,’)])
position = position-1
typ = np.array([int(j) for j in input(“請按照順序輸入這些列的指標(biāo)類型(1:極小型,2:中間型,3:區(qū)間型)格式同上”).split(’,’)])
for k in range(position.shape[0]):
x_mat[:, position[k]] = positivization(x_mat[:, position[k]], typ[k], position[k])
print(“正向化后的矩陣:”, x_mat)
第三步:對正向化后的矩陣進(jìn)行標(biāo)準(zhǔn)化
tep_x1 = (x_mat * x_mat).sum(axis=0) # 每個(gè)元素平方后按列相加
tep_x2 = np.tile(tep_x1, (n, 1)) # 將矩陣tep_x1平鋪n行
Z = x_mat / ((tep_x2) ** 0.5) # Z為標(biāo)準(zhǔn)化矩陣
print(“標(biāo)準(zhǔn)化后的矩陣為:”, Z)
第四步:計(jì)算與最大值和最小值的距離,并算出得分
tep_max = Z.max(0) # 得到Z中每列的最大值
tep_min = Z.min(0) # 每列的最小值
tep_a = Z - np.tile(tep_max, (n, 1)) # 將tep_max向下平鋪n行,并與Z中的每個(gè)對應(yīng)元素做差
tep_i = Z - np.tile(tep_min, (n, 1)) # 將tep_max向下平鋪n行,并與Z中的每個(gè)對應(yīng)元素做差
D_P = ((tep_a ** 2).sum(axis=1)) ** 0.5 # D+與最大值的距離向量
D_N = ((tep_i ** 2).sum(axis=1)) ** 0.5
S = D_N / (D_P + D_N) # 未歸一化的得分
std_S = S / S.sum(axis=0)
sorted_S = np.sort(std_S, axis=0)
print(std_S) # 打印標(biāo)準(zhǔn)化后的得分
std_S.to_csv(std_S.csv) 結(jié)果輸出到std_S.csv文件
案例:
某一教育評估機(jī)構(gòu)對5個(gè)研究生院進(jìn)行評估。該機(jī)構(gòu)選取了4個(gè)評價(jià)指標(biāo):人均專著、生師比、科研經(jīng)費(fèi)、逾期畢業(yè)率。采集數(shù)據(jù)如表所示。
解釋:人均專著和科研經(jīng)費(fèi)是效益性指標(biāo),預(yù)期畢業(yè)率是成本型指標(biāo),生師比是區(qū)間型指標(biāo),最優(yōu)范圍是[5,6],最差下限2,最差上限12. 4個(gè)指標(biāo)權(quán)重采用專家打分的結(jié)果,分別為0.2,0.3,0.4和0.1。
實(shí)現(xiàn)代碼:
import numpy as np
import pandas as pd
#TOPSIS方法函數(shù)
def Topsis(A1):
W0=[0.2,0.3,0.4,0.1] #權(quán)重矩陣
W=np.ones([A1.shape[1],A1.shape[1]],float)
for i in range(len(W)):
for j in range(len(W)):
if i==j:
W[i,j]=W0[j]
else:
W[i,j]=0
Z=np.ones([A1.shape[0],A1.shape[1]],float)
Z=np.dot(A1,W) #加權(quán)矩陣
#標(biāo)準(zhǔn)化處理
def standard(A):
#效益型指標(biāo)
A1=np.ones([A.shape[0],A.shape[1]],float)
for i in range(A.shape[1]):
if i0 or i2:
if max(A[:,i])==min(A[:,i]):
A1[:,i]=1
else:
for j in range(A.shape[0]):
A1[j,i]=(A[j,i]-min(A[:,i]))/(max(A[:,i])-min(A[:,i]))
#讀取初始矩陣并計(jì)算
def data(file_path):
data=pd.read_excel(file_path).values
A=data[:,1:]
A=np.array(A)
#m,n=A.shape[0],A.shape[1] #m表示行數(shù),n表示列數(shù)
return A
#權(quán)重
A=data(‘研究生院評估數(shù)據(jù).xlsx’)
A1=standard(A)
C=Topsis(A1)
print?
總結(jié)
以上是生活随笔為你收集整理的数学建模——TOPSIS综合评价模型Python代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学建模——K-means聚类模型Pyt
- 下一篇: 数学建模——层次分析法Python代码