我有几点意见。因为有时其中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,以获得更接近数据点的结果?谢谢
多米尼克
答案 0 :(得分: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()
根据评论,我添加了插值。我不是很喜欢这种方法(我更喜欢定义函数,如果它已经知道),因为当数据是噪声时你可能最终过度拟合,但看起来插值更接近你想要的。