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

如何手动构建一个线性回归模型

import numpy as np
from utils.features import prepare_for_training # 预处理
import torch as t# 现在开始构建线性回归
class LinearRegression():"""总结一下这个函数具体做了什么事情:1. 预处理数据2. 得到所有的特征个数,也就是θ的个数3. 初始化参数矩阵"""# 对于我们的任务,我们首先需要传入的参数是:data数据,labels标签(因为我们的任务是有监督任务)# polynomial_degree, sinusoid_degree ???# normalize_data=True 表示我们的数据是否需要归一化def __init__(self, data, labels, polynomial_degree=0, sinusoid_degree=0, normalize_data=True):# 我们需要拿到预处理的结果,三个量分别表示:# data_processed:预处理之后的数据# features_mean:mean值->也就是所有数据的平均值# features_deviation:标准差(data_processed, features_mean, features_deviation) = prepare_for_training(data, polynomial_degree=0, sinusoid_degree=0, normalize_data=True)self.data = data_processedself.labels = labelsself.features_mean = features_meanself.features_deviation = features_deviationself.polynomial_degree = polynomial_degreeself.sinusoid_degree = sinusoid_degreeself.normalize_data = normalize_data# 现在我们针对线性回归y = w1x1 + w2x2 + ... + wmxm + b, 我们已经有了x(data),y(labels),现在我们还缺少w# w的个数也就是我们特征的个数num_features = self.data.shape[1] # data.shape中行表示我们的数据的个数,列表示我们特征的个数# θ是我们最终要求解的参数值,θ的个数也就是我们的特征的个数# 先进行初始化,使用0矩阵,同时满足矩阵格式:self.theta = t.zeros((num_features, 1))def train(self, step, batch_size, epoch=500):# 接下来构建我们的训练函数(训练模块,执行梯度下降)# step学习率# epoch迭代次数# 这个地方使用梯度下降不单单能得到损失值,还能更新我们的参数cost_history = self.gd(step, epoch)# 最终我们想要的也就是θ和损失值return self.theta, cost_historydef gd(self, step, epoch):# 梯度下降(总)# 由于我们需要看损失的变化,所以每一次梯度下降我们都需要记录一次损失值,而我们的损失值,需要我们的损失函数去计算cost_history = []for i in range(epoch):self.gd_step(step)#记录每一次的迭代所得到的损失cost_history.append(self.cost_func(self.data, self.labels))return cost_historydef gd_step(self, step): # 梯度下降的单个步骤(梯度下降参数更新方法,注意是矩阵的运算)# 样本的个数num_examples = self.data.shape[0]# 预测值: 也就是我们的 数据×参数prediction = LinearRegression.hypothesis(self.data, self.theta) # 此处是因为我们使用了@staticmethod装饰器,从而使我们能够直接调用hypothesis类方法# 残差: 预测值 - 真实值delta = prediction - self.labelstheta = self.thetatheta = theta - step*(1/num_examples)*(t.dot(delta.T, self.data)).T # 根据我们的重要重要重要公式,注意我们的残差与data之间是矩阵的乘法,同时,残差需要进行转置(具体原因见手写笔记)# 为了调用方便我们这里使用了静态方法装饰器 ???""""""@staticmethoddef hypothesis(data, theta):# 使用我们的x值和θ值做预测得到y的预测值# 这里的t.dot同np.dot,向量之间就是内积,矩阵之间就是线性代数中矩阵的乘法# 我们通过x×θ我们得到了预测值yprediction = t.dot(data, theta)return predictiondef cost_func(self, data, labels):num_examples = data.shape[0]delta = self.hypothesis(data, self.theta) - labels#  均方差损失函数(同最小二乘法)# 注意这里的矩阵不能直接**平方,矩阵的平方在数学中我们可以使用:矩阵的转置×矩阵本身cost = (1/2)*t.dot(delta.T, delta)print(cost.shape) # $$$print(cost) # $$$return cost[0][0] ### 注意这里是为了把合适的值选出来,需要自己去找???# 辅助函数,得到当前的损失def cost_get(self, data, labels):# 数据预处理,这里我们只要prepare_for_training函数的第一个返回值,也就是我们的data_processeddata_processed = prepare_for_training(data, self.polynomial_degree, self.sinusoid_degree, self.normalize_data)[0]# 直接得到损失值return self.cost_func(data, labels)# 辅助函数,用训练好的参数得到预测结果def predict(self, data):data_processed = prepare_for_training(data, self.polynomial_degree, self.sinusoid_degree, self.normalize_data)[0]return LinearRegression.hypothesis(data_processed, self.theta)
http://www.gsyq.cn/news/21931.html

相关文章:

  • Web Components 微前端实现与应用
  • 好记性不如烂笔头之C语言优先级查询
  • 2025-10-15 ?
  • 20251015打卡
  • p66页2
  • BroadcastChannel跨页签通信复盘总结
  • 02020510 EF Core高级10-构建动态表达式树、不推荐动态构建表达式树、动态构建IQuerable、动态构建字符串
  • libaom 在ubuntu 上用鸿蒙OHOS编译
  • p66 实训2
  • [asm/c]:SYSCALL系统调用的编号(x86_64)
  • 人生的底色
  • ansible安装脚本
  • 详细介绍:【笔记】介绍 WPF XAML 中 Binding 的 StringFormat详细功能
  • 结果(Results)和结论 (Conclusion)的联系与区别
  • 20251015
  • [QOJ888] Travel around China 题解
  • P1912 [NOI2009] 诗人小G 分析
  • CSP-S 模拟 29
  • 实用指南:【编号508】(道路分类)湖南路网数据湖南路网分类数据(2025年)
  • 深入解析:Leetcode+Java+图论+岛屿问题
  • 简单介绍
  • agent策略分析与Parer解读
  • Visual Studio 2022连接mysql数据库,解决System.Data.Odbc.OdbcException (0x80131937)
  • [20251014]建立和完善col_list.sql脚本.txt
  • 倍增法
  • 鸿蒙NEXT Wi-Fi扫描编写指南:从基础到实战
  • 251015读书报告
  • 元推理框架的诞生,是绝对真实的证明,彻底击溃虚无论
  • 吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础 课后习题和代码实践
  • 蛋白表达标签:提升重组蛋白研究与生产的关键工具