【发布时间】:2017-06-10 21:40:44
【问题描述】:
我想出了一个自定义插值方法来解决我的问题,我想问一下使用它是否有任何风险。我不是数学或编程专家,这就是我想要反馈的原因:)
故事:
当我想出插值数据的想法时,我正在为我的数据寻找一种好的曲线拟合方法。
我正在将涂料混合在一起,并在薄膜干燥时使用分光光度计进行反射率测量。我想计算白色和彩色涂料所需的比例以达到一定的亮度,无论任何色调变化(例如黑色+白色涂料产生蓝灰色)或色度损失(例如橙色+白色产生“柔和”的黄橙色,等等)
我检查比尔-朗伯定律是否适用,但它不适用。颜料混合比染料稀释更复杂。所以我想为我的数据点拟合一条曲线(这里解释了这个过程:Interpolation for color-mixing
第一步是绘制校准曲线,我测试了以下混合颜色与白色涂料的比例:
ratios = 1, 1/2., 1/4., 1/8., 1/16., 1/32., 1/64., 0
这是我精心准备的样品的图,用分光光度计测量,蓝色曲线代表全色(比率=1),红色曲线代表白漆(比率=0),黑色曲线代表混合样品:
第二步,我想从该数据中猜测一个函数,该函数将计算0 和1 之间任何比率的光谱曲线。我确实测试了几种曲线拟合(拟合指数函数)和插值(二次、三次)方法,但结果质量很差。
例如,这是我在380nm 的所有颜色样本的反射率数据:
这是scipy.optimize.curve_fit使用函数的结果:
def func(x, a, b, c):
return a * np.exp(-b * x) + c
popt, pcov = curve_fit(func, x, y)
然后我想到了这个想法:光谱数据的对数更接近于一条直线,而数据的对数的对数几乎是一条直线,如下代码和图表所示:
import numpy as np
import matplotlib.pyplot as plt
reflectance_at_380nm = 5.319, 13.3875, 24.866, 35.958, 47.1105, 56.2255, 65.232, 83.9295
ratios = 1, 1/2., 1/4., 1/8., 1/16., 1/32., 1/64., 0
linear_approx = np.log(np.log(reflectance_at_380nm))
plt.plot(ratios, linear_approx)
plt.show()
然后我所做的是对线性近似进行插值,然后将数据转换回线性,然后我得到了一个非常好的数据插值,比我之前得到的要好得多:
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
reflectance_at_380nm = 5.319, 13.3875, 24.866, 35.958, 47.1105, 56.2255, 65.232, 83.9295
ratios = 1, 1/2., 1/4., 1/8., 1/16., 1/32., 1/64., 0
linear_approx = np.log(np.log(reflectance_at_380nm))
xnew = np.arange(100)/100.
cs = scipy.interpolate.spline(ratios, linear_approx, xnew, order=1)
cs = np.exp(np.exp(cs))
plt.plot(xnew,cs)
plt.plot(x,y,'ro')
plt.show()
所以我的问题是针对专家的:这种插值方法有多好,使用它有什么风险?会导致错误的结果吗?
另外:这个方法可以改进还是已经存在,如果存在,它是如何调用的?
感谢您的阅读
【问题讨论】:
-
您似乎是回答您问题的最佳人选。至少就插值的质量而言;这是主要问题。
-
如果您的代码正常工作(未产生错误),您将在Code Review获得更好的反馈
标签: python interpolation curve data-fitting