Python 案例:如何分配不同场景的权重
权重分配是数据分析、推荐系统、评分模型中的常见需求,下面给你几个可直接运行的完整案例,覆盖不同场景。

案例 1:基础权重分配(归一化)
场景:绩效评分,不同指标权重不同。
def normalize_weights(weights: dict) -> dict:
"""将权重归一化,使总和为 1"""
total = sum(weights.values())
return {k: v / total for k, v in weights.items()}
# 原始权重(可以是任意正数,不必和为1)
raw_weights = {
"工作业绩": 50,
"团队协作": 25,
"创新能力": 15,
"出勤率": 10,
}
weights = normalize_weights(raw_weights)
print(weights)
# {'工作业绩': 0.5, '团队协作': 0.25, '创新能力': 0.15, '出勤率': 0.1}
# 计算得分
scores = {"工作业绩": 90, "团队协作": 85, "创新能力": 70, "出勤率": 100}
final_score = sum(scores[k] * weights[k] for k in scores)
print(f"综合得分:{final_score:.2f}") # 综合得分:87.25
案例 2:场景化动态权重(同一模型不同场景)
场景:风控系统,不同交易场景关注点不同。
# 各场景下的权重配置表
SCENE_WEIGHTS = {
"normal_trade": { # 普通交易
"amount": 0.20,
"frequency": 0.20,
"device": 0.20,
"history": 0.40,
},
"high_value_trade": { # 大额交易
"amount": 0.50,
"frequency": 0.15,
"device": 0.15,
"history": 0.20,
},
"new_user_trade": { # 新用户交易
"amount": 0.30,
"frequency": 0.10,
"device": 0.30,
"history": 0.30,
},
}
def calc_risk(scene: str, features: dict) -> float:
weights = SCENE_WEIGHTS[scene]
return sum(features[f] * w for f, w in weights.items())
# 同一组特征,不同场景打分
features = {"amount": 80, "frequency": 40, "device": 60, "history": 30}
for scene in SCENE_WEIGHTS:
print(f"{scene:20s} 风险分: {calc_risk(scene, features):.1f}")
# normal_trade 风险分: 48.0
# high_value_trade 风险分: 59.5
# new_user_trade 风险分: 51.0
案例 3:AHP 层次分析法(主观权重)
场景:需要专家判断、结构化推导权重。
import numpy as np
def ahp_weights(matrix: np.ndarray):
"""AHP 层次分析法求权重与一致性检验"""
n = matrix.shape[0]
# 特征向量法求权重
eigvals, eigvecs = np.linalg.eig(matrix)
max_idx = np.argmax(eigvals.real)
weights = eigvecs[:, max_idx].real
weights = weights / weights.sum()
# 一致性检验
CI = (eigvals[max_idx].real - n) / (n - 1)
RI = {1:0, 2:0, 3:0.58, 4:0.90, 5:1.12, 6:1.24}[n]
CR = CI / RI if RI else 0
return weights, CR
# 判断矩阵:3 个维度,a_ij 表示 i 比 j 重要的程度
# 价格重要 = 3 × 质量,质量 = 2 × 外观
matrix = np.array([
[1, 3, 6],
[1/3, 1, 2],
[1/6, 1/2, 1],
])
weights, CR = ahp_weights(matrix)
labels = ["价格", "质量", "外观"]
for l, w in zip(labels, weights):
print(f"{l}: {w:.4f}")
print(f"一致性比率 CR = {CR:.4f} {'✅ 通过' if CR < 0.1 else '❌ 需调整'}")
# 价格: 0.6667 质量: 0.2222 外观: 0.1111 CR ≈ 0
案例 4:熵权法(客观权重)
场景:数据驱动,让指标自身的信息量决定权重。
import numpy as np
def entropy_weights(data: np.ndarray):
"""熵权法:data shape = (样本数, 指标数),越大越好"""
# 1. 归一化(min-max)
x_min = data.min(axis=0)
x_max = data.max(axis=0)
norm = (data - x_min) / (x_max - x_min + 1e-12)
# 2. 计算比重 p_ij
p = norm / (norm.sum(axis=0) + 1e-12)
# 3. 熵值 e_j
k = 1 / np.log(len(data))
e = -k * np.nansum(p * np.log(p + 1e-12), axis=0)
# 4. 差异系数 → 权重
d = 1 - e
return d / d.sum()
# 5 个方案在 4 个指标上的表现
data = np.array([
[9, 8, 6, 7],
[7, 9, 8, 6],
[8, 7, 9, 8],
[6, 9, 7, 9],
[9, 6, 8, 5],
])
w = entropy_weights(data)
labels = ["指标A", "指标B", "指标C", "指标D"]
for l, wi in zip(labels, w):
print(f"{l}: {wi:.4f}")
案例 5:多场景组合权重(加权融合)
场景:用户评分系统中,需要兼顾主观与客观。
def combine_weights(subjective: dict, objective: dict, alpha: float = 0.5):
"""alpha 越大越偏向主观权重"""
return {
k: alpha * subjective[k] + (1 - alpha) * objective[k]
for k in subjective
}
subj = {"价格": 0.6667, "质量": 0.2222, "外观": 0.1111}
obj = {"价格": 0.30, "质量": 0.50, "外观": 0.20}
combined = combine_weights(subj, obj, alpha=0.6)
print({k: round(v, 4) for k, v in combined.items()})
# {'价格': 0.52, '质量': 0.3332, '外观': 0.1466}
案例 6:时间衰减权重
场景:用户兴趣建模,越近的行为权重越高。
import math
from datetime import datetime, timedelta
def time_decay_weight(timestamp: datetime, now: datetime, half_life_days: float = 30):
"""指数衰减:半衰期后权重减半"""
delta_days = (now - timestamp).total_seconds() / 86400
return 0.5 ** (delta_days / half_life_days)
now = datetime(2024, 6, 1)
events = [
{"action": "点击", "time": now - timedelta(days=1)},
{"action": "收藏", "time": now - timedelta(days=10)},
{"action": "购买", "time": now - timedelta(days=60)},
]
action_base = {"点击": 1, "收藏": 3, "购买": 5}
for e in events:
w = time_decay_weight(e["time"], now) * action_base[e["action"]]
print(f"{e['action']:4s} 权重: {w:.3f}")
# 点击 权重: 0.977
# 收藏 权重: 2.378
# 购买 权重: 1.250
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 归一化 | 简单评分 | 直观、易维护 | 依赖人工设定 |
| 场景化权重表 | 多业务场景 | 灵活切换 | 需要维护配置 |
| AHP | 专家决策 | 结构化、可验证一致性 | 主观性强、矩阵大时繁琐 |
| 熵权法 | 数据充分 | 完全客观 | 忽略业务含义 |
| 组合权重 | 平衡主客观 | 兼顾两者 | 需调 alpha |
| 时间衰减 | 行为/推荐 | 反映时效 | 半衰期需调参 |
生产环境建议
- 权重配置外置:放到 YAML / DB / 配置中心,可热更新。
- 校验和约束:所有场景权重
sum == 1,且0 ≤ w ≤ 1。 - 监控:记录每个场景权重版本,方便回溯 A/B 效果。
- 兜底:场景缺失时使用默认权重。
需要我针对某个具体场景(比如推荐系统、风控、LLM 多 Agent 打分)再深入展开吗?