gpt4 book ai didi

python - 分段函数: Find equation and solve it using data points

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:57 25 4
gpt4 key购买 nike

我有几点。因为有时其中 1 或 2 个可能是未知的(x 和 y 坐标),所以我想找到方程并能够找到那些缺失的点(如果可能的话)通过 numpy。简化模型:

a = np.arange(12)
x = np.array([1000,1010,1020,1030,1040,1050,1060,1070,1080,1090,1100,1110])
y = np.array([0,50,100,250,300,350,500,550,600,750,800,850])

看起来像:

[[   0    1    2    3    4    5    6    7    8    9   10   11]
[1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 1100 1110]
[ 0 50 100 250 300 350 500 550 600 750 800 850]]

如您所见,x 增加 10 10,y 增加 50,然后是 50,然后是 150,依此类推。我尝试用最小二乘法解决问题,但效果并不令人满意:

A = np.array([ x, np.ones(12)])
m,c = np.linalg.lstsq(A.T,y)[0]
sol = m*x + c
print sol.astype(int)

这将返回:[-23 58 139 221 302 384 465 547 628 710 791 873]问题:如何继续(最好使用 numpy)以获得更接近数据点的结果?谢谢多米尼克

最佳答案

不确定您所说的结果与数据点不接近的依据是什么。当我将它们绘制出来时,它们对我来说看起来很好:

#!/usr/bin/env python2.7
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d


x = np.array([1000, 1010, 1020, 1030, 1040, 1050,
1060, 1070, 1080, 1090, 1100, 1110])
y = np.array([0, 50, 100, 250, 300, 350,
500, 550, 600, 750, 800, 850])

A = np.vstack([ x, np.ones(12)])
m, c = np.linalg.lstsq(A.T, y)[0]
sol = m*x + c

finterp = interp1d(x, y)

print x[9], finterp(x[9]), y[9]

plt.plot(x, y, 'o', label='data')
plt.plot(x, sol, '-.', label='fit')
plt.plot(x, finterp(x), '-', label='interpolated')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='best')
plt.show()

根据评论,我添加了插值。我不太喜欢这种方法(我更喜欢定义已知的函数),因为当数据是噪声时,您可能最终会过度拟合,但插值似乎更接近您想要的。

enter image description here

关于python - 分段函数: Find equation and solve it using data points,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23201439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com