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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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]=size(X);
X(:,3) = min_best(X(:,3)) ;% 将极小型指标转化为加大型
xmin = min(X);
xmax = max(X);
xmaxmin = xmax-xmin;
Z =(X-xmin)./repmat(xmaxmin,n,1);  % 最大值最小值标准化,去除量纲
R = corrcoef(Z);  % 计算相关系数矩阵,但是要将相关系数矩阵都变成正相关
for i =1:n
    for j=1:m
        if R(i,j)<0
            R(i,j)=-R(i,j);
        end
    end
end 
delta = zeros(1,m);
c = zeros(1,m);
for j=1:m
    delta(j) = std(Z(:,j));
    c(j)= size(R,1)-sum(R(:,j));
end
C = delta.*c;
w =C./(sum(C))

% min_best子函数:
function [change_x]=min_best(x)
  r=size(x,1);
  change_x = repmat(max(x),r,1)-x;
end

python代码:

import numpy as np
import pandas as pd

def critic(X):
    n,m = X.shape
    X[:,2] = min_best(X[:,2])  # 自己的数据根据实际情况
    Z = standard(X)  # 标准化X,去量纲
    R = np.array(pd.DataFrame(Z).corr())
    delta = np.zeros(m)
    c = np.zeros(m)
    for j in range(m):
        delta[j] = Z[:,j].std()
        c[j] = R.shape[0] - R[:,j].sum()
    C = delta * c
    w = C/sum(C)
    return np.round(w,4)

def min_best(X):
    for i in range(len(X)):
        X[i] = max(X)-X[i]
    return X

def standard(X):
    xmin = X.min(axis=0)
    xmax = X.max(axis=0)
    xmaxmin = xmax-xmin
    n, m = X.shape
    for i in range(n):
        for j in range(m):
            X[i,j] = (X[i,j]-xmin[j])/xmaxmin[j]
    return X

if __name__ == '__main__':
    X=np.array([[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]])

    print(critic(X))
说明

转载请附上出处,谢谢!

参考文献

[1]https://www.docin.com/p-847838688.html
[2]张娇,蒋倩倩,张伯言,魏屹.基于AHP-CRITIC法正交优选乌甘袋泡茶提取工艺及抗炎作用研究[J].中草药,2020,51(08):2177-2184.

### 关于面板数据 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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值