假设波斯顿房价问题是线性问题
loss函数和求导后函数
# define partial derivative
def partial_derivative_k(x, y, y_hat):
n = len(y)
gradient = 0
for x_i, y_i, y_hat_i in zip(list(x),list(y),list(y_hat)):
gradient += (y_i-y_hat_i) * x_i
return -2/n * gradient
def partial_derivative_b(y, y_hat):
n = len(y)
gradient = 0
for y_i, y_hat_i in zip(list(y),list(y_hat)):
gradient += (y_i-y_hat_i)
return -2 / n * gradient
#initialized parameters
k = random.random() * 200 - 100 # -100 100 初始化k
b = random.random() * 200 - 100 # -100 100 初始化b
learning_rate = 1e-3 #初始化学习率
iteration_num = 200 # 循环学习200次
losses = []
for i in range(iteration_num):
price_use_current_parameters = [price(r, k, b) for r in X_rm] # \hat{y}
current_loss = loss(y, price_use_current_parameters)
losses.append(current_loss)
print("Iteration {}, the loss is {}, parameters k is {} and b is {}".format(i,current_loss,k,b))
k_gradient = partial_derivative_k(X_rm, y, price_use_current_parameters)
b_gradient = partial_derivative_b(y, price_use_current_parameters)
k = k + (-1 * k_gradient) * learning_rate
b = b + (-1 * b_gradient) * learning_rate
best_k = k
best_b = b
将loss画图
plt.plot(list(range(iteration_num)),losses)
price_use_best_parameters = [price(r, best_k, best_b) for r in X_rm]
plt.scatter(X_rm,y)
plt.scatter(X_rm,price_use_current_parameters)