第五章 线性回归(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)

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号