现在假设这样的一个案例,现在有一组这样的数据,是小明每天学习的时间和
最后考试的分数的数据。数据如下表所示,同时想知道小明假设学习4个小时最后考
试会得多少分?
每日学习时间(小时) | 考试得分 |
1 | 20 |
2 | 40 |
3 | 60 |
4 | ? |
设定线性回归模型:
利用上述单特征线性模型来解决这个问题。首先这个数据的输入就一个,就是小明的学习时间,输出是考试的得分。因此该模型可以确定为:
但是为了方便后面的理解和计算将该模型化简一下,我们只用一个W来表达输入和输出之间的关系(尽管这样不太严谨,仅仅是为了方便后面的计算),因此现在的模型可以简化为:
现在用一个公式计算输出和真实值间的误差:
当然数据是有很多的,要计算所有数据真实值和输出之间的误差和并计算出平均值,这个
函数为均方误差函数,也是线性回归模型的损失函数。
"""
2.1线性回归模型与梯度下降
函数为 f(x)=wx
loss loss=(f(x)-y)^2 = (wx - y)^2
其中 y是真实标签值
"""
# 定义数据特征
x_data = [1, 2, 3]
# 定义数据标签
y_data = [20, 40, 60]
# 初始化参数W
w = 4 # 权重
lr = 0.01 # 学习率
loss = 0 # 损失值
num = 0
# 定义线性回归的模型
def forword(x):
return w * x
# 定义损失函数
def cost(xs, ys):
costvalue = 0
for x, y in zip(xs, ys):
y_pred = forword(x)
costvalue += (y_pred - y) ** 2
return costvalue / len(xs) # 计算平均损失值
# 定义计算梯度的函数
def gradient(xs, ys):
grad = 0
for x, y in zip(xs, ys):
grad += 2 * x * (x * w - y)
return grad / len(xs)
for epoch in range(200):
_loss = cost(x_data, y_data) # 计算损失值
if _loss < loss: # 如果当前损失值小于上一轮的损失值就记录
loss = _loss
if _loss - loss < 1e-6: # 判断当前轮的损失值与上一轮的损失值的差是否在范围内如果在就计数加一
if num == 2:
break
num += 1
grad_val = gradient(x_data, y_data) # 计算梯度
w = w - lr * grad_val # 更新参数
print(f"Epoch:{epoch},w={w:.6f},Loss={_loss:.6f}")
print("训练结束得到权重值为:%.6f"%w)
print("使用权重值进行推理 学习时间为4时 得到结果分数:%.6f"%forword(4))