python案例如何分配不同场景的权重?

wen python案例 2

Python案例:如何分配不同场景的权重

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

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'))

机器学习可学习权重

适

抱歉,评论功能暂时关闭!