TOPSIS综合评价模型Python实现

import os
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
"""
熵值法是根据指标所含信息有序程度的差异性来确定指标权重的客观赋权方法'
熵用于度量不确定性,仅依赖于数据本身的离散程度;
指标的离散程度越大则熵值越大,表明指标值提供的信息量越多,则该指标的权重也应越大

step:
0.指标同向化(本文指标均为极大型指标,因此忽略本步骤)
1.归一化(权重计算前的归一化不能是同向化后的矩阵,会损失原始信息)
2.计算各指标的熵值
3.计算各指标的权系数
4.计算加权后数据集
5.得到正负理想解
6.得到样本与正负理想解间的距离
7.计算评分
"""
###读取数据
def read_data(path,code = "gb18030",is_train = True):
	"""
	读取csv文件 并标准化 其中最后一列为标签(舍去)
	:param path: 文件路径
	:param code: 文件编码
	:return: dataP,df ,标准化后的数据集
	"""
	#读取数据集
	data = pd.read_csv(path, encoding=code)
	data = data[data.columns.tolist()[:-1]]
	data = np.array(data)
	#标准化
	if is_train == True:
		dataP = scaler.fit_transform(data)
	else:
		dataP = scaler.transform(data)
	return dataP

###定义权重计算函数
def entropy(data):
	"""
	data为标准化后的数据集
	:param data: df
	:return: ndarray,1D,weight
	"""
	E = np.nansum(-data * np.log(data) / np.log(len(data)), axis=0)
	#计算权系数
	return (1 - E) / (1 - E).sum()



###得到加权后数据集
def weight_data(weight,data):
	"""
	计算数据集与权重的乘积
	:param weight:
	:param data:
	:return:
	"""
	R = data * weight
	return R

###定义正负理想解
def ideal_data(R):
	r_max = np.max(R, axis=0)  # 每个指标的最大值为正理想解
	r_min = np.min(R, axis=0)  # 每个指标的最小值为负理想解
	return r_max,r_min


###计算各方案到正负理想解的距离
def ideal_distance(R,r_max,r_min):
	d_z = np.sqrt(np.sum(np.square((R - np.tile(r_max, (R.shape[0], 1)))), axis=1))  # d+向量
	d_f = np.sqrt(np.sum(np.square((R - np.tile(r_min, (R.shape[0], 1)))), axis=1))  # d-向量
	return d_z,d_f

###得到评分
def figure_score(d_z,d_f):
	s = d_f / (d_z + d_f)
	Score = 100 * s / max(s)
	return Score

def train(path,code = "gb18030"):
	"""
	训练模型;将指标权重、将正理想解、负理想解 作为参数保存到topsis_params.csv
	:param path:
	:param code:
	:return:
	"""
	data = read_data(path,code = code)
	weight = entropy(data)
	R = weight_data(weight,data)
	r_max, r_min = ideal_data(R)
	d_z,d_f = ideal_distance(R,r_max, r_min)
	Score = figure_score(d_z, d_f)
	# for j in range(0, len(Score)):
	# 	print(f"第{j + 1}个得分为:{Score[j]}")
	print("weight:",weight) #1*cols np.array
	print("r_max:",r_max.tolist())   #cols*1 series
	print("r_min:",r_min.tolist())   #cols*1 series
	df_paras = pd.DataFrame()
	df_paras["weight"] = weight
	df_paras["r_max"] = r_max.tolist()
	df_paras["r_min"] = r_min.tolist()
	df_paras.to_csv(os.getcwd()+r"\params\topsis_params.csv",index=False)
	return Score,weight,r_max, r_min

def predict(path,weight,r_max, r_min,code ="utf-8"):
	"""
	预测模型;载入 指标权重、将正理想解、负理想解 预测新数据
	:param path: 
	:param weight: 
	:param r_max: 
	:param r_min: 
	:param code: 
	:return: 
	"""
	data = read_data(path,code = code)
	weight = np.array(weight)
	R = weight_data(data,weight)
	d_z,d_f = ideal_distance(R,r_max, r_min)
	Score = figure_score(d_z, d_f)
	for j in range(0, len(Score)):
		print(f"第{j + 1}个得分为:{Score[j]}")
	return Score

if __name__ =="__main__":
	#训练、测试集路径
	train_path = r"D:\baseline\datas\data_Train.csv"
	test_path = r"D:\baseline\datas\data_Test.csv"
	#训练-保存参数
	# Scoretr,weight,r_max, r_min = train(train_path, code="gb18030")
	#预测-读取参数
	df_params = pd.read_csv(os.getcwd()+r"\params\topsis_params.csv")
	Scorete = predict(test_path,df_params['weight'],df_params['r_max'], df_params['r_min'], code="gb18030")

部分数据

 参考文献:

TOPSIS法 —— python_洋洋菜鸟的博客-CSDN博客_topsis python1.TOPSIS法介绍2. 计算步骤(1)数据标准化(2)得到加权后的矩阵(3)确定正理想解和负理想解(4)计算各方案到正(负)理想解的距离(5)计算综合评价值3.实例研究3.1 导入相关库3.2 读取数据3.3 读取行数和列数3.4 数据标准化3.5 得到信息熵3.6 计算权重3.7 计算权重后的数据3.8 得到最大值最小值距离3.9 计算评分总代码https://blog.csdn.net/qq_25990967/article/details/122762897

https://zhuanlan.zhihu.com/p/37738503/1 简述C.L.Hwang 和 K.Yoon 于1981年首次提出 TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution)。TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地…https://zhuanlan.zhihu.com/p/37738503/

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
熵值TOPSIS综合评价是一种用于决策分析的方,可以帮助确定最佳选择。在Python中,可以使用熵值和TOPSIS结合来实施这种方。首先,需要进行数据归一化处理,使得不同指标的数据在相同的尺度上。然后,计算每个指标的信息熵,以确定各指标的权重。接下来,计算每个方案到正理想解和负理想解的距离,并计算综合评价值。最后,根据综合评价值确定最佳选择。 具体的步骤如下: 1. 数据归一化处理:将原始数据进行归一化处理,确保不同指标的取值范围相同,例如使用Min-Max归一化或Z-score归一化等方。 2. 计算信息熵:根据归一化后的数据,计算每个指标的信息熵,以确定各指标的权重。信息熵越大,表示该指标的离散程度越大,权重越大。 3. 计算加权后的矩阵:将数据矩阵与权重进行加权,得到加权后的矩阵。 4. 确定正理想解和负理想解:根据加权后的矩阵,确定正理想解和负理想解。正理想解是指在每个指标上取得最大值的解,负理想解是指在每个指标上取得最小值的解。 5. 计算各方案到正(负)理想解的距离:计算每个方案到正理想解和负理想解的距离,可以使用欧氏距离或其他距离度量方。 6. 计算综合评价值:根据距离计算综合评价值,综合评价值越大,表示方案越优。 7. 根据综合评价值确定最佳选择:根据综合评价值的大小,确定最佳选择。 以上是熵值TOPSIS综合评价Python中的一般步骤,具体的实现可以参考相关的Python库或代码示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [熵值TOPSIS](https://blog.csdn.net/weixin_43196531/article/details/111053889)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [TOPSIS综合评价模型Python实现](https://blog.csdn.net/weixin_41187013/article/details/128933759)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值