评价类方法实例(python)

1.熵值法笔记:(参考链接:https://zhuanlan.zhihu.com/p/110039345)

因此可以运用信息熵评价所获系统信息的有序程度及信息的效用值.在评价体系中,指标的信息熵越大,则其信息的效用值越小,因此赋予该指标较小的指标权重;指标的信息熵越小,则其信息的效用值越大,因此赋予该指标较大的指标权重.

​ ~~~python

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
"""
Created on Fri Mar 23 10:48:36 2018
@author: Big Teacher Brother
"""
import pandas as pd
import numpy as np
import math
from numpy import array
 
# 1读取数据
df = pd.read_csv('E:\\text.csv', encoding='gb2312')
# 2数据预处理 ,去除空值的记录
df.dropna()
 
#定义熵值法函数
def cal_weight(x):
    '''熵值法计算变量的权重'''
    # 标准化
    x = x.apply(lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x))))
 
    # 求k
    rows = x.index.size  # 行
    cols = x.columns.size  # 列
    k = 1.0 / math.log(rows)
 
    lnf = [[None] * cols for i in range(rows)]
 
    # 矩阵计算--
    # 信息熵
    # p=array(p)
    x = array(x)
    lnf = [[None] * cols for i in range(rows)]
    lnf = array(lnf)
    for i in range(0, rows):
        for j in range(0, cols):
            if x[i][j] == 0:
                lnfij = 0.0
            else:
                p = x[i][j] / x.sum(axis=0)[j]
                lnfij = math.log(p) * p * (-k)
            lnf[i][j] = lnfij
    lnf = pd.DataFrame(lnf)
    E = lnf
 
    # 计算冗余度
    d = 1 - E.sum(axis=0)
    # 计算各指标的权重
    w = [[None] * 1 for i in range(cols)]
    for j in range(0, cols):
        wj = d[j] / sum(d)
        w[j] = wj
        # 计算各样本的综合得分,用最原始的数据
    
    w = pd.DataFrame(w)
    return w
 
 
if __name__ == '__main__':
    # 计算df各字段的权重
    w = cal_weight(df)  # 调用cal_weight
    w.index = df.columns
    w.columns = ['weight']
    print(w)
    print('运行完成!')
 

2.TOPSIS法

原理:

C.L.Hwang 和 K.Yoon 于1981年首次提出 TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution)。TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为基于归一化后的原始数据矩阵,采用余弦法找出有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行。

图解:

评价类方法实例(python)_第1张图片

分步骤解读:

评价类方法实例(python)_第2张图片

转化正负向指标:
极小型:

评价类方法实例(python)_第3张图片

def minimum(x):   #极小型指标
    return x.max() - x
中间型:

评价类方法实例(python)_第4张图片

def middle(x,value): #中间型指标
    max1 = max(abs(x-value)) #也就是中间值指标
    return abs(x -value)/max1  #直接
区间型:

评价类方法实例(python)_第5张图片

def interval(x,max1,min1):   #区间型指标
    M = max(min1-min(x),max(x)-max1)    #得到之间
    for i in range(len(x)):
        if(min1<=x[i]<=max1):
            x[i]=1
        elif(i<min1):
            x[i]=(1-(min1-x[i])/M)
        else:
            x[i]=(1-(x[i]-max1)/M)
    return x
归一化:

评价类方法实例(python)_第6张图片

data = data.apply(lambda x:x/np.sqrt((x**2).sum()))  #进行标准化
计算最优距离和最劣距离:

评价类方法实例(python)_第7张图片

max_value = data.max(axis=0) #最优距离
min_value = data.min(axis=0) #最劣距离
计算各评价对象与最优方案、最劣方案的接近程度

评价类方法实例(python)_第8张图片

for i in range(row):
    sum1 = 0
    sum2 = 0
    for j in range(col):
       sum1 += math.sqrt(w[j]*(data.iloc[i,j]-max_value[j])**2)  #至最优方案的距
       sum2 += math.sqrt(w[j]*(data.iloc[i,j]-min_value[j])**2)  #
    optimal[i] = sum1
    worst[i] = sum2
计算贴近程度Ci

评价类方法实例(python)_第9张图片

result = worst/(optimal+worst)

之后只需要对列表中的贴近程序进行排序就可以得到排名了。

你可能感兴趣的:(学习,数据分析,python)