用指数回归预测B站Lv7经验上限

发布时间 2023-11-05 14:11:14作者: 亦真亦幻Studio

以下是B站等级与所需经验关系表:

会员等级 达到要求
Lv0(注册会员) 注册成功
Lv1 通过答题测试
Lv2 获得200经验值
Lv3 获得1500经验值
Lv4 获得4500经验值
Lv5 获得10800经验值
Lv6 获得28800经验值

 

抽象成数学问题即寻找以下不完全归纳的通项公式:

Lv 0 1 2 3 4 5 6 7 8 9
所需经验 ? ? 200 1500 4500 10800 28800 ? ? ?

 

即寻找 f(x) st f(2)=200, f(3)=1500, f(4)=4500, f(5)=10800, f(6)=28800,然而经过差分分析:

发现其并非多项式级的通项公式。后经过查询做过类似工作的前辈的B站专栏及其评论区可知,选取 exp 指数拟合更符合置信原则[1],于是写出以下代码尝试使用 exp 指数函数进行回归:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit


# 定义指数增长函数形式
def exponential_func(x, a, b):
    return a * np.exp(b * x)

# 将预测结果转为B站形式
def to_b_lv(lv: float):
    return int(lv / 100) * 100


# 输入数据
x_data = np.array([2.0, 3.0, 4.0, 5.0, 6.0])
y_data = np.array([200.0, 1500.0, 4500.0, 10800.0, 28880.0])

# 初始参数估计
initial_guess = (3.7, 2.0)  # 随意选择的初始估计值

# 使用 curve_fit 进行拟合
params, covariance = curve_fit(
    exponential_func, x_data, y_data, p0=initial_guess)

# 拟合结果
a_fit, b_fit = params
print(f"fit parm a: {a_fit}, b: {b_fit}")

# 绘制拟合曲线
x_fit = np.linspace(0, 10, 100)
y_fit = exponential_func(x_fit, a_fit, b_fit)
plt.plot(x_data, y_data, 'o', label='origin')
plt.plot(x_fit, y_fit, '-', label='fit')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

# print(x_data, y_data)
for i in range(7, 10):
    print(f'Lv{i}:{to_b_lv(exponential_func(i, a_fit, b_fit))}')

 其运行结果如下:

fit parm a: 85.86907180147904, b: 0.9695795332987809

Lv7:76100

Lv8:200600

Lv9:529100

 

 即回归函数为:f(x)=85.87*exp(0.97x)

 估测的Lv7所需经验为 76100

 

参考

[1] B站等级与经验值?