Python案例:如何分配不同场景的权重
权重分配是多场景决策、评分系统、推荐算法中的核心问题,下面通过几个典型案例说明不同场景下的权重分配方法。

AHP层次分析法(主观权重)
适用于专家打分、评价指标体系,如员工绩效、供应商评估。
import numpy as np
def ahp_weights(matrix):
"""AHP层次分析法计算权重"""
# 1. 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(matrix)
max_idx = np.argmax(eigenvalues.real)
max_eigenvalue = eigenvalues[max_idx].real
weights = eigenvectors[:, max_idx].real
weights = weights / weights.sum() # 归一化
# 2. 一致性检验
n = matrix.shape[0]
RI = {1:0, 2:0, 3:0.58, 4:0.90, 5:1.12, 6:1.24, 7:1.32, 8:1.41}
CI = (max_eigenvalue - n) / (n - 1)
CR = CI / RI[n] if RI.get(n, 0) != 0 else 0
print(f"最大特征值: {max_eigenvalue:.4f}")
print(f"一致性比率 CR: {CR:.4f} {'✓通过' if CR < 0.1 else '✗不通过'}")
return weights
# 场景:选择供应商 —— [价格, 质量, 交期, 服务]
# 1-9标度:1同等重要,9极端重要
comparison = np.array([
[1, 3, 5, 7], # 价格
[1/3, 1, 3, 5], # 质量
[1/5, 1/3, 1, 3], # 交期
[1/7, 1/5, 1/3, 1], # 服务
])
weights = ahp_weights(comparison)
features = ['价格', '质量', '交期', '服务']
for f, w in zip(features, weights):
print(f"{f}: {w:.2%}")
熵权法(客观权重)
适用于有历史数据、指标量化的场景,如用户行为分析、风险评估。
import numpy as np
import pandas as pd
def entropy_weight(data):
"""熵权法:数据离散度越大,权重越高"""
# data: 行=样本,列=指标
data = np.array(data, dtype=float)
# 1. 标准化(正向指标)
data_norm = (data - data.min(0)) / (data.max(0) - data.min(0) + 1e-10)
# 2. 计算比重
p = data_norm / (data_norm.sum(0) + 1e-10)
# 3. 计算熵值
k = 1 / np.log(len(data))
e = -k * np.sum(p * np.log(p + 1e-10), axis=0)
# 4. 计算权重
d = 1 - e
weights = d / d.sum()
return weights
# 场景:3个用户场景的权重 [页面停留, 点击率, 转化率, 复购率]
df = pd.DataFrame({
'停留时长': [120, 300, 45],
'点击率': [0.15, 0.35, 0.08],
'转化率': [0.02, 0.08, 0.01],
'复购率': [0.30, 0.55, 0.20]
})
weights = entropy_weight(df.values)
for col, w in zip(df.columns, weights):
print(f"{col}: {w:.2%}")
组合赋权(AHP + 熵权)
主观与客观结合,避免单一方法偏差。
def combine_weights(w_subj, w_obj, alpha=0.5):
"""线性组合:alpha控制主观权重占比"""
return alpha * w_subj + (1 - alpha) * w_obj
# 假设上两步得到
w_ahp = np.array([0.55, 0.23, 0.15, 0.07])
w_entropy = np.array([0.20, 0.35, 0.15, 0.30])
w_final = combine_weights(w_ahp, w_entropy, alpha=0.6)
print("组合权重:", w_final.round(3))
业务规则的动态权重
适用于多场景推荐、场景化定价,权重随上下文调整。
class SceneWeightManager:
"""不同场景动态权重"""
def __init__(self):
# 基础权重配置
self.scene_configs = {
'promotion': {'price': 0.6, 'quality': 0.2, 'brand': 0.2},
'default': {'price': 0.3, 'quality': 0.5, 'brand': 0.2},
'premium': {'price': 0.1, 'quality': 0.4, 'brand': 0.5},
}
def get_weight(self, scene, user_signals=None):
"""根据场景+用户信号动态调整"""
weights = self.scene_configs.get(scene, self.scene_configs['default']).copy()
# 用户信号修正:高价值用户降低价格敏感度
if user_signals and user_signals.get('is_vip'):
weights['price'] *= 0.5
weights['quality'] *= 1.3
weights['brand'] *= 1.2
# 归一化
total = sum(weights.values())
return {k: v/total for k, v in weights.items()}
def score(self, items, scene, user_signals=None):
"""综合评分"""
w = self.get_weight(scene, user_signals)
results = []
for item in items:
s = sum(item[k] * w[k] for k in w)
results.append((item['name'], round(s, 3)))
return sorted(results, key=lambda x: -x[1])
# 示例
manager = SceneWeightManager()
items = [
{'name': '商品A', 'price': 0.9, 'quality': 0.6, 'brand': 0.5},
{'name': '商品B', 'price': 0.5, 'quality': 0.9, 'brand': 0.8},
{'name': '商品C', 'price': 0.7, 'quality': 0.8, 'brand': 0.7},
]
print("促销场景:", manager.score(items, 'promotion'))
print("VIP促销:", manager.score(items, 'promotion', {'is_vip': True}))
print("高端场景:", manager.score(items, 'premium'))
机器学习可学习权重
适