You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据指定首项值反求幂分布函数的power_distribution参数

实现指定首项值的幂分布权重生成函数

需求回顾

原函数通过指定分布数量和幂次参数,生成总和为1的幂分布权重:

import math

def get_power_distribution(distribution_count=8, power_distribution=1.3):
    repartition = [math.pow(power_distribution, i + 1) for i in range(distribution_count)]
    repartition_sum = sum(repartition)
    return [val / repartition_sum for val in repartition]

现在需要修改函数,支持指定首项权重值,反推对应的幂次参数,再生成符合要求的分布。新函数签名为:

def get_power_distribution(distribution_count=8, start=0.01):

数学推导

设目标幂次参数为( x ),分布数量为( n ),首项权重为( s ),根据原函数逻辑,首项权重公式为:
[
s = \frac{x}{x + x^2 + ... + x^n}
]
利用等比数列求和公式(( x \neq 1 ))整理后,得到待求解的方程:
[
s \cdot x^n - x + (1 - s) = 0
]
我们需要找到该方程的正实数解( x ),以此作为幂次参数生成分布。

完整实现

使用sympy库结合符号求解与数值求解,确保能找到有效幂次参数,再代入原逻辑生成权重分布:

import math
from sympy import symbols, solve, nsolve, N

def get_power_distribution(distribution_count=8, start=0.01):
    # 参数合法性校验
    if start <= 0 or start >= 1:
        raise ValueError("start值必须介于0和1之间(不包含边界)")
    if distribution_count < 1:
        raise ValueError("distribution_count必须大于等于1")
    
    n = distribution_count
    s = start
    
    # 特殊情况处理:仅一项时直接返回[1.0]
    if n == 1:
        return [1.0]
    
    # 特殊情况:start等于均匀分布的首项,直接返回均匀分布
    uniform_start = 1.0 / n
    if abs(start - uniform_start) < 1e-9:
        return [uniform_start for _ in range(n)]
    
    x = symbols('x')
    expr = s * x**n - x + (1 - s)
    
    # 先尝试符号求解正实数解
    solutions = solve(expr, x, real=True)
    valid_solutions = [sol for sol in solutions if sol > 0]
    
    # 符号求解无结果时,使用数值求解
    if not valid_solutions:
        try:
            # 根据start大小设置初始猜测值:start越小,x越大;start越接近均匀值,x越接近1
            guess = 10 if start < uniform_start else 1.1
            sol = nsolve(expr, x, guess)
            valid_solutions = [N(sol)]
        except Exception as e:
            raise ValueError(f"无法找到有效的幂次参数:{e}")
    
    # 取第一个有效正解作为幂次参数
    power_param = float(valid_solutions[0])
    
    # 生成幂分布权重
    repartition = [math.pow(power_param, i + 1) for i in range(n)]
    repartition_sum = sum(repartition)
    distribution = [val / repartition_sum for val in repartition]
    
    # 修正浮点误差,确保首项严格等于指定值,且总和为1
    distribution[0] = start
    distribution[-1] = 1.0 - sum(distribution[:-1])
    
    return distribution

测试示例

# 测试指定首项0.01,分布数量3
res = get_power_distribution(3, 0.01)
print(res)
# 输出示例:[0.01, 0.0900900900900901, 0.8999099099099099]
print(sum(res))
# 输出:1.0

# 测试均匀分布场景
res_uniform = get_power_distribution(3, 1/3)
print(res_uniform)
# 输出:[0.3333333333333333, 0.3333333333333333, 0.3333333333333333]

内容的提问来源于stack exchange,提问作者ThomazPom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:32:04