机器学习--归一化处理

归一化

归一化的目的

归一化的一个目的是,使得梯度下降在不同维度 θ \theta θ 参数(不同数量级)上,可以步调一致协同的进行梯度下降。这就好比社会主义,一小部分人先富裕起来了,先富带后富,这需要一定的时间,先富的这批人等待其他的人富裕起来;但是,更好途经是实现共同富裕,最后每个人都不能落下, 优化的步伐是一致的。

归一化本质

  做归一化的目的是要实现**“共同富裕”**,而之所以梯度下降优化时不能达到步调一致的根本原因其实还是 x 1 x_1 x1 x 2 x_2 x2 的数量级不同。所以什么是归一化?

  答案自然就出来了,就是把 x 1 x_1 x1 x 2 x_2 x2 的数量级统一,扩展一点说,如果有更多特征维度,就要把各个特征维度 x 1 、 x 2 、 … … 、 x n x_1、x_2、……、x_n x1x2……xn 的数量级统一,来做到无量纲化。

最大值最小值归一化

emsp; 也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间。转换函数如下:

X ∗ = X − X _ m i n X _ m a x − X _ m i n X^* = \frac{X - X\_min}{X\_max -X\_min} X=X_maxX_minXX_min

  其实我们很容易发现使用最大值最小值归一化(min-max标准化)的时候,优点是一定可以把数值归一到 0 ~ 1 之间,缺点是如果有一个离群值(比如马云的财富),正如我们举的例子一样,会使得一个数值为 1,其它数值都几乎为 0,所以受离群值的影响比较大!

代码演示

import numpy as np
x_1 = np.random.randint(1,10,size=10)
x_2 = np.random.randint(100,300,size=10)
x = np.c_[x_1,x_2]
print('归一化之前的数据:')
display(x)
x_ = (x-x.min(axis=0))/(x.max(axis=0)-x.min(axis=0))
print('归一化之后的数据:')
display(x_)

在这里插入图片描述

、Z-score标准化

  这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化,叫做Z-score标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:

X ∗ = X − μ σ X^* = \frac{X - \mu}{\sigma} X=σXμ

其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

μ = 1 n ∑ i = 1 n x i \mu = \frac{1}{n}\sum\limits_{i = 1}^nx_i μ=n1i=1nxi

σ = 1 n ∑ i = 1 n ( x i − μ ) 2 \sigma = \sqrt{\frac{1}{n}\sum\limits_{i = 1}^n(x_i - \mu)^2} σ=n1i=1n(xiμ)2

  相对于最大值最小值归一化来说,因为标准归一化除以了标准差,而标准差的计算会考虑到所有样本数据,所以受到离群值的影响会小一些,这就是除以方差的好处!但是,0-均值标准化不一定会把数据缩放到 0 ~ 1 之间了。既然是0均值,也就意味着,有正有负!

代码演示

import numpy as np
x_1 = np.random.randint(1,10,size=10)
x_2 = np.random.randint(100,300,size=10)
x = np.c_[x_1,x_2]
print('归一化之前的数据')
display(x)
print('归一化之后的数据')
x_ = (x-x.mean(axis=0))/x.std(axis=0)
display(x_)

在这里插入图片描述
在sklearn 中使用z-score标准化

import numpy as np
from sklearn.preprocessing import StandardScaler
x_1 = np.random.randint(1,10,size=10)
x_2 = np.random.randint(100,300,size=10)
x = np.c_[x_1,x_2]
print('归一化之前的数据')
display(x)
Standard_scale = StandardScaler()
x_ = Standard_scale.fit_transform(x)
print('归一化之后的数据')
display(x_)

在这里插入图片描述
  那为什么要减去均值呢?其实做均值归一化还有一个特殊的好处(对比最大值最小值归一化,全部是正数0~1),我们来看一下梯度下降的式子,你就会发现 α \alpha α正数,不管 A 也就是 梯度 g 是正还是负( A 就是 y ^ − y = h θ ( x ) − y \hat{y} - y = h_{\theta}(x) - y y^y=hθ(x)y),对于所有的维度 X,比如这里的 x 1 x_1 x1 x 2 x_2 x2 来说, α \alpha α 乘上 A 都是一样的符号,那么每次迭代的时候 w 1 t + 1 w_1^{t+1} w1t+1 w 2 t + 1 w_2^{t+1} w2t+1 的更新幅度符号也必然是一样的,这样就会像下图有右侧所示:要想从 w t w_t wt 更新到 w ∗ w^* w 就必然要么 w 1 w_1 w1 w 2 w_2 w2 同时变大再同时变小,或者就 w 1 w_1 w1 w 2 w_2 w2 同时变小再同时变大。不能如图上所示蓝色的最优解路径,即 w 1 w_1 w1 变小的同时 w 2 w_2 w2 变大!
请添加图片描述

  那我们如何才能做到让 w 1 w_1 w1 变小的时候 w 2 w_2 w2 变大呢?归其根本还是数据集 X 矩阵(经过min-max归一化)中的数据均为正数。所以如果我们可以让 x 1 x_1 x1 x 2 x_2 x2 它们符号不同,比如有正有负,其实就可以在做梯度下降的时候有更多的可能性去让更新尽可能沿着最优解路径去走。

  结论:0-均值标准化处理数据之后,属性有正有负,可以让梯度下降沿着最优路径进行~

注意:

  我们在做特征工程的时候,很多时候如果对训练集的数据进行了预处理,比如这里讲的归一化,那么未来对测试集的时候,和模型上线来新的数据的时候,都要进行相同的数据预处理流程,而且所使用的均值和方差是来自当时训练集的均值和方差!

  因为我们人工智能要干的事情就是从训练集数据中找规律,然后利用找到的规律去预测新产生的数据。这也就是说假设训练集和测试集以及未来新来的数据是属于同分布的!从代码上面来说如何去使用训练集的均值和方差呢?就需要把 scaler 对象持久化, 回头模型上线的时候再加载进来去对新来的数据进行处理。

# 训练数据
import numpy as np
from sklearn.preprocessing import StandardScaler
x_1 = np.random.randint(1,10,size = 10)
x_2 = np.random.randint(100,300,size = 10)
x = np.c_[x_1,x_2]
print('归一化之前的数据:')
display(x)
standard_scaler = StandardScaler() # 模型,归一化
x_ = standard_scaler.fit_transform(x)
print('归一化之后的数据:')
display(x_)

在这里插入图片描述

scaler 持久化存储

import joblibjoblib.dump(Standard_scale, 'scaler')
#%%
# 使用之前保存的模型数据
x_new = np.array([[7, 256]])
scaler = joblib.load('./scaler')
scaler.transform(x_new)

坚持学习,整理复盘
在这里插入图片描述

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

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

相关文章

微服务 Nacos服务注册与发现

一、Nacos 功能介绍 在微服务架构下,一个业务服务会被拆分成多个微服务,各个服务之间相互通信完成整体的功能。另外,为了避免单点故障,微服务都会采取集群方式的高可用部署,集群规模越大,性能也会越高&…

为什么需要分库分表,如何实现?

本文我们主要讲解“为什么需要分库分表,如何实现”。 在前文中讲到了读写分离,读写分离优化了互联网读多写少场景下的性能问题,考虑一个业务场景,如果读库的数据规模非常大,除了增加多个从库之外,还有其他…

WaitGroup并发控制原理及底层源码实现

WaitGroup并发控制原理及底层源码实现 1.1实现原理 1.2底层源码 type WaitGroup struct {noCopy noCopy// 64-bit value: high 32 bits are counter, low 32 bits are waiter count.// 64-bit atomic operations require 64-bit alignment, but 32-bit// compilers only guaran…

态势感知是什么?在网络安全中有什么作用

态势感知是一种基于环境的、动态的、全面的洞察安全风险的能力。它以安全大数据为基础,从全局的角度,提高对安全威胁的发现识别、理解分析和处理反应能力。目的在于在大规模网络环境下,对能够引起网络态势变化的安全要素进行获取、理解、显示…

L1-041:寻找250

题目描述 对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。 输出格式: 在一行中…

程序员视角体验快速搭建智能客服中心

本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 目录 前言基本概念工作原理浅试体验体验收获最后 前言 Amazon Connect是亚马逊云科技…

2 - Electron 核心概念

Electron 核心概念 主进程 通过Node.js、Electron提供的API与系统底层打交道启动项目时运行的 main.js 脚本就是我们说的主进程。在主进程运行的脚本可以以创建 Web 页面的形式展示 GUI。主进程只有一个 渲染进程 每个 Electron 的页面都在运行着自己的进程,这样…

检查字符串是否以指定的字符串结尾str.endswith()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 检查字符串是否以指定的字符串结尾 str.endswith() [太阳]选择题 请问以下代码输出的结果是? s "I love China!" print("【执行】print(s.endswith(!))") p…

Redis设计与实现之双端链表

目录 一、Redis为什么选择双端链表作为底层数据结构? 二、双端链表 1、双端链表的应用 实现Redis的列表类型 Note: Redis列表使用两种数据结构作为底层实现: Redis自身功能的构建 2、双端链表的实现 ​编辑3、迭代器 三、双端链表在Redis中的应用…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(二)

5.5 防止低优先级锁饥饿 AntDB-M按照优先级将锁又分了两类,用于解决低优先级锁饥饿问题。 ●独占型(hog): X, SNRW, SNW; 具有较强的不兼容性,优先级高,容易霸占锁,造成其他低优先级锁一直处于等待状态。 ●暗弱型(piglet): SW; …

加速数据采集:用OkHttp和Kotlin构建Amazon图片爬虫

引言 曾想过轻松获取亚马逊上的商品图片用于项目或研究吗?是否曾面对网络速度慢或被网站反爬虫机制拦截而无法完成数据采集任务?如果是,那么本文将为您介绍如何用OkHttp和Kotlin构建一个高效的Amazon图片爬虫解决方案。 背景介绍 亚马逊&a…

【MySQL】MySQL库的增删查改

文章目录 1.库的操作1.1创建数据库1.2创建数据库案例 2.字符集和校验规则2.1查看系统默认字符集以及校验规则2.2查看数据库支持的字符集2.3查看数据库支持的字符集校验规则2.4校验规则对数据库的影响 3.操纵数据库3.1查看数据库3.2显示创建语句3.3修改数据库3.4数据库删除3.5备…

KUKA机器人如何在程序中编辑等待时间?

KUKA机器人如何在程序中编辑等待时间? 如下图所示,如何实现在P1点和P2点之间等待设定的时间? 如下图所示,可以直接输入wait sec 2(等待2秒), 如下图所示,再次选中该程序后&#…

python学习1

大家好,这里是七七,今天开始又新开一个专栏,Python学习。这次思考了些许,准备用例子来学习,而不是只通过一大堆道理和书本来学习了。啊对,这次是从0开始学习,因此大佬不用看本文了,小…

linux sed批量修改替换文件中的内容/sed特殊字符

sed系列文章 linux常用命令(9):sed命令(编辑/替换/删除文本)linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行linux sed批量修改替换文件中的内容/sed特殊字符 文章目录 sed系列文章一、sed替换文本语法1.1、基础语法1.2、高阶语法 二、实战/实例2.1…

k8s常用命令及示例(三):apply 、edit、delete

k8s常用命令及示例(三):apply 、edit、delete 1. kubectl apply -f 命令:从yaml文件中创建资源对象。 -f 参数为强制执行。kubectl apply和kubectl create的区别如下:kubectl create 和 kubectl apply 是 Kubernetes 中两个常用的命令&…

Springboot管理系统数据权限过滤(二)——SQL拦截器

上一节Springboot管理系统数据权限过滤——ruoyi实现方案对数据权限实现方案有了认识,本文将进一步优化权限过滤方案,实现对业务代码零入侵。 回顾上一章中权限方案: 主要是通过注解拦截,拼接好权限脚本后,放到对象变…

c题目17:写一个swap函数,可以交换2个整数变量的值。(分别用普通方式和指针方式实现,对比结果)

每日小语 我坐着,观望世界上所有的忧患,所有的压迫和耻辱看着,听着,一声不响。——惠特曼 自己思考 最近这段时间新的感悟似乎也没有,但我发现我和别人的思想越来越不同,只能跟极少数人产生共鸣&#xff0…

DevOps 和人工智能 – 天作之合

如今,人工智能和机器学习无处不在,所以它们开始在 DevOps 领域崭露头角也毫不令人意外。人工智能和机器学习正在通过自动化任务改变 DevOps,并使各企业的软件开发生命周期更高效、更深刻和更安全。我们在 DevOps 趋势中简要讨论过这一问题&am…

使用shell脚本给日志文件瘦身

一、前言 后台系统运行久了,日志文件的体积日渐增多,除了使用常用的日志框架如logback对日志进行按天打印、按大小分割等方式外,还可以使用shell命令来对大日志进行瘦身。 本篇使用sed指令来对文件进行操作,具体操作如下&#xf…