建设银行网网站打不开,网站建设遇到问题解决方案,做网站优化时代码结构关系大吗,做网站建设有前景吗介绍
TOPSIS法#xff08;Technique for Order Preference by Similarity to Ideal Solution#xff09; 可翻译为逼近理想解排序法#xff0c;国内常简称为优劣解距离法 TOPSIS 法是一种常用的综合评价方法#xff0c;其能充分利用原始数据的信息#xff0c; 其结果能精…介绍
TOPSIS法Technique for Order Preference by Similarity to Ideal Solution 可翻译为逼近理想解排序法国内常简称为优劣解距离法 TOPSIS 法是一种常用的综合评价方法其能充分利用原始数据的信息 其结果能精确地反映各评价方案之间的差距。
C.L.Hwang 和 K.Yoon 于1981年首次提出TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution)可翻译为逼近理 想解排序法国内常简称为优劣解距离法。 TOPSIS 法是一种常用的综合评价方法能充分利用原始数据的 信息其结果能精确地反映各评价方案之间的差距。 基本过程为先将原始数据矩阵统一指标类型一般正向化处理 得到正向化的矩阵再对正向化的矩阵进行标准化处理以消除各指 标量纲的影响并找到有限方案中的最优方案和最劣方案然后分 别计算各评价对象与最优方案和最劣方案间的距离获得各评价对 象与最优方案的相对接近程度以此作为评价优劣的依据。该方法 对数据分布及样本含量没有严格限制数据计算简单易行 为什么要用这个东西
当给出一组数据时比如一个宿舍有小明、小红、小刚、小智四个人他们的高数分别考了60、72、66、99那么对应的排名就是4、2、3、1修正后的排名就是1324则排名的权重就是4 2 3 1 101 / 10 0.4、3 / 10 0.3、2 / 10 0.2、4 / 10 0.4虽然说小智的权重确实是最高的但是你能通过这个权重看出差距吗很明显不行明明小智同学考了99分非常优秀远远超过的小明同学的60分但是权重就是0.4和0.1无论最后一名考多少分都是这个权重无法得出他们之前的真实的差距咦这时候Topsis就有用了请继续往下看
量纲
极大型
如果是上述成绩或者GDP这类的例子得分越高越好那么就称其为极大型指标
极小型
如果是某个工厂产生的污染那么就是污染越少越好称这样的指标为极小型指标
中间型
大家可以回忆一下初高中学的化学知识就比如中和反应是不是ph越接近7越好啊这时候的ph值就是中间型指标
区间型
还是以化学实验为例子中等氧水体溶解氧浓度在4-8毫克/升之间。这个区间内水体中的大多数生物仍然可以正常进行呼吸活动但可能在高温或其它压力下会有些许限制。这时候含氧量就是一个区间型指标了 如何计算得分
x - min / (x - min) (x max)
就是x与最小值之间的距离 / x与最小值之间的距离 x与最大值之间的距离 那么到此对这个模型的基本介绍就结束了下面给出py的模板
Topsis的python代码模板
import numpy as np # 导入numpy包并将其命名为np##定义正向化的函数
def positivization(x,type,i):
# x需要正向化处理的指标对应的原始向量
# typ指标类型1极小型2中间型3区间型
# i正在处理的是原始矩阵的哪一列if type 1: #极小型print(第,i,列是极小型正向化中...)posit_x x.max(0)-xprint(第,i,列极小型处理完成)print(--------------------------分隔--------------------------)return posit_xelif type 2: #中间型print(第,i,列是中间型)best int(input(请输入最佳值))m (abs(x-best)).max()posit_x 1-abs(x-best)/mprint(第,i,列中间型处理完成)print(--------------------------分隔--------------------------)return posit_xelif type 3: #区间型print(第,i,列是区间型)a,b [int(l) for l in input(按顺序输入最佳区间的左右界并用逗号隔开).split(,)]m (np.append(a-x.min(),x.max()-b)).max()x_row x.shape[0] #获取x的行数posit_x np.zeros((x_row,1),dtypefloat)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,列区间型处理完成)print(--------------------------分隔--------------------------)return posit_x.reshape(x_row)## 第一步从外部导入数据
#注保证表格不包含除数字以外的内容
x_mat np.loadtxt(20条河流的水质情况数据.csv, encodingUTF-8-sig, delimiter,) # 推荐使用csv格式文件## 第二步判断是否需要正向化
n, m x_mat.shape
print(共有, n, 个评价对象, m, 个评价指标)
judge int(input(指标是否需要正向化处理需要请输入1不需要则输入0))
if judge 1:position np.array([int(i) for i in input(请输入需要正向化处理的指标所在的列例如第1、3、4列需要处理则输入1,3,4).split(,)])position position-1typ np.array([int(j) for j in input(请按照顺序输入这些列的指标类型1极小型2中间型3区间型格式同上).split(,)])for k in range(position.shape[0]):x_mat[:, position[k]] positivization(x_mat[:, position[k]], typ[k], position[k])print(正向化后的矩阵, x_mat)## 第三步对正向化后的矩阵进行标准化
tep_x1 (x_mat * x_mat).sum(axis0) # 每个元素平方后按列相加
tep_x2 np.tile(tep_x1, (n, 1)) # 将矩阵tep_x1平铺n行
Z x_mat / ((tep_x2) ** 0.5) # Z为标准化矩阵
print(标准化后的矩阵为, Z)## 第四步计算与最大值和最小值的距离并算出得分
tep_max Z.max(0) # 得到Z中每列的最大值
tep_min Z.min(0) # 每列的最小值
tep_a Z - np.tile(tep_max, (n, 1)) # 将tep_max向下平铺n行,并与Z中的每个对应元素做差
tep_i Z - np.tile(tep_min, (n, 1)) # 将tep_max向下平铺n行并与Z中的每个对应元素做差
D_P ((tep_a ** 2).sum(axis1)) ** 0.5 # D与最大值的距离向量
D_N ((tep_i ** 2).sum(axis1)) ** 0.5
S D_N / (D_P D_N) # 未归一化的得分
std_S S / S.sum(axis0)
sorted_S np.sort(std_S, axis0)
提示此代码是适用于csv文件的如果是xlsx的话需要转csv的请参考一下代码
import pandas as pd# 1. 从Excel文件读取数据
excel_file 20条河流的水质情况数据.xlsx # 输入的Excel文件名
sheet_name Sheet1 # Excel文件中的工作表名称try:df pd.read_excel(excel_file, sheet_namesheet_name)print(f成功从 {excel_file} 中读取数据。)
except FileNotFoundError:print(f文件 {excel_file} 未找到。请检查文件路径和文件名是否正确。)exit(1)
except Exception as e:print(f读取文件 {excel_file} 发生错误{e})exit(1)# 2. 将数据保存为CSV文件
csv_file 20条河流的水质情况数据.csv # 输出的CSV文件名try:df.to_csv(csv_file, indexFalse, encodingutf-8-sig) # 使用utf-8-sig编码格式print(f成功将数据保存到 {csv_file}。)
except Exception as e:print(f保存文件 {csv_file} 发生错误{e})exit(1)print(转换完成。)加油