权重计算(1)——客观赋权法

本文首先分类介绍主客观赋权法,然后简述四种客观赋权法的算法步骤,分别给出python代码。



0x01、权重计算方法简述

1.1 赋权方法的分类

在用户建模的过程中,常常需要从用户的各项行为指标 ( x 1 , x 2 , . . . , x n ) (x_{1}, x_{2}, ... , x_{n}) (x1,x2,...,xn),以加权求和的方式计算用户的总体活跃度,形如: S = a 1 x 1 + a 2 x 2 + . . . + a n x n S = a_{1} x_{1} + a_{2} x_{2} + ... + a_{n} x_{n} S=a1x1+a2x2+...+anxn

其中 a 1 , a 2 , . . . , a n a_{1}, a_{2}, ... , a_{n} a1,a2,...,an 分别为 x 1 , x 2 , . . . , x n x_{1}, x_{2}, ... , x_{n} x1,x2,...,xn 的权重。通过对 x i   ( i = 1 , 2 , . . . , n ) x_{i} ~ (i=1,2,...,n) xi (i=1,2,...,n) 的 “重要性” 的设置,加权求和,计算用户的总得分。

对于如何确定 a 1 , a 2 , . . . , a n a_{1}, a_{2}, ... , a_{n} a1,a2,...,an 的值,主要有八种方法,可分为以下四类:

  • 第1类(主观赋权法):AHP层次法和优序图法。利用数字的相对大小信息计算权重;
  • 第2类(根据信息量):熵值法(熵权法)。利用数据熵值信息即信息量大小计算权重;
  • 第3类(根据数据波动):CRITIC、独立性权重和信息量权重。利用数据的波动性或者数据之间的相关关系计算权重;
  • 第4类(信息浓缩思想):因子分析和主成分法。根据数据的信息浓缩原理,利用方差解释率计算权重。
名称 数据波动性 数据间相关关系 数字大小信息 适用性
AHP层次法 适用于多个层次指标计算权重,专家打分赋权有一定的主观性
优序图法 计算较简便,较多指标时使用得到的权重结果更可靠
熵值法 适用于指标较多的、底层方案层指标计算权重,但对样本的依赖性较大,随着样本数据变化,权重会有一定的波动
CRITIC权重法 综合考虑数据波动情况和指标间的相关性,适合指标自身带有一定相关性和波动性的数据
信息量权重法 适用于将数据差异性视作一种信息,用数据波动程度来衡量指标权重
独立性权重法 适用于指标本身带有一些相关性、属于同一系统下的指标计算权重
因子分析法 指标较多时降维得到具有可解释性的因子权重,也可单独得到各指标权重,需要大量样本数据
主成分分析法 适用于指标较多时降维得到主成分权重,也可单独得到各项指标权重,需要大量样本数据

注意:

  • 一般来说,计算权重时,可使用四种客观赋权法(熵权法、CRITIC权重法、信息量权重法、独立性权重法)分别计算各指标的权重,然后计算四种方法所得结果的均值,从而得到最终的权重。
  • 如果只想使用专家的意见,可以使用主观赋权法。
  • 因子分析法、主成分分析法主要用于降维并计算权重,只能得到各个因子的权重,无法得到具体每个分析项的权重
  • 如果想要将主客观的权重结合起来,可以使用组合赋权法(集成赋权法)。

1.2 数据处理函数

这里把后面需要用到的MinMax归一化、标准化、均值、标准差、方差、相关系数等函数都一起给出,后面的代码将仅给出算法,不再包含这些函数。

import pandas as pd
import numpy as np
import math
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 标准化
def normalize_Standard(df): 
    scaler = StandardScaler()
    return pd.DataFrame(scaler.fit_transform(df), columns=df.columns.values)

# MinMax归一化(0-1 归一化)
def normalize_MinMax(df):
    scaler = MinMaxScaler(feature_range=(0,1))
    return pd.DataFrame(scaler.fit_transform(df), columns=df.columns.values)

# 均值
def compute_mat_mean(df):
    return pd.DataFrame(df.mean(), columns=['mean_value'])

## 标准差(使用df.std)
def compute_mat_std(df):
    return pd.DataFrame(df.std(), columns=['std_value'])

# 方差(标准差的平方)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值