python实现topsis法

目录

TOPSIS算法原理

1.模型介绍

1.2.TOPSIS法的适用条件

2.算法步骤

第一步正向化:将原始矩阵正向化处理(将所有的指标类型统一转换为极大型指标)

第二步标准化​编辑

第三步计算得分

 代码实现

 模型优化

模型的优缺点


TOPSIS算法原理

1.模型介绍

C.L.Hwang 和 K.Yoon 于1981年首次提 TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution),可翻译为逼近理想解排序法,国内常简称为优劣解距离法

TOPSIS 法是一种常用的综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。

基本过程为先将原始数据矩阵统一指标类型(一般正向化处理)得到正向化的矩阵,再对正向化的矩阵进行标准化处理以消除各指标量纲的影响,并找到有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行

1.2.TOPSIS法的适用条件

(1 比较的对象一般要远大于两个

2)比较的指标不只一个方面

3)有很多指标不存在理论上的最大值和最小值,例如GDP增长值

特别的:TOPSIS法 特别适合具有多组评价对象时,要求通过检测评价对象与最优解、最劣解的距离来进行排序

2.算法步骤

第一步正向化:将原始矩阵正向化处理(将所有的指标类型统一转换为极大型指标)

最常见的有四个指标:

指标名称指标特点例子
极大型(效益型)指标越大(多)越好成绩、GDP增速、企业利润
极小型(成本型)指标越小(少)越好费用、坏品率、污染程度
中间型指标越接近某个值越好水质量评估时的PH值
区间型指标落在某个区间最好体温、水中植物性营养物量

极小型转化为极大型

这个例子中,与他人争吵的次数为极小型指标,怎么转化为极大型的呢,首先找到该指标中的最大值,也就是3,然后拿最大值减去指标中的每一个值(3-2,3-0...),这样我们就得到了极大型指标

中间型转化为极大型 

首先我们求M,M等于指标中的每一个值减去最佳值(7)的绝对值的最大值,然后代入上方正向化公式即可

区间型转化为极大型

 同理我们先求M,首先我们找到指标中的最小值(35.2),同理最大值(38.4),上面的例子a为下界(36),上界b(37),然后代入求M的公式求得M,然后对指标中的每个数进行区间判断,代入正向化的分段公式中。经过以上处理我们得到正向化矩阵,接下来我们进行标准处理,来消除不同量纲的影响

第二步标准化

第三步计算得分

我们先举个例子

首先我们找到每个指标的最大值(0.6048,0.8018),最小值(0.3665,0),然后求评价对象与每个指标最大值的距离,以及最小值的距离。得分等于最小值距离除以最大值距离加最小值距离。

具体公式如下图

 代码实现

这里以20条河流的水质情况数据为例

题目:评价下表中20条河流的水质情况。

注:含氧量越高越好(极大型);PH值越接7越好(中间型);细菌总数越少好(极小型);植物性营养物量介10‐20之间最佳(区间型),超过20或低于10均不好

河流

含氧量ppm)

PH

细菌总数(/mL)

植物性营养物量ppm)

A

4.69

6.59

51

11.94

B

2.03

7.86

19

6.46

C

9.11

6.31

46

8.91

D

8.61

7.05

46

26.43

E

7.13

6.5

50

23.57

F

2.39

6.77

38

24.62

G

7.69

6.79

38

6.01

H

9.3

6.81

27

31.57

I

5.45

7.62

5

18.46

J

6.19

7.27

17

7.51

K

7.93

7.53

9

6.52

L

4.4

7.28

17

25.3

M

7.46

8.24

23

14.42

N

2.01

5.55

47

26.31

O

2.04

6.4

23

17.91

P

7.73

6.14

52

15.72

Q

6.35

7.58

25

29.46

R

8.29

8.41

39

12.02

S

3.54

7.27

54

3.16

T

7.44

6.26

8

28.41

这里以python实现代码(使用工具Jupyter Notebook):

#导入分析库
import pandas as pd
import numpy as np

##导入数据
df = pd.read_excel(r'./20条河流的水质情况数据.xlsx')
df.head(5)   #查看头5条数据


#极小型指标 -> 极大型指标
def Mintomax(datas):
    return np.max(datas) - datas


df['细菌总数(个/mL)'] = Mintomax(df['细菌总数(个/mL)'])    #极小型指标 -> 极大型指标
df.head()     #查看
#中间型指标 -> 极大型指标
def Midtomax(datas,x_best):
    temp_datas = datas - x_best
    M = np.max(abs(temp_datas))
    answer_datas = 1 - abs(datas - x_best) / M
    return answer_datas


df['PH值'] = Midtomax(df['PH值'],7)    #中间型指标 -> 极大型指标 7为最佳值
#区间型指标 -> 极大型指标
def Intertomax(datas,x_min,x_max):
    M = max(x_min - np.min(datas) , np.max(datas) - x_max)
    answer_list = []
    for i in datas:
        if(i < x_min):
            answer_list.append(1 - (x_min - i) / M)
        elif (i > x_max):
            answer_list.append(1 - (i - x_max) / M)
        else:
            answer_list.append(1)
    return np.array(answer_list)



df['植物性营养物量(ppm)'] = Intertomax(df['植物性营养物量(ppm)'],10,20)    #区间型指标 -> 极大型指标  10为下界,20为上界
#正向化矩阵标准化(去除量纲影响)
def Standard(datas):
    k = np.power(np.sum(pow(datas,2) , axis = 0) , 0.5)
    for i in range(len(k)):
        datas[:,i] = datas[:,i] / k[i]
    return datas


label_need = df.keys()[1:]
data = df[label_need].values    #刨除变量名后的数据值
sta_data = Standard(data)   #正向化矩阵标准化(去除量纲影响)
#计算得分并归一化
def Score(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)  # 归一化处理
    return score



sco = Score(sta_data)   #计算得分
#将计算得到的得分与源数据一起进行整理,形成dataframe
df['score'] = sco

处理后的结果如下:

 模型优化

前面的步骤相同,计算评价对象与最大值,最小值距离时加上每个指标的权重即可。

模型的优缺点

Topsis法 的优点:

1避免了数据的主观性,不需要目标函数,不用通过检验,而且能够很好的刻画多个影响指标的综合影响力度。

2对于数据分布及样本量、指标多少无严格限制,既适于小样本资料,也适于多评价单元、多指标的大系统,较为灵活、方便。

Topsis法 的缺点:

1需要的每个指标的数据,对应的量化指标选取会有一定难度。

2不确定指标的选取个数为多少适宜,才能够去很好刻画指标的影响力度。

3必须有两个以上的研究对象才可以进行使用。

  • 12
    点赞
  • 143
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Python语言可以使用熵权TOPSIS来进行多属性决策分析。下面是一个简单的代码示例: ```python import numpy as np def topsis(data, weights, is_maximize): # 数据规范化 normalized_data = data / np.sqrt(np.sum(data ** 2, axis=0)) # 权重归一化 normalized_weights = weights / np.sum(weights) # 计算加权规范化矩阵 weighted_normalized_data = normalized_data * normalized_weights # 计算正理想解和负理想解 if is_maximize: ideal_best = np.max(weighted_normalized_data, axis=0) ideal_worst = np.min(weighted_normalized_data, axis=0) else: ideal_best = np.min(weighted_normalized_data, axis=0) ideal_worst = np.max(weighted_normalized_data, axis=0) # 计算到正理想解和负理想解的距离 distance_to_best = np.sqrt(np.sum((weighted_normalized_data - ideal_best) ** 2, axis=1)) distance_to_worst = np.sqrt(np.sum((weighted_normalized_data - ideal_worst) ** 2, axis=1)) # 计算综合评价指数 topsis_score = distance_to_worst / (distance_to_best + distance_to_worst) return topsis_score # 示例数据 data = np.array([[3, 4, 6, 8], [2, 7, 1, 9], [5, 6, 4, 7]]) weights = np.array([0.3, 0.2, 0.3, 0.2]) # 使用熵权TOPSIS进行多属性决策分析 result = topsis(data, weights, True) print(result) ``` 以上代码实现了使用熵权TOPSIS进行多属性决策分析。输入数据是一个二维数组,每列代表一个属性,每行代表一个决策对象。weights是每个属性的权重,is_maximize表示是否最大化指标。函数返回一个一维数组,表示每个决策对象的综合评价指数。运行代码后,打印结果即为各个决策对象的综合评价指数。 ### 回答2: 熵权TOPSIS是一种多属性决策方,用来评估各个方案的综合指标。以下是使用Python编写的熵权TOPSIS代码示例: ```python import numpy as np def entropy_weight(data): # 计算熵权向量 m, n = data.shape p = data.copy() # 创建一个与data相同的矩阵p for j in range(n): p[:, j] = p[:, j] / np.sum(p[:, j]) # 归一化 ent = (-1 / np.log(m)) * np.nansum(p * np.log(p), axis=0) # 计算每个属性的熵 weight = (1 - ent) / np.sum(1 - ent) # 计算每个属性的权重 return weight def topsis_method(data, weight, positive_indicator): # TOPSIS计算综合评价结果 m, n = data.shape s = data * weight # 加权后的决策矩阵 ideal_best = np.max(s, axis=0) # 理想最佳方案 ideal_worst = np.min(s, axis=0) # 理想最差方案 # 计算到理想最佳方案的距离 d_best = np.sqrt(np.sum((s - ideal_best) ** 2, axis=1)) # 计算到理想最差方案的距离 d_worst = np.sqrt(np.sum((s - ideal_worst) ** 2, axis=1)) # 计算综合评价得分 score = d_worst / (d_best + d_worst) if positive_indicator == -1: score = 1 - score # 如果指标为负指标,则将得分反转 return score # 示例数据 data = np.array([[1, 5, 3, 2], [2, 4, 5, 3], [5, 4, 3, 1], [4, 3, 2, 2]]) weight = entropy_weight(data) positive_indicator = -1 # -1表示第四列是负指标,可以根据实际情况更改 result = topsis_method(data, weight, positive_indicator) print("综合评价得分:", result) ``` 以上代码首先定义了一个计算熵权向量的函数`entropy_weight`,该函数将输入的决策矩阵归一化后计算每个属性的熵,并将熵权向量归一化得到权重。 接着定义了一个使用TOPSIS计算综合评价结果的函数`topsis_method`,该函数根据输入的决策矩阵、权重和正/负指标,计算每个方案到理想最佳和理想最差方案的距离,并根据正/负指标计算综合评价得分。 最后,给出了一个示例数据,并使用上述函数计算了综合评价得分。最后打印出了结果。 请注意,以上代码只是一种示例实现,实际应用中可能需要根据具体情况进行适当的修改。 ### 回答3: TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)是一种常用的多准则决策方,可以用于评估多个候选方案的综合效能。Python可以使用熵权TOPSIS进行实现。 熵权TOPSIS实现步骤如下: 1. 输入决策矩阵:首先,我们需要输入一个决策矩阵,其中每一行代表一个候选方案,每一列代表一个评价指标。假设决策矩阵为decision_matrix,矩阵的形状为(m, n),其中m为候选方案的数量,n为评价指标的数量。 2. 标准化决策矩阵:将决策矩阵进行标准化处理,将每一列的数值映射到[0, 1]范围内。可以使用如下代码实现: ```python def normalize_matrix(decision_matrix): normalized_matrix = decision_matrix.copy() for i in range(decision_matrix.shape[1]): col = decision_matrix[:, i] min_val = np.min(col) max_val = np.max(col) normalized_matrix[:, i] = (col - min_val) / (max_val - min_val) return normalized_matrix ``` 3. 计算权重矩阵:使用熵权计算评价指标的权重。可以使用如下代码实现: ```python def calculate_weights(decision_matrix): entropy = np.zeros(decision_matrix.shape[1]) for i in range(decision_matrix.shape[1]): col = decision_matrix[:, i] p = col / np.sum(col) entropy[i] = -np.sum(p * np.log2(p)) weights = (1 - entropy) / np.sum(1 - entropy) return weights ``` 4. 确定正理想解和负理想解:正理想解的每一列取对应指标的最大值,负理想解的每一列取对应指标的最小值。可以使用如下代码实现: ```python def determine_ideal_solutions(decision_matrix): positive_ideal_solution = np.max(decision_matrix, axis=0) negative_ideal_solution = np.min(decision_matrix, axis=0) return positive_ideal_solution, negative_ideal_solution ``` 5. 计算正负理想解之间的距离:可以使用欧氏距离或曼哈顿距离等计算候选方案与正负理想解之间的距离。可以使用如下代码实现: ```python def calculate_distances(normalized_matrix, positive_ideal_solution, negative_ideal_solution): positive_distances = np.linalg.norm(normalized_matrix - positive_ideal_solution, axis=1) negative_distances = np.linalg.norm(normalized_matrix - negative_ideal_solution, axis=1) return positive_distances, negative_distances ``` 6. 计算综合得分:根据距离计算候选方案的综合得分,综合得分越接近1表示效果越好,越接近0表示效果越差。可以使用如下代码实现: ```python def calculate_scores(positive_distances, negative_distances): scores = negative_distances / (positive_distances + negative_distances) return scores ``` 以上就是熵权TOPSISPython实现代码。根据以上函数,我们可以通过调用这些函数来进行熵权TOPSIS的实际应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值