当前位置: 首页 > 知识库问答 >
问题:

使用python进行非线性回归-有什么简单的方法可以更好地拟合这些数据?

丁书
2023-03-14

我有一些我想拟合的数据,这样我就可以对给定某个温度的物理参数的值进行一些估计。

我使用numpy.polyfit二次模型,但是拟合并不像我希望的那样好,我对回归也没有太多经验。

我已经包括了散点图和numpy提供的模型:S与温度;蓝点是实验数据,黑线是模型

x轴是温度(以C为单位),y轴是参数,我们称之为S。这是实验数据,但在理论上,随着温度的升高,S应趋向于0,随着温度的降低,S应达到1。

我的问题是:如何更好地拟合这些数据?我应该使用什么库,什么样的函数可能比多项式更接近这个数据,等等?

如果有帮助的话,我可以提供代码,多项式的系数等等。

这是我的数据的Dropbox链接。(为了避免混淆,有点重要的注意事项,虽然它不会改变实际的回归,但该数据集中的温度列是Tc-t,其中Tc是转变温度(40C)。我通过计算40-x将其转换为t)。

共有3个答案

柴赞
2023-03-14

对于非线性回归问题,您可以尝试sklearn中的SVR()、KneighborsRegression()或DecisionTreeRegression(),并在测试集上比较模型性能。

丌官高远
2023-03-14

我建议您签出scipy。他们有一个非线性优化器,用于将数据拟合到任意函数。请参见此处的scipy.optimize.curve\u fit文档。请注意,功能越复杂,安装所需的时间就越长。

韦阳晖
2023-03-14

此示例代码使用具有两个形状参数a和b以及偏移项(不影响曲率)的方程式。方程为“y=1.0/(1.0 exp(-a(x-b)))Offset”,参数值a=2.1540318329369712E-01,b=-6.6744890642157646E 00,Offset=-3.5241299859596645e-01,其R平方为0.988,RMSE为0.0085。

该示例包含您发布的数据,使用Python代码进行拟合和绘图,并使用scipy.optimize.differential_evolution遗传算法进行自动初始参数估计。差分进化的实现使用拉丁超立方体算法来确保参数空间的彻底搜索,这需要搜索范围——在这个示例代码中,这些范围基于最大和最小数据值。

import numpy, scipy, matplotlib
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.optimize import differential_evolution
import warnings

xData = numpy.array([19.1647, 18.0189, 16.9550, 15.7683, 14.7044, 13.6269, 12.6040, 11.4309, 10.2987, 9.23465, 8.18440, 7.89789, 7.62498, 7.36571, 7.01106, 6.71094, 6.46548, 6.27436, 6.16543, 6.05569, 5.91904, 5.78247, 5.53661, 4.85425, 4.29468, 3.74888, 3.16206, 2.58882, 1.93371, 1.52426, 1.14211, 0.719035, 0.377708, 0.0226971, -0.223181, -0.537231, -0.878491, -1.27484, -1.45266, -1.57583, -1.61717])
yData = numpy.array([0.644557, 0.641059, 0.637555, 0.634059, 0.634135, 0.631825, 0.631899, 0.627209, 0.622516, 0.617818, 0.616103, 0.613736, 0.610175, 0.606613, 0.605445, 0.603676, 0.604887, 0.600127, 0.604909, 0.588207, 0.581056, 0.576292, 0.566761, 0.555472, 0.545367, 0.538842, 0.529336, 0.518635, 0.506747, 0.499018, 0.491885, 0.484754, 0.475230, 0.464514, 0.454387, 0.444861, 0.437128, 0.415076, 0.401363, 0.390034, 0.378698])


def func(x, a, b, Offset): # Sigmoid A With Offset from zunzun.com
    return  1.0 / (1.0 + numpy.exp(-a * (x-b))) + Offset


# function for genetic algorithm to minimize (sum of squared error)
def sumOfSquaredError(parameterTuple):
    warnings.filterwarnings("ignore") # do not print warnings by genetic algorithm
    val = func(xData, *parameterTuple)
    return numpy.sum((yData - val) ** 2.0)


def generate_Initial_Parameters():
    # min and max used for bounds
    maxX = max(xData)
    minX = min(xData)
    maxY = max(yData)
    minY = min(yData)

    parameterBounds = []
    parameterBounds.append([minX, maxX]) # search bounds for a
    parameterBounds.append([minX, maxX]) # search bounds for b
    parameterBounds.append([0.0, maxY]) # search bounds for Offset

    # "seed" the numpy random number generator for repeatable results
    result = differential_evolution(sumOfSquaredError, parameterBounds, seed=3)
    return result.x

# generate initial parameter values
geneticParameters = generate_Initial_Parameters()

# curve fit the test data
fittedParameters, pcov = curve_fit(func, xData, yData, geneticParameters)

print('Parameters', fittedParameters)

modelPredictions = func(xData, *fittedParameters) 

absError = modelPredictions - yData

SE = numpy.square(absError) # squared errors
MSE = numpy.mean(SE) # mean squared errors
RMSE = numpy.sqrt(MSE) # Root Mean Squared Error, RMSE
Rsquared = 1.0 - (numpy.var(absError) / numpy.var(yData))
print('RMSE:', RMSE)
print('R-squared:', Rsquared)



##########################################################
# graphics output section
def ModelAndScatterPlot(graphWidth, graphHeight):
    f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
    axes = f.add_subplot(111)

    # first the raw data as a scatter plot
    axes.plot(xData, yData,  'D')

    # create data for the fitted equation plot
    xModel = numpy.linspace(min(xData), max(xData))
    yModel = func(xModel, *fittedParameters)

    # now the model as a line plot 
    axes.plot(xModel, yModel)

    axes.set_xlabel('X Data') # X axis data label
    axes.set_ylabel('Y Data') # Y axis data label

    plt.show()
    plt.close('all') # clean up after using pyplot

graphWidth = 800
graphHeight = 600
ModelAndScatterPlot(graphWidth, graphHeight)
 类似资料:
  • 本文向大家介绍python实现简单的单变量线性回归方法,包括了python实现简单的单变量线性回归方法的使用技巧和注意事项,需要的朋友参考一下 线性回归是机器学习中的基础算法之一,属于监督学习中的回归问题,算法的关键在于如何最小化代价函数,通常使用梯度下降或者正规方程(最小二乘法),在这里对算法原理不过多赘述,建议看吴恩达发布在斯坦福大学上的课程进行入门学习。 这里主要使用python的sklea

  • 问题内容: 如何简单地从本地Python(3.0)脚本SSH到远程服务器,提供登录名/密码,执行命令并将输出打印到Python控制台? 我宁愿不使用任何大型外部库或在远程服务器上安装任何东西。 问题答案: 我没有尝试过,但是这个pysftp模块可能会有所帮助,而后者又使用了paramiko。我相信一切都在客户端。 有趣的命令可能是在远程计算机上执行任意命令。(该模块的功能和方法也更多地暗示了它的F

  • 我正在处理一个大型医学数据集,我想看看是否有一些行对应于同一个患者。与患者 ID 对应的列是 。 我想创建一个新列,如果该患者出现在多行中,它将是“是”,如果它只出现一次,它将 这是我做的代码: 但是这个操作太花时间了。有什么方法可以做得更快吗?

  • 问题内容: 我的代码中出现了很多错误。因此,我希望能够在一开始就将它们最小化,或者在执行代码之前看到尽可能多的错误。这可能吗,如果可以,我该怎么做? 问题答案: 如果您在语法方面遇到问题,可以尝试使用语法突出显示的编辑器。除非您有一种语言的感觉,否则简单的错误将不会突然出现。 调试的最简单形式是插入一些打印语句。一种更高级(且可扩展)的方法是使用std lib中的日志记录模块。 交互式解释器是使用

  • 通过遵循GEKKO文档,我使用了线性和多项式回归的示例。这里是关于简单线性回归的部分。 我只是想知道为什么不评论这些行会得到不同的结果 文件中获得的结果(线性、二次、三次)似乎不是最小二乘法。在这些情况下使用了什么样的最小化标准? 向你问好,拉多万

  • 我有一个javascript函数,它接受一个数组,并对该数组的每个项执行另一个函数。有很多重复的部分,所以我假设有一种更简单的递归方式来写这个: null null 数组中的每个项要么是字符串,要么是嵌套数组。字符串不必是唯一的,所以我认为我不能使用object和map()来代替。