权重计算方法(确定权重的方法主要有哪些)

当矿工们最近在做一个项目时,他们遇到了一个需求。甲方巴巴要求两层指标体系评分。结果谷歌像老虎一样凶猛,结果只有五个。大胆而不顾后果地努力,自研算法计算权重。请等

当矿工们最近在做一个项目时,他们遇到了一个需求。甲方巴巴要求两层指标体系评分。结果

谷歌像老虎一样凶猛,

结果只有五个。

大胆而不顾后果地努力,

自研算法计算权重。

请等一个壮汉经过,

移动你的手,集中注意力。

在统计理论和实践中,权重是表示各评价指标(或评价项目)重要性的权重,表示各评价指标在整体中的不同作用。在具体的业务场景中,最常见的评价指标类型分为单层指标体系和双层指标体系。

权重计算方法(确定权重的方法主要有哪些)

单层索引系统

权重计算方法(确定权重的方法主要有哪些)

双重指标体系

针对这两类指标体系,本文提供了以下三大类五种权重算法进行指标赋权。

主观加权法:g_one

客观赋权法:变异系数法、熵值法、主成分分析法。

积分加权法:乘法积分

每个算法的具体原理,你可以自己Google和百度。下面简单介绍一下算法的精髓。主观赋权法,顾名思义,就是拍脑袋给人权重。最早的算法是德尔菲法,也叫专家法,简单粗暴的直接拍脑袋确定权重。后来出现了层次分析法和g_one法。后者是前者的优化改进版本,也是本文采用的方法。这两类算法的原理是,两两比较比指标整体比较更容易让人们做出理性判断,所以“专家”只需测量每两个指标的相对重要性,就可以推导出整体指标体系中每个指标的相对重要性。

客观加权法是基于数据反映的信息量。信息量越大,对应的指标权重越大。根据度量信息的方式不同,衍生出不同的客观赋权法:熵赋权法用信息熵来度量数据所反映的信息量,变异系数法用变异系数来反映信息量,主成分分析法用各指标对主成分的贡献作为度量指标。

综合赋权法:将主观赋权法和客观赋权法得到的权重进行综合。根据计算方法的不同,可分为加法积分、乘法积分等。

理论完了,我们开始编码吧。

# g1赋权法 def g_one(r_list): r_list.append(1) r_list.reverse() wei_list = np.cumprod(r_list) w_list = list(wei_list/sum(wei_list)) w_list.reverse() return w_list

# 熵权法def entropy_weight(x): x = x.apply(lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x)))) index_list = x.columns.tolist() rows, cols = x.shape k = 1.0 / np.log(rows) x = np.array(x) lnf = [[None] * cols for i in range(rows)] lnf = np.array(lnf) for i in range(0, rows): for j in range(0, cols): if x[i][j] == 0: item = 0.0 else: p = x[i][j] / x.sum(axis=0)[j] item = np.log(p) * p * (-k) lnf[i][j] = item lnf = pd.DataFrame(lnf) new_data = lnf redund = 1 - new_data.sum(axis=0) w = [[None] * 1 for i in range(cols)] for j in range(0, cols): wj = redund[j] / sum(redund) w[j] = wj return w

# 变异系数法 def var_weight(data): x = data index_list = data.columns.tolist() x = x.apply(lambda x: ((x - np.min(x)) / (np.max(x) - np.min(x)))) x_mean = x.mean(axis=0) x_std = x.std(ddof=0) x_cof_var = x_std/x_mean sum_x_cof_var = x_cof_var.sum() x_wi = x_cof_var/sum_x_cof_var return x_wi

# 主成分分析法 from sklearn.decomposition import PCA def pca_weight(data): index_list = data.columns.tolist() x = np.array(data) pca = PCA(n_components=2) pca.fit(x) component = pca.components_ variance_ratio = pca.explained_variance_ratio_ component = abs(component.T) for i in range(0,2): component[:, i] = variance_ratio[i]*component[:, i] a = pd.DataFrame(component) b = a.sum(axis=1) c = b/b.sum(axis=0) c = c.to_frame() return c

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/23449.html

发表回复

登录后才能评论