第五章 线性回归(3)

线性回归

y=k1x1+k2x2+b

import random
import numpy as np

--------------数据获取--------------

xs1 = np.array([i for i in range(2003, 2023)]) # 年份,2003-2022
xs2 = np.array([random.randint(60, 150) for i in range(2003, 2023)]) # 面积
ys = np.array(
[
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 = [(xs1 - x1_min) / (x1_max - x1_min)] # 归一化
xs2_normal = [(xs2 - x2_min) / (x2_max - x2_min)] # 归一化

xs_normal = np.dstack([xs1_normal, xs2_normal])[0]

使用 np.dstack() 将 xs1_normal 和 xs2_normal 沿深度方向堆叠成一个三维数组。

通过 [0] 索引,取出这个三维数组中的第一个“切片”,通常是一个二维数组。

ys_normal = (ys - y_min) / (y_max - y_min) # 归一化
ys_normal = ys_normal.reshape(-1, 1) # 变为列向量

--------------参数初始化--------------

k = np.array([1.0, 1.0]).reshape(2, 1) # 系数初始化

首先使用np.array()将k初始化为2x1的数组,reshape()函数将其变为2x1的矩阵,方便后续计算。

b = 0 # 截距

epoche = 100 # 迭代次数
lr = 0.0001 # 学习率

--------------模型训练--------------

for e in range(epoche): # 迭代epoche次
predict = xs_normal @ k + b # 预测值

loss = (ys_normal - predict) ** 2  # 损失函数

G = delta_C = (predict - ys_normal) / xs_normal.shape[0]

delta_k = xs_normal.T @ G  # 计算k的梯度

k = k - lr * delta_k  # 更新k

print("第", e, "次迭代,损失函数为:", loss.mean())  # 打印损失函数

while True:
input_x1 = int(input("请输入要预测的年份:")) # 输入要预测的年份
input_x1_normal = (input_x1 - x1_min) / (x1_max - x1_min) # 归一化

input_x2 = int(input("请输入面积:"))  # 输入面积
input_x2_normal = (input_x2 - x2_min) / (x2_max - x2_min)  # 归一化

p = np.array([input_x1_normal, input_x2_normal]) @ k + b  # 预测值

pp = p * (y_max - y_min) + y_min  # 反归一化
print("预测值为:", pp)
posted @ 2025-08-26 15:59  李大嘟嘟  阅读(8)  评论(0)    收藏  举报