Python 如何找到包含一组给定点的函数?

Python 如何找到包含一组给定点的函数?,python,function,math,regression,sympy,Python,Function,Math,Regression,Sympy,如果我有一组点,我如何才能找到一个适合它的函数?我看着它,它工作得很好,直到我尝试了一个更复杂的函数。当python中的函数给出一个点列表时,我试图找到sigmoid函数。我知道任何多项式都可以工作,但我想找到最简单的函数来拟合这些点。所谓最简单,我指的是最少数量的术语。这是我的密码: import numpy as np from sympy import Symbol, Function x = Symbol("x") xs = np.array([0, -1, 1,

如果我有一组点,我如何才能找到一个适合它的函数?我看着它,它工作得很好,直到我尝试了一个更复杂的函数。当python中的函数给出一个点列表时,我试图找到sigmoid函数。我知道任何多项式都可以工作,但我想找到最简单的函数来拟合这些点。所谓最简单,我指的是最少数量的术语。这是我的密码:

import numpy as np
from sympy import Symbol, Function

x = Symbol("x")
xs = np.array([0, -1, 1, .5, -.5])
ys = np.array([.5, .269, .731, .622, .378])

fx = ys[0]

for i in range(len(xs)-1):
    #g(x) function
    gx = x-xs[0]
    for j in range(1, i+1):
        gx *= (x-xs[j])

    #lambda function. Make sure to watch out for the first loop when fx is not a symbol
    if type(fx) == np.float64:
        lmx = (ys[i+1]-fx)/(gx.subs(x, xs[i+1]))
    else:
        lmx = (ys[i+1]-fx.subs(x, xs[i+1]))/(gx.subs(x, xs[i+1]))

    #Redefine f(x)
    fx = fx +(lmx)*(gx)
fx = fx.simplify()
print(fx)
这个函数的输出是
-1.48029736688e-16*x**4-0.0173333334*x**3+1.48029736688e-16*x**2+0.24833333333*x+0.5
,但我期望的是1/(1+e^(-x))。 提前谢谢

我知道任何多项式都可以工作

是的,您可以在数据点上使用或,如下所示:

来自sympy导入的
*
从sympy.poly.specialpolys导入插值多边形
从sympy.polys.polyfuncs导入插值
x=符号(“x”)
xs=[0,-1,1,5,-.5]
ys=[.5,269,731,622,378]
xs=[QQ.convert(i)表示xs中的i]
ys=[QQ.convert(i)for i in ys]
p1=展开(插值_poly(len(xs),x,x=xs,Y=ys)).as_poly()
显示器(p1)
p2=在范围(len(xs))]内对i进行插值([(xs[i],ys[i]),x)
显示器(p2)
输出:


当python中的函数给出一个点列表时,我试图找到sigmoid函数

因为有多种类型的,我会选择它,因为在评论中也提到了它。可以在SymPy中定义函数的一般形式,使用Scipy进行曲线拟合,然后替换函数中找到的系数,然后绘制它以查看它是否与输入数据点匹配

将numpy导入为np
从sympy进口*
从scipy.optimize导入曲线\u拟合
从sympy.utilities.lambdify导入lambdify
将matplotlib.pyplot作为plt导入
x=符号(“x”)
xs=[0,-1,1,5,-.5]
ys=[.5,269,731,622,378]
五十、 k,x0,x=符号('lkx_0 x')
f=L/(1+(exp(-k*(x-x0)))
显示器(f)
符号=列表(f.自由符号)
符号移除(x)
符号插入(0,x)
py_f=lambdify(符号,f)
popt,pcov=曲线拟合(py_f,xs,ys,maxfev=4*(10**5))
符号流行(0)
subs_arg=dict(列表(zip(syms,popt)))
f1=f.subs(subs_arg)
显示器(f1)
f2=lambdify([x],f1)
#绘制输入数据点
plt.散射(np.阵列(xs)、np.阵列(ys)、color=“红色”)
#曲线拟合函数
xp=np.arange(最小(xs),最大(xs)+1,0.05)
yp=f2(xp)
plt.绘图(xp,yp,color=“蓝色”)
plt.show()
输出:

这篇文章中的所有代码也都是可用的


那么,有没有办法用最少的项来找到这个函数呢


这是开放的解释和含糊不清的。多种类型的术语并不仅仅由一些术语来描述。也许可以写下这些函数的目录,提出自己的度量来区分哪一个更简单,然后对每一个函数进行拟合,最后确定哪一个更适合。

嗨,你知道某种阶次的多项式总是能满足你的要求,对吗?可以使用多项式函数(泰勒级数)拟合任意点集。在你的情况下,就是这样。我不太清楚你的问题是关于什么的。如果要拟合曲线,应该知道要拟合哪个函数。拟合点集并询问,哪些函数通过这些点是没有意义的,因为它们(通常)是无限多的。我明白你的意思。我想我要的是找到最简单的函数。我会编辑这个问题,那是不可能的。函数的数量是无限的,但自动曲线拟合人员正在寻找多项式拟合。如果你知道它是一个逆指数,你可以让它拟合系数,但它不能尝试所有不同类型的函数。好的,谢谢。那么我应该删除这篇文章吗?在你看来,这不是“最简单的”,但他们经常用它。只要不手动指定函数类型(如
a/(1+b*e^(-x))
),那么您尝试执行的操作是完全不可能的