归一化(自用笔记)

归一化

一种数据处理方式,将数据处理后限制在某个固定范围内。

两种形式

1、将数据处理为[0,1]小数,一些情况也可以处理成[-1,1]等其他固定范围。(归一话)

2、通过归一化,将有量纲表达式变成无量纲表达式。(标准化)

归一化目标

为了减少不同数据差值过大影响迭代结果。归一化后,数据基本上可以被圈定在一个区域内,可以加快训练速度,寻求最优解过程平缓,收敛速度更快。

归一化类型

1. Min-max normalization (Rescaling):

适合在最大最小值明确不变的情况下使用,如果对处理后的数据返回有严格要求也可使用。

归一化,将数据处理成量纲一致的数据,限制范围多为[0,1],[-1,1]。在这里插入图片描述

算法逻辑:

找一组数据的最大最小值

利用公式归一化

输出

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

Data = np.array([[0.2, 0.9, 29], [0.9, 0.1, 100], [0.5, 0.5, 30]])

# 最小-最大归一化算法
# 1.1 归一化处理
def MinMax(data):
    # C = data[:, 2]  # 第三行的所有数据,data[:,0]表示第1列所有数据;data[1,:]表示第2行所有数据
    min = np.min(data)  # 寻找最小值
    max = np.max(data)  # 寻找最大值
    print("转化前的矩阵:\n", data)
    for x in data:
        x[2] = (x[2] - min) / (max - min)  # 对数据按公式进行计算,进行归一化
    print("转化后的矩阵:\n", data)
    return data # 返回归一化处理后的数据

# 1.2 可视化
def ShowData(Data, ShowD1):
    length = len(Data) # 计算数据长度
    X = np.ones(Data.shape[0])  # Data.shape[0]=3 即第一个中括号里的个数
    plt.figure()
    plt.subplot(121)
    for i in range(length):
        plt.scatter(X * (i + 1), Data[:, i])
    plt.subplot(122)
    for i in range(length):
        plt.scatter(X * (i + 1), ShowD1[:, i])
    plt.show()

ShowData(Data, MinMax(Data.copy()))
output:
转化前的矩阵:
 [[  0.2   0.9  29. ]
 [  0.9   0.1 100. ]
 [  0.5   0.5  30. ]]
转化后的矩阵:
 [[0.2        0.9        0.28928929]
 [0.9        0.1        1.        ]
 [0.5        0.5        0.2992993 ]]

总结:数据规模过大不适宜,归一化后范围在[0,1],对于原始数据有负有正的情况慎用

此类情况应使用归一化指数函数softmax()函数,原理公式在这里插入图片描述

numpy.min()函数,找最小值

基本语法如下:

numpy.min(a, axis=None, out=None,keepdims=False, initial=<no value>, where=<no value>)

a:输入数组,即要查找最小值的数组。
axis:可选参数,指定沿着哪个轴查找最小值。如果为None,则返回数组中的最小值;如果为整数,则返回指定轴上的最小值;如果为元组,则返回多个指定轴上的最小值。
out:可选参数,用于指定存储结果的数组。如果提供此参数,结果将直接存储在这个数组中,而不是返回一个新数组。
keepdims:可选参数,如果为True,则保持输出数组的维度与输入数组相同;如果为False,则输出数组会降维。
initial:可选参数,用于设置计算最小值的初始值。这个参数在numpy的较新版本中提供,可以更加灵活地控制最小值计算过程。
where:可选参数,条件数组,用于指定哪些元素参与最小值的计算。

numpy.max()函数,找最大值

基本语法如下:

numpy.max(a, axis=None, out=None, keepdims=False, initial=<no value>, where=<no value>)

a:输入数组,即要查找最大值的数组。
axis:可选参数,指定沿着哪个轴查找最大值。如果为None,则返回数组中的最大值;如果为整数,则返回指定轴上的最大值;如果为元组,则返回多个指定轴上的最大值。
out:可选参数,用于指定存储结果的数组。如果提供此参数,结果将直接存储在这个数组中,而不是返回一个新数组。
keepdims:可选参数,如果为True,则保持输出数组的维度与输入数组相同;如果为False,则输出数组会降维。
initial:可选参数,用于设置计算最大值的初始值。这个参数在numpy的较新版本中提供,可以更加灵活地控制最大值计算过程。
where:可选参数,条件数组,用于指定哪些元素参与最大值的计算。

numpy.min()numpy.max()函数多用于数据分析(找最值用于识别数据中的极端值、检测数据中的异常点、了解数据分布情况)、机器学习(找最大值用于监控损失函数的变化、评估模型的性能;最小值用于损失函数的计算、梯度下降等优化算法)、图像处理(找最大值用于检测图中亮区、 高亮物体或计算图像的亮度范围;最小值暗区或计算图像的亮度范围)

使用时要注意:

明确计算维度(处理多维数组时,明确指定axis参数,确保沿着正确的维度查找最大值);

结合条件筛选(利用where参数,根据特定条件筛选参与最值计算的元素,从而更加精确地找到所需的最值);

注意数据类型(确保输入数组的数据类型适合进行最值计算,以避免精度损失或计算错误)

matplotlib.pyplot.figure()函数,用于创建新的图形或激活已存在的图形

基本语法如下:

matplotlib.pyplot.figure(
    # autoincrement if None, else integer from 1-N,如果为None,则自动递增,否则为1-N之间的整数
    num: int | str | Figure | SubFigure | None = None,
    # defaults to rc figure.figsize,默认为白色(white)
    figsize: tuple[float, float] | None = None,
    # defaults to rc figure.dpi,默认为白色(white)
    dpi: float | None = None,
    *,
    # defaults to rc figure.facecolor,默认为白色(white)
    facecolor: ColorType | None = None,
    # defaults to rc figure.edgecolor,默认为白色(white)
    edgecolor: ColorType | None = None,
    frameon: bool = True,
    FigureClass: type[Figure] = Figure,
    clear: bool = False,
    **kwargs
) -> Figure:# 返回为Figure

num:图形的唯一标识符。可选参数。整数、字符串或Figure对象。可选参数。默认值为None
当已经存在使用该标识符的图形时,使用该标识符的图形将被激活并返回。对于标识符而言,整数对应Figure.number属性,字符串对应图形的标签。
如果没有对应标识符的图形时,新的图形将会创建。如果参数值为整数则用于Figure.number属性,否则将会自动生成一个整数值(从1开始,每新建一个图像递增1)。如果参数值为字符串,图形标签和窗口标题将设为该值。

figsize:图形的尺寸(宽度,高度),默认单位为英寸。可选参数。浮点数二元组。默认值为rcParams["figure.figsize"],即[6.4, 4.8]。

dpi:图形的分辨率,即每英寸的像素数。可选参数。浮点数。默认值为rcParams["figure.dpi"],即100。Jupyter Notebook默认值为72,另外由于bbox_inches='tight',因此Jupyter Notebook可能会剪切图形,导致图形的实际大小不可预测。

facecolor:图形的背景色。可选参数。颜色值。默认值为rcParams["figure.facecolor"],即’white’。

edgecolor:图形的边框色。可选参数。颜色值。默认值为rcParams["figure.edgecolor"],即’white’。

frameon:是否绘制图形。可选参数。布尔值。默认值为True

FigureClasss:生成图形时选用的自定义Figure。可选参数。Figure类的子类。默认值为<class 'matplotlib.figure.Figure'>

clear:当图形存在时是否清除原有图形。可选参数。布尔值,值为True时,当图形存在时,原有图形将被清除。默认值为False

tight_layout:是否使用紧凑布局。布尔值或字典。默认值为rcParams["figure.autolayout"],即False
如果值为False,则使用subplotpars参数调整子图配置参数。如果值为True,则调用tight_layout函数。如果值为字典,字典键即tight_layout函数的参数。

subplotpars:子图参数。SubplotParams对象,如果为None,则使用子图的默认参数rcParams["figure.subplot.*"]

constrained_layout: 是否采用约束布局。布尔值或字典。默认值为rcParams["figure.constrained_layout.use"],即False
如果值为True,则使用约束布局(constrained layout)调整绘图元素的位置。该参数类似于tight_layout

**kwargsFigure对象的其他属性。

返回值为Figure对象。

matplotlib.pyplot.scatte()函数绘制散点图的

基本语法如下:

matplotlib.pyplot.scatter(
    x: float | ArrayLike,
    y: float | ArrayLike,
    s: float | ArrayLike | None = None,
    c: ArrayLike | Sequence[ColorType] | ColorType | None = None,
    marker: MarkerType | None = None,
    cmap: str | Colormap | None = None,
    norm: str | Normalize | None = None,
    vmin: float | None = None,
    vmax: float | None = None,
    alpha: float | None = None,
    linewidths: float | Sequence[float] | None = None,
    *,
    edgecolors: Literal["face", "none"] | ColorType | Sequence[ColorType] | None = None,
    plotnonfinite: bool = False,
    data=None,
    **kwargs,
) -> PathCollection:

x, y,就是散点的坐标,数据点的位置

s, 散点的大小,面积

c, 散点的颜色,默认为‘b’, 也就是blue

marker, 散点样式,默认值为实心圆,‘o’

cmap, 指的是matplotlib.colors.Colormap,也就是色彩映射表实例或注册的色彩映射表名称,相当于多个调色盘的合集。仅当 c 是浮点数组时才使用 cmap

norm, 如果c是浮点数组,则使用范数 在 0 到 1 的范围内缩放颜色数据c,以便映射到色彩映射表cmap

vmin, vmax,这两个参数与默认规范结合使用,以将颜色数组c映射到色彩映射表cmap。如果为 None,则使用颜色数组的相应最小值和最大值。当给出范数时,不可以使用这两个参数。

alpha, 散点透明度([0, 1]之间的数,0表示完全透明,1则表示完全不透明)

linewidths, 散点的边缘线宽

edgecolors, 散点的边缘颜色

2. Mean normalization:

适合在最大最小值明确不变的情况下使用,如果对处理后的数据返回有严格要求也可使用。

3. Z-score normalization (Standardization):

也被称为标准化,经过处理的数据为均值为0,标准差为1的分布。在数据存在异常值、最大最小值不固定情况下,可以使用标准化方法。会改变数据的状态分布,但不会改变分布种类。神经网络中经常会使用到该方法进行归一化

在分类聚类算法中,需要使用距离度量相似性的适合,标准化效果会比归一化效果更好,但是在实际应用中,最好还是分别进行实验,选择当前条件下,能使模型精度更高的一种。

在这里插入图片描述

算法逻辑:

输入数据

求取数据的均值、平方,再利用中心化公式计算

输出结果

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
Data = np.array([[0.2, 0.9, 29], [0.9, 0.1, 100], [0.5, 0.5, 30]])

# 2.1标准化算法
def Zscore(data):
    x_mean = np.mean(data[:2])
    length = len(data[:, 2])# 求数据总长度
    vari = np.sqrt((np.sum((data[:2] - x_mean) ** 2)) / length)# 按公式及进行计算得到标准差
    print("标准差:", vari)
    print("Z-score标准化后的矩阵是\n", data)
    data[:, 2] = (data[:, 2] - x_mean) / vari# 按公式进行计算,讲数据标准化处理
    print("Z-score标准化后的矩阵是\n", data)
    return data

# 2.2 可视化
def ShowData(Data, ShowD1):
    length = len(Data) # 计算数据长度
    X = np.ones(Data.shape[0])  # Data.shape[0]=3 即第一个中括号里的个数
    plt.figure()
    plt.subplot(121)
    for i in range(length):
        plt.scatter(X * (i + 1), Data[:, i])
    plt.subplot(122)
    for i in range(length):
        plt.scatter(X * (i + 1), ShowD1[:, i])
    plt.show()

ShowData(Data, Zscore(Data.copy()))
output:
标准差: 51.569160680908254
Z-score标准化后的矩阵是
 [[  0.2   0.9  29. ]
 [  0.9   0.1 100. ]
 [  0.5   0.5  30. ]]
Z-score标准化后的矩阵是
 [[0.2        0.9        0.13864876]
 [0.9        0.1        1.5154406 ]
 [0.5        0.5        0.15804019]]
numpy.mean()函数,计算平均值
numpy.mean(a, axis=None, dtype=None, out=None, keepdims=np._NoValue, *,         where=np._NoValue):

a, 需要输入一个数组

axis, 默认是对所有元素相加求平均值;axis = 0,对各列求均值;axis = 1,对各行求均值

dtype,表示计算平均数时使用的数据类型。默认为float64

outkeepdims在使用中几乎很少用到,一般都是默认

计算简单,只需要调用简单数学公式就可以计算。能够应用于数值型的数据,并且不收数据量级的影响,因为本身作用就是消除量级给分析带来的不变。

需要总体平均值和方差,大多数情况下,用样本的均值与标准差代替;对于数据分布有一定要求,正态分布最适;消除了数据的实际意义,因此处理结构只能用于比较数据间的结果,数据的真实意义需要还原原值。

4. 非线性归一化

常用于数据分化程度较大的场景,有时需要通过一些数学函数对原始值进行映射,如对数、反正切等。

__注意:__Min-max normalization、Mean normalization两种归一化(normalization )方法不会改变数据的状态分布,且会将数据限定在一个具体的范围;但是Z-score normalization也叫标准化(Standardization)方法会改变数据的状态分布。

同时前三种方法本质上都是一种线性变化,不会因为对数据的处理而改变数据的原始数值排序。

归一化使用条件

一般需要使用归一化的算法:

1、涉及或隐含距离计算的算法: K-means、KNN、PCA、SVM等

2、梯度下降算法: 梯度下降的收敛速度取决于参数的初始位置到local minima的距离,以及学习率η的大小,所以其实本质上还是涉及距离的算法。

3、 采用sigmoid等有饱和区的激活函数: 如果输入分布范围很广,参数初始化时没有适配好,很容易直接陷入饱和区,导致梯度消失

一般不需要进行归一化的算法:

1、与距离无关的概率模型: Naive Bayes等

2、与距离无关的基于树的模型:比如决策树、随机森林等,

树中节点的选择只关注当前点从哪个特征点切分分类效果更好,与特征点间差值、距离无关,但是如果使用标准化也会提高模型的准确性。但是在树模型中归一化可有可无,可以作为超参数在训练时进行选择。

学习链接:
————————————————

原文链接:https://blog.youkuaiyun.com/weixin_45142381/article/details/127262663

原文链接:https://blog.youkuaiyun.com/2402_83361138/article/details/137913088

原文链接:https://blog.youkuaiyun.com/2402_83361138/article/details/137913286

原文链接:https://blog.youkuaiyun.com/mighty13/article/details/116334547

原文链接:https://blog.youkuaiyun.com/u013620306/article/details/127225226

原文链接:https://blog.youkuaiyun.com/weixin_45142381/article/details/127262663

原文链接:https://blog.youkuaiyun.com/2402_83361138/article/details/137913088

原文链接:https://blog.youkuaiyun.com/2402_83361138/article/details/137913286

原文链接:https://blog.youkuaiyun.com/mighty13/article/details/116334547

原文链接:https://blog.youkuaiyun.com/u013620306/article/details/127225226

原文链接:https://blog.youkuaiyun.com/m0_51816252/article/details/126209555

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值