#python #scipy #curve-fitting
#python #сципи #подгонка кривой
Вопрос:
У меня есть набор точек данных в двухкоординатной шкале. Я хочу подогнать точки. Количество точек данных исчисляется несколькими тысячами. Здесь я дал воспроизводимые точки данных формы.
Мой код:
from scipy.optimize import curve_fit
x1 = [327.98999023, 327.98999023, 328.02999878, 367.6499939 ,
374.72000122, 372.73001099, 372.95001221, 373.02999878,
379.39001465, 375.58999634, 378.97000122, 378.1499939 ,
380.70001221, 379.42999268, 379.5 , 379.5 ,
392.22000122, 379.57998657, 376.67999268, 376.67999268]
ym1 = [2.54999995, 2.73999989, 2.91000009, 2.96999991, 3.17000002,
3.40000004, 3.60000014, 3.77999991, 3.98999989, 4.21000004,
4.44000006, 4.62000012, 4.83999997, 5.19999981, 5.32999992,
5.59000015, 5.88999987, 6.20000005, 6.46000028, 6.66999996]
def testfit(x, *p):
''' function to fit the indentation curve
p = [x0,c, poly1d_coeffs ]'''
x = x.astype(float)
y = p[1]*(1-sigmoid(x-p[0],k=1)) np.poly1d(p[2:])(x) * sigmoid(x-p[0],k=1)
return y
def sigmoid(x, k=1):
return 1/(1 np.exp(-k*x))
p0_guess = (30, 5, 0.3, -10 )
popt, pcov = curve_fit(testfit, x1, ym1, p0=p0_guess) # find optimal parameters
# calculate prediction
yp1 = testfit(x1,popt[0],popt[1],popt[2])
# calculate r^2
r1 = r2_score(ym1,yp1)
print(r1)
plt.plot(x1,ym1,'.')
plt.plot(x1,yp1,'-')
plt.show()
Текущий вывод:
r1
Out[128]: -2.1490993028157854 # Negative fit score, Really bad fit.
Комментарии:
1. вы получаете какое-либо предупреждение?
2. @AminGheibi Никакого предупреждения. Это было выполнено безукоризненно.
3. не могу комментировать на основе графика, потому что плотность точек не ясна. Возможно, у вас слишком много точек, близких к (300,0), которые удерживают линию (друг над другом). Пример в вопросе также выдает предупреждение о ковариационной матрице.
4. Извините, но в чем вопрос?
5. Для вас данные выглядят как сигмовидная функция? Если это так, я должен не согласиться. Но да, в чем здесь вопрос?