5 评价类算法:CRITIC法笔记(附Python代码)

一、原理

1.定义

CRITIC方法是一种客观权重赋权法。它的基本思路是确定指标的客观权数以两个基本概念为基础。一是对比强度,它表示同一指标各个评价方案取值差距的大小,以标准差的形式来表现。二是评价指标之间的冲突性,指标之间的冲突性是以指标之间的相关性为基础,如两个指标之间具有较强的正相关,说明两个指标冲突性较低。

2.作用

CRITIC权重法适用于判断数据稳定性,并且适合分析指标或因素之间有着一定的关联的数据。

二、相关概念

1.对比强度

是指同一个指标各个评价方案之间取值差距的大小,以标准差的形式来表现。标准差越大,说明波动越大,即各方案之间的取值差距越大,权重会越高。其中,假设m个待评对象,n个评价指标。
在这里插入图片描述

2.冲突性

指标之间的冲突性用相关系数进行表示,若两个指标之间具有较强的正相关,说明其冲突性越小,权重会越低。
在这里插入图片描述

3.信息承载量

设信息承载量为Cj,公式为:
在这里插入图片描述

三、步骤

1.数据标准化

每个指标的数量级不一样,需要把它们化到同一个范围内比较。指标也都需要正向化。此篇把正向化和标准化结合。
设有m个待评对象,n个评价指标,可以构成数据矩阵X = (xij)mxn.

  • 若xj为负向指标(越小越优型指标),需如下处理:
  • 若xj为正向指标(越大越优型指标),需如下处理:
    在这里插入图片描述

2.计算信息承载量

根据上述第二部分所列对比强度冲突性公式,推导得信息承载量公式。
根据以上3个公式,计算所需信息承载量C。

3.计算权重

这里将计算的信息承载量 Cj 进行归一化,即为所计算的权重 W。可以看出,信息承载量越大时,权重越大。
在这里插入图片描述

4.计算评分

将权重 W 与处理后的矩阵 x 相乘,获得测评对象的分数(该公式中,分数未转为百分比形式)。
在这里插入图片描述

四、代码

import numpy as np

'''
4
5
1 1 2 1 1
0.483 13.2682 0.0 4.3646 5.1070
0.4035 13.4909 39.0131 3.6151 5.5005
0.8979 25.7776 9.0513 4.8920 7.5342
0.5927 16.0245 13.2935 4.4529 6.5913
'''

'''1.输入数据'''
print("请输入参评对象数目:")
n = eval(input())
print("请输入评价指标数目:")
m = eval(input())
print("请输入指标类型:1:极大型,2:极小型")
kind = input().split(" ")
print("请输入矩阵:")
X = np.zeros(shape=(n, m))
for i in range(n):
    X[i] = input().split(" ")
    X[i] = list(map(float, X[i]))
print("输入的矩阵为:\n{}".format(X))

'''2.标准化处理'''
def maxTomax(maxx, minx, x):
    x = list(x)
    ans = [[(e-minx)]/(maxx-minx) for e in x]
    return np.array(ans)
def minTomax(maxx, minx, x):
    x = list(x)
    ans = [[(maxx-e)]/(maxx-minx) for e in x]
    return np.array(ans)

A = np.zeros(shape=(n, 1))

for i in range(m):
    maxA = max(X[:, i])
    minA = min(X[:, i])
    if kind[i] == "1":
        v = maxTomax(maxA, minA, X[:, i])
    elif kind[i] == "2":
        v = minTomax(maxA, minA, X[:, i])
    if i == 0:
        A = v.reshape(-1, 1)
    else:
        A = np.hstack([A, v.reshape(-1, 1)])
print("标准化矩阵为:\n{}".format(A))

'''3.计算对比强度'''
V = np.std(A, axis=0)
print("对比强度为:\n{}".format(V))

'''4.计算冲突性'''
A2 = list(map(list, zip(*A))) # 矩阵转置
r = np.corrcoef(A2)   # 求皮尔逊相关系数
f = np.sum(1-r, axis=1)
print("冲突性为:\n{}".format(f))

'''5.计算信息承载量'''
C = V*f
print('信息承载量为:\n{}'.format(C))

'''6.计算权重'''
w = C/np.sum(C)
print('权重为:\n{}'.format(w))

'''7.计算得分'''
s = np.dot(A, w)
Score = 100*s/max(s)
for i in range(len(Score)):
    print(f"第{i+1}个测评对象的百分制得分为:{Score[i]}")

在这里插入图片描述
在这里插入图片描述

五、参考链接

1.CSDN博客笔记
2.知乎笔记

  • 8
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 我不是很了解critic权重,但Python代码可以用以下方式实现:import numpy as np# 定义参数 alpha = 0.01 gamma = 0.95# 定义两个状态:正常和异常 states = [0, 1]# 定义行为 actions = [0, 1]# 定义每个状态的奖励 rewards = np.array([[-1, 1], [-2, 10]])# 定义状态转移矩阵 transition_matrix = np.array([[0.7, 0.3], [0.3, 0.7]])# 初始化Q矩阵 Q = np.zeros([len(states), len(actions)])# 开始迭代 for i in range(1000): current_state = np.random.choice(states) while current_state != 0: action = np.argmax(Q[current_state, :] + np.random.randn(1, len(actions)) * (1.0 / (i + 1))) next_state = np.random.choice(states, p=transition_matrix[current_state, action]) td_target = rewards[current_state, action] + gamma * np.max(Q[next_state, :]) td_error = td_target - Q[current_state, action] Q[current_state, action] += alpha * td_error current_state = next_stateprint(Q) ### 回答2: 在使用权重对影评进行评价时,可以使用Python编写以下代码: 首先,需要定义一个函数来计算critic权重得分。该函数接收两个列表作为输入参数,一个是影评者的评分列表,另一个是对应影评者的权重列表。函数会根据评分和权重的对应关系,计算出一个加权平均分。 ```python def calculate_critic_score(scores, weights): # 首先,计算所有评分与权重的乘积列表 weighted_scores = [score * weight for score, weight in zip(scores, weights)] # 然后,计算加权平均分 weighted_average = sum(weighted_scores) / sum(weights) return weighted_average ``` 接下来,可以定义一个测试示例,来演示如何使用上述函数计算critic权重得分。 ```python # 影评者评分列表 scores = [8, 9, 7, 9.5] # 影评者权重列表 weights = [0.3, 0.2, 0.3, 0.2] # 调用函数计算critic权重得分 critic_score = calculate_critic_score(scores, weights) # 打印结果 print("Critic权重得分:", critic_score) ``` 运行上述代码,输出结果将显示该影评的critic权重得分。 希望这个代码可以帮助你理解和实现critic权重。 ### 回答3: critic权重是一种常用的决策方,它根据不同指标的重要性来确定最终决策的权重。在Python中,可以使用以下代码实现critic权重。 首先,需要导入需要的库,包括`numpy`用于数值计算和矩阵操作。 ``` import numpy as np ``` 然后,定义一个函数来计算权重。这里的权重计算方可以根据实际需求进行修改。以下是一个简单的示例: ```python def calculate_weights(criteria): criteria_np = np.array(criteria) # 将指标列表转换为numpy数组 sum_values = np.sum(criteria_np) # 计算指标的总和 weights = criteria_np / sum_values # 按比例计算每个指标的权重 return weights ``` 函数中,首先将指标列表转换为numpy数组,然后计算指标的总和。接着,按比例计算每个指标的权重,最后返回权重列表。 最后,可以使用以下代码来调用函数并得到权重: ```python criteria = [3, 4, 2, 1] # 指标列表 weights = calculate_weights(criteria) # 计算权重 print("权重:", weights) ``` 运行以上代码,将得到指标[3, 4, 2, 1]的权重。输出结果将类似于: ``` 权重: [0.3 0.4 0.2 0.1] ``` 以上就是使用Python实现critic权重代码。根据实际需求,可以根据自己的需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zz_Lambda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值