专栏名称: 机器之心
专业的人工智能媒体和产业服务平台
目录
相关文章推荐
爱可可-爱生活  ·  【[91星]MASLab:一个为基于LLM的 ... ·  2 天前  
人工智能产业链union  ·  【AI】万字追问:人类需要AI,还是更需要自 ... ·  2 天前  
人工智能产业链union  ·  【AI】万字追问:人类需要AI,还是更需要自 ... ·  2 天前  
人工智能学家  ·  自主agent路线错了!华人学者提出LLM- ... ·  3 天前  
爱可可-爱生活  ·  晚安~ #晚安# -20250614230759 ·  2 天前  
黄建同学  ·  这篇文章《Don’t Build ... ·  3 天前  
51好读  ›  专栏  ›  机器之心

教程 | 从头开始:用Python实现带随机梯度下降的线性回归

机器之心  · 公众号  · AI  · 2017-01-29 13:31

正文

请到「今天看啥」查看全文


yhat = coefficients[0]

for i in range(len(row)-1):

yhat += coefficients[i + 1] * row[i]

return yhat


我们可以用一个小的数据集对这个函数进行测试。


x, y

1, 1

2, 3

4, 3

3, 2

5, 5


下图是一小部分数据:


线性回归的部分转换数据


我们也可用之前准备好的系数为这个数据集做预测。predict() 函数测试如下。


# Make a prediction with coefficients

def predict(row, coefficients):

yhat = coefficients[0]

for i in range(len(row)-1):

yhat += coefficients[i + 1] * row[i]

return yhat

dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]]

coef = [0.4, 0.8]

for row in dataset:

yhat = predict(row, coef)

print("Expected=%.3f, Predicted=%.3f" % (row[-1], yhat))


单个输入值 (x) 和两个系数(b0 和 b1)。用于建模该问题的预测方程为:


y = b0 + b1 * x


或者,手动选择特定系数:


y = 0.4 + 0.8 * x


运行此函数,我们将得到一个相当接近预测值的输出值(y)。


Expected=1.000, Predicted=1.200

Expected=3.000, Predicted=2.000

Expected=3.000, Predicted=3.600

Expected=2.000, Predicted=2.800

Expected=5.000, Predicted=4.400


现在我们可以用随机梯度下降来优化我们的系数值了。


2. 估计系数


我们可以使用随机梯度下降来为我们的训练数据估计系数值。随机阶梯下降需要两个设定参数:


  • 学习率(Learning Rate):用于限制每次更新时被修正的系数的数量。

  • Epochs:更新系数的同时运行训练集的次数。


这两个值和数据集都是函数的参数。我们的这个函数将执行三个遍历循环:


1. 单次 epoch 循环

2. 单次 epoch 中训练集中的每行循环

3. 单次 epoch 中每个系数循环并为每一行更新它


可以看到,每次 epoch,我们都会更新数据集里每行的系数。系数的更新是基于模型生成的误差。该误差被算作候选系数的预测值和预期输出值之间的差。


error = prediction - expected


有一个系数用于加权每一个输入属性,这些属性将以连续的方式进行更新,比如


b1(t+1) = b1(t) - learning_rate * error(t) * x1(t)


列表开始的特殊系数,也被称为截距(intercept)或偏差(bias),也以类似的方式更新,但因其不与特定输入值相关,所以无输入值。


b0(t+1) = b0(t) - learning_rate * error(t)


现在我们把所有东西组合在一起。coefficients_sgd() 函数正是用随机梯度下降来计算一个训练集的系数值,下面即是该函数:


# Estimate linear regression coefficients using stochastic gradient descent

def coefficients_sgd(train, l_rate, n_epoch):

coef = [0.0 for i in range(len(train[0]))]

for epoch in range(n_epoch):

sum_error = 0

for row in train:

yhat = predict(row, coef)

error = yhat - row[-1]

sum_error += error**2

coef[0] = coef[0] - l_rate * error

for i in range(len(row)-1):







请到「今天看啥」查看全文