$$ \newcommand{\R}{\mathbb{R}} \newcommand{\E}{\mathbb{E}} \newcommand{\x}{\mathbf{x}} \newcommand{\y}{\mathbf{y}} \newcommand{\wv}{\mathbf{w}} \newcommand{\av}{\mathbf{\alpha}} \newcommand{\bv}{\mathbf{b}} \newcommand{\N}{\mathbb{N}} \newcommand{\id}{\mathbf{I}} \newcommand{\ind}{\mathbf{1}} \newcommand{\0}{\mathbf{0}} \newcommand{\unit}{\mathbf{e}} \newcommand{\one}{\mathbf{1}} \newcommand{\zero}{\mathbf{0}} \newcommand\rfrac[2]{^{#1}\!/_{#2}} \newcommand{\norm}[1]{\left\lVert#1\right\rVert} $$

多元线性回归

描述

多元线性回归的目标是找到一个最佳拟合输入数据的线性函数。通过输入数据集: $(\mathbf{x}, y)$,多元线性回归将得到一个向量 $\mathbf{w}$,使得残差平方(squared residuals)和最小化:

将其按照矩阵的方式表示,我们将得到以下公式:

从而得到一个确定解:

但是,如果输入数据集过大从而导致无法完全解析所有数据时,可以通过随机梯度下降(SGD)来得到一个近似解。 SGD首先用输入数据集的随机子集求得一个梯度,特定点 $\mathbf{x}_i$ 上的梯度为:

求解出来的梯度被归一化,缩放公式为: $\gamma = \frac{s}{\sqrt{j}}$,其中 $s$ 为初始步长,$j$ 为当前迭代次数。当前梯度的权重向量减去归一化后的当前梯度值,即得到下一次迭代的权重向量:

多元线性回归可以根据输入的SGD迭代次数终止,也可以在达到给定的收敛条件后终止。其中收敛条件为两次迭代之间残差平方和满足:

操作

多元线性回归 是一个预测模型(Predictor)。 因此,它支持拟合(fit)与预测(predict)两种操作。

拟合

多元线性回归通过 LabeledVector 集合进行训练:

  • fit: DataSet[LabeledVector] => Unit

预测

多元线性回归会对 Vector 的所有子类预测其回归值:

  • predict[T <: Vector]: DataSet[T] => DataSet[LabeledVector]

如果想要对模型的预测结果进行苹果,可以对已包含正确值的样本集做预测。传入 DataSet[LabeledVector],得到每个数据的回归值后返回 DataSet[(Double, Double)]。 在每个 DataSet[(Double, Double)] 元组中,第一个元素是输入的 DataSet[LabeledVector] 中的正确值,第二个元素是对应的预测值。你可以使用 (正确值, 预测值) 的对比来评估算法:

  • predict: DataSet[LabeledVector] => DataSet[(Double, Double)]

参数

多元线性回归的实现可以通过下面的参数进行控制:

参数 描述
Iterations

最大迭代次数。(默认值:10

Stepsize

梯度下降的初始步长。该值确定每次进行梯度下降时,反向移动的距离。调整步长对于算法的稳定收敛及性能非常重要。(默认值:0.1

ConvergenceThreshold

算法停止迭代的残差平方和变化程度的收敛阈值。(默认值:None

LearningRateMethod

学习率方法,用于计算每次迭代的有效学习率。Flink ML支持的学习率方法列表见:learning rate methods。(默认值:LearningRateMethod.Default

例子

// 创建多元线性回归学习器
val mlr = MultipleLinearRegression()
.setIterations(10)
.setStepsize(0.5)
.setConvergenceThreshold(0.001)

// 载入训练数据及以及测试数据集
val trainingDS: DataSet[LabeledVector] = ...
val testingDS: DataSet[Vector] = ...

// 对提供的数据进行线性拟合
mlr.fit(trainingDS)

// 对测试数据集进行预测
val predictions = mlr.predict(testingDS)