实现了作者的模型,并且添加了简单的数据预处理:
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)