我们还没有贯穿回归模型,我们再回退一会儿。 正如我在本系列的第一篇文章中所说,基本线性回归是许多机器学习模型的基础,今天我们将讨论的一些东西,与称为多项式回归的线性回归略有不同。
机器学习在很多方面改变了我们的世界,我们有不同的方法来学习分类和回归问题的训练数据,例如线性回归、逻辑回归、支持向量机、多项式回归、和许多其它技术。一些参数方法如多项式回归和支持向量机脱颖而出,在于它们的多用途。
它们为简单问题创建简单边界,亦可为复杂问题创建非线性边界
多项式提醒
多项式是任何看起来像这样的数学表达式;
多项式方程 01:
我们已有数据 x,然后取它来升幂,然后我们也有一些系数能缩放我们的数据。
此处是多项式回归的另一个示例
多项式方程 02:
5 对应于 ao -7 对应于 a1,4 对应于 a2,且 11.3 对应于 a3。
在多项式中,您不一定需要在此处包含每个 x 项,我们来看看这个等式;
多项式方程 03:
您可以想象它如书写
多项式的阶
多项式中还有另一个概念叫阶,多项式的阶用 n 表示。 它是数学表达式中的最高系数,例如:
- 上面的多项式方程 01,是一个 n 阶多项式回归
- 上面的多项式方程 02,是一个三阶/次多项式回归
- 上面的多项式方程 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 = 数据点数量
为了计算这些值,我们使用这个简单的数据集。
X | y |
---|---|
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 中实现此结果。我们将其转换为矩阵形式,现在它变成了
多项式矩阵图
这种乘法的结果将我们带回到联立方程。 所以您知道我们在数学上是正确的,
现在我们编写一些代码;