本文以线性回归作为出发点开始我们的梯度下降的讲解
为了让本文读者理解的更加清晰,我顺着思路一步步给各位读者讲一下
第一步:导包(这一步必须的)
import numpy as np
import pandas as pd
from tqdm import tqdm
import matplotlib.pyplot as plt
第二步:为了完成本次的梯度下降算法,我们要简单的生成一部分数据
# 生成示例数据
def generate_data(n_samples=100, noise_scale=0.5):
np.random.seed(42) # 设置随机种子以确保结果可复现
x = np.linspace(0, 10, n_samples) # 生成从0到10的n_samples个等间距的点
y = 2 * x + 1 + np.random.normal(scale=noise_scale, size=n_samples) # 线性关系加上噪声
return x, y
"""
[ 0. 0.1010101 0.2020202 0.3030303 0.4040404 0.50505051
0.60606061 0.70707071 0.80808081 0.90909091 1.01010101 1.11111111
1.21212121 ........ 9.39393939 9.49494949 9.5959596
9.6969697 9.7979798 9.8989899 10. ]共100个样本
[ 1.24835708 1.13288805 1.72788467 2.36757553 1.69100412 1.89303253
3.00172762 ........ 19.79384491 19.46016172
20.54199953 20.72648723 20.80053653 20.88270643]共100个样本
"""
第三步:计算损失函数
# 计算损失函数
def get_J(x, y, b1, b0):
h = b1 * x + b0
delta2 = np.square(y - h)
J = np.mean(delta2) / 2
return J
这里面b1就是我们的k,b0就是我们传统意义上的b
第四步:更新参数函数
# 更新参数
def update(x, y, b1, b0, alpha):
grad_k, grad_b = get_gradients(x, y, b1, b0)
b1 -= alpha * grad_k
b0 -= alpha * grad_b
return b1, b0
第5步:主函数设置
# 主函数
def main():
# 超参设置
alpha = 0.0008
epoch = 4000
# 加载数据
x, y = generate_data()
# 初始化参数
b1 = 1
b0 = 0.3
# 列表存放每轮的损失,以便绘图
l = []
e = []
loss = get_J(x, y, b1, b0)
l.append(loss)
ep = 0
e.append(ep)
# 梯度下降
for i in tqdm(range(epoch)):
e.append(i + 1)
b1, b0 = update(x, y, b1, b0, alpha)
loss = get_J(x, y, b1, b0)
l.append(loss)
# 绘制损失随迭代次数变化的图表
plt.plot(e, l)
plt.title('Loss vs. Epoch')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
if __name__ == '__main__':
main()
其实逻辑一缕清楚,就没那么难了
标签:__,plt,梯度,代码,面试,b0,b1,np,alpha From: https://blog.csdn.net/sdsasaAAS/article/details/143382671