> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> 该函数实现随机线性回归。支持自定义参数，包括学习率、L2 正则化系数和小批次大小， 并提供几种权重更新方法（Adam、简单 SGD、Momentum、Nesterov）。

# stochasticLinearRegression

<div id="stochasticLinearRegression">
  ## stochasticLinearRegression
</div>

引入版本：v20.1.0

此函数实现了随机线性回归。
它支持以下自定义参数：

* 学习率
* L2 正则化系数
* 小批次大小

它还提供了几种权重更新方法：

* Adam (默认)
* 简单 SGD
* Momentum
* Nesterov

**用法**

该函数的使用分为两步：拟合模型，以及对新数据进行预测。

1. 拟合

进行拟合时，可以使用如下查询：

```sql theme={null}
CREATE TABLE IF NOT EXISTS train_data
(
    param1 Float64,
    param2 Float64,
    target Float64
) ENGINE = Memory;

CREATE TABLE your_model ENGINE = Memory AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data;
```

这里，我们还需要将数据插入 `train_data` 表。
参数个数不是固定的，只取决于传递给 `linearRegressionState` 的 argument 数量。
它们都必须是数值。
请注意，包含目标值 (即我们希望模型学会预测的值) 的列要作为第一个 argument 插入。

2. 预测

将状态保存到表中后，我们可以多次将其用于预测，甚至将其与其他状态 merge，创建新的、更好的模型。

```sql theme={null}
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) FROM test_data
```

该查询将返回一列预测值。
请注意，`evalMLMethod` 的第一个参数是 `AggregateFunctionState` 对象，后续参数为特征列。

`test_data` 是一个类似于 `train_data` 的表，但可能不包含目标值。

**注意**

1. 要合并两个模型，用户可以创建如下查询：

```sq; theme={null}
SELECT state1 + state2 FROM your_models
```

其中，`your_models` 表同时包含这两个模型。
该查询将返回一个新的 `AggregateFunctionState` 对象。

2. 如果未使用 `-State` 组合器，你可以在不保存模型的情况下提取已创建模型的权重，供其他用途使用。

```sql theme={null}
SELECT stochasticLinearRegression(0.01)(target, param1, param2)
FROM train_data
```

这样的查询会拟合该模型并返回其权重——前几个值是与模型参数对应的权重，最后一个值是偏置。
因此，在上面的示例中，该查询将返回一列 3 个值。

**语法**

```sql theme={null}
stochasticLinearRegression([learning_rate, l2_regularization_coef, mini_batch_size, method])(target, x1, x2, ...)
```

**参数**

* `learning_rate` — 执行梯度下降时的步长系数。学习率过大可能会导致模型权重变为无穷大。默认值为 `0.00001`。[`Float64`](/zh/reference/data-types/float)
* `l2_regularization_coef` — L2 正则化系数，可帮助防止过拟合。默认值为 `0.1`。[`Float64`](/zh/reference/data-types/float)
* `mini_batch_size` — 设置执行一次梯度下降时，用于计算并累加梯度的元素数量。纯随机下降使用单个元素，但使用较小的批次 (约 10 个元素) 会使梯度更新更稳定。默认值为 `15`。[`UInt64`](/zh/reference/data-types/int-uint)
* `method` — 权重更新方法：`Adam` (默认) 、`SGD`、`Momentum`、`Nesterov`。`Momentum` 和 `Nesterov` 需要略多一些计算和内存，但在收敛速度和随机梯度方法的稳定性方面通常更有优势。[`const String`](/zh/reference/data-types/string)
* `target` — 要学习预测的目标值 (因变量) 。必须为数值类型。[`Float*`](/zh/reference/data-types/float)
* `x1, x2, ...` — 特征值 (自变量) 。必须全部为数值类型。[`Float*`](/zh/reference/data-types/float)

**返回值**

返回训练后的线性回归模型权重。前面的值对应模型参数，最后一个值为偏置。使用 `evalMLMethod` 进行预测。[`Array(Float64)`](/zh/reference/data-types/array)

**示例**

**训练模型**

```sql title=Query theme={null}
CREATE TABLE your_model
ENGINE = Memory
AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, x1, x2)
AS state FROM train_data
```

```response title=Response theme={null}
将训练好的模型状态保存到表中
```

**预测**

```sql title=Query theme={null}
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, x1, x2) FROM test_data
```

```response title=Response theme={null}
返回测试数据的预测值
```

**获取模型权重**

```sql title=Query theme={null}
SELECT stochasticLinearRegression(0.01)(target, x1, x2) FROM train_data
```

```response title=Response theme={null}
返回模型权重，但不保存状态
```

**另请参见**

* [stochasticLogisticRegression](/zh/reference/functions/aggregate-functions/stochasticLogisticRegression)
* [线性回归和逻辑回归的区别](https://stackoverflow.com/questions/12146914/what-is-the-difference-between-linear-regression-and-logistic-regression)
