关于Critic确定权重的matlab代码和python代码

本文深入解析了Critic算法,一种基于指标信息量和冲突性的权重确定方法,通过对比强度和相关系数评估指标重要性,并提供了MATLAB和Python实现代码。
该文章已生成可运行项目,

关于Critic确定权重的matlab代码和python代码:

观察到关于Critic确定权重的相关知识比较少,笔者写了一点自己的理解,如果有不对的地方还请指教!另外文章最后给出我自己写的matlab代码和python代码!

本文采用CRITIC 赋值法对模型进行优化。Critic 赋值法以两个基本概念为基础:一是对比强度,借鉴标准离差法的思想,认为若同一指标的所有评价指数差别越大,即标准差越大,则所蕴含的信息量越大;二是评价指标之间的冲突性,指标之间的冲突性是以指标之间的相关系数为基础,如两个指标之间具有较强的正相关,说明两个指标冲突性较低。第j 个指标与其它指标的冲突性的量化指标 ,其中𝑟𝑖𝑗评价指标i和j之间的相关系数。各个指标的客观权重确定就是对比强度和冲突性来综合衡量的。设𝐶𝑗表示第j个评价指标所包告的信息量。𝐶𝑗的计算式:
在这里插入图片描述在这里插入图片描述
一般地,𝐶𝑗越大,第j个评价指标所包含的信息量越大,则该指标的相对重要性也就越大。设𝑊𝑗为第j个指标的客观权重。𝑊𝑗的计算公式:
在这里插入图片描述
(m为指标数(维度),n为样本个数)

Critic算法流程图:
在这里插入图片描述

例题:假设有下面的数据:(例题参考自:https://www.docin.com/p-847838688.html
资产收益率 费用利润率 逾期贷款率 资产使用率 自有资本率
中信银行 0.4830 13.2682 0.0000 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
注:逾期贷款率为越小越好,其余为越大越好;

经过极大化指标和标准化数据后得到以下矩阵(这里采取的是最大值最小值标准化):
资产收益率 费用利润率 逾期贷款率 资产使用率 自有资本率
中信银行 0.16800 0.0000 1.0000 0.58697 0.0000
光大银行 0.00000 0.01780 0.0000 0.00000 0.16212
浦发银行 1.00000 1.00000 0.76799 1.00000 1.00000
招商银行 0.38269 0.22034 0.65926 0.65612 0.61153

相关矩阵为:
在这里插入图片描述
标准化后的各列标准差:
在这里插入图片描述
最后求得各指标的权重为:
在这里插入图片描述

Matlab代码:

clc;clear;
X=[0.4830,13.2682,0.0000,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];
[n,m]
本文章已经生成可运行项目
### 关于面板数据 CRITIC 权重计算的 Python MATLAB 实现 #### 背景介绍 CRITIC 方法是一种基于信息论的目标赋权方法,能够通过衡量指标之间的冲突性指标变异程度来确定权重。对于面板数据(Panel Data),其结构通常由多个时间点多个对象组成,因此在应用 CRITIC 方法时需特别注意如何处理时间空间维度的数据。 以下是针对面板数据的 CRITIC 权重计算的具体实现代码: --- #### MATLAB 实现 MATLAB 的实现主要依赖矩阵运算功能完成标准化、冲突度计算以及最终权重分配过程。以下是一个完整的 MATLAB 函数实现[^2]: ```matlab function w = critic_weight(X) % X 是 n*m 矩阵 (n 表示样本数量, m 表示指标数量) % 数据标准化 max_X = max(X); min_X = min(X); S = (X - ones(size(X,1),1)*min_X) ./ ... (ones(size(X,1),1)*(max_X - min_X)); % 计算标准差 Std = std(S); % 计算相关系数矩阵 Corr = corrcoef(S); % 初始化冲突度 C 向量 Conflict = zeros(1,size(X,2)); for j=1:size(X,2) sum_corr_j = abs(Corr(j,:)) * Std'; Conflict(j) = sum(sum_corr_j) / size(X,2); end % 计算权重 W W = Std .* (1 - Conflict); w = W / sum(W); % 归一化 end ``` 上述代码适用于任意形状的标准矩阵 \(X\),并能自动调整至适合面板数据的形式。 --- #### Python 实现 Python 中可以通过 NumPy 库快速实现类似的逻辑。如果涉及更复杂的优化需求,则可引入 Pandas 或 SciPy 工具包辅助处理。下面是一份简洁的 Python 版本实现[^3]: ```python import numpy as np def critic_weight(Z): """ 使用 CRITIC 法计算权重 :param Z: 输入矩阵 (已正向化标准化后的数据),大小为 n*m :return: 返回权重向量 W,大小为 1*m """ # 正则化数据 standardized_data = (Z - Z.min(axis=0)) / (Z.max(axis=0) - Z.min(axis=0)) # 计算每列的标准差 standard_deviation = np.std(standardized_data, axis=0) # 计算相关系数矩阵 correlation_matrix = np.corrcoef(standardized_data.T) # 冲突度计算 conflict = [] for i in range(correlation_matrix.shape[0]): temp_sum = 0 for j in range(correlation_matrix.shape[1]): if i != j: temp_sum += abs(correlation_matrix[i][j]) * standard_deviation[j] conflict.append(temp_sum) # 组合权重 weight_vector = standard_deviation * (1 - np.array(conflict)) normalized_weights = weight_vector / np.sum(weight_vector) return normalized_weights # 测试部分 if __name__ == "__main__": data = np.random.rand(10, 5) # 假设有一个 10*5 的随机矩阵表示面板数据 weights = critic_weight(data) print("Weights:", weights) ``` 此代码同样支持多维数组输入,并假设输入已经过必要的预处理步骤(如缺失值填充或异常检测)[^4]。 --- #### 注意事项 1. 面板数据中的时间序列特性可能会影响某些统计属性的结果解释,建议先对原始数据进行平稳性检验。 2. 如果存在大量零值或者极端值的情况,在执行标准化之前应考虑适当变换(例如取对数或其他非线性映射)。 3. 对于高维稀疏矩阵场景下运行效率较低的问题,可以尝试采用分批加载策略减少内存占用。 ---
评论 39
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值