线性回归(梯度下降)

首先说案例:

房子的价格和所占面积有着很大的关系,假如现在有一些关于房子面积和价格的数据,我要如何根据已经有的数据来判断未知的数据呢?

假如x(房屋面积),y(房屋价格)

x=[ 56 72 69 88 102 86 76 79 94 74]

y=[92, 102, 86, 110, 130, 99, 96, 102, 105, 92]

单变量梯度下降

我们可以看到x和y有一定的关系。假如,我们令

$y=\omega x + b$

这里有两个未知数(\omega,b),我们要如何求得这两个未知数?

我们现在知道的是什么?是所有的x、y的真实值。我们想干什么?想要用公式来预测。预测什么?根据x预测y。我们可以不断尝试改变w和b的值,来判断其预测的准确性。因此这里的w和b是变量。我们要如何衡量这个变量取值后预测的准确性呢?我们可以看下面的图:红线是预测直线,点是真实的面积和价格。可以看到其中不乏存在误差,我们的目标就是使误差达到最小值。那么我们如何来衡量误差呢?我们加下来引进以下术语:

模型函数:y= \omega x + b,也可写成:h_{\omega,b}(x)=\omega x + b

规定:

x^{(i)}第i条记录(样本)
m总样本数

损失函数:

我们要定义一个函数来衡量误差的大小,这个函数称为损失函数

那么如何定义损失函数才能够准确衡量呢?

首先要体现预测值与真实值的误差,那就需要有预测值与真实值的差。

J(\omega,b)=\frac{\sum_{i=1}^{m}(h_{w,b}(x^{(i)})-y^{(i)})^{2}}{2m}

这里用到平方使值都为正数,以便不会相加的时候正负抵消,这里除以m是为了使随着m的增大让损失函数不会递增,这里分母上的2是为了后续计算简便。

我们现在的任务就是求解损失函数J的最小值时对应的w和b。

这里我们引入梯度下降法。网上有很多讲解,这里就不展开。

这里展示对J求导的具体过程:

\frac{\partial J(\omega,b)}{\partial \omega} =\frac{1}{2m}\frac{\partial (\sum_{i=1}^{m}(\omega x^{(i)}+b-y^{(i)})^{2})}{\partial \omega} =\frac{\sum_{i=1}^{m}2 (\omega x^{(i)}+b-y^{(i)})x^{(i)}}{2m} =\frac{\sum_{i=1}^{m}(h_{\omega,b}(x^{(i)})-y^{(i)})x^{(i)}}{m}

梯度下降:

\omega=w-\alpha \frac{\partial J(\omega,b)}{\partial w}

b=b-\alpha \frac{\partial J(\omega,b)}{\partial b}

多变量梯度下降

下面看向量化的内容:

上面的参数只有一个,但是现实生活中影响因子可不止一个,假如有10000个我们肯定不能像上面那样写成一个乘一个。

 波士顿房价数据集 是机器学习中非常知名的数据集,它被用于多篇回归算法研究的学术论文中。该数据集共计 506 条,其中包含有 13 个与房价相关的特征以及 1 个目标值(房价)。

数据在这里:https://labfile.oss.aliyuncs.com/courses/1081/course-5-boston.csv

该数据集统计了波士顿地区各城镇的住房价格中位数,以及与之相关的特征。每列数据的列名解释如下:

  • CRIM: 城镇犯罪率。
  • ZN: 占地面积超过 2.5 万平方英尺的住宅用地比例。
  • INDUS: 城镇非零售业务地区的比例。
  • CHAS: 查尔斯河是否经过 (=1 经过,=0 不经过)。
  • NOX: 一氧化氮浓度(每 1000 万份)。
  • RM: 住宅平均房间数。
  • AGE: 所有者年龄。
  • DIS: 与就业中心的距离。
  • RAD: 公路可达性指数。
  • TAX: 物业税率。
  • PTRATIO: 城镇师生比例。
  • BLACK: 城镇的黑人指数。
  • LSTAT: 人口中地位较低人群的百分数。
  • MEDV: 城镇住房价格中位数。(需要预测的)

我们现在有n个参数\omega_{1}\omega_{2}\omega_{3} \cdots \omega_{n-1}\omega_{n},写成向量的形式就是\vec{\omega}=[\omega_{1}\cdots \omega_{n}]

现在模型就是:f_{\vec{\omega},b}=\vec{\omega}\cdot \vec{x}+b

损失函数是:J(\vec{\omega},b)

梯度下降重复操作是:

repeat:

\omega_{j}=w_{j}-\alpha \frac{\partial J(\vec{\omega},b)}{\partial \omega_{j}}

b=b-\alpha \frac{\partial J(\vec{\omega},b)}{\partial b}

接下来我们具体对损失函数求导:

接下来介绍一些线性回归的一些API:

import sklearn.linear_model as lm
#创建模型
model = lm.LinearRegression()
#训练模型
#输入为一个二维数组表示的样本矩阵
#输出为每个样本最终结果
model.fit(输入,输出)#
#预测输出
#输入array是一个二维数组,每行是一个样本,每一列是一个特性
result = model.perdict(array)

假如下面是总体数据:

x1x2x3y

那么这个就是输入:

这就是输出:

这里使用上面的数据进行测试:

我们的思路如下:

import pandas as pd
import numpy as np
import matplotlib

matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

features = pd.read_csv("https://labfile.oss.aliyuncs.com/courses/1081/course-5-boston.csv")
target = features['medv']
split_num = int(features.shape[0] * 0.7)  # 得到 70% 位置  # 目标值数据
X_train = features[:split_num]  # 训练集特征
y_train = target[:split_num]  # 训练集目标

X_test = features[split_num:]  # 测试集特征
y_test = target[split_num:]  # 测试集目标

model = LinearRegression()  # 建立模型
model.fit(X_train, y_train)
print("系数为", model.coef_)
print("截距为", model.intercept_)

pre = model.predict(X_test)


# 计算平均绝对误差(MAE):
def mae_value(y_true, y_pred):
    n = y_true.shape[0]
    mae = sum(np.abs(y_true - y_pred)) / n
    return mae


# 计算均方误差(MSE)
def mse_value(y_true, y_pred):
    n = y_true.shape[0]
    mse = sum(np.square(y_true - y_pred)) / n
    return mse


mae = mae_value(y_test.values, pre)
mse = mse_value(y_test.values, pre)

print("MAE: ", mae)
print("MSE: ", mse)
plt.figure(figsize=(10, 6))
plt.scatter(y_test.index,y_test.values, color='blue', label='真实值', marker='o')
plt.scatter(y_test.index,pre, color='red', label='预测值', marker='x')
plt.title("预测值与真实值比较")
plt.xlabel('样本编号')
plt.ylabel('房价')
plt.legend(loc='best')
plt.grid(True)
plt.show()

结果:
系数为 [-3.89487871e-15 -5.03069808e-15  3.26128013e-16  9.53456200e-15
  1.23485884e-14 -1.95123865e-15 -4.26741975e-15  6.41414005e-16
  2.91894330e-16  2.81025203e-16  1.00033913e-15 -5.89805982e-17
 -1.12323345e-16  1.00000000e+00]
截距为 2.4513724383723456e-13
MAE:  6.197381789039163e-14
MSE:  7.683577875093926e-27

因为数据给的有点刻意,所以预测结果非常匹配。

注意:这里使用的学习率和最大迭代次数都是固定的,如果想要修改可以通过如下:
 

model = SGDRegressor(learning_rate='constant', eta0=0.01, max_iter=1000, tol=1e-3)

其中:
 

  1. learning_rate

    • 这个参数决定了学习率的调度方法(schedule)。它可以取以下值之一:
      • 'constant':使用恒定的学习率,即 eta0
      • 'optimal':使用一个自适应的学习率,这个学习率取决于初始学习率、当前步数和正则化项。
      • 'invscaling':使用逆比例调度的学习率,学习率会随时间步数的增加而减少。
      • 'adaptive':如果一次训练中的损失未减少,学习率会逐步减少。
  2. eta0

    • 初始学习率。当 learning_rate 设为 'constant''invscaling' 或 'adaptive' 时,这个值就决定了模型的初始学习率。对于 SGDRegressoreta0 是模型学习参数更新的步长。
  3. max_iter

    • 最大迭代次数。它决定了训练模型时允许的最大迭代次数。对于大型数据集,可能需要更多的迭代次数才能使模型收敛。
  4. tol

    • 容差(tolerance)。训练过程会在损失函数的变化小于这个容差值时提前停止,意味着模型已基本收敛。如果设置得过小,模型可能会运行更多的迭代次数才能收敛。

下面看一个纯手敲的版本:
添加一个截距项,方便矩阵相乘得出,偏移项b

# 增加一个截距项
X_train = np.c_[np.ones(X_train.shape[0]), X_train]
X_test = np.c_[np.ones(X_test.shape[0]), X_test]

这个代码:X_train.shape得到的是一个元组(行数,列数),再[0]取出行数。然后用np.ones创建一个这么多行的全为1的矩阵。np.c_是将两个矩阵连接(水平连接)

接下来是梯度下降的过程:
 

def gradient_descent(X, y, learning_rate=0.01, max_iter=1000, tol=1e-3):
    m, n = X.shape
    theta = np.zeros(n)
    for iteration in range(max_iter):
        gradient = X.T.dot(X.dot(theta) - y) / m
        new_theta = theta - learning_rate * gradient
        if np.linalg.norm(new_theta - theta, ord=1) < tol:
            break
        theta = new_theta
    return theta
  1. 输入参数:

    • X: 特征矩阵,其中每行代表一个样本,每列代表一个特征。
    • y: 目标变量的向量。
    • learning_rate: 学习率,控制每次更新的步长,默认为0.01。
    • max_iter: 最大迭代次数,用于控制梯度下降的迭代次数,默认为1000。
    • tol: 容忍度,用于控制算法收敛的阈值,默认为1e-3。
  2. 初始化参数:

    • m, n = X.shape: 获取特征矩阵 X 的行数(样本数)和列数(特征数)。
    • theta = np.zeros(n): 初始化参数向量 theta,全部设为零,长度与特征数相同。
  3. 梯度下降迭代:

    • for iteration in range(max_iter)::循环执行梯度下降迭代。
    • gradient = X.T.dot(X.dot(theta) - y) / m: 计算梯度,这里使用了线性回归模型的损失函数的梯度公式。
    • new_theta = theta - learning_rate * gradient: 更新参数向量 theta,向梯度的负方向移动一定步长。
    • if np.linalg.norm(new_theta - theta, ord=1) < tol::检查参数更新的变化是否小于阈值 tol,如果满足要求则停止迭代。
    • theta = new_theta: 将更新后的参数向量赋值给 theta 继续下一次迭代。
  4. 返回结果:

    • 返回最终收敛的参数向量 theta,该向量能够使得线性回归模型拟合样本数据最佳。

看一下矩阵推导的梯度下降:
 

这里面有一些关于矩阵求导的课程:

【机器学习中的矩阵求导方法】 https://www.bilibili.com/video/BV1ZU4y1g7Zj/?share_source=copy_web&vd_source=4d2276692373e2a32789e2a8319e4a50

【【手推机器学习】矩阵求导--合集】 https://www.bilibili.com/video/BV1xk4y1B7RQ/?p=5&share_source=copy_web&vd_source=4d2276692373e2a32789e2a8319e4a50

矩阵求导(四)常见矩阵求导公式证明 - 知乎 (zhihu.com)

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

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

相关文章

MySQL 锁分类

MySQL 锁分类 在 MySQL 中&#xff0c;为了保证并发性能和数据安全&#xff0c;有多种锁机制。我们常见的有表级锁和行级锁。让我们一起来学习 MySQL 中各种锁的知识。 表级锁 表级锁是对整张表进行锁定。 表数据锁 1. 读锁 允许多个会话同时读取同一张表的数据&#xff…

大模型时代的目标检测

https://zhuanlan.zhihu.com/p/663703934https://zhuanlan.zhihu.com/p/6637039341.open set/open word/ood 这个任务是指在实际应用上可以检测任何前景物体&#xff0c;但是有些不需要预测类别&#xff0c;只要检测出框就行。在很多场合也有应用场景&#xff0c;有点像类无关…

HyperSD - 会画草图就能玩AI绘画,AI一键手绘,实时同步 本地一键整合包下载

字节跳动的Lightning团队发布的新图像模型蒸馏算法Hyper-SD&#xff0c;是一项在图像处理和机器学习领域的重要进展。这项技术通过创新的方法提升了模型在不同推理步骤下的性能&#xff0c;同时保持了模型大小的精简。 基于这个算法模型&#xff0c;一个很实用的功能出现了&am…

知识图谱入门笔记

自学参考&#xff1a; 视频&#xff1a;斯坦福CS520 | 知识图谱 最全知识图谱综述 详解知识图谱的构建全流程 知识图谱构建&#xff08;概念&#xff0c;工具&#xff0c;实例调研&#xff09; 一、基本概念 知识图谱&#xff08;Knowledge graph&#xff09;&#xff1a;由结…

本地部署,MODNet 背景去除大模型

目录 摘要 引言 MODNet 架构 关键组件 技术原理 本地部署 运行结果 结论 GitHub - ZHKKKe/MODNet: A Trimap-Free Portrait Matting Solution in Real Time [AAAI 2022]A Trimap-Free Portrait Matting Solution in Real Time [AAAI 2022] - ZHKKKe/MODNethttps://gith…

【Linux】软件管理工具 yum

文章目录 概念搜索&#xff1a;yum list安装&#xff1a;yum install卸载&#xff1a;yum remove 概念 在Linux下安装软件&#xff0c;可以下载到程序的源代码&#xff0c;进行编译得到可执行程序&#xff0c;另外这些软件还有依赖其它工具的问题&#xff0c;还得下载编译这些依…

鸿蒙小练习

bean对象 export class BannerImage{id:numberurl:stringtargetUrl:stringproductId:numberconstructor(id: number, url: string, targetUrl: string, productId: number) {this.id idthis.url urlthis.targetUrl targetUrlthis.productId productId} }export class d…

嵌入式应用开发之模块驱动移植教程

前言:本篇主要面向小白的小伙伴&#xff0c;提供一些基础的模块移植教程&#xff0c;不涉及预处理指令类的移植教程。 #为什么要移植驱动 这个问题&#xff0c;可以来说是显而易见的&#xff0c;在标准库的开发过程中&#xff0c;如果重新写一个模块的驱动&#xff0c;从串行通…

Autosar Dcm配置-0x28服务ComControl-基于ETAS软件

文章目录 前言DcmDcmDsdDcmDspBswMBswMModeRequestPortBswMModeConditionBswMLogicalExpressionBswMActionBswMActionListBswMRule总结前言 0x28服务主要用来控制非诊断报文的通讯,一般在刷写预编程过程中,用来禁止APP的通信报文,可以减少总线负载率,提高刷写成功率。本文…

【Orange Pi AI Pro】开箱体验完,发现是真的强!!!

最近香橙派联合华为出了一款新的AI开发板——Orange Pi AI Pro&#xff0c;关键是搭载了昇腾AI处理器提供了8TOPS INT8的算力&#xff0c;作为一个嵌入式的CSDN博主&#xff0c;当然得体验一下这款新产品。 文章目录 1 开箱2 硬件介绍2.1 开发板硬件详情&#xff1a;2.2 顶层视…

分享浏览器被hao123网页劫持,去除劫持的方式

昨天看python相关的自动化工作代码时&#xff0c;发现谷歌浏览器被hao123劫持了&#xff0c;把那些程序删了也不管用 方法1&#xff1a;删除hao123注册表&#xff0c;这个方式不太好用&#xff0c;会找不到注册表 方法2&#xff1a;看浏览器快捷方式的属性页面&#xff0c;一…

keil5新建stm32工程的基本

1、建立工程文件夹&#xff0c;keil中新建工程&#xff0c;选择型号&#xff1b; 2、工程文件夹里建立自己所需要的文件夹等&#xff0c;复制固件库里面的文件到工程文件夹里&#xff1b; 3、将工程里建立对应的同名的分组&#xff0c;并将文件夹内的文件添加到工程分组中。 点…

MQTT——Mosquitto使用(Linux订阅者+Win发布者)

前提&#xff1a;WSL&#xff08;Ubuntu22&#xff09;作为订阅者&#xff0c;本机Win10作为发布者。 1、Linux安装Mosquitto 命令行安装。 sudo apt-get install mosquitto 以上默认只安装了mosquitto的服务&#xff0c;不带测试客户端工具mosquitto_sub和mosquitto_pub。如…

IC5000_IC5700 License激活步骤

文章目录 前言连接硬件License RequestLicense Progam 前言 用过的调试器除了Lauterbach之外&#xff0c;iSystem的应该是比较好用的&#xff0c;比Lauterbach也便宜一些。本文介绍IC5000的License激活说明&#xff0c;前提是正版采购了IC5000及对应的license 连接硬件 电源…

鸿蒙瀑布流和欢迎页(1)

1.瀑布流 https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis-arkui/arkui-ts/ts-container-waterflow.md他有官网文档&#xff0c;有个瀑布流的案例 自定义一类实现官方瀑布流接口 // WaterFlowDataSource.ets// 实现IDataSource接口的…

开源项目:机遇与挑战共存的创新之路

开源项目&#xff1a;机遇与挑战共存的创新之路 开源&#xff08;Open Source&#xff0c;开放源码&#xff09;被非盈利软件组织&#xff08;美国的Open Source Initiative协会&#xff09;注册为认证标记&#xff0c;并对其进行了正式的定义&#xff0c;用于描述那些源码可以…

安全防御---防火墙实验1

安全防御—防火墙实验1 一、实验拓扑与要求 要求&#xff1a; 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 …

6-7 宠物领养开发及相关代码

6-7 宠物领养开发及相关代码&#xff08;react区块链实战&#xff09; 来到ant-design https://ant.design/index-cn https://ant.design/components/layout-cn/ 来到布局 选择一个简单的布局即可 会显示出所有的相关界面的代码 根据对应界面的代码在我们的react项目woniu-…

Vagrant配合VirtualBox搭建虚拟机

目录 前言一、软件下载及安装1.下载2.安装扩展&#xff1a; 二、创建一个虚拟机1.Vagrant官方镜像仓库 三、使用远程工具连接虚拟机1.修改相关配置文件 四、虚拟机克隆及使用1.通用配置2.简单搭建一个java环境3.克隆虚拟机1.重命名虚拟机&#xff08;可选&#xff09;2.打包指定…

【精品资料】数字乡村一体化解决方案(45页PPT)

引言&#xff1a;数字乡村一体化解决方案是响应国家乡村振兴战略&#xff0c;依托现代信息技术和数字经济理念&#xff0c;对乡村进行全面改造和升级的综合框架。该方案旨在通过数字化手段&#xff0c;推动乡村产业、治理、文化、教育、医疗等领域的协同发展&#xff0c;实现乡…