Python实现模糊综合评价

理论部分可以参考这个:

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)

但是那个博客有很多主观臆断的地方:

  • 隶属度矩阵R
  • 权重向量A
  • 评分矩阵S

最后一个评分矩阵S用主观臆断去填还说得去

但是头两个矩阵并不适合用主观解决:

隶属度矩阵R:

隶属度矩阵可以看这个博客进行求解:

https://zhuanlan.zhihu.com/p/160846498

  1. 对每个指标选出一个隶属度函数

  2. 对矩阵中的每一个元素进行求解:

    即吧当前的因素带入隶属度函数求得矩阵的一个元素

权重向量A:

这个博客中说是可以使用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)

Python实现模糊综合评价_第1张图片

但是可以看到, 这个熵权法是需要一个原始的数据输入的

所以重点需要确定使用啥作为原始数据输入

Python实现模糊综合评价_第2张图片

你可能感兴趣的:(python)