数据科学与机器学习(第 07 部分):多项式回归

我们还没有贯穿回归模型,我们再回退一会儿。 正如我在本系列的第一篇文章中所说,基本线性回归是许多机器学习模型的基础,今天我们将讨论的一些东西,与称为多项式回归的线性回归略有不同。

机器学习在很多方面改变了我们的世界,我们有不同的方法来学习分类和回归问题的训练数据,例如线性回归、逻辑回归、支持向量机、多项式回归、和许多其它技术。一些参数方法如多项式回归和支持向量机脱颖而出,在于它们的多用途。

它们为简单问题创建简单边界,亦可为复杂问题创建非线性边界

多项式提醒

多项式是任何看起来像这样的数学表达式;

 多项式方程 01:

我们已有数据 x,然后取它来升幂,然后我们也有一些系数能缩放我们的数据。

此处是多项式回归的另一个示例

多项式方程 02:

对应于 ao -7 对应于 a14 对应于 a2,且 11.3 对应于 a3。 

在多项式中,您不一定需要在此处包含每个 x 项,我们来看看这个等式;

多项式方程 03:

您可以想象它如书写

多项式的阶 

多项式中还有另一个概念叫阶,多项式的阶用 n 表示。 它是数学表达式中的最高系数,例如:

  1. 上面的多项式方程 01,是一个 n 阶多项式回归
  2. 上面的多项式方程 02,是一个三阶/次多项式回归
  3. 上面的多项式方程 03,也是三阶/次多项式回归

一些人感到困惑,因为在第二个方程中,我们有 3 个变量乘以 x,它们的系数按升序排列 1、2、3,同时在第二个方程中我们只有两个变量。 好吧,多项式的阶数主要由表达式中的最高系数决定。

多项式回归

多项式回归是进行预测的机器学习算法之一,我听说它已被广泛用于预测 COVID-19 和其它传染病的传播率,我们来看看这个算法是由什么组成的。
来看一个简单的线性回归模型。

注意到什么了吗?

这个简单的线性回归并无特别之处,只不过是一阶多项式回归,根据多项式回归我们可以向其添加变量的阶,例如,二阶多项式回归如下所示:

我们可以令这个表达式达到更高的阶,

这是 k 阶多项式回归,等一下,这还是线性回归吗?线性模型发生了什么。

线性度发生了什么?

我在前面的文章中不是说过,回归全部是关于线性模型的吗? 当我们已有这些平方项系数时,我们如何将这种多项式回归拟合到线性度。 这一切都归结到哪些需要线性,哪些可以是非线性的。 系数/Beta 都是线性的,它只是数据本身升到更高的幂。

什么时候应该使用多项式回归?

我们都知道,基本线性模型不擅长拟合稍微复杂的数据(非线性)或计算数据集中的复杂关系,而多项式回归就是为了解决这个问题。 想象一下,尝试取苹果股价预测纳斯达克的价格,苹果是纳斯达克价格背后最大的影响者之一,它的关系仍然不是线性的,那么线性模型也许无法将我们的数据集拟合到我们可以信任它,并据其制定未来预测决策的程度。 我们创建散点图来显示价格值,看看这两个交易品种的图形在同一数轴上的样子。

下面是在终端上创建散点图的函数,这要归功于 CGraphics直到我撰写这篇文章的那一刻,我才知道这样的事情是可能的

bool ScatterPlot(
                 string obj_name,
                 vector &x,
                 vector &y,
                 string legend,
                 string x_axis_label = "x-axis",
                 string y_axis_label = "y-axis", 
                 color  clr = clrDodgerBlue,
                 bool   points_fill = true                 
                )
 { 
   if (!graph.Create(0,obj_name,0,30,70,440,320))
     {
       printf("Failed to Create graphical object on the Main chart Err = %d",GetLastError());
       return(false);
     }
   
   ChartSetInteger(0,CHART_SHOW,ChartShow);
   
   double x_arr[], y_arr[]; 
   
   pol_reg.vectortoArray(x,x_arr);
   pol_reg.vectortoArray(y,y_arr);
   
   CCurve *curve = graph.CurveAdd(x_arr,y_arr,clr,CURVE_POINTS);
   curve.PointsSize(10);
   curve.PointsFill(points_fill); 
   curve.Name(legend);
   graph.XAxis().Name(x_axis_label);
   graph.XAxis().NameSize(10);
   graph.YAxis().Name(y_axis_label);
   graph.YAxis().NameSize(10);
   graph.FontSet("Lucida Console",10);
   graph.CurvePlotAll();
   graph.Update();
 
   delete(curve);
   
   return(true);
 }

   string plot_name = "x vs y"; 
   
   ObjectDelete(0,plot_name);    
   ScatterPlot(plot_name,x_v,y_v,X_symbol,X_symbol,Y_symol,clrOrange); 

输出:

Nasdaq vs Apple 图形

您不能否认线性模型在这类问题中表现不佳的事实,所以我们来尝试多项式回归。 那么现在,这就提出了一个问题,即制作多项式模型应该使用几阶?

查看模型表达式;

鉴于我们只有一个自变量,我们可以将其带到我们想要的任何幂,再次我们如何知道我们应该提高这个自变量的幂,换言之,我们如何知道多项式应该是几阶?若要理解这一点,我们首先了解一种称为贝叶斯(Bayesian)信息准则的东西,表示为 BIC

贝叶斯(Bayesian)信息准则

其公式给出如下;

BIC =  n log(SSE) + k log (n)

 n = 数据点数量 

 k = 参数数量

但在我们找到最佳模型之前,我们创建一个基本的多项式回归,看看是什么让它跳升,从那里我们就可以继续寻找最佳阶数。

查找模型的系数。

从方程;

我们通过查找 b0、b1 和 b2 的值来求解这个二阶多项式回归任务。

我们使用以下方程组,

n = 数据点数量

为了计算这些值,我们使用这个简单的数据集。

Xy
 3 2.5
 4 3.2
 5  3.8
 6 6.5
 7 11.5


我们现在拥有一组针对我们问题的联立方程,和简单的数据集,可据其构建事物,您可以轻松地插入值,并在科学计算器、Microsoft excel、或您喜欢的工具中找到系数。您将获得值;

  • b0 = 12.4285714
  • b1= -5.5128571
  • b2 = 0.7642857

但这不是我们要在在 MQL5 中做的事情,我们从上面的联立方程组中找出如何在 MetaEditor 中实现此结果。我们将其转换为矩阵形式,现在它变成了

多项式矩阵图

这种乘法的结果将我们带回到联立方程。 所以您知道我们在数学上是正确的,

现在我们编写一些代码;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值