第五章 线性回归(2)

# 线性回归
# 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)
posted @ 2025-08-20 21:46  李大嘟嘟  阅读(7)  评论(0)    收藏  举报