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

news/2025/10/16 1:14:08/文章来源:https://www.cnblogs.com/AttaSayyid/p/19144604
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.mzph.cn/news/937908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web Components 微前端实现与应用

Web Components 微前端实现与应用 1. 核心架构设计 1.1 微前端架构模式 // 微前端核心接口定义 interface MicroFrontendConfig {name: string;entry: string; // 应用入口container: string; // 挂载容…

DshanPI-A1 RK3576 gmrender-resurrect B站投屏

演示效果 一、环境信息类别 具体配置板卡 DshanPI-A1主控芯片 RK3576操作系统 Armbian桌面系统 GNOME窗口系统 WaylandGPU 驱动 Panfrost二、实现原理核心组件:gmrender-resurrect 是一款接收 DLNA 服务内容,并通过 …

组件级异步加载与预加载策略

组件级异步加载与预加载策略 1. 核心架构设计 1.1 异步组件加载器 // 组件加载状态枚举 enum ComponentLoadStatus {IDLE = idle,LOADING = loading,LOADED = loaded,ERROR = error }// 组件配置接口 interface Compon…

好记性不如烂笔头之C语言优先级查询

优先级 运算符 名称与含义 使用形式 结合方向  说明1 [] 数组下标 数组名[ int] 左到右() 圆括号. 成员选择(对象)-> 成员选择(指针)2 - 负号运算符 -表达式 右到左~ 按位取反 ~表达式++ 自增 ++变量名/变量…

SAM系列论文浅析

SAM(Segment Anything Model)系列代表了计算机视觉基础模型从"专用工具"向"通用感知系统"的演进。本文从视觉语言模型的角度深入分析SAM系列三代模型的技术演进,重点剖析SAM3如何通过引入可提示…

2023 ICPC Xian

2023 ICPC Xian ICPC Xian 也是非常坐牢的一场 E 从能力值小的人开始考虑,遍历他能胜利多少次,若他能胜利 \(x\) 次,则必须在交换操作后有一个长度为 \(2^x\) 的区间里面都是比他弱的,从小到大遍历胜利次数,同时维…

2025-10-15 ?

?Kasino game you have 1 coin,determine to join the following game or not. if you have n coins( n is a real number) before this round,you will have 9n w.p. 1/2,and have 0.1n w.p. 1/2 you will play infi…

为什么一部电影,一本书一看就喜欢

为什么一部电影,一本书一看就喜欢,我知道这跟这部作品的,要表达的思想有关,可为什么。。。因为这部电影你还没看完,内容你还不知道,你是怎么喜欢上的呢。真的很奇怪。。。也许,这是很肤浅的认识吧。就现在以前的…

20251015打卡

冒一下泡,我还活着哈哈哈

牛客119232 牛客2025秋季算法编程训练联赛1-提升组 游记

打了大约 $90min$ 离场,$4t$,整体题目较水。省流 打了大约 \(90min\) 离场,\(4t\),整体题目较水。10.15 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 晚上没吃饭,为了吃饭知道不会打的时间特别长。看到题…

BroadcastChannel跨页签通信复盘总结

BroadcastChannel API 提供了一个简单有效的跨页签通信解决方案,特别适合需要实时同步状态的同源页面场景。虽然存在一些局限性,但在合适的业务场景下,它能够以最小的开发成本实现良好的通信效果。 核心实现代码 //…

02020510 EF Core高级10-构建动态表达式树、不推荐动态构建表达式树、动态构建IQuerable、动态构建字符串

02020510 EF Core高级10-构建动态表达式树、不推荐动态构建表达式树、动态构建IQuerable、动态构建字符串 1. 不用Emit生成IL代码实现select的动态化(视频3-46) 1、Select(b=>new{b.Id,b.Name}) 2、运行时动态设定…

02020601 Web API01-顶级语句、全局using指令、可空类型、record类型(自动重写ToString、Equals)、init和private属性

02020601 Web API01-顶级语句、全局using指令、可空类型、record类型(自动重写ToString、Equals)、init和private属性 1.1 C#新语法01(视频4-1) 1.1 C#新语法 1、C#8.0、C#9.0和C#10.0中增加了很多的新语法,这里讲…

Nginx 之Rewrite 使用详解

Nginx 的 rewrite 模块是处理 HTTP 请求过程中的一个重要功能,它允许基于 Perl 兼容正则表达式(PCRE)对用户请求的 URI 进行重写,并返回 30x 重定向跳转或按条件执行相关配置。 Rewrite 指令 2.1 指令语法 Nginx 中…

libaom 在ubuntu 上用鸿蒙OHOS编译

1) 导入 OHOS 环境(当前会话)export OHOS_SDK=/root/harmony/command-line-tools/sdk/default/openharmony export OHOS_SYSROOT=$OHOS_SDK/native/sysroot export PATH=$OHOS_SDK/native/llvm/bin:$PATH# 确认编译器…

Aexlet-VGG2

使用CUDA 10轮结果显示还是Alex胜出

《膜拜!适合新手入门的卷积神经网络原理详解教程》读书报告

视频从卷积操作的基本概念入手,逐步深入到步长、边缘填充、特征图尺寸计算、参数共享、池化层作用以及整体网络架构等关键知识点,通过可视化的矩阵运算示例,让抽象的算法原理变得通俗易懂。(一)卷积操作:特征提取…