【问题标题】:Non-linear regression in Seaborn PythonSeaborn Python 中的非线性回归
【发布时间】:2018-03-11 21:27:37
【问题描述】:

我有以下数据框,我希望对其执行一些回归。我正在使用 Seaborn,但似乎无法找到适合的非线性函数。下面是我的代码及其输出,下面是我正在使用的数据框 df。注意我已经截断了这个图中的轴。

我想拟合泊松或高斯分布的函数样式。

import pandas 
import seaborn


graph = seaborn.lmplot('$R$', 'Equilibrium Value', data = df, fit_reg=True, order=2, ci=None)
graph.set(xlim = (-0.25,10))

但是,这会产生下图。

df

     R          Equilibrium Value
0   5.102041    7.849315e-03
1   4.081633    2.593005e-02
2   0.000000    9.990000e-01
3   30.612245   4.197446e-14
4   14.285714   6.730133e-07
5   12.244898   5.268202e-06
6   15.306122   2.403316e-07
7   39.795918   3.292955e-18
8   19.387755   3.875505e-09
9   45.918367   5.731842e-21
10  1.020408    9.936863e-01
11  50.000000   8.102142e-23
12  2.040816    7.647420e-01
13  48.979592   2.353931e-22
14  43.877551   4.787156e-20
15  34.693878   6.357120e-16
16  27.551020   9.610208e-13
17  29.591837   1.193193e-13
18  31.632653   1.474959e-14
19  3.061224    1.200807e-01
20  23.469388   6.153965e-11
21  33.673469   1.815181e-15
22  42.857143   1.381050e-19
23  25.510204   7.706746e-12
24  13.265306   1.883431e-06
25  9.183673    1.154141e-04
26  41.836735   3.979575e-19
27  36.734694   7.770915e-17
28  18.367347   1.089037e-08
29  44.897959   1.657448e-20
30  16.326531   8.575577e-08
31  28.571429   3.388120e-13
32  40.816327   1.145412e-18
33  11.224490   1.473268e-05
34  24.489796   2.178927e-11
35  21.428571   4.893541e-10
36  32.653061   5.177167e-15
37  8.163265    3.241799e-04
38  22.448980   1.736254e-10
39  46.938776   1.979881e-21
40  47.959184   6.830820e-22
41  26.530612   2.722925e-12
42  38.775510   9.456077e-18
43  6.122449    2.632851e-03
44  37.755102   2.712309e-17
45  10.204082   4.121137e-05
46  35.714286   2.223883e-16
47  20.408163   1.377819e-09
48  17.346939   3.057373e-08
49  7.142857    9.167507e-04

编辑

附上两张图,当订单参数增加到超过 20 时,这两个数据集和另一个数据集生成。

订单 = 3

【问题讨论】:

  • 尝试将您的订单更改为 3
  • @BenT 我已经尝试了 order 参数的多个值:/
  • 它不会修改曲线的形状吗?它使用 np.polyfit 应该使用高阶函数来降低成本函数。你能把它对你的图表做了什么吗?
  • @BenT 嗯,实际上你是对的,现在看起来确实更好,因为我将值推得很高(25 + )。然而,它有点跳跃,不是一条连续的曲线。
  • 令我惊讶的是,仅使用 3 阶函数看起来并没有更好。预计会有如此复杂的曲线,其中拟合线的 25 阶多项式函数。如果您想将曲线与高斯曲线进行比较,您可能只想绘制一条实际的高斯曲线,而不是试图拟合一条曲线。你也可以把它做成一个线图,清楚地表明数据点看起来是高斯的。

标签: python seaborn non-linear-regression


【解决方案1】:

我无法理解为什么这里需要 lmplot。通常,您希望通过获取模型函数并将其拟合到数据来执行拟合。 假设你想要一个高斯函数

model = lambda x, A, x0, sigma, offset:  offset+A*np.exp(-((x-x0)/sigma)**2)

您可以使用 scipy.optimize.curve_fit 将其与您的数据相匹配:

popt, pcov = curve_fit(model, df["R"].values, 
                              df["EquilibriumValue"].values, p0=[1,0,2,0])

完整代码:

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

df = ... # your dataframe

# plot data
plt.scatter(df["R"].values,df["EquilibriumValue"].values, label="data")

# Fitting
model = lambda x, A, x0, sigma, offset:  offset+A*np.exp(-((x-x0)/sigma)**2)
popt, pcov = curve_fit(model, df["R"].values, 
                              df["EquilibriumValue"].values, p0=[1,0,2,0])
#plot fit
x = np.linspace(df["R"].values.min(),df["R"].values.max(),250)
plt.plot(x,model(x,*popt), label="fit")

# Fitting
model2 = lambda x, sigma:  model(x,1,0,sigma,0)
popt2, pcov2 = curve_fit(model2, df["R"].values, 
                              df["EquilibriumValue"].values, p0=[2])
#plot fit2
x2 = np.linspace(df["R"].values.min(),df["R"].values.max(),250)
plt.plot(x2,model2(x2,*popt2), label="fit2")

plt.xlim(None,10)
plt.legend()
plt.show()

【讨论】:

  • 没办法对 Seaborn 做类似的事情?
猜你喜欢
  • 2019-01-20
  • 2017-06-17
  • 2018-02-04
  • 2021-02-17
  • 2020-05-17
  • 1970-01-01
  • 2011-12-09
  • 2019-10-09
  • 2016-08-25
相关资源
最近更新 更多