【机器学习】单变量线性回归
目录
源代码文件请点击此处!
线性回归模型(linear regression model)
- 线性回归模型:
其中, 为权重(weight), 为偏置(bias)
- 预测值(通常加一个帽子符号):
损失/代价函数(cost function)——均方误差(mean squared error)
- 一个训练样本:
- 训练样本总数 =
- 损失/代价函数是一个二次函数,在图像上是一个开口向上的抛物线的形状。
- 为什么需要乘以 1/2?因为对平方项求偏导后会出现系数 2,是为了约去这个系数。
梯度下降算法(gradient descent algorithm)
- :学习率(learning rate),用于控制梯度下降时的步长,以抵达损失函数的最小值处。若 太小,梯度下降太慢;若 太大,下降过程可能无法收敛。
- 梯度下降算法:
其中,偏导数为
参数(parameter)和超参数(hyperparameter)
- 超参数(hyperparameter):训练之前人为设置的任何数量都是超参数,例如学习率
- 参数(parameter):模型在训练过程中创建或修改的任何数量都是参数,例如
代码实现样例
import numpy as np
import matplotlib.pyplot as plt
# 计算误差均方函数 J(w,b)
def cost_function(x, y, w, b):
m = x.shape[0] # 训练集的数据样本数
cost_sum = 0.0
for i in range(m):
f_wb = w * x[i] + b
cost = (f_wb - y[i]) ** 2
cost_sum += cost
return cost_sum / (2 * m)
# 计算梯度值 dJ/dw, dJ/db
def compute_gradient(x, y, w, b):
m = x.shape[0] # 训练集的数据样本数
d_w = 0.0
d_b = 0.0
for i in range(m):
f_wb = w * x[i] + b
d_wi = (f_wb - y[i]) * x[i]
d_bi = (f_wb - y[i])
d_w += d_wi
d_b += d_bi
dj_dw = d_w / m
dj_db = d_b / m
return dj_dw, dj_db
# 梯度下降算法
def linear_regression(x, y, w, b, learning_rate=0.01, epochs=1000):
J_history = [] # 记录每次迭代产生的误差值
for epoch in range(epochs):
dj_dw, dj_db = compute_gradient(x, y, w, b)
# w 和 b 需同步更新
w = w - learning_rate * dj_dw
b = b - learning_rate * dj_db
J_history.append(cost_function(x, y, w, b)) # 记录每次迭代产生的误差值
return w, b, J_history
# 绘制线性方程的图像
def draw_line(w, b, xmin, xmax, title):
x = np.linspace(xmin, xmax)
y = w * x + b
# plt.axis([0, 10, 0, 50]) # xmin, xmax, ymin, ymax
plt.xlabel("X-axis", size=15)
plt.ylabel("Y-axis", size=15)
plt.title(title, size=20)
plt.plot(x, y)
# 绘制散点图
def draw_scatter(x, y, title):
plt.xlabel("X-axis", size=15)
plt.ylabel("Y-axis", size=15)
plt.title(title, size=20)
plt.scatter(x, y)
# 从这里开始执行
if __name__ == '__main__':
# 训练集样本
x_train = np.array([1, 2, 3, 5, 6, 7])
y_train = np.array([15.5, 19.7, 24.4, 35.6, 40.7, 44.8])
w = 0.0 # 权重
b = 0.0 # 偏置
epochs = 10000 # 迭代次数
learning_rate = 0.01 # 学习率
J_history = [] # # 记录每次迭代产生的误差值
w, b, J_history = linear_regression(x_train, y_train, w, b, learning_rate, epochs)
print(f"result: w = {w:0.4f}, b = {b:0.4f}") # 打印结果
# 绘制迭代计算得到的线性回归方程
plt.figure(1)
draw_line(w, b, 0, 10, "Linear Regression")
plt.scatter(x_train, y_train) # 将训练数据集也表示在图中
plt.show()
# 绘制误差值的散点图
plt.figure(2)
x_axis = list(range(0, 10000))
draw_scatter(x_axis, J_history, "Cost Function in Every Epoch")
plt.show()
运行结果
本文作者:漫舞八月(Mount256)
本文链接:https://www.cnblogs.com/Mount256/p/17952138
版权声明:本作品采用CC 4.0 BY-SA许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步