我可以对sklearn进行对数回归吗?

Alv*_*ena 1 python regression scikit-learn

我不知道“对数回归”是否正确,我需要在数据上拟合一条曲线,例如多项式曲线,但最终会趋于平缓。

这是一张图像,蓝色曲线是我所需要的(二阶多项式回归),品红色曲线是我所需要的。

在此处输入图片说明

我进行了很多搜索,找不到,只有线性回归,多项式回归,而对sklearn没有对数回归。我需要绘制曲线,然后通过回归进行预测。

编辑

这是我发布的绘图图像的数据:

x,y
670,75
707,46
565,47
342,77
433,73
472,46
569,52
611,60
616,63
493,67
572,11
745,12
483,75
637,75
218,251
444,72
305,75
746,64
444,98
342,117
272,85
128,275
500,75
654,65
241,150
217,150
426,131
155,153
841,66
737,70
722,70
754,60
664,60
688,60
796,55
799,62
229,150
232,95
116,480
340,49
501,65
Run Code Online (Sandbox Code Playgroud)

小智 6

如果我理解正确,则希望使用y = a * exp(-b *(x-c))+ d来拟合数据。

我不确定sklearn是否能做到。但是您可以使用scipy.optimize.curve_fit()将数据与您定义的任何函数匹配。(scipy):

对于您的情况,我对您的数据进行了实验,结果如下:

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

my_data = np.genfromtxt('yourdata.csv', delimiter=',')
my_data = my_data[my_data[:,0].argsort()]
xdata = my_data[:,0].transpose()
ydata = my_data[:,1].transpose()

# define a function for fitting
def func(x, a, b, c, d):
    return a * np.exp(-b * (x - c)) + d

init_vals = [50, 0, 90, 63]
# fit your data and getting fit parameters
popt, pcov = curve_fit(func, xdata, ydata, p0=init_vals, bounds=([0, 0, 90, 0], [1000, 0.1, 200, 200]))
# predict new data based on your fit
y_pred = func(200, *popt)
print(y_pred)

plt.plot(xdata, ydata, 'bo', label='data')
plt.plot(xdata, func(xdata, *popt), '-', label='fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

从上面的代码中绘制

我发现的初始值b对于拟合至关重要。我估计了一个很小的范围,然后拟合了数据。

如果你有关系的没有先验知识xy,则可以使用由sklearn提供的回归方法,如线性回归,内核岭回归(KRR),最近邻回归,高斯过程回归等,以适应非线性数据。在此处查找文档


bin*_*jip 5

您正在查看指数分布的数据。

您可以通过对数转换 y 变量,然后使用线性回归。这是可行的,因为较大的 y 值比较小的值会被压缩得更多。

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import expon

x = np.linspace(1, 10, 10)
y = np.array([30, 20, 12, 8, 7, 4, 3, 2, 2, 1])
y_fit = expon.pdf(x, scale=2)*100

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y)
ax.plot(x, y_fit)
ax.set_ylabel('y (blue)')
ax.grid(True)

ax2 = ax.twinx()
ax2.scatter(x, np.log(y), color='red')
ax2.set_ylabel('log(y) (red)')

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述