分段函数:使用数据点寻找并解方程

1 投票
1 回答
1016 浏览
提问于 2025-04-18 03:37

我有几个数据点。因为有时候其中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,而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,才能得到更接近数据点的结果?谢谢!

——多米尼克

1 个回答

1

我不太明白你为什么说结果和数据点不够接近。当我把它们画出来的时候,我觉得看起来还不错:

#!/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()

根据评论的反馈,我添加了插值。这种方法我不是特别喜欢(如果函数已经知道的话,我更喜欢直接定义函数),因为当数据有噪声的时候,你可能会过度拟合,但看起来插值更接近你想要的结果。

在这里输入图片描述

撰写回答