使用numpy的polyfit创建最佳拟合线时,可以将参数full指定为True。除了系数之外,这将返回4个额外的值。这些值意味着什么,它们告诉我这个函数与我的数据的匹配程度如何?
https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html
我在做的是:
bestFit = np.polyfit(x_data, y_data, deg=1, full=True)
我得到了结果:
(array([ 0.00062008, 0.00328837]), array([ 0.00323329]), 2, array([
1.30236506, 0.55122159]), 1.1102230246251565e-15)
文档说四条额外的信息是:残差,秩,奇异值和秒。
编辑: 我正在寻找rcond和singular_values如何描述拟合优度的进一步解释。
谢谢!
答案 0 :(得分:1)
rcond和singular_values如何描述适合度。
简短的回答:他们没有。
它们没有描述多项式与数据的拟合程度;这是residuals
的用途。他们描述了多项式计算的数值稳健性。
rcond
的值并非真正与拟合质量有关,它描述了获得拟合的过程,即线性系统的最小二乘解。大多数情况下polyfit
的用户不提供此参数,因此polyfit
本身会选择合适的值。然后将该值返回给用户以获取其信息。
rcond
用于病态矩阵中的截断。最小二乘解算器做两件事:
当x的某些变化根本不影响右侧时,会出现第二个子句。但由于浮点计算不完善,通常会发生的情况是x的某些变化会影响右侧很少。这是rcond
用于决定何时"很少"应被视为"零噪音"。
例如,考虑系统
x1 = 1
x1 + 0.0000000001 * x2 = 2
这个可以完全解决:x1 = 1和x2 = 10000000000.但是......微小的系数(实际上是在一些矩阵操作之后出现)中有一些数字错误;据我们所知,它可能是负面的,也可能是零。我们应该让它对解决方案产生如此巨大的影响吗?
因此,在这种情况下,矩阵(特别是其奇异值)会在级别rcond
被截断。这留下了
x1 = 1
x1 = 2
其中最小二乘解是x1 = 1.5,x2 = 0.注意,这个解是稳健的:系数的微小波动没有大数。
当在最小二乘意义上解决线性系统Ax = b时,A的奇异值决定了它在数值上是多么棘手。具体而言,最大和最小奇异值之间的巨大差异是有问题的:这样的系统病态。一个例子是
0.835*x1 + 0.667*x2 = 0.168
0.333*x1 + 0.266*x2 = 0.0067
确切的解是(1,-1)。但如果右侧从0.067变为0.066,则解决方案是(-666,834) - 完全不同。问题是A的奇异值是(大致)1和1e-6;这会将右边的任何变化放大1e6倍。
不幸的是,多项式拟合经常导致病态条件矩阵。例如,拟合24度到25个等间距数据点的多项式是不可取的。
import numpy as np
x = np.arange(25)
np.polyfit(x, x, 24, full=True)
奇异值
array([4.68696731e+00, 1.55044718e+00, 7.17264545e-01, 3.14298605e-01,
1.16528492e-01, 3.84141241e-02, 1.15530672e-02, 3.20120674e-03,
8.20608411e-04, 1.94870760e-04, 4.28461687e-05, 8.70404409e-06,
1.62785983e-06, 2.78844775e-07, 4.34463936e-08, 6.10212689e-09,
7.63709211e-10, 8.39231664e-11, 7.94539407e-12, 6.32326226e-13,
4.09332903e-14, 2.05501534e-15, 7.55397827e-17, 4.81104905e-18,
8.98275758e-20]),
,默认值为rcond(此处为5.55e-15
),其中四个被截断为0.
最小和最大奇异值之间的大小差异表明,通过大小1e-15的数量来扰动y值可以导致大约1变化到系数。 (并非每个扰动都会这样做,只有一些恰好与奇异向量对齐以获得小的奇异值)。
有效等级只是高于rcond
阈值的奇异值的数量。在上面的例子中它是21。这意味着即使拟合是25个点,并且我们得到具有25个系数的多项式,解决方案中只有21个自由度。