# 线性回归
# y=k1x1+k2x2+b
import random
# --------------数据获取--------------
xs1 = [i for i in range(2003, 2023)]#年份
xs2 = [random.randint(60, 150) for i in range(2003, 2023)]#面积
ys = [
5000,
5699,
6500,
8000,
8800,
12000,
12500,
13000,
14000,
15000,
20000,
32000,
40000,
48000,
53000,
54000,
57000,
58000,
59000,
60000,
]# 房价
# --------------数据处理--------------
# MIN-MAX 归一化 (x-min)/(max-min)
x1_min = min(xs1)
x1_max = max(xs1)
x2_min = min(xs1)
x2_max = max(xs1)
y_min = min(ys)
y_max = max(ys)
xs1_normal = [(i - x1_min) / (x1_max - x1_min) for i in xs1]
xs2_normal = [(i - x2_min) / (x2_max - x2_min) for i in xs2]
ys_normal = [(i - y_min) / (y_max - y_min) for i in ys]
# --------------参数初始化--------------
k1 = 1 # 斜率
k2 = 1 # 斜率
b = 0 # 截距
epoche = 100 # 迭代次数
lr = 0.0001 # 学习率
# --------------模型训练--------------
for e in range(epoche): # 迭代epoche次
for x1, x2, y in zip(xs1_normal,xs2_normal, ys_normal): # 遍历数据集
# --------------模型预测(模型推理,求出预测值)--------------
predict = k1 * x1+k2 * x2 + b # 预测值
# 求出损失函数
loss = (predict - y) ** 2 # 损失函数
# 计算梯度值
delta_k1 = (predict - y) * x1 # 斜率的导数
delta_k2 = (predict - y) * x2 # 斜率的导数
delta_b = (predict - y) * 1 # 截距的导数
# 更新参数
k1 = k1 - delta_k1 * lr # 更新斜率
k2 = k2 - delta_k2 * lr # 更新斜率
b = b - delta_b * lr # 更新截距
print(loss)
# 模型上线及预测
while True:
input_x1 = input("请输入要预测的年份:") # 输入要预测的年份
input_x1_normal = (int(input_x1) - x1_min) / (x1_max - x1_min) # 归一化
input_x2 = input("请输入面积:") # 输入面积
input_x2_normal = (int(input_x2) - x2_min) / (x2_max - x2_min) # 归一化
p = k1 * int(input_x1_normal) + k2 * int(input_x2_normal) + b # 预测值
pp = p * (y_max - y_min) + y_min # 反归一化
print("预测值为:", pp)