归一化
一种数据处理方式,将数据处理后限制在某个固定范围内。
两种形式
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
。
**kwargs
:Figure
对象的其他属性。
返回值为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
out
和keepdims
在使用中几乎很少用到,一般都是默认
计算简单,只需要调用简单数学公式就可以计算。能够应用于数值型的数据,并且不收数据量级的影响,因为本身作用就是消除量级给分析带来的不变。
需要总体平均值和方差,大多数情况下,用样本的均值与标准差代替;对于数据分布有一定要求,正态分布最适;消除了数据的实际意义,因此处理结构只能用于比较数据间的结果,数据的真实意义需要还原原值。
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