【问题标题】:How good is this interpolation method?这种插值方法有多好?
【发布时间】: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),黑色曲线代表混合样品:

第二步,我想从该数据中猜测一个函数,该函数将计算01 之间任何比率的光谱曲线。我确实测试了几种曲线拟合(拟合指数函数)和插值(二次、三次)方法,但结果质量很差。

例如,这是我在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


【解决方案1】:

这看起来类似于用于拟合回归线或寻找分类问题的决策边界的核方法。

内核技巧背后的想法是,将数据转换为维度空间(通常是更高维度),其中数据是线性可分的(用于分类),或具有线性曲线拟合(用于回归)。完成曲线拟合后,可以应用逆变换。在您的情况下,连续取幂 (exp(exp(X))) 似乎是逆变换,而连续对数 (log(log(x))) 似乎是变换。

我不确定是否有一个内核可以做到这一点,但直觉是相似的。这是一篇使用 SVM 进行分类的中型文章: https://medium.com/@zxr.nju/what-is-the-kernel-trick-why-is-it-important-98a98db0961d

由于它是一种在机器学习中非常流行的方法,我怀疑如果拟合正确(不是欠拟合或过拟合)会导致错误的结果 - 这需要通过统计来判断测试。

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2011-10-27
    • 2019-11-06
    • 2021-11-15
    相关资源
    最近更新 更多