我具有要近似的复杂函数,并且我使用np.polyfit
找到多项式来近似它。
我想找到正确的十进制位置的统计数据,以确定近似值的质量。
但是很难有效地做到。目前,我只是将元素转换为字符串,并根据元素找到最长的常见前缀长度元素,不用说这效率低下。
import numpy as np
from collections import Counter
x = np.linspace(1, 2, 4096)
exp = np.exp(x)
poly = np.polyfit(x, exp, 6)
approx = np.polyval(poly, x)
def LCP(s1, s2):
c = 0
for a, b in zip(s1, s2):
if a != b:
break
c += 1
return c
def leading_digits(f1, f2):
l = LCP(str(f1), str(f2)) - 1
return max(l, 0)
correct_places = Counter()
for a, b in zip(approx, exp):
correct_places[leading_digits(a, b)] += 1
Counter({7: 2014, 8: 1699, 6: 207, 9: 135, 5: 27, 10: 12, 11: 2})
什么是更有效的方法?
分析解答
比较平等的领先数字的数量似乎不是一个好方法。 1.01
和1.09
具有共同的2
领先数字,1.09
和1.10
仅1
,但第二对具有较小的绝对差。
我将计算绝对差异,并使用对数获得它的数量级:
Counter(-np.floor(np.log10(abs(approx-exp))).astype(int))
输出:
Counter({8: 3488, 7: 307, 9: 272, 10: 26, 11: 2, 12: 1})