机器学习模型——线性回归

server/2024/11/28 11:39:57/

文章目录

  • 前言
  • 1.基础概念
  • 2.代价函数
  • 3.单变量线性回归
    • 3.1加载数据
    • 3.2初始化超参数
    • 3.3梯度下降算法
      • 3.3.1初次梯度下降
      • 3.3.2 多次梯度下降
      • 3.3.3结果可视化

前言

随着互联网数据不断累积,硬件不断升级迭代,在这个信息爆炸的时代,机器学习已被应用在各行各业中,可谓无处不在。在入门机器学习时,所学习的第一个模型大概率是线性回归模型,本篇博客从底层原理到代码实现一步一步带你了解如何是线性回归

1.基础概念

线性回归旨在建立一个线性模型,通过若干带有标注的样本数据构造出一个预测模型f(x),用于描述自变量(特征)与因变量(目标)之间的关系。
最典型的线性回归模型,同时也是举例最多的例子便是预测房价,网上也有很多相关的数据集。其数学模型可以表示为:
在这里插入图片描述
拆开形式为:
在这里插入图片描述
当然也可以将参数b融入w向量中,只需在所有样本x后面加上新的属性值为1即可

2.代价函数

对于线性回归问题,一般使用平方误差作为代价函数,所以代价函数可以表示为:
在这里插入图片描述
所以训练的目标为让代价函数最小,此时我们可以直接求偏导令其等于零,来确定参数w,b,也可以使用梯度下降算法,此处本篇博客使用梯度下降算法,在运用梯度下降算法之前我们需要确定梯度,推导过程如图所示:
在这里插入图片描述后续算法设计时需要用到。
这里对 梯度下降简要解释一下 :对一个函数,根据某点的梯度(斜率),以一定的步长即学习率来逼近极值点。

3.单变量线性回归

现在大多数都会用sklearn来实现线性回归模型,而忽略了底层如何实现的,所以本篇博客介绍如何一步一步实现梯度下降,而不使用现有以封装好的库

3.1加载数据

此处我们使用pandas库提供的函数来读取csv格式的文件

import pandas as pd
df=pd.read_csv('./data/regress_data1.csv')
x=df.iloc[:,:1].values
y=df.iloc[:,1:2].values

运行结果:
在这里插入图片描述

3.2初始化超参数

w=0
b=0
predict=w*x+b

在这里插入图片描述
此时该模型预测结果为predict,显然不是一个好的模型,因此需要梯度下降来调整超参数w,b,此时我们计算一下当前模型的代价:

import numpy as np
m=len(x)
loss=np.sum(np.power(y-predict,2))/(2*m)

在这里插入图片描述

3.3梯度下降算法

3.3.1初次梯度下降

在这里插入图片描述
在计算梯度下降时,你可能出现这个问题,反正我出现了,但慢慢调过后就没了,原因是它把它当作矩阵处理的所以出现这个问题,所以可以之间将其转化为向量就会避免这个问题出现了
x为矩阵,而不是向量
向量
因此正确代码应该为:

w=0
b=0
learning_rate=0.0
temp_w=w-np.dot((predict-y)[:,0],x[:,0])/m*learning_rate
temp_b=b-np.sum(predict-y)/m*learning_rate
w=temp_w
b=temp_b
w,b

在这里插入图片描述
此时的代价函数为:

predict=w*x+b
np.sum(np.power(y-predict,2))/(2*m)

在这里插入图片描述
此时发现该模型的代价比之前模型的代价更低

3.3.2 多次梯度下降

此处我们迭代了1000次,并输出了损失

learning_rate=0.01
w=0
b=0
for epoch in range(1000):temp_w=w-np.dot((predict-y)[:,0],x[:,0])/m*learning_ratetemp_b=b-np.sum(predict-y)/m*learning_ratew=temp_wb=temp_bpredict=w*x+bloss=np.sum(np.power(y-predict,2))/(2*m)if((epoch+1)%100==0):print("第{}轮梯度下降后的损失为:{}".format(epoch+1,loss))

输出结果:
在这里插入图片描述

3.3.3结果可视化

import matplotlib.pyplot as plt
learning_rate=0.01
w=0
b=0
plt.scatter(x,y)for epoch in range(1000):temp_w=w-np.dot((predict-y)[:,0],x[:,0])/m*learning_ratetemp_b=b-np.sum(predict-y)/m*learning_ratew=temp_wb=temp_bpredict=w*x+bloss=np.sum(np.power(y-predict,2))/(2*m)if((epoch)%100==0):print("第{}轮梯度下降后的损失为:{}".format(epoch,loss))plt.plot(x, predict)
plt.show()

在这里插入图片描述


http://www.ppmy.cn/server/145612.html

相关文章

嵌入式linux C++通用makefile模板

编译生成spdlog_app可执行程序 #Makefile # 编译器 #COMPLITEarm-none-linux-gnueabi- #COMPLITE/root/share/nuvoton_cross/arm_linux_4.8/bin/arm-nuvoton-linux-uclibceabi- #/root/share/nuvoton_cross/host/usr/bin/ COMPLITEarm-nuvoton-linux-gnueabi- CC$(COMPLITE)gc…

redis中的bigkey及读取优化

一、bigKey介绍 1、简介 在 Redis 中,Big Key(大键)指的是占用大量内存的单个键。通常,Redis 是一个高性能的内存数据库,但是当某些键变得非常大时,会带来性能上的影响。例如,大量的内存消耗、长时间的操作延迟,甚至可能导致 Redis 停止响应或崩溃。 通俗的来说,指…

macOS 开发环境配置与应用开发指南

macOS 开发环境配置与应用开发指南 macOS作为苹果公司推出的操作系统,因其稳定性、优雅的用户界面和强大的开发支持,已成为开发者和创意专业人士的首选平台之一。无论是开发iOS、macOS桌面应用,还是Web应用、跨平台程序,macOS都提…

【Linux网络编程】TCP套接字

TCP与UDP的区别: udp是无连接的、面向数据报(通信时以数据报为单位传输)的传输层通信协议,其中每个数据报都是独立的,通信之前不需要建立连接,bind绑定套接字后直接可以进行通信。 tcp是面向连接的、基于字…

Python 爬虫入门教程:从零构建你的第一个网络爬虫

网络爬虫是一种自动化程序,用于从网站抓取数据。Python 凭借其丰富的库和简单的语法,是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识,并实现一个简单的爬虫项目。 1. 什么是网络爬虫? 网络爬虫&#x…

yum源配置(本地和网络源)

本地 需要先使用命令创建目录 mkdir -p /mnt/cdrom [rootlocalhost ~]# cd /etc/yum.repos.d [rootlocalhost yum.repos.d]# tar -czf CentOS-Base.tar.gz CentOS* [rootlocalhost ~]#rm -rf *repo [rootlocalhost yum.repos.d]# vi local.repo [local] namelocal_yum…

11.19c++面向对象+单例模式

编写如下类: class File{ FILE* fp }; 1:构造函数&#xff0c;打开一个指定的文件 2:write函数 向文件中写入数据 3&#xff1a;read函数&#xff0c;从文件中读取数据&#xff0c;以string类型返回 代码实现&#xff1a; #include <iostream>using namespace std;class…

1panel专业版防火墙自定义规则使用记录

案例一&#xff1a;自建lsky 使用1panel防火墙自定义规则通过匹配正则表达式实现仅可访问/i和/lsky 目录 注意&#xff1a;这里的lsky的服务是是使用的反代&#xff0c;反代&#xff0c;这里是用的反向代理&#xff0c;如果你有疑问&#xff0c;可以留言&#xff0c;看到会解答…