线性回归实现原理

news2024/12/26 11:29:53

 

一.定义
回归是监督学习的一个重要问题,回归用于预测输入变量和输出变量之间的关系,特别是当输入变量的值发生变化时,输出变量的值也随之发生变化。回归模型正是表示从输入变量到输出变量之间映射的函数

回归的目的是预测数组型的目标值。

线性回归:根据已知的数据集,通过梯度下降的方法来训练线性回归模型的参数w,从而用线性回归模型来预测数据的未知的类别。

二.学习过程

 

 

三.损失函数

使用均方误差作为损失函数;使用均方误差的原因:有十分好的几何意义,对应了常用的欧式距离。在线性回归中,就是找到一个直线,使得所有样本到直线的欧式距离最小。

损失函数:

求导过程如下:

 

上式最小二乘法求导用到的数学公式:

 

①当  XTX为满秩矩阵或者正定矩阵时,可使用正规方程法,直接求得闭式解。

可直接用最小二乘法得出模型的参数w

 

算法实现:(Python):

def Regres(X,Y):
    x = mat(X); y = mat(Y).T
    if linalg.det(x.T*x) == 0.0:#判断行列式是否为0
        print ("矩阵行列式为0,不可逆")
        return 0
    else return ((x.T*x).I * (x.T*y))#返回为已经求出的w,其中I为求逆操作

②当XTX为不可逆矩阵时,可使用梯度下降的方法

损失函数:

  

 

使用矩阵表示(方便计算)

E=h-y

四.优缺点
优点:结果易于理解,计算不复杂

缺点:对非线性的数据拟合不好,不能处理非线性模型

五.应用场景
线性回归预测PM2.5预测
给定训练集train.csv,要求根据前9个小时的空气监测情况预测第10个小时的PM2.5含量。

训练集介绍:

  (1):csv文件,本次作业使用丰原站的观测记录,分成 train set 跟 test set,train set 是丰原站每个月的前 20 天所有资料。test set 则是从丰原站剩下的资料中取样出来。(取每个月前20天的数据做训练  集,12月X20天=240天,每月后10天数据test set 用于测试,对学生不可见);    (2):test.csv : 从剩下的资料当中取样出连续的 10 小时为一笔,前九小时的所有观测数据当作 feature,第十小时的 PM2.5 当作 answer。一共取出 240 笔不重複的 test data,请根据 feature 预测这 240 笔的 PM2.5。

  (3):每天的监测时间点为0时,1时......到23时,共24个时间节点;

  (4):每天的检测指标包括CO、NO、PM2.5、PM10等气体浓度,是否降雨、刮风等气象信息,共计18项;

       (5):数据集https://github.com/datawhalechina/leeml-notes/blob/master/docs/Homework/HW_1/Dataset

数据处理

【下文中提到的“数据帧”并非指pandas库中的数据结构DataFrame,而是指一个二维的数据包】

根据作业要求可知,需要用到连续9个时间点的气象观测数据,来预测第10个时间点的PM2.5含量。针对每一天来说,其包含的信息维度为(18,24)(18项指标,24个时间节点)。可以将0到8时的数据截

取出来,形成一个维度为(18,9)的数据帧,作为训练数据,将9时的PM2.5含量取出来,作为该训练数据对应的label;同理可取1到9时的数据作为训练用的数据帧,10时的PM2.5含量作为label......以此

分割,可将每天的信息分割为15个shape为(18,9)的数据帧和与之对应的15个label。

下面时train.csv训练集数据的内容:

源码:

import numpy as np
import pandas as pd
df =pd.read_csv('work/hw1_data/train.csv',encoding='big5')
print(df)
df.drop(["日期","測站"],axis=1,inplace=True)
print(df)
col=df["測項"].unique()
#print(col)
new_train=pd.DataFrame(np.zeros([18,24*240]),index=col)
#print(new_train)
for i in col:
    df1=df[df["測項"]==i]
    df1.drop(["測項"],axis=1,inplace=True)
    df1=np.array(df1)  #数组
    #print(df1)
    df1[df1=="NR"]="0"  #将数组中nr的值成0
    df1=df1.astype("float")
    df1=df1.reshape(1,5760)
    #print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
    new_train.loc[i]=df1  #形成整行插入一维数组,也可以转化成整列插入,设置new_train为(24*240,18),则new—train[i]=df1
print(new_train)
 
#接下来提取训练集的标签
label=np.array(new_train.loc["PM2.5",9:],dtype='float32')   #提取训练集的标签
label=label.reshape(5751,1)   #构成5751*1的列矩阵
print(label)
 
#接下来训练模型,得出w
label=label.astype("float")  #数组所有的值转化成float型,标签
#print(label)
m=len(label)
#print(m)
eta=0.00001
w=np.ones((10,1))
for t in range(100):
    for v in range(m):
        x=np.array(new_train.loc["PM2.5",v:v+8])  #样本的所有特征值
        x=np.insert(x,0,1.0)  #在9个特征值前加一个1.0,方便处理偏置b
        h=np.dot(x,w)
        err=label[v]-h  #第一次更新label-wx
        x=x.reshape(10,1)  #装置x变成10*1
        w+=eta*x*err  #每次变更w向量
print(w)
 
#接下来提取测试集的标签,并预测
df2=pd.read_csv('work/hw1_data/test.csv',encoding='big5')  #提取测试集的特征值,接下来预测
#print(df2)
test=df2.iloc[:,2:]
test=np.array(test)
test[test=="NR"]="0"   #替换非数字的字符
test=test.astype("float")  #转化成数值
print(test)
print(test.shape)
t=9
test1=[]
for i in range(240):  #提取240个测试集
    test1.append([1.0,*test[t]])
    #print(test1)
    t=t+18
#print(test1)
test1=np.array(test1)  #将测试集变成数组
print(test1.shape)  #打印数组shape
t_label=[]
print("预测值:")
for k in range (240):  #遍历测试集
    test_label=np.dot(test1[k],w)
    print(test_label)
    t_label.append(test_label)
#t_label=np.array(t_label)  #转化成一维数组
#t_label=t_label.reshape(240,1) #转化成240*1的列数组
#print(t_label)#打印列数组

 运行结果:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54632.html

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

相关文章

并查集的学习

并查集是一种树型的数据结构,并查集可以高效地进行如下操作: 1、查询元素p和元素q是否属于同一组 2、合并元素p和元素q所在地组 并查集结构: 是一种树型结构,这棵树地要求比较简单 1、每个元素都唯一对应一个节点 2、每一组数…

iOS打包错误The operation couldn’t be completed. (AppThinning.StubError error 1.)

1、iOS打包错误 iOS打包报错:The operation couldn’t be completed. (AppThinning.StubError error 1.) 操作流程:archive之后选择Distribute App,在如上图步骤选择 Ad Hoc,然后出现The operation couldn’t be completed. (Ap…

GCC - 基于win10平台搭建Cmake + MinGW + gcc-arm-none 开源开发环境

前言 基于GUN开源工具链,搭建Windows平台下ARM编译运行环境! 🐱‍🚀 文中涉及的开发工具包已打包上传,可点击此处下载。 文章速览前言一、安装git-bash二、安装 MinGW-w6432位下载地址:  [MinGW - Minimalist GNU …

鉴源论坛 · 观模丨基于搜索的测试生成

作者 | 孙海英 华东师范大学软件工程学院讲师 苏亭 华东师范大学软件工程学院教授 版块 | 鉴源论坛 观模 测试用例自动生成,简称测试生成(Test Generation),是指针对给定的被测对象,例如代码单元、接口、系统等&…

[附源码]Python计算机毕业设计Django防疫物资捐赠

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

Spring MVC 中的分页 RESTful API 响应

分页允许您将来自Spring MVC的大型RESTful API响应拆分为称为页面的较小块。在这篇文章中,让我们看看如何使用Spring MVC和Spring JPA对来自Spring boot应用程序的JSON响应进行分页。 Spring MVC 中的分页和排序 如前所述,我们可以使用spring 数据 JPA…

急诊预检分诊管理系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

webpack之性能优化

今天先来看两种性能优化的方式: 第一:抽离css代码并压缩 在没有配置之前,css是一起被打包到js文件里面的,像这样子 因此我们需要将css文件单独抽离出来 npm i mini-css-extract-plugin -D我们是需要在打包的时候去抽离它&#x…

LotuS2:新一代扩增子数据分析神器(更快、更准、更稳定)

一、研究背景 扩增子测序是分析微生物组成熟且成本较低的方法。然而,扩增子数据处理需要生物信息学技能和高计算能力来处理大数据集。此外,只有小部分工具适用于长读长扩增子数据分析。2022年10月Microbiome发表了一种新的扩增子数据处理神器——LotuS2…

0113 链表Day2

剑指 Offer 06. 从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1 输入:head [1,3,2] 输出:[2,3,1] /*** Definition for singly-linked list.* public class ListN…

通过源码来理解Cglib与JDK动态代理

最近在阅读到了Spring源码对于两种动态代理使用在不同场景下的使用,两种方式各有利弊写一篇文加深自己的认识。文中对于源码的涉及较少,更多的是作者自己的理解和举例,然后通过部分源码验证。 首先看两个面试经常会遇到的关于Spring的问题&a…

纳尼?华为首席架构师只用434页笔记,就将网络协议给拿下了

不管是前端还是后端,几乎所有的程序运行都会涉及到网络协议。10 个程序员里面,10 个都说自己学过网络协议,9 个说自己懂网络协议。但真正面试的时候,能回答出相关问题的,可能只有两三个。 金九银十跳槽热季&#xff0…

七、【React-Router6】路由传参 之 search

文章目录1、routes.js2、Message.jsx3、Detail.jsx4、Result5、另外一个可以获取 search 的新 Hook :useLocation项目修改自 上一节 的 Demo 1、routes.js import { Navigate } from react-router-dom import About from ../components/About import Home from ../…

【D3.js】1.18-给 D3 标签添加样式

title: 【D3.js】1.18-给 D3 标签添加样式 date: 2022-12-02 14:44 tags: [JavaScript,CSS,HTML,D3.js,SVG] 标签也可以添加样式。 一、学习目标 如何设置字体大小? .attr(“font-size”,25) 如何填充颜色? .attr(“fill”,“red”) 二、题目 将 text 元…

LeetCode简单题之不同的平均值数目

题目 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组,你就重复执行以下步骤: 找到 nums 中的最小值,并删除它。 找到 nums 中的最大值,并删除它。 计算删除两数的平均值。 两数 a 和 b 的 平均值…

[操作系统笔记]连续分配管理方式

内容系听课复习所做笔记,图例多来自课程截图 连续分配管理方式 连续分配:指为用户进程分配的必须是一个连续的内存空间 相应地,非连续分配可以是离散的 对于固定分区分配,需要有一个分区说明表,类似下表: …

【jmeter录制浏览器上特定的单个请求】

目录准备工作jmeter代理设置设置postman代理复制浏览器是特定的url背景:想要对浏览器某一个请求做测试,直接手动输入到jmeter不切实际,一般是使用jmeter代理的方式录制下来,但会有个问题,一般浏览器加载许多其他请求&a…

在虚拟机中安装Linux操作系统详细步骤

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 在虚拟机中安装Linux操作系统详细步骤专栏:《Linux从小白到大神》| 系统学习Linux开发、VI…

达梦数据库表空间误删恢复实操

达梦数据库表空间误删恢复实操1.表空间失效文件检查2.表空间失效文件恢复准备3.表空间失效文件恢复4.表空间失效文件恢复实操1.表空间失效文件检查 表空间恢复失效文件的检查。 语法格式 SP_FILE_SYS_CHECK ();语句功能 在 LINUX 操作系统下,检查是否有数据文件被…

一个已经存在10年,却被严重低估的 Python 库

今天介绍的是一个已经存在十年,但是依旧不红的库 decorator,好像很少有人知道他的存在一样。 这个库可以帮你做什么呢 ? 其实很简单,就是可以帮你更方便地写python装饰器代码,更重要的是,它让 Python 中被…