赞
踩
参考链接:http://blog.sina.com.cn/s/blog_710e9b550101ansp.html
三、综合评价模型建立步骤
1、综合评价模式是一种对一个或多个系统进行评价的模型。一般分为如下几个步骤:
2、选取评价指标,指标的选取应该具有独立性和全面性。
3、得到m×n测量矩阵,每一行表示一个带评价系统(共m行),没一列表示一个评价指标(共n列)。
4、对测量矩阵每个指标进行一致化处理。指标一般有极小型,居中型和区间型,一般都转化为极大型。
5、进行无量纲化处理。常用的方法有标准差法、极值差法、功效系数法等。
6、确定评价指标权重向量。是固定权值还是动态权值?动态权值的隶属函数有分段变幂函数、偏大型正态分布函数、S型分布函数等。
7、建立综合评价模型。线性加权还是非线性加权?
8、给出结论。如果是多对象评价模型可以提供一个排序方法,对评价结果进行排序。
四、指标权重确定方法之独立性权系数法
应用实例:
某大学2013年进行研究生招聘,某学院系主任希望从报名的30人中挑选出最优秀的5人。该系主任根据考生笔试成绩和面试成绩的得分,对考生进行筛选。但是由于各项课程的培养计划重要程度不同。因此该系主任想要通过考生各科目的考试成绩以及面试内容的成绩设定权重,以比较合理的方式对考生的成绩进行综合评价。下面是报名的30人的各科目考试成绩和面试成绩。
编码 政治 英语 数学 专业课 专业英语 专业知识 1 67 88 65 104 41 54 2 78 66 85 116 61 56 3 72 85 74 136 48 77 4 76 62 87 101 42 61 5 68 63 79 139 77 79 6 90 87 95 95 48 41 7 71 67 89 122 75 77 8 78 80 100 90 80 49 9 78 84 70 109 63 48 10 75 72 89 106 78 46 11 85 84 77 99 53 68 12 61 84 67 102 71 62 13 76 86 62 118 58 66 14 62 79 69 140 71 40 15 64 82 85 100 58 57 16 77 66 64 143 45 66 17 86 62 96 97 78 62 18 60 89 67 138 40 72 19 89 76 91 144 53 70 20 77 85 81 103 80 56 21 83 89 65 119 68 44 22 62 80 72 139 49 63 23 76 78 85 126 42 51 24 68 77 76 104 68 45 25 71 82 93 90 78 60 26 64 90 60 131 61 47 27 60 62 72 131 76 67 28 77 61 95 91 50 55 29 63 77 93 129 56 63 30 70 84 98 135 70 59
python源码实现:
# -*- encoding=utf-8 -*-
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import numpy as np
from sklearn import preprocessing
from math import sqrt
import statsmodels.api as sm
# 自定义归一化函数
def autoNorm(data):
"""
:param data: 列表
:return: 归一化列表
"""
arr = np.asarray(data)
norm_list=[]
for x in arr:
x = round(float(x - np.min(arr)) / ((np.max(arr) - np.min(arr))+0.001),4)
norm_list.append(x)
return norm_list
# 自定义max-min 归一化函数
def min_max_scaler(data):
"""
:param data: 输入各评价指标的数据框
:return: 归一化之后的数据框
"""
X = np.array(data)
min_max_scaler = preprocessing.MinMaxScaler()
X_minMax = min_max_scaler.fit_transform(X)
X_minMax=pd.DataFrame(X_minMax,columns=data.columns.values)
return X_minMax
def multipl(a, b):
"""
:param a: 列表1
:param b: 列表2
:return: 相乘求和之后的值
"""
sumofab = 0.0
for i in range(len(a)):
temp = a[i] * b[i]
sumofab += temp
return sumofab
def corrcoef(x, y):
"""
:param x: 列表1
:param y: 列表2
:return: 复相关系数R
"""
n = len(x)
# 求和
sum1 = sum(x)
sum2 = sum(y)
# 求乘积之和
sumofxy = multipl(x, y)
# 求平方和
sumofx2 = sum([pow(i, 2) for i in x])
sumofy2 = sum([pow(j, 2) for j in y])
num = sumofxy - (float(sum1) * float(sum2) / n)
# 计算复相关系数
den = sqrt((sumofx2 - float(sum1 ** 2) / n) * (sumofy2 - float(sum2 ** 2) / n))
R=num / den
return R
def get_R_coefficient(data):
"""
:param data: 评价指标的数据框
:return:评价指标的复相关系数
"""
R_list=[]
for i in range(0,len(data.columns.values)):
columns_list = list(data.columns.values)
k1 = columns_list[i]
columns_list.remove(k1)
X = sm.add_constant(data.loc[:,columns_list])
y = data.loc[:,k1]
est = sm.OLS(y, X)
est2 = est.fit()
predict = est2.predict()
R=corrcoef(y, predict)
R_list.append(R)
return R_list
def get_R_wi(R_list):
"""
:param R_list: 复相关系数列表
:return: 各指标的权重
"""
wi_1=[]
wi_list=[]
for i in range(0,len(R_list)):
# 求各指标与其他指标复相关系数的倒数
w1=round(1/R_list[i],2)
wi_1.append(w1)
# 对上表数据进行归一化处理,即可得到各指标的权重
sum_wi_1=sum(wi_1)
for i in range(0,len(wi_1)):
# w2 = wi_1[i] / sum_wi_1
w2=round(wi_1[i]/sum_wi_1,2)
wi_list.append(w2)
return wi_list
def get_article_score(wi_list,data):
"""
:param wi_list: 权重系数列表
:param data:评价指标数据框
:return:返回文章质量得分
"""
# 将权重转换为矩阵
cof_var = np.mat(wi_list)
# 将数据框转换为矩阵
context_train_data = np.mat(data)
# 权重跟自变量相乘
last_hot_matrix = context_train_data * cof_var.T
last_hot_matrix = pd.DataFrame(last_hot_matrix.T)
# 累加求和得到总分
last_hot_score = list(last_hot_matrix.apply(sum))
# max-min 归一化
# last_hot_score_autoNorm = autoNorm(last_hot_score)
# 值映射成分数(0-100分)
# last_hot_score_result = [i * 100 for i in last_hot_score_autoNorm]
return last_hot_score
if __name__ == '__main__':
data=pd.read_excel('C:\\Users\\xiaohu\\Desktop\\文本挖掘\\文本质量综合评价算法\\test.xlsx')
context_train_data=data.iloc[:,1:7]
R_list=get_R_coefficient(context_train_data)
wi_list=get_R_wi(R_list)
last_hot_score_result=get_article_score(wi_list,context_train_data)
# 增加一列id
context_train_data['编码']=data['编码']
# 增加一列分数值
context_train_data['score']=last_hot_score_result
# 然后对数据框按热度值从大到小排序
result=context_train_data.sort_values(by = 'score',axis = 0,ascending = False)
result['rank']=range(1,len(result)+1)
print(result)
# 写出csv数据
result.to_csv('C:\\Users\\xiaohu\\Desktop\\文本挖掘\\文本质量综合评价算法\\test_result.csv', index=False)
结果展示:
政治 英语 数学 专业课 专业英语 专业知识 编码 score rank
18 89 76 91 144 53 70 19 83.43 1
29 70 84 98 135 70 59 30 83.36 2
4 68 63 79 139 77 79 5 82.35 3
6 71 67 89 122 75 77 7 81.68 4
19 77 85 81 103 80 56 20 79.85 5
16 86 62 96 97 78 62 17 79.08 6
2 72 85 74 136 48 77 3 78.71 7
7 78 80 100 90 80 49 8 78.70 8
24 71 82 93 90 78 60 25 78.24 9
20 83 89 65 119 68 44 21 77.03 10
28 63 77 93 129 56 63 29 76.91 11
9 75 72 89 106 78 46 10 76.70 12
26 60 62 72 131 76 67 27 76.64 13
12 76 86 62 118 58 66 13 76.02 14
10 85 84 77 99 53 68 11 75.67 15
13 62 79 69 140 71 40 14 75.27 16
1 78 66 85 116 61 56 2 74.76 17
21 62 80 72 139 49 63 22 74.31 18
17 60 89 67 138 40 72 18 74.08 19
8 78 84 70 109 63 48 9 74.07 20
11 61 84 67 102 71 62 12 73.89 21
25 64 90 60 131 61 47 26 73.87 22
15 77 66 64 143 45 66 16 73.56 23
5 90 87 95 95 48 41 6 73.34 24
22 76 78 85 126 42 51 23 72.69 25
14 64 82 85 100 58 57 15 72.33 26
23 68 77 76 104 68 45 24 71.93 27
27 77 61 95 91 50 55 28 68.85 28
3 76 62 87 101 42 61 4 68.33 29
0 67 88 65 104 41 54 1 67.43 30
Process finished with exit code 0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。