多元线性回归的目标是找到一个最佳拟合输入数据的线性函数。通过输入数据集: $(\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)