我有一个问题,我有两个带有x和y值的列表,我想基于这些创建一个函数。但问题是我想构建一个像这样的函数:
f(x)= a *(x-b)** c
我已经知道了scipy.interpolate,但是找不到任何可以返回像这样的函数。
是否有一种非常简单的方法可以通过搜索a,b和c的哪个值最匹配来尝试创建最佳函数?
感谢您的帮助!
编辑:
这是我目前的x和y值:
我创建了这个函数:
def problem(values):
s = sum((y - values[0]*(x-values[1])**values[2])**2 for x,y in zip(X,Y))
return(s)
我尝试用scipy.optimize.minimize找到a,b和c的最佳值,但我不知道a,b和c的值是否应该开始......
values = minimize(problem,(a,b,c))
答案 0 :(得分:1)
(编辑为OP增加的代码和子问题。)
一般的想法是使用最小二乘最小化来找到最好的" a
,b
和c
的值。首先定义一个参数为a, b, c
的函数,该函数返回给定y
值与计算值a * (x-b)**c
之间差异的平方和。 (该函数可以作为单行执行。)然后使用优化例程(例如scipy中的一个)来最小化该函数值的值。那些a, b, c
的值就是你想要的 - 用它们来定义你想要的功能。
需要检查一些细节,例如对a, b, c
的允许值的限制,但这些细节在某种程度上取决于您的x
和y
值列表。
现在您已经显示了x
和y
值的图表,我发现您的值都是正数,而且函数通常会增加。对于这种常见情况,我会使用初始值
a = 1.0
b = 0.0
c = 1.0
这给出了原点的直线,实际上是y = x
行,这通常是一个不错的第一猜测。在您的情况下,x
和y
值具有非常不同的比例,y
比x
大约一百倍,因此您可能会在更改时获得更好的结果价值a
:
a = 100.0
b = 0.0
c = 1.0
我可以看到更好的价值观和对最终价值的一些限制,但我宁愿让这个答案更加通用,也可以用于其他类似的问题。
你的函数problem()
看起来对我来说是正确的,尽管为了更清晰,我会以不同的方式编写它。一定要测试一下。