最近需要用一下TOPSIS算法,所以学了一下,然后网上搜了一下python代码,但是download下来的代码感觉有一些问题,所以自己基于download下来的代码修改了一下,并且测试了一下。
本文主要是介绍下修改的python TOPSIS代码,至于算法的介绍,给个链接,大家自己花个半小时看下即可,非常容易理解
TOPSIS算法介绍,这是网上的一篇博文,写的非常得清晰易懂,而且这个算法本来就简单,就不做过多介绍了,大家自己点开链接看一下就行了。
二、基于博主“XHHP”的python代码的修改后的TOPSIS算法cmdg链接
2.1指标正向化这一部分和cmdg相同,没有修改。输入是一个np.array,返回是正向化后结果。输入的array的每一行是一个样本的各个指标,列数就是指标数,这个和通常的skilearn的输入是相同的。
#极小型指标 -> 极大型指标def dataDirection_1(datas): return np.max(datas)-datas #套公式#中间型指标 -> 极大型指标def dataDirection_2(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 #区间型指标 -> 极大型指标def dataDirection_3(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( x_min <= i <= x_max): answer_list.append(1) else: answer_list.append(1 - (i - x_max)/M) return np.array(answer_list)case:
一个中间型指标的正向化。
极小化指标正向化的case。
自己重写了一下这个标准化,输入是一个二维的array,每一行是一个样本,各个列就是各个指标。
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 datascase:
之前标准化数据的输出结果作为输入
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) # 每个样本距离Z+的距离 tmpmindist = np.power(np.sum(np.power((z_min - sta_data) , 2) , axis = 1) , 0.5) # 每个样本距离Z+的距离 score = tmpmindist / (tmpmindist + tmpmaxdist) score = score / np.sum(score) # 归一化处理 return scorecase:
case:
这样一来,TOPSIS算法就已经全部完成了。
代码是用Jupyter Notebook写的,放在github里了,需要自己拿下好了。
TOPSIS算法(python实现)