一、 手撕LinerRegression
LinerRegression来预测房价信息,仅使用两个features,因此仅有两个w跟一个偏置b
1. 创建一个liner函数
def liner_two(x, w, b):
return w[0] * x[0] + w[1] * x[1] + b
2. 创建一个损失函数loss
def loss(y, x, w, b):
return 1 / 2 * (liner_two(x, w, b) - y) ** 2
3. 创建一个梯度下降函数,由于数据量少的问题,并未在该函数中添加batch_size
****
def sgd(y, x, w, b, lr):
temp0 = (w[0] * x[0] + w[1] * x[1] + b - y) * x[0]
temp1 = (w[0] * x[0] + w[1] * x[1] + b - y) * x[1]
temp2 = (w[0] * x[0] + w[1] * x[1] + b - y) * 1
w[0] = w[0] - lr * temp0
w[1] = w[1] - lr * temp1
b = b - lr * temp2
return w,b
4. 模型初始化以及参数初始化
w = [1,1]
b = 1
training_data = [[1.0,1.0],[2.0,2.0],[3.0,3.0]]
y = [1.0,2.0,3.0]
lr = 0.05
5. 开始模型训练
训练时,迭代次数为500次,学习率为0.05
w_history = []
b_history = []
loss_history = []
for i in range(500):
temp_loss = 0
for j in range(len(training_data)):
w,b = sgd(y[j],training_data[j],w,b,lr)
temp_loss = (loss(y[j],training_data[j],w,b))
loss_history.append(temp_loss/len(training_data))
b_history.append(b)
w_history.append(w[0])
6.模型训练结果
下图示 训练次数与模型参数的关联图 可以发现在epoch为300左右时,模型已经训练ok
下图是 epoch与loss之间关联图