如何选择多维多项式回归模型?

时间:2013-07-19 06:28:10

标签: math machine-learning regression polynomial-math

我有这样的数据样本:

1.5  2.3  4.2  0.9
1.2  0.3  1.2  0.3
0.5  1.3  2.2  1.5
4.2  2.5  3.2  6.2

让我们来定义

x1 = {1.5  2.3  4.2  0.9}

x11 = 1.5x12 = 2.3x13 = 4.2y1 = 0.9(每个留置权都是样本)。


现在,我需要对这些数据应用多项式回归,例如,使用x拟合y

我知道单个x变量(1维)的模型:

a*x1^3 + b*x1^2 + c*x1 + d = y

就我而言,结果将是:

a*(x11, x12, x13, x14)^3 + b*(x11, x12, x13, x14)^2 + c*(x11, x12, x13, x14) + d = y

问题,如何展开(x11, x12, x13, x14)^3,因为y是一维的?

2 个答案:

答案 0 :(得分:0)

免责声明:我不是数学家,绝对不是那些东西的专家。

简短版本:我认为这是不可能的。

更长的版本:

据我所知,您尝试对矢量进行取幂(例如(x11,x12,x13,x14)^3)。

向量是matrices - 这里的四维向量可以看作是4x1矩阵。据我所知,对于二次矩阵(nxn),“仅允许”矩阵的取幂。原因是commutative propertyA*B = B*A)对于非二次矩阵是not fulfilled

您正在寻找的可能是“矢量函数的回归”和/或“曲面拟合”。

我希望这有点帮助。

*斯特

答案 1 :(得分:0)

<强>建模

作为模型化问题,您必须在如何从4维空间到单维空间之间进行选择。你需要一个投影函数:p: - R 4 - &gt; [R

投影功能将标记您对问题的一部分知识。 如果您知道第一个参数比其他参数更重要,那么您可以继续使用函数 p:(x,y,z,t) - &gt; x 并忘记其他参数。一般来说,你没有这方面的知识。所以我们使用occam's razor(这是问题的这个建模部分的机器学习部分),并保持模型尽可能简单但不再:

我选择了例子:(1) p:(x,y,z,t) - &gt; X + Y + Z + T

所以样本的每个参数都会以相同的方式对结果做出贡献;另一种解决方案可以是:(2)* p:(x,y,z,t) - &gt; X * Y * Z * T *

但是在(2)上进行日志转换后,您会看到类似(1)的内容。

您选择的学习函数是f(x) - > a * x ^ 3 + b * x ^ 2 + c * x + d。您必须注意将投影应用于学习功能的方式。 将“p”应用于模型并未给出:

f(x,y,z,t) -> 
  a*(x + y + z + y)^3 +
  b*(x + y + z + y)^2 +
  c*(x + y + z + y)^1 +
  d*(x + y + z + y)^0

但是:

f(x,y,z,t) ->
  a*(x)^3 + b*(x)^2 + c*(x) + d +
  a*(y)^3 + b*(y)^2 + c*(y) + d +
  a*(z)^3 + b*(z)^2 + c*(z) + d +
  a*(t)^3 + b*(t)^2 + c*(t) + d

这是参数独立性的属性:您在每个参数上应用学习功能。将参数链接为已编码的知识,作为每个参数之间“+”运算符选择的一部分。

因此,解决参数(a1,b1,c1,d1)的学习问题应该适合您的模型:

f(x,y,z,t) ->
  a1*(x^3 + y^3 + z^3 + t^3) +
  b1*(x^2 + y^2 + z^2 + t^2) +
  c1*(x + y + z + t) +
  d1

<强>解决

使用gnuplot可以使用fit function解决这些问题(第7章)。

f(x,y,z,t) = a1*(x**3 + y**3 + z**3 + t**3) + b1*(x**2 + y**2 + z**2 + t**2) + c1*(x + y + z + t) + d1
fit f(x,y,t,u) 'mydata.dat' using 1:2:3:4 via a1, b1, c1, d1

NB1 :使用fit时,变量名'z'保留用于其他内容(help fit);所以你必须在使用'fit'时重命名变量。

NB2 :mydata.dat包含样本,其中每列由制表分隔。您还必须为每个样本添加'y'的已知值。所以在'mydata.dat'中有5列。 (并且文件名必须以'.dat'结尾)。

所以这里是我使用的 mydata.dat 文件:

1.5 2.3 4.2 0.9 1.0
1.2 0.3 1.2 0.3 2.0
0.5 1.3 2.2 1.5 3.0
4.2 2.5 3.2 6.2 4.0

如您所见,我添加了'y'列,为每个样本提供了预期值。 然后在控制台中运行该工具:

gnuplot> f(x,y,z,t) = a1*(x**3 + y**3 + z**3 + t**3) + b1*(x**2 + y**2 + z**2 + t**2) + c1*(x + y + z + t) + d1
gnuplot> fit f(x,y,t,u) 'mydata.dat' using 1:2:3:4 via a1, b1, c1, d1

[many lines]

After 9 iterations the fit converged.
final sum of squares of residuals : 8.7617e-31
abs. change during last iteration : -2.9774e-30


Exactly as many data points as there are parameters.
In this degenerate case, all errors are zero by definition.

Final set of parameters 
======================= 

a1              = 0.340413       
b1              = -2.7489        
c1              = 6.44678        
d1              = -4.86178

所以问题就解决了。

Gnuplot是开源的,所以看源 如果你愿意,可能是一个很好的起点 自己编码。你也可以从“帮助适应”开始 在gnuplot;它讲的是非线性最小二乘法  (NLLS) Marquardt-Levenberg algorithm

等效算法的实现并不需要所有这些数学知识(数学只需要速度)。 您所要做的就是搜索算法(例如遗传学;在binnary中将参数a1-d1随机更改后随机更改参数a1-d1),其中优化的搜索条件是学习样本的最小误差平方。