理论部分可以参考这个:
https://www.cnblogs.com/lovescience/p/13512732.html
这是根据上头的博客写出的代码:
非常的简单, 仅有两个矩阵乘法:
def fuzzyTest():
r = np.array([[0.35, 0.39, 0.22, 0.04],
[0.17, 0.35, 0.39, 0.09],
[0, 0.30, 0.44, 0.26],
[0.09, 0.22, 0.30, 0.39],
[0.43, 0.35, 0.22, 0]])
# # factorMatrix = ([0.35, 0.39, 0.22, 0.04],
# # [0.17, 0.35, 0.39, 0.09],
# # [0, 0.30, 0.44, 0.26],
# # [0.09, 0.22, 0.30, 0.39],
# # [0.43, 0.35, 0.22, 0])
#
# wVector = frequency(factorMatrix, 1)
# print(wVector)
# ans = appraise( np.array([1]), np.array([1]), wVector)
# print(ans)
# np.matmul()
# b1 = np.array([0.23, 0.5, 0.31, 0.11])
# a = np.array([0.35, 0.35, 0.1, 0.1, 0.1])
a = AHP(r)
print(a)
# print(r)
# print(a)
b = np.matmul(a, r)
print(b)
s = np.array([100, 80, 60, 30])
f = np.matmul(b, s.transpose())
print(f)
但是那个博客有很多主观臆断的地方:
最后一个评分矩阵S用主观臆断去填还说得去
但是头两个矩阵并不适合用主观解决:
隶属度矩阵可以看这个博客进行求解:
https://zhuanlan.zhihu.com/p/160846498
对每个指标选出一个隶属度函数
对矩阵中的每一个元素进行求解:
即吧当前的因素带入隶属度函数求得矩阵的一个元素
这个博客中说是可以使用AHP的成对比较阵来解决
但是成对比较阵本身也是专家评分得出的结果, 所以这里考虑使用熵权法解决
代码:
注意这里使用的是xlrd, 不支持xlsx文件, 只能保存为xls
def readexcel(hn,nc, path, sheetname):
data = xlrd.open_workbook(path)
table = data.sheet_by_name(sheetname)
nrows = table.nrows
data=[]
for i in range(hn,nrows):
data.append(table.row_values(i)[nc:])
return np.array(data)
def entropy(data0):
#返回每个样本的指数
#样本数,指标个数
n,m=np.shape(data0)
#一行一个样本,一列一个指标
#下面是归一化
maxium=np.max(data0,axis=0)
minium=np.min(data0,axis=0)
data= (data0-minium)*1.0/(maxium-minium)
##计算第j项指标,第i个样本占该指标的比重
sumzb=np.sum(data,axis=0)
data=data/sumzb
#对ln0处理
a=data*1.0
a[np.where(data==0)]=0.0001
# #计算每个指标的熵
e=(-1.0/np.log(n))*np.sum(data*np.log(a),axis=0)
# #计算权重
w=(1-e)/np.sum(1-e)
print("w = ")
print(w)
recodes=np.sum(data0*w,axis=1)
return recodes
def topsisTest2():
# 读数据并求熵
path = r'topsisData.xls'
hn, nc = 1, 1
# hn为表头行数,nc为表头列数
sheetname = u'Sheet1'
data = readexcel(hn, nc, path, sheetname)
grades = entropy(data)
print("grade type : {}".format(type(grades)))
print(grades)
但是可以看到, 这个熵权法是需要一个原始的数据输入的
所以重点需要确定使用啥作为原始数据输入