【机器学习 - 4】:线性回归算法

news2024/9/27 12:14:13

文章目录

  • 线性回归
    • 线性回归的理解
    • 损失函数
  • 简单线性回归
    • 封装线性回归算法
  • 线性回归算法
    • 在sklearn中调用线性回归算法
    • 向量化运算
  • 线性回归模型中的误差
    • 均方误差 MSE
    • 均方根误差
    • 平均绝对误差
    • 调用sklearn中的均方根误差和平均绝对误差函数
    • R squared error (常用)

线性回归


线性回归的理解

线性回归:判断数据的特征和目标值之间具有一定的线性关系。
简单线性回归:样本的特征只有一个,用线性回归法进行预测,叫做简单线性回归。
多元线性回归:样本的特征有两个或两个以上,叫做多元线性回归。

如下图所示,为线性回归模型
在这里插入图片描述

损失函数

损失函数:np.sum((y`-y)**2),即预测值和真实值的差值之和。因为有复数的存在所以求平方,不用绝对值的原因:用平方方便后续的求导和求极值。

最小二乘法
在这里插入图片描述
一些推导过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重要结论
在这里插入图片描述

简单线性回归


  1. 先画出数据的散点图
import numpy as np
import matplotlib.pyplot as plt

x = np.array([1,2,3,4,5])
y = np.array([2,1,3,2,5])

plt.scatter(x,y)
plt.axis([0,6,0,6])
plt.show()

在这里插入图片描述

  1. 对数据进行处理,求出a和b
# y = a * x + b
# 先求出平均值
x_mean = np.mean(x)
y_mean = np.mean(y)

num = 0.0 # 分子
d = 0.0 # 分母

for x_i, y_i in zip(x, y):
    num += (x_i-x_mean)*(y_i-y_mean)
    d += (x_i-x_mean)**2
a = num/d
b = y_mean-a*x_mean

在这里插入图片描述

  1. 求出y`,并画出预测直线,求出这条线,使得真实值与预测值的差值达到最小。
y_hat = a * x + b

plt.plot(x, y_hat, color='r')
plt.scatter(x,y)
plt.axis([0, 6, 0, 6])
plt.show()

在这里插入图片描述

封装线性回归算法

import numpy as np


class SimpleLinearRegression:
    def __init__(self):
        self.a_ = None
        self.b_ = None
        self.x_mean = None
        self.y_mean = None

    def fit(self, x_train, y_train):
        self.x_mean = np.mean(x_train)
        self.y_mean = np.mean(y_train)

        num = 0.0   # 分子
        d = 0.0     # 分母
        for x_i, y_i in zip(x_train, y_train):
            num += (x_i-self.x_mean) * (y_i-self.y_mean)
            d += (x_i-self.x_mean)**2
        self.a = num/d
        self.b = self.y_mean - self.a * self.x_mean

        return self

    def predict(self, x_test):
        return self.a * x_test + self.b

    def __repr__(self):
        return 'SimpleLinearRegression()'

在jupter notebook中导入运行
在这里插入图片描述

线性回归算法


使用线性回归算法的前提:数据具有一定的线性关系。

我们希望找到一条最佳拟合的直线方程,y=ax+b,对于每一个样本点,在这个直线方程上都有一个预测值,预测值和真实值有一定的差距,我们希望这些样本到直线方程的差距之和最小。

计算差距:sqrt(|y-y`|**2),使用平方并开根号的方式更适合我们进行求导或求值。

在sklearn中调用线性回归算法

  1. 导入模块
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
  1. 准备数据,训练模型
# 准备数据
x = np.array([1,2,3,4,5])
y = np.array([3,1,4,3,6])

lin_reg = LinearRegression()
lin_reg.fit(x.reshape(-1,1), y)	# 拟合,训练模型

在这里插入图片描述

  1. 画出散点图和预测直线
plt.scatter(x, y)
plt.plot(x, lin_reg.predict(x.reshape(-1,1)), color='r')
plt.axis([0,6,0,7])
plt.show()

在这里插入图片描述

向量化运算

如下图所示,向量化运算更加方便,向量点乘是先乘后加,原理一样。
在这里插入图片描述

x = np.array([1,2,3,4,5])
y = np.array([3,1,4,3,6])
def lin_fit(x, y):
    x_mean = np.mean(x)
    y_mean = np.mean(y)
    num = 0.0
    d = 0.0
    num = (x-x_mean).dot(y-y_mean)
    d = (x-x_mean).dot(x-x_mean)
    a = num/d
    b = y_mean-a*x_mean
    return a, b

在这里插入图片描述

线性回归模型中的误差


在分类问题可以将score看成准确率,在回归问题将score看成模型的好坏程度。
在这里插入图片描述

均方误差 MSE

均方误差的公式如下图所示:
在这里插入图片描述
为什么要除以样本数量m?
举个例子,比如第一个团队有2个人,统计其工资的均方误差为800,第二个团队有100个人,工资的均方误差为1000,能说明第一个团队比较好吗?这是不行的,因为统计的个数不同,样本不同,导致量纲不一样,所以需要除以样本数量m,减少量纲的影响。

封装的函数

# 均方误差 MSE
def MSE(y_true, y_predict):
    return np.sum((y_true-y_predict)**2)/len(y_true)

在这里插入图片描述

均方根误差

在这里插入图片描述
在均方误差中进行开根号处理,可以消除量纲的影响。

封装的均方根误差

# 均方根误差
from math import sqrt
def RMSE(y_true, y_predict):
    return sqrt(np.sum((y_true-y_predict)**2)/len(y_true))

在这里插入图片描述

平均绝对误差

在这里插入图片描述
封装的平均绝对误差

# 平均绝对误差
def MAE(y_true, y_predict):
    return np.sum(np.absolute(y_true-y_predict))/len(y_true)

在这里插入图片描述

调用sklearn中的均方根误差和平均绝对误差函数

from sklearn.metrics import mean_squared_error, mean_absolute_error
mean_squared_error(x, y_hat)
mean_absolute_error(x, y_hat)

在这里插入图片描述

R squared error (常用)

R^2(以下用R2表示)分类的准确度在0和1之间,R2为1时,模型最优,即没有出现任何错误。

计算公式如下:
在这里插入图片描述
封装R squared error

import numpy as np
x = np.array([1,2,3,4,5])
y = np.array([3,1,4,3,6])
def r2_score(x_true, y_predict):
    return 1-((np.sum((x_true-y_predict)**2)/len(x_true))/np.var(x_true))

在这里插入图片描述

或调用均值方差 MSE
在这里插入图片描述
调用sklearn中的线性回归算法,计算预测值,最终的误差结果还是一样

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(x.reshape(-1,1), y)
y_predict = lin_reg.predict(x.reshape(-1,1))

在这里插入图片描述

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

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

相关文章

结构光相机国产、非国产统计参数对比分析

结构光相机国产、非国产统计参数对比分析 1. Kinect v1 Kinect v1深度相机拥有一个RGB彩色摄像头,一个红外线CMOS摄像机和一个红外发射器。相机的红外线CMOS摄像机和红外发射器以左右水平的方式分布。该相机采用的是以结构光为基础进行改进后的光编码(…

【SpringCloud16】SpringCloud Sieuth分布式请求链路跟踪

1.概述 1.1 为什么会出现这个技术? 问题: 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中…

Linux服务器离线安装Gitlab

1、下载 1.1、网址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 1.2、选择版本 2、安装 2.1、将安装包上传到服务器 2.2、检查相关依赖是否安装 使用命令 rpm -qa | grep -i (要查看的依赖名);如果安装了&#…

OpenAI DALL·E 绘画机器人

快过年了,在公司也没啥任务,索性尝试使用OpenAI的DALLE生成一些好玩的图片。 OpenAI DALLE 官方介绍: DALLE 是一种由 OpenAI 开发的大型语言模型,其能够通过生成图像和文本来完成各种任务。其名称来源于绘画机器人 WALLE 和艺术家…

2023年准备报考软考,考哪个?

一般建议从软考中级考试考,科目多,难度也不大!关于中级科目。计算机软件类包括:软件评测师、软件设计师、软件过程能力评估师。计算机网络类包括:网络工程师。计算机应用技术类包括:多媒体应用设计师、嵌入…

DBCO-PEG-OPSS_OPSS-PEG-DBCO_二苯并环辛烯PEG巯基吡啶

DBCO 试剂是一类点击化学标记试剂,含有非常活泼的 DBCO((二苯并环辛炔)基团,DBCO 试剂可以通过无铜点击化学与叠氮化物标记的分子或生物分子发生反应。DBCO 点击化学可以在水性缓冲液中运行,也可以在有机溶…

机器学习知识总结 —— 16.如何实现一个简单的SVM算法

文章目录创建具有特征的二维数据实现SVM算法线性核函数梯度下降和损失函数训练实验效果总结在前面的章节里,已经简要的介绍了SVM算法的工作原理,现在在这篇文章里,我们来看看SVM算法的一些简单实现。 创建具有特征的二维数据 一般来说&…

【闪电侠学netty】第8章 客户端与服务端通信协议编解码

【Netty】读书笔记 - 跟闪电侠学 1. 内容概要 1.1 总结 1.1.1 编码与解码定义 编码:把java对象根据协议封装成二进制数据包的过程 解码:从二进制数据包中解析出Java对象的过程 1.1.2 设计了如下几个类 文件名类型描述Serializerinterface 作用&#…

MacOS Docker 安装和运行原理

本文讲述主要是基于Mac电脑安装教程,使用的是homebrew安装,未安装homebrew的请先自行安装下 一、使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker。Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew…

【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)

文章目录前言一、数据准备二、训练三、结果前言 Imagenet是计算机视觉的经典分类比赛,但是Imagenet数据集本身太大了,我们穷学生没有这么大的算力,2016年google DeepMind团队从Imagnet数据集中抽取的一小部分(大小约3GB&#xff…

DBCO-PEG-Methacrylate_DBCO-PEG-MA_二苯并环辛炔-PEG-甲基丙烯酸酯

一、试剂基团反应特点(Reagent group reaction characteristics):DBCO(二苯并环辛炔)是一种环炔烃,可以通过在水溶液中通过应变促进的1,3-偶极环加成反应与叠氮化物反应,这种生物正交反应也称为…

Crack:MindFusion.Diagramming for ASP.NET V7.0

MindFusion.Diagramming for ASP.NET V7.0 MindFusion.Diagramming for ASP.NET 为 Web 应用程序提供图表功能。它包括丰富的预定义图表节点以及具有无限行数和列数的表节点。您可以在容器中组织节点,形状设计器 UI 工具可帮助您快速轻松地生成自己的图表节点。 添加…

GD32F450工程模板创建

一、新建工程目录 序号文件夹备注1Project存放工程文件,编译文件等。2Firmware存放ARM内核文件,标准外设库文件等。3Hardware存放开发板的硬件驱动文件。4App存放应用层文件。5User存放main函数,gd32f4xx_it文件,systick文件。6D…

【GD32F427开发板试用】07-硬件SPI驱动0.96LCD

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:Stark_GS SPI 简介及特点 具有全双工、半双工和单工模式的主从操作。16位宽度,独立的发送和接收缓冲区。8位或16位数据帧格式。低…

火出圈的《中国奇谭》,如果浪浪山的小妖怪们也用WorkPlus

你会被一只小妖怪感动到破防吗? 最近,由上海美术电影制片厂和B站联合推出的动画片《中国奇谭》火了,仅仅一上线就被打出9.9的高分,频繁登上微博热搜。 其中,第一集《小妖怪的夏天》取材自《西游记》,却从…

Unity编辑器右键菜单实现多平台游戏资源打包—AssetBundle的构建

文章目录👉一、初识AssetBundle👉二、创建AssetBundle👉三、动手操作:实现右键菜单打包AssetBundle👉一、初识AssetBundle AssetBundle是Unity提供的一种打包资源的文件格式,比如模型、纹理和音频文件等的各…

大数据导论

数据是什么数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合,它是可识别的、抽象的符号。它不仅指狭义上的数字,还可以是具有一定意义的文字、字母、数字符号的组…

python学习 --- 元组基础

目录 一、什么是元组 1、不可变序列和可变序列 2、元组 二、 元组的创建方式 1、小括号(可省略) 2、内置函数tuple() 三、元组的获取与遍历 1、元组的获取 2、元组的遍历 一、什么是元组 1、不可变序列和可变序列 不可变序列:没有增…

使用streamlit记录

官方网址:https://docs.streamlit.io/ 官方网址:https://discuss.streamlit.io/t/streamlit-components-community-tracker/4634 官方网址:https://github.com/streamlit/streamlit 第三方插件网址:https://github.com/arnaudmiri…

Solidity 中的数学(第 2 部分:溢出)

本文是关于在 Solidity 中进行数学运算的系列文章中的第二篇。这次的主题是:溢出。 介绍 每次我看到、*或**审计另一个 Solidity 智能合约时,我都会开始写以下评论:“这里可能会溢出”。我需要几秒钟来写这四个字,在这几秒钟内&a…