当前位置: 首页 > news >正文

手撸大模型-基础篇 简单线性回归模型预测房价

# NumPy Pandas Matplotlib
import numpy as np
import matplotlib.pyplot as plt

'''
双特征,矩阵化
'''

1. Min-Max 归一化及其逆操作

1.1 输入数据归一化

def normalize1(sample, data):
    max_value = np.max(data)
    min_value = np.min(data)
    return (sample - min_value) / (max_value - min_value)

1.2 预测结果去归一化

def d_normalize1(sample, data):
    max_value = np.max(data)
    min_value = np.min(data)
    return sample * (max_value - min_value) + min_value

2. Z-score 标准化及其逆操作

2.1 输入数据归一化

def normalize2(sample, data):
    mean = np.mean(data)
    stds = np.std(data)
    return (sample - mean) / stds

2.2 预测结果去归一化
def d_normalize2(sample, data):
    mean = np.mean(data)
    stds = np.std(data)
    return sample * stds + mean

3. 模型定义

def model(X, W, b):
    return  X@W + b

4. 损失函数
使用均方误差(MSE)作为损失函数:
def loss_func(predict, label):
    return (predict - label)**2

5. 主程序
if __name__ == "__main__":
    np.random.seed(17)

    prices_raw = np.arange(37294, 87294, 5000) + np.random.randn(10)*3000
    years_raw  = np.arange(2014, 2024)
    areas_raw  = np.arange(80, 140, 6) + np.random.randn(10)

    # X = np.vstack((areas_raw, years_raw)).T

 5.1 数据标准化
    prices = normalize2(prices_raw, prices_raw)
    years  = normalize2(years_raw, years_raw)
    areas  = normalize2(areas_raw, areas_raw)

    X = np.vstack((areas, years)).T

 5.2 模型初始化与训练参数设置

  • 设置训练周期(epoch)为 100。

  • 模型输入特征维度为 2,输出特征维度为 1。

  • 初始化权重矩阵 W 为全零矩阵,偏置 b 为 0。

  • 设置学习率 lr 为 0.01。

  • 设定批量大小 batch_size 为 3(小批量梯度下降)。

    epoch = 100
    in_features  = 2
    out_features = 1
    W = np.zeros((in_features, out_features))
    b = 0.

    lr = 0.01

    batch_size = 3
 5.3 小批量梯度下降训练循环

    for e in range(epoch):

        cursor = 0
        while cursor <= len(X):
            actual_batchsize = min(len(X)-cursor, batch_size)
            batch_inputs = X[cursor: cursor + actual_batchsize]
            batch_labels = prices[cursor: cursor + actual_batchsize].reshape(actual_batchsize, 1)

            predict = model(batch_inputs, W, b)

            loss = loss_func(predict, batch_labels)

            G = 2*(predict - batch_labels) / actual_batchsize
            
            dW = batch_inputs.T @ G
            db = G

            W -= lr*dW
            b -= lr*db
            b = np.mean(b)
            cursor += batch_size
        print("Loss: {}".format(loss))

5.4 预测功能

    inputs = np.array((normalize2(90, areas_raw), normalize2(2025, years_raw))).reshape(1, 2)
    predict = model(inputs, W, b)
    predict = d_normalize2(predict, prices_raw)
    
    pass

6. 完整代码 

# -*- coding: utf-8 -*-
# NumPy Pandas Matplotlib
import numpy as np
import matplotlib.pyplot as plt

'''
双特征,矩阵化
'''

def normalize1(sample, data):
    max_value = np.max(data)
    min_value = np.min(data)
    return (sample - min_value) / (max_value - min_value)

def d_normalize1(sample, data):
    max_value = np.max(data)
    min_value = np.min(data)
    return sample * (max_value - min_value) + min_value

def normalize2(sample, data):
    mean = np.mean(data)
    stds = np.std(data)
    return (sample - mean) / stds


def d_normalize2(sample, data):
    mean = np.mean(data)
    stds = np.std(data)
    return sample * stds + mean



def model(X, W, b):
    return X@W + b


def loss_func(predict, label):
    return (predict - label)**2


if __name__ == "__main__":
    np.random.seed(17)

    prices_raw = np.arange(37294, 87294, 5000) + np.random.randn(10)* 3000
    years_raw  = np.arange(2014, 2024)
    areas_raw  = np.arange(80, 140, 6) + np.random.randn(10)

    # X = np.vstack((areas_raw, years_raw)).T

    prices = normalize2(prices_raw, prices_raw)
    years  = normalize2(years_raw, years_raw)
    areas  = normalize2(areas_raw, areas_raw)

    X = np.vstack((areas, years)).T

    epoch = 100
    in_features  = 2
    out_features = 1
    W = np.zeros((in_features, out_features))
    b = 0.

    lr = 0.01

    batch_size = 3

    for e in range(epoch):

        cursor = 0
        while cursor <= len(X):
            actual_batchsize = min(len(X)- cursor, batch_size)
            batch_inputs = X[cursor: cursor + actual_batchsize]
            batch_labels = prices[cursor: cursor + actual_batchsize].reshape(actual_batchsize, 1)

            predict = model(batch_inputs, W, b)

            loss = loss_func(predict, batch_labels)

            G = 2* ( predict - batch_labels) / actual_batchsize

            dW = batch_inputs.T @ G
            db = G

            W -= lr* dW
            b -= lr* db
            b = np.mean(b)
            cursor += batch_size
        print("Loss: {}".format(loss))

    inputs = np.array((normalize2(90, areas_raw), normalize2(2025, years_raw))).reshape(1, 2)
    predict = model(inputs, W, b)
    predict = d_normalize2(predict, prices_raw)

    pass



7. 运行结果

相关文章:

  • 一周一个Unity小游戏2D反弹球游戏 - 球板的发球
  • 【03】STM32F407 HAL 库框架设计学习
  • 介绍微信小程序中页面的生命周期函数和组件的生命周期函数
  • Python:列表的定义和增删改查,推导式与嵌套
  • 蓝桥杯单片机第16届4T模拟赛三思路讲解
  • 计算机毕业设计SpringBoot+Vue.js汽车资讯网站(源码+文档+PPT+讲解)
  • Java支持多继承么,为什么?
  • 4-3自定义加载器,并添加功能
  • 本地部署大模型
  • 《动手学习深度学习》的笔记,将会持续更新。
  • vue3:三项目增加404页面
  • Mysql 语法再巩固
  • 接口自动化测试框架(pytest+allure+aiohttp+用例自动生成)
  • 香港大学deep-research开源项目
  • (动态规划 最大(连续)子数组和)leetcode 53
  • Elasticsearch 数据量大时如何优化查询性能?
  • Python正则
  • [M数据结构] lc2353. 设计食物评分系统(数据结构+set 平衡树+懒删除堆)
  • 达梦数据库如何查看当前锁表和如何解决锁表问题
  • 企业access_token,与用户access_token区别,获取方式,如何获取用户信息
  • 怎样做企业网站/传统营销与网络营销的整合方法
  • html5怎末做意见反馈网站/如何把品牌推广出去
  • 怎样做网站的快捷方式/十大广告公司排名
  • 四川住房城乡建设部网站/百度联盟
  • wordpress 防注入广告/北京网站优化体验
  • 北京网站建设q.479185700強/网站设计公司上海