我有一个清单
[1.0, 0.488, 0.300, 0.213, 0.163, 0.127]
情节(没有足够的声誉来发布图片)
我需要进一步将此函数外推 15 个点,渐近线为 0。
我发现也许我需要一个用于 SVR 的自定义内核(类似于 y=1/x),但我还没有找到任何关于如何实现它的示例。我将非常感谢任何示例/链接/或提示
我有一个清单
[1.0, 0.488, 0.300, 0.213, 0.163, 0.127]
情节(没有足够的声誉来发布图片)
我需要进一步将此函数外推 15 个点,渐近线为 0。
我发现也许我需要一个用于 SVR 的自定义内核(类似于 y=1/x),但我还没有找到任何关于如何实现它的示例。我将非常感谢任何示例/链接/或提示
您的数据看起来是对数的。尝试使用 scipy.optimize curve_fit() 函数来找到近似的对数系数。我尝试了几个内置的 python 函数,但无法很好地适应其中的任何一个,但可以将它们用作起点。
最后,我在您发布的数据上运行了 curve_fit() 函数,经过一些调整,我能够在这张图表上生成绿线。蓝线是您的原始数据。它们靠得很近,很难看出区别。黄线是 curve_fit 给我的最佳拟合线。
我还包括了外推点(再次是绿线)和下面接下来 15 个点的值。如您所见,该线对 x 轴渐近。
仅供参考,我的调整包括将 np.log() 添加到分母以转换日志的基数。另外,我将截距更改为 1,因为这是您的数据开始的地方。如果您想自动执行此操作,您可以编写一些函数来迭代日志基数和截距的不同值。我在代码中包含了注释以获取更多详细信息。
import matplotlib.pyplot as plt # Matlab-style plotting
import numpy as np
import scipy
from scipy.optimize import curve_fit
x = [1.0,2.0,3.0,4.0,5.0,6.0]
x2 = np.arange(0, 22.0, 1.0)
y = [1.0, 0.488, 0.300, 0.213, 0.163, 0.127]
x = np.array(x)
y = np.array(y)
plt.plot(x,y)
# get the approximate values for the log function
data = scipy.optimize.curve_fit(lambda t,a,b: a+b*np.log(t), x, y, p0=(1, 1))
# plot those values, the fit is not very good
y1 = data[0][0] + data[0][1]*np.log(x) # yellow
plt.plot(x,y1)
# original coefficients were .91 and -.48
# adjust the 2 coefficents until you get a better fit
# first coefficient is like the intercept but for the line of x of 1, not the y axis
# I also changed the log base value by including the np.log() on the denominator,
# this gives the line a larger curve than the original
y2 = 1.0 - np.log(x2)/np.log(x2+1.9) # green
plt.plot(x2,y2)
plt.show
data
(array([ 0.91083753, -0.48242954]),
array([[ 0.00543936, -0.00380311],
[-0.00380311, 0.00346828]]))
y2
array([ inf, 1. , 0.49069866, 0.30871637, 0.21896813,
0.16675119, 0.13310187, 0.10985155, 0.09295092, 0.08018302,
0.0702405 , 0.06230656, 0.05584666, 0.05049745, 0.04600401,
0.04218259, 0.03889766, 0.03604721, 0.03355312, 0.03135462,
0.02940378, 0.02766231])