机器学习--归一化处理

归一化

归一化的目的

归一化的一个目的是,使得梯度下降在不同维度 θ \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,一经查实,立即删除!

相关文章

源码赏析: 数据结构转换工具 configor (一)

一、configor 先贴地址 configor,先看configor的特性: Header-only & STL-likeCustom type conversion & serializationComplete Unicode supportASCII & Wide-character support 说白了,这个工具用于自定义类型的转换和序列化…

微服务 Nacos服务注册与发现

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

Flask 中的跨域难题:定义、影响与解决方案深度解析

跨域(Cross-Origin)是指在浏览器中,一个页面的脚本试图访问另一个页面的内容时发生的安全限制。Flask 作为一种 Web 应用框架,也涉及到跨域问题。本文将详细介绍跨域的定义、影响以及解决方案,涵盖如何在 Flask 中处理…

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

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

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…

MSSQL存储过程的功能和用法

MSSQL(Microsoft SQL Server)的存储过程是一组SQL语句的集合,这些语句被预先编译并存储在数据库中,用于执行复杂的数据操作。以下是MSSQL存储过程的一些主要功能和用法: 功能: 数据操作:存储过程…

MySQL升级PostgreSQL遇到的常见问题及其解决方案

CRUD问题 选择 id 在的逗号分隔的字符串所表示的数组中的行 如果要将字符串用于连接条件,则需要将字符串转换为适当的整数数组。 Select * from table_name where id any(string_to_array(?, ,)::int[]);string_to_array(?, ,)::int[] 这部分代码的作用是将一…

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

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

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中的应用…

22. 常用shell之 chown - 更改文件所有者 的用法和衍生用法

chown 是 Unix 和类 Unix 系统(如 Linux 和 macOS)中用于更改文件或目录的所有者和所属组的命令。这个命令对于系统管理和文件权限管理至关重要。下面详细介绍 chown 的基本用法和一些衍生用法。 基本用法 chown 命令的基本语法如下: chow…

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

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

windows MinGW C语言编译器安装及环境变量配置教程

windows MinGW C语言编译器安装配置环境变量 MinGW安装 MinGW被称为Windows版的GCC,安装包下载地址: 提示:该安装包下载完之后,相当于安装好了MinGW,之后即可配置环境变量!所以,可以先新建好…

docker-compose elk部署elk 单节点版本

elk集群 docker-compose单节点运行版 机器分配 192.168.77.136 docker-compose 192.168.77.137 log-test cron 安装docker、docker-compose centos yum -y install docker-ce docker-composedebian/ubuntu apt -y install docker-ce docker-compose编写docker-compose.yaml…

算法训练day32|贪心算法part02

122.买卖股票的最佳时机 II 局部最优&#xff1a;记录每天的利润&#xff0c;只需要累加利润为正的天数 // 贪心思路 class Solution {public int maxProfit(int[] prices) {int result 0;for (int i 1; i < prices.length; i) {result Math.max(prices[i] - prices[i …

将数组中的数逆序存放

本题要求编写程序&#xff0c;将给定的n个整数存入数组中&#xff0c;将数组中的这n个数逆序存放&#xff0c;再按顺序输出数组中的元素。 输入格式: 输入在第一行中给出一个正整数n&#xff08;1≤n≤10&#xff09;。第二行输入n个整数&#xff0c;用空格分开。 输出格式:…

[Android] Binder all-in-all

前言&#xff1a; Binder 是一种 IPC 机制&#xff0c;使用共享内存实现进程间通讯&#xff0c;既可以传递消息&#xff0c;也可以传递创建在共享内存中的对象&#xff0c;而Binder本身就是用共享内存实现的&#xff0c;因此遵循Binder写法的类是可以实例化后在进程间传递的。…