多项式回归的原理及实现、多重回归的原理

news2025/1/10 12:06:41

1.多项式回归的原理及实现

笔记来源于《白话机器学习的数学》

1.1 多项式回归的原理

预测一个变量 x x x与一个变量 y y y的关系
例如:广告费 x x x与点击量 y y y
用曲线拟合数据
求导过程类比本人之前的博客进行推导,相关笔记:最小二乘法的原理及实现

n次曲线
f θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 + ⋯ + θ n x n f_{\theta}(x)=\theta_0+\theta_1x+\theta_2x^2+\cdots+\theta_nx^n fθ(x)=θ0+θ1x+θ2x2++θnxn
尽管次数越高对训练数据拟合越精确(过拟合)但我们的目的是用这个拟合曲线去预测训练数据之外的数据,需要这个曲线或模型具备泛化能力,而不是仅仅代表训练数据,过拟合使得模型不再具有代表性了,不能预测一般情形了

1.2 多项式回归的实现

广告费 x x x与点击量 y y y

import numpy as np
import matplotlib.pyplot as plt

# 读入训练数据
train = np.loadtxt('~/Downloads/sourcecode-cn/click.csv', delimiter=',', dtype='int', skiprows=1)
train_x = train[:,0] # 第一列
train_y = train[:,1] # 第二列

数据预处理步骤之一:对训练数据进行标准化 / 归一化,目的使得参数收敛会更快
计算出数据中所有x的均值 μ \mu μ 和标准差 σ \sigma σ,每个数值x按照下列式子进行标准化

# 标准化
mu = train_x.mean()
sigma = train_x.std()
def standardize(x):
    return (x - mu) / sigma

train_z = standardize(train_x)
# 展示标准化后的数据
plt.plot(train_z, train_y, 'o')
plt.show()

# 参数初始化
theta = np.random.rand(3)

# 创建训练数据的矩阵
def to_matrix(x):
    return np.vstack([np.ones(x.size), x, x ** 2]).T

X = to_matrix(train_z)

由于训练数据有很多,所以我们把 1 行数据当作 1 个训练数据,以矩阵的形式来处理会更好。

# 预测函数
def f(x):
    return np.dot(x, theta)

# 目标函数
def E(x, y):
    return 0.5 * np.sum((y - f(x)) ** 2)

# 学习率
ETA = 1e-3
# 初始化误差的差值,随后作为循环结束判断依据
diff = 1
# 初始化更新次数
count = 0

参数的更新表达式(注意更新参数时所有参数必须同步更新,确保梯度方向保持稳定)

因为此例有三个参数 θ 0 、 θ 1 、 θ 2 \theta_0、\theta_1、\theta_2 θ0θ1θ2
法一:在循环体中直接用三个式子更新三个参数

法二:将参数更新式后半部分写为矩阵形式,一个式子更新三个参数



使用梯度下降法

# 直到误差的差值小于 0.01 为止,重复参数更新
error = E(X, train_y)
while diff > 1e-2:
    # 更新结果保存到临时变量
    # 这里使用矩阵直接计算出所有参数,而不是每个参数进行更新迭代
    theta = theta - ETA * np.dot(f(X) - train_y, X)

    # 计算与上一次误差的差值
    current_error = E(X, train_y)
    diff = error - current_error
    error = current_error

    # 输出日志
    count += 1
    log = '第 {} 次 : theta = {}, 差值 = {:.4f}'
    print(log.format(count, theta, diff))

# 绘图确认
x = np.linspace(-3, 3, 100)
plt.plot(train_z, train_y, 'o')
plt.plot(x, f(to_matrix(x)))
plt.show()


以重复次数为横轴,均方误差为纵轴绘图,随着迭代次数的增多,均方误差逐渐下降

# 均方误差
def MSE(x, y):
    return (1 / x.shape[0]) * np.sum((y-f(x))**2)

# 用随机值初始化参数
theta = np.random.rand(3)

# MSE的历史记录
errors = []

# 误差的差值
diff = 1
# 重复学习
errors.append(MSE(X, train_y))
while diff > 1e-2:
    theta = theta - ETA * np.dot(f(X) - train_y, X)
    errors.append(MSE(X, train_y))
    diff = errors[-2] - errors[-1]
# 绘制误差变化图
x = np.arange(len(errors))
plt.plot(x, errors)
plt.show()

上述过程采用了梯度下降法(使用所有训练数据)对目标函数进行优化,接下来我们使用随机梯度下降法(只使用一个训练数据)对目标函数进行优化
n次随机梯度下降(耗时相对短)等价于1次梯度下降(耗时相对长)


上图中 k k k 是随机的

import numpy as np
import matplotlib.pyplot as plt

# 读入训练数据
train = np.loadtxt('~/Downloads/sourcecode-cn/click.csv', delimiter=',', dtype='int', skiprows=1)
train_x = train[:,0]
train_y = train[:,1]

# 标准化
mu = train_x.mean()
sigma = train_x.std()
def standardize(x):
    return (x - mu) / sigma

train_z = standardize(train_x)

# 参数初始化
theta = np.random.rand(3)

# 创建训练数据的矩阵
def to_matrix(x):
    return np.vstack([np.ones(x.size), x, x ** 2]).T

X = to_matrix(train_z)

# 预测函数
def f(x):
    return np.dot(x, theta)

# 均方误差
def MSE(x, y):
    return (1 / x.shape[0]) * np.sum((y - f(x)) ** 2)

# 学习率
ETA = 1e-3

# 误差的差值
diff = 1

# 更新次数
count = 0

# 重复学习
error = MSE(X, train_y)
while diff > 1e-2:
    # 使用随机梯度下降法更新参数
    p = np.random.permutation(X.shape[0]) # 随机p
    for x, y in zip(X[p,:], train_y[p]): # 选择第p行的训练数据(此例中一个x,一个y)对参数进行更新
        theta = theta - ETA * (f(x) - y) * x

    # 计算与上一次误差的差值
    current_error = MSE(X, train_y)
    diff = error - current_error
    error = current_error

    # 输出日志
    count += 1
    log = '第 {} 次 : theta = {}, 差值 = {:.4f}'
    print(log.format(count, theta, diff))

# 绘图确认
x = np.linspace(-3, 3, 100)
plt.plot(train_z, train_y, 'o')
plt.plot(x, f(to_matrix(x)))
plt.show()

2.多重回归的原理

2.1 多重回归的原理

预测多个变量 x x x与一个变量 y y y的关系
例如:广告费 x 1 x_1 x1、广告展示位置 x 2 x_2 x2、广告版面大小 x 3 x_3 x3与点击量 y y y
f θ ( x 1 , ⋯ , x n ) = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n f_{\theta}(x_1,\cdots,x_n)=\theta_0+\theta_1x_1+\theta_2x_2+\cdots+\theta_nx_n fθ(x1xn)=θ0+θ1x1+θ2x2++θnxn
θ = [ θ 0 θ 1 ⋮ θ n ] 、 x = [ x 0 x 1 ⋮ x n ] ( x 0 = 1 ) \boldsymbol{\theta}= \left [ \begin{matrix} \theta_0\\ \theta_1 \\ \vdots\\ \theta_n \end{matrix} \right ] 、 \boldsymbol{x}= \left [ \begin{matrix} x_0\\ x_1 \\ \vdots\\ x_n \end{matrix} \right ](x_0=1) θ= θ0θ1θn x= x0x1xn x0=1
f θ ( x ) = θ T x = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n f_{\boldsymbol{\theta}}(\boldsymbol{x})=\boldsymbol{\theta}^T\boldsymbol{x}=\theta_0x_0+\theta_1x_1+\theta_2x_2+\cdots+\theta_nx_n fθ(x)=θTx=θ0x0+θ1x1+θ2x2++θnxn

θ j : = θ j − η ∑ i = 1 n ( f θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j:=\theta_j-\eta\sum_{i=1}^n\big(f_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})-y^{(i)}\big)x_j^{(i)} θj:=θjηi=1n(fθ(x(i))y(i))xj(i)
上述表达式使用了所有训练数据

需要注意的是数据预处理时需要对所有变量x进行标准化
计算变量 x 1 x_1 x1所有数值的均值和标准差,利用下式对变量 x 1 x_1 x1所有数值进行标准化,其他类似

训练过程与多项式回归类似,唯一不同的是预测函数不同

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

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

相关文章

Nginx基于授权的访问控制步骤

目录 一、安装httpd-tools 二、生成用户密码认证文件 三、修改主配置文件相对应的目录,添加认证配置置顶 四、 重启服务 五、 访问网址 一、安装httpd-tools 二、生成用户密码认证文件 三、修改主配置文件相对应的目录,添加认证配置置顶 Vim /usr/loc…

【雕爷学编程】Arduino动手做(124)---24位WS2812环形灯板

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

tensorflow2模型保存和恢复

有两种方法可以保存模型: 使用检查点,一种简单的在硬盘上保存变量的方法使用SavedModel,模型结构及检查点 检查点不包含任何关于模型自身的描述:它们只是一种简单的存储参数并能让开发者正确恢复它的方法。 SavedModel格式在保…

Mysql复习多表查询

Mysql复习多表查询 1.多表关系2.多表查询概述3.内连接4. 外连接5. 自连接5.1 案例 6. 子查询6.1 标量子查询6.1.1 标量子查询案例 6.1 列子查询6.2 行子查询6.2.1 demo1 6.3 表子查询6.3.1 demo16.3.2 demo2 7.联合查询8.1 案例 附录 1.多表关系 >多表查询 项目开发中&…

【算法】代码随想录、数组——长度最小的子数组、滑动窗口实现

209.长度最小的子数组 解法思想来自代码随想录:209.长度最小的子数组 (1)暴力解法 我们暴力解法直接使用两个for循环,然后不断的遍历寻找符合条件的子序列; 初始化长度变量length和结果变量result为0和int类型最大数…

近期离职心情记录 大不了前端换行!

提了离职了,发消息给领导的时候我都不敢看,发了马上关闭了聊天框当乌龟。。。 一、大致背景介绍 现在在二线城市的上市公司,本人大专学历,学的是java(甚至还报名了培训班)。第一个公司是现在公司的外包公司…

管理类联考——逻辑——知识篇——论证推理——七、论证方式——haimian

论证方式 考点分析 削弱 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量211111 题型分类 关键问题 题型特征 典型问法: 为了评价上述论证的正确性,回答以下哪个问题最为重要以下哪项对于评价上述结论最为重要? 思路点拨…

【IMX6ULL驱动开发学习】10.设置uboot使用网络加载zImage和dtb

1. 在uboot中设置网络 首先启动自己的板子,使用 ifconfig 命令或者 ifconfig -a 命令查看自己网卡的地址 ifconfig ifconfig -a我的网卡地址是这个 52:15:66:2E:16:71接着设置自己的ip setenv ipaddr 192.168.1.100设置服务器ip setenv serverip 192.168.1.200保…

如何系列 如何在单机和集群环境保证代码线程安全

文章目录 什么是线程安全什么场景下会发生如何保证线程安全单机环境1.无状态设计2.使用final关键字(不可变)3.使用synchronized关键字4.使用volatile关键字5.使用java.util.concurrent.atomic包中的原子包装类6.使用java.util.concurrent.locks包中的锁7…

【ROS2】(导航-05)在 Navigation-ROS 2上加载地图

一、说明 如何建立ROS2的导航地图?在ROS2的服务器中,其中有一个地图服务器,该服务器与参数服务器类同,当外界节点请求的时候,将新的地图导入导航系统中。注意,这里新的地图就是因为场景足够大时&#xff0c…

Docker常见使用

Docker常见使用 1、Docker安装 ## 下载阿里源repo文件 $ curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo $ curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo$ yum clean …

Linux系统编程(多进程编程深入2)

文章目录 前言一、进程退出状态二、进程退出状态宏的使用三、wait的局限性四、waitpid函数讲解五、使用fork函数创建两次孙进程解决子问题总结 前言 本篇文章继续讲解多线程编程。 一、进程退出状态 进程退出状态(Exit Status)指的是进程在终止时返回…

HTML中的常用标签用法

作者:爱塔居 专栏:javaEE 作者简介:大三学生,希望和大家一起进步 目录 一、注释标签 二、标题标签:h1-h6 三、段落标签:p 四、换行标签:br 五、格式化标签 六、图片标签:img 七、超链…

快速排序到底有多快

作者主页:paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《算法详解》专栏,本专栏是针对于大学生,编程小白精心…

ECS服务器上搭建一个Java开发环境

ECS服务器上搭建一个Java开发环境 本步骤将在ECS服务器上搭建一个Java开发环境,包括OpenJDK 1.8和Maven 3.6.3,并配置阿里云镜像仓库。 执行如下命令,安装OpenJDK 1.8。 yum -y install java-1.8.0-openjdk-devel.x86_64执行如下命令&…

【NLP】用python实现文本转语音处理

一、说明 介绍一款python调用库,离线软件包pyttsx3 API,它能够将文字转化成语音文件。Python 中有多种 API 可用于将文本转换为语音。pyttsx3 是一个非常易于使用的工具,可将输入的文本转换为音频。与其它类似的库不同,它可以离线…

AutoSAR系列讲解(入门篇)2.2-SWC的类型(APPL)

SWC的类型 一、原子级的SWC(Atomic SWC) 二、集合级的SWC(Composition SWC) 三、特殊的SWC 一、原子级的SWC(Atomic SWC) 原子级的SWC(Atomic SWC):故名思意&#xff…

git 的基本操作

1. git建立本地仓库 在想要建立的目录下输入命令 git init 我们可以看一下 .git目录下有什么 2. 配置git本地仓库 配置用户的 name 和 email 命令:git config [...] 配置完后,我们像查看一下 刚才的配置 2.1 查看配置命令 git config -l 2.2 删除…

【CS144-2021】Stanford 计算机网络课程学习

CS144 2019 Fall:https://kangyupl.gitee.io/cs144.github.io/2020 Fall:https://github.com/lawliet9712/Stanford-CS144-2021【推荐】2021 Fall:https://github.com/Kiprey/sponge 前前后后弄了半个月,终于啃完 CS144 了&#…

VLAN基础知识3_VLAN间三层通信(单臂路由)

目录 1.VLAN单臂路由简介 2.基于单臂路由VLAN间三层通信原理 3.VLAN间三层通信单臂路由实验 3.1 常用配置命令 3.2 实验配置步骤 3.3实验效果 1.VLAN单臂路由简介 单臂路由(One-Arm Router)是一种网络拓扑结构,其中一个路由器的一个接…