微积分梯度算法
import numpy as np
# 损失函数:均方误差(MSE)
def mse_loss(y_true, y_pred):
return np.mean((y_true - y_pred) ** 2)
# 梯度计算:损失函数对参数w的偏导数
def compute_gradient(X, y, w):
# L = (1/n) * Σ(y - wX)²
# dL/dw = -(2/n) * Σ(y - wX) * X
n = len(y)
# 计算样板在向量方向的预估值,w是X的同列数的一维数组
predictions = X.dot(w)
# 计算实际值y和预测值的差值,并计算出X每列特在在本次计算时的损失量,即X的行列转行并进行差值进行点积
gradient = -(2/n) * X.T.dot(y - predictions)
return gradient
# 参数更新:沿梯度反方向移动,y是实际值,X是样本,w是向量即预测的评分体系,learning_rate是学习率,iterations是迭代次数
def gradient_descent(X, y, w, learning_rate, iterations):
for i in range(iterations):
# 计算本地迭代的梯度情况
grad = compute_gradient(X, y, w)
# 根据梯度情况调整向量值,每次调整的比例是学习度
w = w - learning_rate * grad
if i % 100 == 0:
# 计算函数损失,也就是向量调整到什么情况,方差越小向量越准确,即按照向量方向进行预测越贴近实际值
loss = mse_loss(y, X.dot(w))
print(f"Iteration {i}: loss = {loss:.4f}")
return w