Python 这种插值方法有多好?
我为我的问题想出了一个自定义插值方法,我想问一下使用它是否有任何风险。我不是数学或编程专家,因此我希望得到反馈:) 故事: 我正在为我的数据寻找一种好的曲线拟合方法,这时我想出了一个插值数据的主意 我把颜料混合在一起,在胶片干燥时用分光光度计测量反射率。我想计算白色和彩色涂料达到一定亮度所需的比例,而不考虑任何色调变化(例如,黑色+白色涂料产生蓝灰色)或色度损失(例如,橙色+白色涂料产生“粉彩”黄橙色等) 我检查比尔-兰伯特定律是否适用,但它不适用。颜料混合的行为比染料稀释更复杂。因此,我想将曲线拟合到我的数据点(该过程如下所述: 第一步是做一个校准曲线,我测试了混合在一起的彩色涂料与白色涂料的以下比例:Python 这种插值方法有多好?,python,interpolation,curve,data-fitting,Python,Interpolation,Curve,Data Fitting,我为我的问题想出了一个自定义插值方法,我想问一下使用它是否有任何风险。我不是数学或编程专家,因此我希望得到反馈:) 故事: 我正在为我的数据寻找一种好的曲线拟合方法,这时我想出了一个插值数据的主意 我把颜料混合在一起,在胶片干燥时用分光光度计测量反射率。我想计算白色和彩色涂料达到一定亮度所需的比例,而不考虑任何色调变化(例如,黑色+白色涂料产生蓝灰色)或色度损失(例如,橙色+白色涂料产生“粉彩”黄橙色等) 我检查比尔-兰伯特定律是否适用,但它不适用。颜料混合的行为比染料稀释更复杂。因此,我想将曲
ratios = 1, 1/2., 1/4., 1/8., 1/16., 1/32., 1/64., 0
这是我精心准备的样品图,用分光光度计测量,蓝色曲线代表全色(比率=1),红色曲线代表白色油漆(比率=0),黑色曲线代表混合样品:
第二步,我想从这些数据中猜测一个函数,该函数可以计算出0
和1
之间任何比率的光谱曲线。我测试了几种曲线拟合(拟合指数函数)和插值(二次、三次)方法,但结果质量很差
例如,这是所有颜色样本在380nm处的反射率数据:
这是使用以下函数进行的scipy.optimize.curve\u 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()
所以我的问题是给专家们的:这种插值方法有多好,使用它有什么风险?它会导致错误的结果吗
另外:此方法是否可以改进,或者是否已经存在,如果存在,如何调用
感谢您阅读这看起来类似于用于拟合回归线或查找分类问题的决策边界的核心方法
内核技巧背后的想法是,将数据转换为一个维度空间(通常是更高维度),其中的数据是线性可分离的(用于分类),或具有线性曲线拟合(用于回归)。完成曲线拟合后,可以应用逆变换。在您的情况下,可以使用连续指数(exp(exp(X))),似乎是逆变换,而连续对数(log(log(x)))似乎是变换
我不确定是否有一个内核可以做到这一点,但直觉是类似的。下面是一篇关于使用SVM进行分类的中间文章:
由于这是一种在机器学习中非常普遍使用的方法,我怀疑如果拟合正确(不是欠拟合或过拟合),它会导致错误的结果-这需要通过统计测试来判断。您似乎是回答问题的最佳人选。至少就插值的质量而言,这是主要问题。如果您的代码正常工作(不产生错误),您将获得更好的反馈