以下是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站等级与经验值?
标签:Lv7,plt,fit,经验值,回归,上限,lv,np,data From: https://www.cnblogs.com/MuGeminorum/p/17810470.html