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

时间:2024-10-21 07:16:55

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

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

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

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

例题:假设有下面的数据:(例题参考自:/
资产收益率 费用利润率 逾期贷款率 资产使用率 自有资本率
中信银行 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]/
[2]张娇,蒋倩倩,张伯言,魏屹.基于AHP-CRITIC法正交优选乌甘袋泡茶提取工艺及抗炎作用研究[J].中草药,2020,51(08):2177-2184.