实现了作者的模型,并且添加了简单的数据预处理:
import numpy as np
import pandas as pd
import math
def checkdata ( fuzzy_matrix) :
x, y, z= fuzzy_matrix. shape;
m= 0
for i in range ( 0 , x) :
for j in range ( 0 , y) :
sum = 0
for k in range ( 0 , z) :
sum = sum + fuzzy_matrix[ i, j, k]
if ( round ( sum , 0 ) != 1 ) :
m= m+ 1
print ( "(" , i+ 1 , "," , j+ 1 , ")" )
for k_ in range ( 0 , z) :
fuzzy_matrix[ i, j, k_] = fuzzy_matrix[ i, j, k_] / sum
print ( "保留0位小数后,一共有{0}个数据不符合条件,现在已经修改" . format ( m) )
return fuzzy_matrix;
def selfDis2 ( pi, z) :
sum = 0.0
for i in range ( 0 , z) :
sum = sum + pi[ i] * pi[ i]
return sum ;
def distance ( p_i, p_j) :
vector_i= np. array( p_i) ;
vector_j = np. array( p_j) ;
vector_dif_T= vector_i- vector_j;
line= vector_dif_T. shape[ 0 ] ;
vector_dif_T= vector_dif_T. reshape( line, 1 ) ;
vector_dif_line= vector_dif_T. reshape( 1 , line) ;
d= np. dot( vector_dif_line, vector_dif_T) ;
d= d[ 0 , 0 ]
d= pow ( d, 1 / 2 ) ;
return round ( d, 4 ) ;
def sim ( p_i, p_j) :
return 1 - distance( p_i, p_j) ;
def simArray ( fmatrix) :
x, y, z= fmatrix. shape;
p= 1
simMatrix= [ ]
for i in range ( 0 , x) :
tmp = [ ]
for j in range ( 0 , y) :
pi= fmatrix[ i, j, : ] ;
sum = 0.0
for i_ in range ( 0 , x) :
for j_ in range ( 0 , y) :
if ( i== i_ and j== j_) :
continue ;
else :
pj= fmatrix[ i_, j_, : ] ;
sum = sum + sim( pi, pj) ;
tmp. append( round ( sum , 4 ) )
simMatrix. append( tmp) ;
simM= np. array( simMatrix)
return simM
def crdi ( fmatrix) :
x, y, z= fmatrix. shape;
sup= simArray( fmatrix) ;
sum = 0.0
for i in range ( 0 , x) :
for j in range ( 0 , y) :
sum = sum + sup[ i, j]
for i in range ( 0 , x) :
for j in range ( 0 , y) :
sup[ i, j] = sup[ i, j] / sum
return sup;
def qu ( fmatrix) :
crdiMatrix_= crdi( fmatrix) ;
print ( type ( crdiMatrix_) )
x, y, z= fmatrix. shape;
list_line= [ ]
for i in range ( 0 , x) :
list_column= [ ]
for j in range ( 0 , y) :
pi= fmatrix[ i, j, : ] ;
doublePi= selfDis2( pi, z) ;
exp= crdiMatrix_[ i, j]
expCrdi= pow ( math. e, exp)
sum = expCrdi* doublePi;
list_column. append( sum )
list_line. append( list_column)
quMatrix= np. array( list_line)
return quMatrix
def weightMatrix ( fmatrix) :
quMatrix= qu( fmatrix) ;
maxValue= quMatrix. max ( ) ;
x, y= quMatrix. shape;
for i in range ( 0 , x) :
for j in range ( 0 , y) :
quMatrix[ i, j] = quMatrix[ i, j] / maxValue;
return quMatrix
def geometricMean ( fmatrix) :
fmatrix = checkdata( fmatrix) ;
geoMatrix= weightMatrix( fmatrix) ;
x, y, z= fmatrix. shape;
finalResult= [ ] ;
for q in range ( 0 , z) :
tmp_q= [ ] ;
for i in range ( 0 , x) :
rqn= 0.0 ;
w_line= 0.0 ;
m_line = 1 ;
for j in range ( 0 , y) :
w_line= w_line+ geoMatrix[ i, j] ;
m_line= m_line* pow ( fmatrix[ i, j, q] , geoMatrix[ i, j] ) ;
w_line = 1 / w_line;
rqn= pow ( m_line, w_line) ;
tmp_q. append( rqn) ;
finalResult. append( tmp_q) ;
finalR= np. array( finalResult) ;
x, y= finalR. shape
finalResult= [ ]
for j in range ( 0 , y) :
tmp = [ ]
for i in range ( 0 , x) :
tmp. append( finalR[ i, j] ) ;
finalResult. append( tmp) ;
return np. array( finalResult) ;
def rankMake ( fmatrix) :
geoMetrix= geometricMean( fmatrix) ;
print ( "平均几何均值矩阵 Geometric Mean Matrix" )
print ( geoMetrix)
x, y= geoMetrix. shape;
weight= [ 0.1 , 0.3 , 0.6 ] ;
results= [ ]
for i in range ( 0 , x) :
str_= "A" + str ( i+ 1 )
tmp= [ ]
sum = 0.0
tmp. append( str_)
for j in range ( 0 , y) :
sum = sum + geoMetrix[ i, j] * weight[ j]
tmp. append( sum ) ;
results. append( tmp)
results= np. array( results)
results= results[ results[ : , 1 ] . argsort( ) ]
x, y = results. shape;
finals= [ ]
for i in range ( 0 , x) :
tmp= [ ]
for j in range ( 0 , y) :
tmp. append( results[ i, j] )
tmp. append( 10 - i)
finals. append( tmp)
results= np. array( finals)
results= results[ results[ : , 0 ] . argsort( ) ]
print ( results)
return results;
if __name__ == '__main__' :
fuzzy_list= [ [ ( 0 , 0 , 1 ) , ( 0 , 0 , 1 ) , ( 0 , 0 , 1 ) ] ,
[ ( 0 , 0 , 1 ) , ( 0 , 0 , 1 ) , ( 0 , 0 , 1 ) ] ,
[ ( 0 , 0 , 1 ) , ( 0 , 0 , 1 ) , ( 0 , 0 , 1 ) ] ]
fuzzy_matrix = np. array( fuzzy_list) ;
rankMake( fuzzy_matrix)