本文首先分类介绍主客观赋权法,然后简述四种客观赋权法的算法步骤,分别给出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'])
# 方差(标准差的平方)