我花了一个多星期的时间试图做同样的事情。我尝试了一大堆优化的东西来微调系数,但基本上没有成功,然后我发现有一个封闭形式的解决方案,效果很好。
免责声明:我试图以固定的最大数量级拟合数据。如果您的 E1、E2 等值没有限制,那么这对您不起作用。
现在我已经花时间学习了这些东西,我实际上发现如果我理解了一些答案,它们会给出很好的提示。距离我上一次统计和线性代数课也有一段时间了。
所以如果还有其他人缺乏线性代数知识,这就是我所做的。
尽管这不是您要拟合的线性函数,但事实证明这仍然是一个线性回归问题。维基百科有一篇关于线性回归的非常好的文章。我建议慢慢阅读:https://en.wikipedia.org/wiki/Linear_regression#:~:text=In%20statistics%2C%20linear%20regression%20is,as%20dependent%20and%20independent%20variables)。它还链接了很多其他不错的相关文章。
如果您不知道如何使用矩阵来解决简单的(单变量)线性回归问题,请花一些时间来学习如何做到这一点。
一旦你学会了如何做简单的线性回归,然后尝试一些多元线性回归。基本上,要进行多变量线性回归,您创建一个 X 矩阵,其中每个输入数据项都有一行,并且每一行包含该数据条目的所有变量值(加上最后一列中使用的 1对于多项式末尾的常数值(称为截距)。然后创建一个 Y 矩阵,它是一个单列,每个数据项都有一行。然后你解决 B = (XTX)-1XTY。 B 然后成为多项式的所有系数。
对于多变量多项式回归,它的想法是一样的,只是现在你有一个巨大的多变量线性回归,其中每个回归量(你正在做回归的变量)是你的巨型多项式表达式的一个系数。
因此,如果您的输入数据如下所示:
| Inputs |
Output |
| a1, b1, |
y1 |
| a2, b2, |
y2 |
| ... |
... |
| aN, bN, |
yN |
并且您想要拟合 y = c1a^2b^2 + c2a^2b + c3a 形式的二阶多项式^2 + c4ab^2 + c5ab + c6a + c7b^2 + c8b + c9 ,那么您的 X 矩阵将如下所示:
|
|
|
|
|
|
|
|
|
| a1^2*b1^2 |
a1^2*b1 |
a1^2 |
a1*b1^2 |
a1*b1 |
a1 |
b1^2 |
b1 |
1 |
| a2^2*b2^2 |
a2^2*b2 |
a2^2 |
a2*b1^2 |
a2*b2 |
a2 |
b2^2 |
b2 |
1 |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
| aN^2*bN^2 |
aN^2*bN |
aN^2 |
aN*bN^2 |
aN*bN |
aN |
bN^2 |
bN |
1 |
你的 Y 矩阵很简单:
然后你做 B = (XTX)-1XTY 然后 B 等于
|
| c1 |
| c2 |
| c3 |
| c4 |
| c5 |
| c6 |
| c7 |
| c8 |
| c9 |
请注意,系数的总数将是 (o + 1)V,其中 o 是多项式的阶,V 是变量的数量,因此它增长得非常快。
如果你使用好的矩阵代码,那么我相信运行时复杂度将是 O(((o+1)V)3 + ((o + 1 )V)2N),其中 V 是变量数,o 是多项式的阶数,N 是您拥有的数据输入数。起初这听起来很糟糕,但在大多数情况下,o 和 V 可能不会很高,所以这只是关于 N 的线性。
请注意,如果您正在编写自己的矩阵代码,那么确保您的反演代码使用类似LU decomposition 的内容很重要。如果您使用天真的反转方法(就像我一开始那样),那么 ((o+1)V)3 将变为 ((o+1)V )!,情况更糟。在我做出这个改变之前,我预测我的 5 阶 3 变量多项式将需要大约 400 谷歌千年才能完成。使用LU分解后,大约需要7秒。
另一免责声明
这种方法要求 (XTX) 不是奇异矩阵(换句话说,它可以反转)。我的线性代数有点粗糙,所以我不知道会发生这种情况的所有情况,但我知道当输入变量之间存在完美的多重共线性时会发生这种情况。这意味着一个变量只是另一个因子乘以一个常数(例如,一个输入是完成一个项目的小时数,另一个是完成一个项目的美元,但美元只是基于小时费率乘以小时数)。
好消息是,当存在完美的多重共线性时,您就会知道。当你反转矩阵时,你最终会被零除或其他东西。
更大的问题是当你有不完美的多重共线性时。那时您有两个密切相关但不完全相关的变量(例如温度和高度,或速度和马赫数)。在这些情况下,这种方法在理论上仍然有效,但它变得非常敏感,以至于小的浮点错误可能会导致结果偏离。
然而,在我的观察中,结果要么非常好,要么非常糟糕,因此您可以为均方误差设置一些阈值,如果超过该阈值,则说“无法计算多项式”。