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

时间:2017-09-23 16:25:40

标签: python scikit-learn

我不知道“对数回归”是否是正确的术语,我需要在数据上拟合曲线,如多项式曲线,但最后会变平。

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

enter image description here

我搜索了很多,但是找不到,只能进行线性回归,多项式回归,但没有对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

3 个答案:

答案 0 :(得分:3)

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

我不确定sklearn是否可以做到这一点。但是你可以使用scipy.optimize.curve_fit()来使你定义的函数适合你的数据。(scipy):

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

<p>Click the button to trigger a function that will output "Hello 
World" in a p element with id="demo".</p>

<button onclick="myFunction()">Click me</button>

<p id="demo"></p>

plot from the code above

我发现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() 的初始值对于拟合是至关重要的。我估计了它的小范围,然后拟合数据。

如果您对bx之间的关系没有先验知识,可以使用sklearn提供的回归方法,如线性回归,核岭回归(KRR),最近邻回归,高斯过程回归等适合非线性数据。 Find the documentation here

答案 1 :(得分:2)

您正在查看exponentially distributed数据。

您可以按日志转换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()

enter image description here

答案 2 :(得分:1)

要使用sklearn,您可以先将案例[HttpPost] public ActionResult Index(string GetValue1) { return RedirectToAction("Index"); } 重塑为y = Aexp(-BX),然后使用LinearRegressor训练和拟合数据。

ln(Y) = ln(A) - BX

enter image description here