0

我有这样的数据样本:

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.5, x12 = 2.3, x13 = 4.2, y1 = 0.9(每个留置权都是一个样本)。


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

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

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是单维,我该如何扩展?

4

2 回答 2

0

造型

作为一个建模问题,您必须在如何从 4 维空间到单维空间之间做出选择。你需要一个投影函数: p :- R 4 -> R

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

我选择示例: (1) p : (x,y,z,t) -> x+y+z+t

因此样本的每个参数都会以相同的方式对结果产生影响;另一种解决方案可能是: (2) *p : (x,y,z,t) -> 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 函数解决这个问题(第 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' 保留给其他东西(帮助 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 算法

等效算法的实现并不真正需要所有这些数学知识(数学只需要速度)。您所要做的就是搜索算法(例如遗传学;在将参数写入二进制后随机更改参数 a1-d1),其中优化的搜索标准是学习样本的最小二乘误差。

于 2013-07-19T12:00:32.953 回答
0

免责声明:我不是数学家,也绝对不是这方面的专家。

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

更长的版本:

据我了解您尝试对向量求幂的问题(例如(x11,x12,x13,x14)^3)。

向量是矩阵——这里的 4 维向量可以看作4x1矩阵。据我所知,矩阵的幂运算仅“允许”用于二次矩阵 ( nxn)。原因是非二次矩阵不满足的交换性质( A*B = B*A) 。

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

我希望这会有所帮助。

*约斯特

于 2013-07-19T08:20:36.340 回答