程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

python自定义函数的参数拟合

发布于2020-02-26 11:36     阅读(631)     评论(0)     点赞(12)     收藏(4)


example:xdata是输入,ydata是输出

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.optimize import curve_fit
  4. def func(x, a, b, c):
  5. return a * np.exp(-b * x) + c
  6. # Define the data to be fit with some noise:
  7. xdata = np.linspace(0, 4, 50)
  8. y = func(xdata, 2.5, 1.3, 0.5)
  9. np.random.seed(1729)
  10. y_noise = 0.2 * np.random.normal(size=xdata.size)
  11. ydata = y + y_noise
  12. plt.plot(xdata, ydata, 'b-', label='data')
  13. # Fit for the parameters a, b, c of the function func:
  14. popt, pcov = curve_fit(func, xdata, ydata)
  15. print(popt)
  16. plt.plot(xdata, func(xdata, *popt), 'r-',
  17. label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
  18. # Constrain the optimization to the region of 0 <= a <= 3, 0 <= b <= 1 and 0 <= c <= 0.5:
  19. popt, pcov = curve_fit(func, xdata, ydata, bounds=(0, [3., 1., 0.5]))
  20. print(popt)
  21. plt.plot(xdata, func(xdata, *popt), 'g--',
  22. label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
  23. plt.xlabel('x')
  24. plt.ylabel('y')
  25. plt.legend()
  26. plt.show()

 全参考图像质量评价中,PSNR的输出取值范围是0~100 dB,想要把其输出范围映射到0~1区间的话,参考[2]的方法,用下面的式子来拟合,总共有5个参数。

下面的代码中,xdata表示PSNR的数值,ydata表示对应的0~1范围数值。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.optimize import curve_fit
  4. def func(x, a, b, c, d, e):
  5. logist = 0.5 - 1/(1+np.exp(b * (x-c)))
  6. return a*logist + d*x + e
  7. # Define the data to be fit with some noise:
  8. xdata = np.hstack([np.linspace(0, 18, 20), np.linspace(19, 21, 20), np.linspace(21, 30, 50),np.linspace(31, 40, 20),np.linspace(41, 100, 30)])
  9. ydata = np.hstack([np.linspace(0, 0.05, 20),np.linspace(0.1, 0.15, 20), np.linspace(0.2, 0.8, 50), np.linspace(0.81, 0.9, 20), np.linspace(0.9, 1.0, 30)])
  10. np.random.seed(1729)
  11. y_noise = 0.005 * np.random.normal(size=xdata.size)
  12. ydata = ydata + y_noise
  13. for i in range(ydata.size):
  14. if ydata[i] < 0:
  15. ydata[i] = 0
  16. if ydata[i] > 100:
  17. ydata[i] = 100
  18. plt.plot(xdata, ydata, 'b-', label='data')
  19. # Fit for the parameters a, b, c of the function func:
  20. popt, pcov = curve_fit(func, xdata, ydata)
  21. print(popt)
  22. plt.plot(xdata, func(xdata, *popt), 'r-',
  23. label='fit: a=%5.3f, b=%5.3f, c=%5.3f, d=%5.3f, e = %5.3f' % tuple(popt))
  24. plt.xlabel('x')
  25. plt.ylabel('y')
  26. plt.legend()
  27. plt.show()

 

[1] python 自定义函数表达式 拟合求系数

[2] H. R. Sheikh, M. F. Sabir, and A. C. Bovik, “A statistical evaluation of recent full reference image quality assessment algorithms,”IEEE Trans. Image Process., vol. 15, no. 11, pp. 3440–3451, Nov. 2006.

发布了57 篇原创文章 · 获赞 88 · 访问量 30万+


所属网站分类: 技术文章 > 博客

作者:python是我的菜

链接:https://www.pythonheidong.com/blog/article/234010/03f515f8f8142a6ccf95/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)