机器学习算法理论:线性回归

线性回归

       回归的理论解释:回归分析是确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法。按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。

       如果在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

使用线性回归时,需要遵循以下假设:

  • 要预测的因变量与自变量的关系是线性的。
  • 假设每个观测值之间是相互独立的。
  • 假设在自变量的每个取值点上,误差方差都是常数。
  • 各项误差服从正态分布。
最小二乘法

以房价预测为例。 

目标:给定房屋面积和房龄准确预测房价。

房屋面积(x_{1}房龄(x_2房价(y
642709000
10031060000
875902000
787854000

 根据以上房价为数据样本,假设:

y=\theta _0+x_1\cdot \theta _1+x_2\cdot \theta _2

其中: 

  • y为真实房价(标签)
  • \theta _0为微调模型的参数(偏置)
  • x_1为房屋面积(特征)
  • \theta _1为房屋面积在房价中影响究竟有多大(权重)
  • x_2为房龄(特征)
  • \theta _2为房龄在房价中影响究竟有多大(权重)

向量表示:

y=h_{0}(x)=\sum_{i=0}^{n}\theta _{i}x_{i}=\theta ^{T}x 

在对每个样本进行计算都会产生一个预测值,预测值与真实值之间产生误差值。误差项通常以\varepsilon来表示,则:

y^{(i)}=\theta ^Tx^{(i)}+\varepsilon ^{(i)}

所以求解的目标:就是让误差项最小,甚至为0。而每条样本产生的误差\varepsilon ^{(i)}都是独立同分布的(独立是指每套房子房价是独立的,同分布是指每套房子是在同一行情下),并且服从均值为0方差为\theta ^2的正态分布。则:

p(\varepsilon ^i)=\frac{1}{\sqrt{2\pi \sigma }}exp(-\frac{(\varepsilon ^i)^2}{2\sigma ^2})

 根据前面的公式:y^{(i)}=\theta ^Tx^{(i)}+\varepsilon ^{(i)}可得:\varepsilon ^{(i)} = y^{(i)}-\theta ^Tx^{(i)} 再与以上公式合并可得:

p(y^{(i)}|x^{(i)};\theta )=\frac{1}{\sqrt{2\pi \sigma }}exp(-\frac{(y^{(i)}-\theta ^Tx^{(i)})}{2\sigma ^2})

此时求解的目标为: 在给定了\thetax^{(i)}时,得到的真实值y^{(i)}的概率最大。

根据以上目标得到似然函数:

L(\theta )=\prod _{i=1}^{m}p(y^{(i)}|x^{(i)};\theta ) = \prod _{i=1}^{m}\frac{1}{\sqrt{2\pi \sigma }}exp(-\frac{(y^{(i)}-\theta ^Tx^{(i)})^2}{2\sigma^2})

可以理解为所有样本预测值接近真实值概率的乘积。

为方便求解将以上公式转化为对数似然函数(添加对数不影响求解目标,因为我们要得到的是一个点,而不是点对应的值):

ln(L(\theta))=ln(\prod _{i=1}^{m}p(y^{(i)}|x^{(i)};\theta))=ln(\prod_{i=1}^{m}\frac{1}{\sqrt{2\pi \sigma}}exp(-\frac{(y^{(i)}-\theta ^Tx^{(i)})^2}{2\sigma^2}))

=\sum _{i=1}^{m}ln\frac{1}{\sqrt{2\pi\sigma }}exp(-\frac{(y^{(i)}-\theta ^Tx^{(i)})^2}{2\sigma^2})

           =mln\frac{1}{\sqrt{2\pi \sigma }}-\frac{1}{\sigma ^2}\cdot \frac{1}{2}\sum ^m_{i=1}(y^{(i)}-\theta ^Tx^{(i)})^2

mln\frac{1}{\sqrt{2\pi \sigma }}和 \frac{1}{\sigma ^2} 是常数,所以目标函数转化为: 

J(\theta )=\frac{1}{2}\sum ^{m}_{i=1}(y^{(i)}-\theta ^{T}x^{(i)})^{2}

再将目标函数转化为最小二乘法根据偏导数等于0求解\theta

J(\theta )=\frac{1}{2}\sum ^{m}_{i=1}(y^{(i)}-\theta ^{T}x^{(i)})^{2}=\frac{1}{2}(y-X\theta )^T(y-X\theta )

=\frac{1}{2}(y^T-\theta^TX^T)(y-X\theta)

=\frac{1}{2}(y^Ty-y^TX\theta -\theta^TX^Ty+\theta^TX^TX\theta) 

接下来求偏导:

\Delta_\theta J(\theta )=\frac{1}{2}(2X^TX\theta-X^Ty-X^Ty) = X^TX\theta-X^Ty

令偏导数为0,则得到:

\theta =(X^TX)^{-1}X^Ty

以上是使用最小二乘法求解,接下来将通过梯度下降的方法进行不断学习来逐步优化参数θ。

梯度下降 

梯度下降法是一种常用的优化算法,用于求解目标函数的最小值。其基本原理是通过迭代的方式,不断更新参数的值,使得目标函数的值逐渐趋近于最小值。梯度下降法的核心思想是利用函数的梯度信息来指导参数的更新方向 。

常用的梯度下降方法

批量梯度下降法:这种方法计算整个数据集的梯度,然后更新参数。每个参数的更新都是整个数据集上的平均值。然而,这种方法计算量大,计算速度慢,尤其当数据集很大时。

import numpy as np# 生成模拟数据
np.random.seed(0)
X = np.random.rand(100, 1)
y = 2 * X + 1 + 0.1 * np.random.randn(100, 1)# 初始化参数
theta = np.random.randn(2, 1)
alpha = 0.01  # 学习率
iterations = 1000  # 迭代次数
m = len(y)  # 样本数量# 批量梯度下降法
for i in range(iterations):gradients = 2 / m * X.T.dot(X.dot(theta) - y)  # 计算梯度theta = theta - alpha * gradients  # 更新参数print("Theta:", theta)

随机梯度下降法:这种方法每次只使用一个样本计算梯度,然后更新参数。这种方法计算速度快,但是存在一定的随机性,可能会导致收敛速度慢或者无法收敛到全局最优解。

import numpy as npdef sgd(X, y, learning_rate=0.01, epochs=100):# 获取输入矩阵的行数和列数m, n = X.shape# 初始化参数向量theta为全零向量theta = np.zeros(n)# 进行指定轮数的迭代更新for _ in range(epochs):# 遍历数据集中的每个样本for i in range(m):# 随机选择一个样本rand_idx = np.random.randint(m)xi = X[rand_idx:rand_idx+1]yi = y[rand_idx:rand_idx+1]# 计算梯度gradients = 2 * xi.T.dot(xi.dot(theta) - yi)# 更新参数向量thetatheta = theta - learning_rate * gradients# 返回训练得到的参数向量thetareturn theta# 生成模拟数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)# 训练模型
theta = sgd(X, y)
print("Theta:", theta)

小批量梯度下降法:这种方法介于批量梯度下降法和随机梯度下降法之间,使用一部分数据(小批量)计算梯度,然后更新参数。这种方法计算速度较快,且能得到较好的优化效果。

import numpy as np# 定义小批量梯度下降法函数
def mini_batch_gradient_descent(X, y, learning_rate=0.01, epochs=100, batch_size=32):# 获取样本数量和特征数量m, n = X.shape# 初始化参数向量theta = np.zeros((n, 1))# 迭代更新参数for epoch in range(epochs):# 随机打乱样本顺序permutation = np.random.permutation(m)X_shuffled = X[permutation]y_shuffled = y[permutation]# 将数据集划分为小批量for i in range(0, m, batch_size):X_batch = X_shuffled[i:i+batch_size]y_batch = y_shuffled[i:i+batch_size]# 计算梯度gradient = (1/batch_size) * X_batch.T @ (X_batch @ theta - y_batch)# 更新参数theta -= learning_rate * gradientreturn theta# 示例数据
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([[3], [7], [11], [15]])# 调用小批量梯度下降法函数进行线性回归
theta = mini_batch_gradient_descent(X, y)
print("拟合参数:", theta)

动量梯度下降法:这种方法在每次迭代中不仅考虑当前的梯度,还考虑上次迭代的梯度方向,从而加速收敛速度并减少震荡。动量项的引入可以使得算法在优化过程中具有一定的记忆性,能够沿着之前的下降方向继续前进。

import numpy as npdef momentum_gradient_descent(X, y, learning_rate=0.01, momentum=0.9, num_iterations=100):"""使用动量梯度下降法求解线性回归问题。参数:X -- 输入数据矩阵 (m x n)y -- 目标变量向量 (m x 1)learning_rate -- 学习率 (默认值为0.01)momentum -- 动量系数 (默认值为0.9)num_iterations -- 迭代次数 (默认值为100)返回:theta -- 最优参数向量 (n x 1)"""# 初始化参数向量和动量向量m, n = X.shapetheta = np.zeros((n, 1))velocity = np.zeros((n, 1))# 迭代更新参数for i in range(num_iterations):# 计算梯度gradient = (1 / m) * X.T @ (X @ theta - y)# 更新动量向量velocity = momentum * velocity + learning_rate * gradient# 更新参数向量theta = theta - velocityreturn theta

Adam:Adam 算法是一种自适应学习率的优化算法,结合了动量梯度下降法和 RMSProp 算法的特点。它通过计算梯度的指数移动平均值来调整学习率,以更好地适应不同参数的更新速度。Adam 算法在许多任务中表现出色,被广泛应用于深度学习模型的训练。

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

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

相关文章

【Linux】Linux基础之权限

目录 一、Linux中的用户1.1 用户之间的身份切换1.2 指令提权 二、权限管理2.1 文件权限2.2 权限操作2.3 chown和chgrp 三、文件类型四、目录文件的权限操作五、权限掩码六、粘滞位 一、Linux中的用户 Linux中主要有两种用户: root,超级用户非root&…

Netfilter 是如何工作的(六):连接跟踪信息的入口创建(in)和出口确认(confirm)

Articles (gitee.io) IPtables-朱双印博客 (zsythink.net) 在 Netfilter 是如何工作的(五) 中连接跟踪信息使用的创建-确认机制的 Netfilter在报文进入系统的入口处,将连接跟踪信息记录在报文上,在出口进行confirm.确认后的连接信息 本文以一个本机上送…

【MATLAB】CEEMDAN+FFT+HHT组合算法

代码原理 集成经验模态分解(CEEMDAN)是一种信号处理方法,旨在将非线性和非平稳信号分解为本质模态函数(IMF)。这种方法通过对信号进行多轮迭代,结合了噪声干扰的累计退化,从而更好地处理了信号…

关于React你必须知道的3个错误用法。

1. 你知道如何使用“&&”吗? 在React程序中,我经常使用“&&”运算符来决定是否显示内容,如下所示: 我的组长: “你不知道&&运算符的特性吗?当请求还没有成功返回时,会直接渲染“0”。” 我并不信服, 因为我一直都是这样编写代码,从未出过错。为了…

计算机网络技术-2022期末考试解析

【前言】 这是计算机网络技术这门课,感觉和计网还是有不一样的,但也有能做的,把能做的做了。 一、单项选择题(每题2分,共20分) 1. 用于测试两台计算机连通状况的命令是 。 ( ) A. cmd B. ping C. ipconf…

Java副本的概念

在Java中,"副本"(copy)一词可以用于描述不同的概念,具体取决于上下文。以下是两个常见的用法: 对象的副本:在Java中,当你创建一个对象并将其赋值给另一个变量时,实际上是创…

配置CentOS系统以支持静态HTTP服务

CentOS是一个流行的Linux发行版,广泛应用于服务器环境。要配置CentOS系统以支持静态HTTP服务,您可以按照以下步骤进行操作: 安装Web服务器软件:CentOS自带了Apache HTTP服务器软件,您可以使用以下命令安装它&#xff1…

Go 知多少?

作为一名已接触过其他语言的开发,再去学习一门新语言可比之前轻松不少, 语言之间存在很多相似点,但是新语言也有自己的不同点,通常我会先了解它与其他语言常遇到的不同点有哪些, 使自己先能够上手编写基础程序&#…

Java多线程:初识多线程!左手画方,右手画圆

👑专栏内容:Java⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、线程与进程二、创建线程方法1、继承Thread类2、实现Runnable接口3、两者区别4、举个栗子5、简洁写法Ⅰ、Thread匿名内部类写…

DNS 正/反向解析 主从复制 分离解析

一 DNS概念它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网 每一台 DNS 服务器都只负责管理一个有限范围 根域: 全球根服务器节点只有13个,10个在美国,1个荷兰,1个瑞典,1个日本 一级域名&#xff…

【已解决】C语言实现多线程的同步与异步

说真的写了这篇博文时,才知道c语言本身不支持多线程,而是一些windowsapi让c语言拥有多线程的能力,那下面内容就以打开对话框为例,展现如何实现多线程的同步与异步。 文章目录 问题起源c语言多线程同步方案c语言多线程异步方案总结…

Typora使用及Markdow学习笔记1

编程如画,我是panda! 最近有在学习Markdown,所以这次分享一下我的Markdown学习笔记 目录 前言 一、标题 二、段落 1.换行 2.分割线 三、文字显示 1.字体 2.上下标 四、列表 1.无序列表 2.有序列表 3.任务列表 五、区块 六、代…

【Linux运维】LVM和RAID学习及实践

LVM和RAID学习及实践 背景LVM简介新加硬盘的操作RAID-磁盘阵列应用场景RAID0RAID1其他结构RAID制作RAID 小结 背景 某台服务器的磁盘管理需要自己动手处理,找了一些资料也踩了一些坑,在这里记录一下,先介绍一下LVM和RAID这两个东西。在计算机…

【天龙八部】攻略day6

关键字: 灵武、寻宝要求、雁门 1】灵武选择 西凉枫林,锦带,短匕 白溪湖,明镜,双刺 竹海,玉钩,锁甲 2】楼兰寻宝需求 等级80级,40级前6本心法 3】雁门奖励 简单35*4元佑碎金 普…

慕尼黑工业大学最新提出!单目实时密集建图的混合隐式场方法

作者:小柠檬 | 来源:3DCV 在公众号「3DCV」后台,回复「原论文」可获取论文pdf 我们提出了一种新颖的方法,它将基于深度学习的密集SLAM与神经隐式场相结合,实时生成密集地图,而无需像以前的方法那样依赖RGB-…

数据库练习题

素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varchar(10) NO…

java大学生宿舍共享厨房系统宿舍自习室宿舍洗衣房系统源码包含技术文档

主要功能:学生可注册登录,预约自己宿舍楼栋的共享厨房和评价,也可以使用该楼栋的洗衣房,查看洗衣机吹风机的使用情况和报修,还可以进入该楼栋自习室打卡和评价。管理员可管理所有的学生和宿管,分配宿舍&…

10年果粉拯救老掉牙Mac心得(没错我是标题党)

连续两周了,当我不能用Mac,或者说当我闲置了近10年隔三差五的用Mac时,成功发现我的AppleID已经无法登录了。事情是这样的,当我踌躇满志地准备改一篇稿子(潜在的稿费啊亲!)时,发现Pages竟然没有W…

用Kimi chat识别并整理图片里面的文字

Kimi chat是有OCR功能的,可以识别图片中的文字。 下面这张图片是一本书的注释,里面提到有不少图书,利用Kimi chat就可以轻松完成提取其中图书书名的任务。 先拿一张图片来做实验。Kimichat的回复: 在您提供的文件内容中&#xf…

LLM大模型显存计算

一、目录 模型参数单位内存计算案例显卡算力推理显存计算训练显存计算huggface 官网计算 模型推理/训练 需要的显存大模型输入长度与显存的关系大模型推理 多线程与显存的关系 参考:https://blog.csdn.net/Johntill/article/details/132629075 二、实现 模型参数…