# 线性回归
# y=kx+b
# --------------数据获取--------------
xs = [i for i in range(2008, 2023)]
ys = [
5000,
8000,
12000,
20000,
32000,
35000,
40000,
48000,
53000,
54000,
57000,
58000,
59000,
59900,
60000,
]
# --------------数据处理--------------
# MIN-MAX 归一化 (x-min)/(max-min)
x_min = min(xs)
x_max = max(xs)
y_min = min(ys)
y_max = max(ys)
xs_normal = [(i - x_min) / (x_max - x_min) for i in xs]
ys_normal = [(i - y_min) / (y_max - y_min) for i in ys]
# --------------参数初始化--------------
k = 1 # 斜率
b = 0 # 截距
epoche = 100 # 迭代次数
lr = 0.2 # 学习率
# --------------模型训练--------------
for e in range(epoche): # 迭代epoche次
for x, y in zip(xs_normal, ys_normal): # 遍历数据集
# --------------模型预测(模型推理,求出预测值)--------------
predict = k * x + b # 预测值
# 求出损失函数
loss = (predict - y) ** 2 # 损失函数
# 计算梯度值
delta_k = (predict - y) * x # 斜率的导数
delta_b = (predict - y) * 1 # 截距的导数
# 更新参数
k = k - delta_k * lr # 更新斜率
b = b - delta_b * lr # 更新截距
print(loss)
# 模型上线及预测
while True:
input_x = input("请输入要预测的年份:") # 输入要预测的年份
input_x_normal = (int(input_x) - x_min) / (x_max - x_min) # 归一化
p = k * int(input_x_normal) + b # 预测值
pp = p * (y_max - y_min) + y_min # 反归一化
print("预测值为:", pp)