最近需要用一下TOPSIS算法,所以學了一下,然後網上搜了一下python代碼,但是download下來的代碼感覺有一些問題,所以自己基於download下來的代碼修改了一下,並且測試了一下。
本文主要是介紹下修改的python TOPSIS代碼,至於算法的介紹,給個鏈接,大家自己花個半小時看下即可,非常容易理解
一、TOPSIS算法介紹
TOPSIS算法介紹,這是網上的一篇博文,寫的非常得清晰易懂,而且這個算法本來就簡單,就不做過多介紹了,大家自己點開鏈接看一下就行了。
二、基於博主“XHHP”的python代碼的修改後的TOPSIS算法
2.1指標正向化
這一部分和原博文相同,沒有修改。輸入是一個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。
2.2正向化矩陣標準化(去除量綱影響)
自己重寫了一下這個標準化,輸入是一個二維的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 datas
case:
2.3計算得分並歸一化
之前標準化數據的輸出結果作爲輸入
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 score
case:
2.4將計算得到的得分與源數據一起進行整理,形成dataframe
testdata['score'] = sco
testdata.head(5)
case:
這樣一來,TOPSIS算法就已經全部完成了。
三、代碼獲取
代碼是用Jupyter Notebook寫的,放在github裏了,需要自己拿下好了。
TOPSIS算法(python實現)