我想出了一个针对我的问题的自定义插值方法,我想问一下使用它是否存在任何风险。我不是数学或编程专家,这就是我想要反馈的原因:))
故事:
当我提出插入数据的想法时,我正在为我的数据寻找一种好的曲线拟合方法。
我将涂料混合在一起,并在薄膜干燥时用分光光度计进行反射测量。我想计算所需的白色和彩色涂料的比例,以达到一定的亮度,无论任何色调偏移(例如黑色+白色涂料呈现蓝灰色)或色度损失(例如橙色+白色给出“淡粉色”黄橙色,等)
我检查Beer-Lambert法是否适用,但事实并非如此。颜料混合比染料稀释更复杂。所以我想为我的数据点拟合一条曲线(这里解释了这个过程:Interpolation for color-mixing
第一步是做校准曲线,我测试了以下比例混合在一起的有色VS白色涂料:
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()
所以我的问题是专家:这种插值方法有多好,使用它有什么风险?它会导致错误的结果吗?
另外:可以改进此方法,还是已经存在,如果是这样,它是如何调用的?
感谢您阅读
答案 0 :(得分:1)
这看起来类似于用于拟合回归线或为分类问题寻找决策边界的核方法。
内核技巧背后的想法是,数据被转换到一个维度空间(通常是更高维度),其中数据是线性可分的(用于分类),或者具有线性曲线拟合(用于回归)。曲线拟合完成后,可以应用逆变换。在您的情况下,连续取幂 (exp(exp(X))) 似乎是逆变换,而连续对数 (log(log(x))) 似乎是变换。
我不确定是否有一个内核可以做到这一点,但直觉是相似的。这是一篇中等文章,解释了使用 SVM 进行分类的情况: https://medium.com/@zxr.nju/what-is-the-kernel-trick-why-is-it-important-98a98db0961d
由于它是机器学习中非常普遍使用的一种方法,我怀疑如果拟合得当(不是欠拟合或过拟合)会导致错误的结果——这需要通过统计来判断测试。