[机器学习]--线性回归算法

线性回归算法原理

线性关系在生活中有很多案例:

  • 摄氏度和华氏度的转化: F = C ⋅ 9 5 + 32 F = C \cdot\frac{9}{5}+32 F=C59+32
  • 学科最终成绩的计算: 最终成绩 = 0.3 × \times × 平时成绩 + 0.7 × \times ×期末成绩

线性回归(Linear regression)就是利用回归函数对一个或多个自变量和因变量关系建立类似如上模型的一种分析方式

通用公式:
h ( w ) = w 1 x 1 + w 2 x 2 + . . . + b = w T x + b h(w)=w_1x_1+w_2x_2+...+b=w^Tx+b h(w)=w1x1+w2x2+...+b=wTx+b
其中 w 1 , w 2 , . . . w_1,w_2,... w1,w2,...称为系数
x 1 , x 2 , . . . x_1,x_2,... x1,x2,...是自变量
也可以使用矩阵的形式表示:
h ( w ) = ( b w 1 w 2 . . . ) ⋅ ( 1 x 1 x 2 . . . ) h(w) = \begin{pmatrix}b \\ w_1 \\ w_2 \\...\end{pmatrix} \cdot \begin{pmatrix} 1 \\ x_1 \\ x_2 \\ ...\end{pmatrix} h(w)= bw1w2... 1x1x2...

根据自变量的数量, 可以将线性关系分为单变量线性关系, 多变量线性关系

  • 单变量线性关系

图1

  • 多变量线性关系

图2

当特征值超过两个时, 就无法使用绘图来进行可视化了, 但在数学上任然可以使用矩阵的方式表示

损失函数

损失函数可以告诉我们模型的运行情况, 以便我们更好的改进

如下图, 已知的数据集以红叉显示, 简单建立了一个线性回归模型 f w , b f_{w,b} fw,b
指定其中一点( x ( i ) , y ( i ) x^{(i)}, y^{(i)} x(i),y(i)), 该模型的预测值为 y ^ \hat{y} y^
那么该模型在该点的误差就是 y ^ − y ( i ) \hat{y} - y^{(i)} y^y(i)
假设一个有 m m m个点, 每一个点的误差平方都相加再取平均, 就得到该模型的损失函数
J ( w , b ) = 1 2 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 J(w,b) = \frac{1}{2m}\sum^{m}_{i=1}(\hat{y}^{(i)}-y^{(i)})^2 J(w,b)=2m1i=1m(y^(i)y(i))2
为了后面求导运算的简便, 取平均后再乘以 1 2 \frac{1}{2} 21
图3
通常来说, 损失函数的值越小, 模型的效果是最好的, 那么我们建立线性回归模型, 就需要找到损失函数最小是什么时候, 从而找到对应的 w , b w,b w,b值.

那么如何找损失函数的最小值?
使用梯度下降的方法

梯度下降

梯度下降是最小化任何函数的方法, 不单单只是损失函数

下图是某个模型的损失函数, 假设你站在某一个高点处, 那应该如何找到该函数的最小值?
很简单, 环顾四周, 找到最陡峭的一点, 往那个方向走一小步
到达之后再环顾四周, 找到最陡峭的一点, 往那个方向走一小步
不断重复, 就能抵达某一个局部最低点

再回到你的起始位置, 随机往某个方向偏离一点, 重复上述步骤, 你可能会到达另一个局部最低点
在这里插入图片描述
具体数学步骤也并不困难
w = w − α ∂ ∂ w J ( w , b ) w = w - \alpha\frac{\partial}{\partial w}J(w,b) w=wαwJ(w,b)
b = b − α ∂ ∂ w J ( w , b ) b = b - \alpha\frac{\partial}{\partial w}J(w,b) b=bαwJ(w,b)
这里的 α \alpha α称为学习率, 又称步长
对损失函数 J ( w , b ) J(w,b) J(w,b)求偏导, 找到最陡峭的那一点, 根据学习率更新 w , b w, b w,b, 使得损失函数不断下降, 从而找到局部最小值

下图是梯度下降算法的具体应用, 右上图是 J ( w , b ) J(w,b) J(w,b)的等高线图
起始为蓝色, 根据上面的方法不断更新 w , b w,b w,b, 从而找到损失函数的最小值
图5

注意, 学习率的取值不能太大, 也不能太小
如果取值过大, 就可能一步就超过最小值点, 损失函数反而会找不到最小值
如果取值过小, 找到最小值点的时间会很长, 算法效率很低

那么该如何选择好学习率?

作出迭代次数和损失函数 J ( w ⃗ , b ) J(\vec{w},b) J(w ,b)的图像, 根据梯度下降的方法, 随着迭代次数的增加, 损失函数的值会不断减小最后趋近某一个值, 即达到最低点

因此, 选择不同的学习率 α \alpha α, 作出相关图像, 即可找到合理的学习率
在这里插入图片描述

在更多的情况下, 我们遇到的都是多元线性回归模型
多元和单元的区别, 其实就是因变量数量的不同, 因此需要更多的参数来表示
这就要使用到线性代数的知识了, 使用向量矩阵来表示
J ( w ⃗ , b ) = 1 2 m ∑ i = 1 m ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 J(\vec{w},b) = \frac{1}{2m}\sum^{m}_{i=1}(f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2 J(w ,b)=2m1i=1m(fw ,b(x (i))y(i))2
步骤更单元的一样

线性回归模型的简单应用

1.数据说明

diabetes 是一个关于糖尿病的数据集, 该数据集包括442个病人的生理数据及一年以后的病情发展情况。

age:年龄
sex:性别
bmi(body mass index):身体质量指数,是衡量是否肥胖和标准体重的重要指标,理想BMI(18.5~23.9) = 体重(单位Kg) ÷ 身高的平方 (单位m)
bp(blood pressure):血压(平均血压)
s1,s2,s3,s4,s4,s6:六种血清的化验数据,是血液中各种疾病级数指针的6的属性值。
s1——tc,T细胞(一种白细胞)
s2——ldl,低密度脂蛋白
s3——hdl,高密度脂蛋白
s4——tch,促甲状腺激素
s5——ltg,拉莫三嗪
s6——glu,血糖水平

2.数据预处理

导入相关库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_diabetes
diabetes=load_diabetes()
data = diabetes['data']
target = diabetes['target']
feature_names = diabetes['feature_names']
df = pd.DataFrame(data,columns= feature_names)
df

在这里插入图片描述

3.模型训练

1.训练集和测试集的划分
2.实例化线性回归对象
3.传入数据训练模型
4.查看模型的系数(coef_)和截距(intercept_)

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data,target, test_size=0.2, random_state=22)
estimator = LinearRegression()
estimator.fit(x_train,y_train)

estimator.intercept_
estimator.coef_

在这里插入图片描述

4.模型评估

1.查看模型准确率:

y_pred = estimator.predict(x_test)
estimator.score(x_test,y_test)

在这里插入图片描述

2.均方误差mean_absolute_error
计算公式: n n n是样本总数, y ^ i \hat{y}_i y^i是预测值, y i y_i yi是实际值
M S E = 1 n ∑ i = 1 n ( y ^ i − y i ) 2 MSE = \frac{1}{n}\sum^{n}_{i=1}(\hat{y}_i-y_i)^2 MSE=n1i=1n(y^iyi)2

# metrics  评估
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test,y_pred)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WEB渗透免杀篇-Golang免杀

往期文章 WEB渗透免杀篇-免杀工具全集-CSDN博客 WEB渗透免杀篇-加载器免杀-CSDN博客 WEB渗透免杀篇-分块免杀-CSDN博客 WEB渗透免杀篇-Powershell免杀-CSDN博客 WEB渗透免杀篇-Python源码免杀-CSDN博客 WEB渗透免杀篇-C#源码免杀-CSDN博客 WEB渗透免杀篇-MSFshellcode免杀…

土壤墒情固定监测站的工作原理

TH-GTS03土壤墒情固定监测站是一种专门用于监测土壤墒情信息的设备,它通过一系列精密的传感器和数据处理系统,实时、准确地获取土壤的水分含量、温度以及其他相关参数,为农业生产、生态保护和水资源管理等提供重要依据。 土壤墒情固定监测站通…

想做好专业儿童研学项目解决方案,建议先看看这篇

大家好,我是爱吐槽也爱分享的“教育&科技跨界老顽童”。今天想跟大家聊聊这几年越来越火的“沉浸式数字化研学”,因为前不久刚刚参与了一个不错的专业儿童研学项目解决方案,有一些心得想要及时分享,尤其是也想搞专业儿童研学项…

vue3 安装element-plus进行一些简单的测试

1、安装element-plus 官网地址:https://element-plus.org/zh-CN/guide/installation.html 2、安装方法: # 选择一个你喜欢的包管理器# NPM npm install element-plus --save# Yarn yarn add element-plus# pnpm pnpm install element-plus 这里我选择…

STM32G474的HRTIM用作时基定时器

STM32G474的HRTIM由7个定时器组成,分别是主定时器,定时器A,定时器B,定时器C,定时器D,定时器E和定时器F,每个定时器均可单独配置,独立工作。每个定时器都有1个独立的计数器和4个独立的…

[基础入门]正向shell和反弹shell

前言 在渗透过程能获取shell是很重要的一点,首先可以使用一些漏洞对ssh和ftp进行攻击获取shell,如果没有这些漏洞可以考虑一下使用正向shell或者是反弹shell。 一、什么是正向shell和反弹shell 其实这个过程是相对的,需要找到一个参考点&a…

使用 Python 绘制词云图的详细教程

如何使用python绘制词云图 词云图(Word Cloud)是数据可视化中常用的一种技术,通过将文字以不同的大小、颜色和方向排列,以展示文本数据中词汇的频次和重要性。对于文本分析、情感分析、关键词提取等应用,词云图都能够…

【FreeRTOS】队列实验-多设备玩游戏(旋转编码器)

目录 0 前言1 任务1.1 本节源码1.2实验目的1.3实现方案 2 code2.1 创建队列2.2 写队列2.3 创建任务 3 勘误 0 前言 学习视频: 【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】…

CronTab及定时任务

目录 CronTab及定时任务 一、定时任务的基本原理 二、Cron定时任务 但是 三、其他补充命令 CronTab及定时任务 一、定时任务的基本原理 # 每5秒钟向文本中输出一次时间#for i in {1..10}; do while [ 1 < 2 ]; dodate "%Y-%m-%d %H:%M:%S" >> /opt/lea…

Prism-学习笔记1-安装Prism

安装Prism 在VS2022中安装如下图&#xff1a; 2. 搜索Prism&#xff0c;安装Prism&#xff1a;&#xff08;ps&#xff1a;如果安装很慢&#xff0c;直接往上搜关键字 Prism template Pack 下载&#xff0c;或者这里我下载好的Prism包&#xff0c;提取码&#xff1a;bi7c&…

普通高校普通教师如何应对智能时代的冲击

前篇 艰难求生的转型之路-CSDN博客 背景 增量发展阶段&#xff0c;大部分人生活随着个人努力都会出现改善&#xff1b; 存量博弈阶段&#xff0c;大部分人&#xff0c;不展开&#xff0c;求生欲。 增量→“蛋糕”越来越大&#xff1b; 存量→“蛋糕”(*^_^*)凸(艹皿艹 ) …

将 hugo 博客搬迁到服务器

1. 说明 在 Ubuntu 22.04 上使用 root 账号&#xff0c;创建普通账号&#xff0c;并赋予 root 权限。 演示站点&#xff1a;https://woniu336.github.io/ 魔改hugo主题: https://github.com/woniu336/hugo-magic 2. 服务器配置 建立 git 用户 adduser git安装 git sudo apt …

C/C++ 多线程[1]---线程创建+线程释放+实例

文章目录 前言1. 多线程创建2. 多线程释放3. 实例总结 前言 说来惭愧&#xff0c;写了很久的代码&#xff0c;一个单线程通全部。可能是接触的项目少吧&#xff0c;很多多线程的概念其实都知道&#xff0c;但是实战并没有用上。前段时间给公司软件做一个进度条&#xff0c;涉及…

亲测解决Verifying shim SBAT data failed: Security Policy Violation

在小虎用u盘安装ubuntu系统的时候&#xff0c;笔记本出现了这个问题&#xff0c;解决方法是管关闭security boot。 解决方法 利用F2\F10\F12进入Bios设置&#xff0c;关闭security boot即可。 Use F2 to enter the bios security settings, close it. 参考 Verifying shim…

揭秘Semantic Kernel:用AI自动规划和执行用户请求

在我们日益高效的开发世界中&#xff0c;将任务自动化并智能规划变得越来越必要。今天&#xff0c;我要给大家介绍一个强大的概念——Semantic Kernel中的planner功能。通过这篇文章&#xff0c;我们会学习到planner的工作原理以及如何实现智能任务规划。 什么是planner&#x…

Spring GateWay自定义断言工厂

文章目录 概要整体架构流程最终的处理效果小结 概要 我们在线上系统部署了&#xff0c;灰度环境和生产环境时&#xff0c;可以通过自定义断言工厂去将请求需要路由到灰度环境的用户调用灰度的的服务集群&#xff0c;将正常的用户调用正常集群。 这样&#xff0c;我们可以在上线…

R语言论文插图模板第7期—分组散点图

在之前的文章中&#xff0c;分享过R语言折线图的绘制模板&#xff1a; 柱状图的绘制模板&#xff1a; 本期再来分享一下散点图&#xff08;分组&#xff09;的绘制方法。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;…

碰撞检测 | 基于ROS Rviz插件的多边形碰撞检测仿真平台

目录 0 专栏介绍1 基于多边形的碰撞检测2 碰撞检测仿真平台搭建2.1 多边形实例2.2 外部服务接口2.3 Rviz插件化 3 案例演示3.1 功能介绍3.2 绘制多边形 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战…

【附源码】Python :PYQT界面点击按钮随机变色

系列文章目录 Python 界面学习&#xff1a;PYQT界面点击按钮随机变色 文章目录 系列文章目录一、项目需求二、源代码三、代码分析3.1 导入模块&#xff1a;3.2 定义App类&#xff1a;3.3 构造函数&#xff1a;3.4 初始化用户界面&#xff1a;3.5 设置窗口属性&#xff1a;3.6 …

基于距离度量学习的异常检测:一种通过相关距离度量的异常检测方法

异常通常被定义为数据集中与大多数其他项目非常不同的项目。或者说任何与所有其他记录(或几乎所有其他记录)显著不同的记录,并且与其他记录的差异程度超出正常范围,都可以合理地被认为是异常。 例如上图显示的数据集中,我们有四个簇(A、B、C和D)和三个位于这些簇之外的点:P1、P…