机器学习基础——线性回归公式推导(附完整代码)

本文介绍了线性回归模型的概念,通过最小二乘法和均方差来寻找最佳参数。详细推导了线性回归的公式,并通过Python代码展示了简单的线性回归实验,讨论了直接计算的局限性和实际应用中采用的优化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的文章当中,我们介绍过了简单的朴素贝叶斯分类模型,介绍过最小二乘法,所以这期文章我们顺水推舟,来讲讲线性回归模型。


线性回归的本质其实是一种统计学当中的回归分析方法,考察的是自变量和因变量之间的线性关联。后来也许是建模的过程和模型训练的方式和机器学习的理念比较接近,所以近年来,这个模型被归入到了机器学习的领域当中。然而,不管它属于哪个领域,整个模型的思想并没有发生变化。我们只要有所了解即可。


模型概念


线性回归的定义非常简单,它最简单的形式其实就是一元一次方程组。比如,我们有如下式子:

y = w x + b y=wx+b y=wx+b

我们知道若干的x和y,要求w和b。解的方法很简单,我们通过消元法,就可以很容易求出来w和b。


我们针对以上的式子做两个变形,第一个变形是我们的自变量x不再是一个单值,而是一个m * n的矩阵。m表示样本数,n表示特征数,我们写成X。X矩阵的每一行是一个n维的行向量,它代表一个样本。它的系数W也不再是一个值,而是一个n * 1的列向量,它的每一维代表一个样本当中这一维的权重。我们把上面的公式写成矩阵相乘的形式:

Y = X W + b Y=XW+b Y=XW+b

式子里的Y、X和W分别是m * 1, m * n和n * 1的矩阵。


这里有两点要注意,第一点是这里的b我们可以当做是一个浮点数的参数,但是实际上它也是一个m * 1的矩阵(列向量)。但即使我们用的是浮点数也没关系,因为在我们实现模型的时候,numpy或者TensorFlow或者是其他的框架会自动地使用广播将它转化成向量来做加法。


第二点是这里的X写在了W的前面,这也是为了矩阵乘法计算方便。当然我们也可以将X和W都转置,写成WX,但这样得到的结果是一个1 * m的行向量,如果要和Y进行比较,那么还需要再进行一次转置。所以为了简便,我们对调了X和W的顺序。所以大家不要觉得疑惑,明明是WX+b怎么写出来就成了XW+b了。


我们把式子列出来之后,目标就很明确了,就是要通过计算求到一个W和b使得式子成立。但是在此之前,我们需要先明确一点:在实际的工程应用场景当中,是不可能找到W和b使得XW+b恰好和Y完全相等的。因为真实的场景当中数据都存在误差,所以精确的解是不存在的,我们只能退而求其次,追求尽可能精确的解。


最小二乘法与均方差


在之前的文章当中我们介绍过最小二乘法,遗忘的同学可以点击下方链接回顾一下。


概率统计——期望、方差与最小二乘法


在机器学习的过程当中,模型不是直接达到最佳的,而是通过一步一步的迭代,效果逐渐提高,最终收敛不再剧烈变化。我们明白了这个过程,就能理解,在学习的过程当中,我们需要一个量化的指标来衡量模型当前学习到的能力。就好像学生在上学的时候需要考试来测试学生的能力一样,我们也需要一个指标来测试模型的能力。


对于回归模型而言,预测的目标是一个具体的值。显然这个预测值和真实值越接近越好。我们假设预测值是 y ^ \hat{y} y^,真实值是y,显然应该是 ∣ y − y ^ ∣ |y-\hat{y}| yy^越小越好。


但是绝对值的计算非常麻烦,也不方便求导,所以我们通常会将它平方,即: ( y − y ^ ) 2 (y-\hat{y})^2 (yy^)2最小。对于m个样本而言,我们希望它们的平方和尽量小: ∑ i = 1 m ( y i − y i ^ ) 2 \sum_{i=1}^m(y_i - \hat{y_i})^2 i=1m(yiyi^)2


这个式子和我们之前介绍的方差非常相似,只不过在方差当中减的是期望值,而在这里我们减的是真实值。所以这个平方差也有一个类似的名称,叫做均方差


方差反应的是变量在期望值附近的震荡程度,同样的,均方差反应的是模型预测值距离真实值的震荡程度。


寻找最佳的参数来使得均方差尽量小,就是最小二乘法


推导过程


到这里,我们已经搞清楚了模型的公式,也写出了优化的目标,已经非常接近了,只剩下最后一步,就是优化这个目标的方法


如果我们观察一下均方差,我们把它写全: ( Y − ( X W + b ) ) 2 (Y-(XW+b))^2 (Y(XW+b))

### 关于机器学习公式推导及其Python代码实现 #### TensorFlow中的线性回归模型 在TensorFlow中,可以通过定义损失函数并利用梯度下降优化算法来实现简单的线性回归模型。对于给定的数据集$(X, Y)$,其中$X$代表输入特征向量而$Y$为目标标签值,则最小化均方误差(MSE)作为目标函数: $$MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i-\hat y)^2=\frac{1}{n}\|Y-W^TX-b\|^2_2$$ 这里$n$表示样本数量;$\hat y=W^Tx+b$是预测输出;$W,b$分别是权重矩阵和偏置项。 为了找到最优参数组合使得上述表达式达到极小值点,采用随机梯度下降法(SGD)[^1]更新规则如下所示: ```python import tensorflow as tf # 定义占位符用于接收训练数据 x_placeholder = tf.placeholder(tf.float32, shape=[None]) y_placeholder = tf.placeholder(tf.float32, shape=[None]) # 初始化变量w(权值), b(截距) weight_variable = tf.Variable([0.], dtype=tf.float32) bias_variable = tf.Variable([0.], dtype=tf.float32) # 构建预测模型 prediction_operation = weight_variable * x_placeholder + bias_variable # 计算平方差损失 loss_function = tf.reduce_mean((prediction_operation - y_placeholder)**2) # 使用AdamOptimizer执行反向传播调整参数 optimizer_operator = tf.train.AdamOptimizer().minimize(loss_function) with tf.Session() as session: # 执行初始化操作 init_op = tf.global_variables_initializer() session.run(init_op) for epoch_index in range(training_epochs): _, current_loss_value = session.run( [optimizer_operator, loss_function], feed_dict={x_placeholder: training_data_x, y_placeholder: training_data_y}) ``` 此段程序展示了如何基于TensorFlow框架搭建一个基础版的线性拟合器,并通过迭代方式不断逼近真实解的过程。 #### PyTorch下的逻辑斯蒂回归案例研究 另一方面,在PyTorch环境下也可以轻松完成类似的任务——比如构建二分类问题解决方案之一即Logistic Regression Model。其核心思想在于引入Sigmoid激活函数将实数值映射至概率空间内: $$P(y|x)=\sigma(\beta ^ Tx+\alpha)=\frac {e^{\beta ^ T x}}{1+ e^ {\beta ^ T x }} $$ 此处$x,\beta $分别对应着实例属性描述子与待估系数列向量;$\alpha$则为阈值常数项。 下面给出一段完整的源码片段用来说明具体做法: ```python import torch.nn.functional as F from torch import nn class LogisticRegressionModel(nn.Module): def __init__(self, input_dim): super().__init__() self.linear_layer = nn.Linear(input_dim, 1) def forward(self, batch_features): logits_output = self.linear_layer(batch_features).squeeze(-1) probabilities_predictions = F.sigmoid(logits_output) return probabilities_predictions if __name__ == '__main__': model_instance = LogisticRegressionModel(feature_dimensions) criterion_objective = nn.BCELoss() optimizer_handler = optim.SGD(model.parameters(), lr=learning_rate) for iteration_counter in range(num_iterations): predicted_probs = model(train_inputs) error_measure = criterion_objective(predicted_probs, target_labels) optimizer.zero_grad() error_measure.backward() optimizer.step() ``` 这段脚本实现了从零创建LR类直至调用内置交叉熵代价衡量标准以及SGD求解策略为止的一系列流程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值