机器学习的一百个概念(1)单位归一化
前言
本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见[《机器学习的一百个概念》
ima 知识库
知识库广场搜索:
知识库 | 创建人 |
---|---|
机器学习 | @Shockang |
机器学习数学基础 | @Shockang |
深度学习 | @Shockang |
正文
“数据决定模型上限,预处理拯救下限”
引言
在机器学习的宏大世界中,数据预处理是一门不可或缺的艺术 🎨。在各种预处理技术中,归一化(Normalization)作为基础却又至关重要的一步,往往决定着模型性能的上限。本文将深入探讨单位归一化这一核心概念,特别是L2归一化,帮助你全面理解它的原理、应用场景以及与其他归一化方法的区别。
无论你是机器学习初学者寻求基础知识的巩固,还是经验丰富的实践者希望查漏补缺,本文都将为你提供系统而深入的理解。让我们一起揭开单位归一化的神秘面纱,看它如何在无形中提升模型性能!💪
数据预处理的重要性
在深入单位归一化之前,我们先要理解为什么数据预处理如此重要 ⚠️。
为什么需要数据预处理?
机器学习算法本质上是数学模型,它们对输入数据的质量和特性极为敏感。未经处理的原始数据通常存在以下问题:
- 特征尺度不一致 📏:某些特征可能是千米级别,而其他特征可能是厘米级别
- 分布不均 📊:数据可能高度倾斜或呈现异常分布
- 噪声和异常值 🔊:原始数据中的错误和极端值会误导模型
- 高维稀疏性 🌌:高维特征空间中的数据点通常非常稀疏
这些问题会导致:
- 梯度下降收敛缓慢
- 距离计算被大值特征主导
- 正则化项效果不一
- 某些算法(如KNN、SVM)性能严重下降
预处理的基本流程
在这个流程中,归一化是数据变换的重要一环,它直接影响后续模型的训练效果。
归一化的基本概念
什么是归一化?
归一化(Normalization)是将数据按比例缩放,使之落入一个小的特定区间的过程。这个过程通常用于特征工程中的数据预处理阶段。🔄
归一化的主要目标是:
- 消除数据特征之间的量纲影响
- 使不同度量衡标准下的数据可比较
- 加速模型训练中的梯度收敛
- 提高模型的鲁棒性
归一化与标准化的区别
虽然归一化(Normalization)和标准化(Standardization)在中文语境中有时会被混用,但它们在机器学习中是两个不同的概念:
方法 | 目标 | 常见实现 | 结果特征 |
---|---|---|---|
归一化 | 缩放到特定区间 | Min-Max缩放、单位范数归一化 | 范围固定 |
标准化 | 服从标准正态分布 | Z-Score标准化 | 均值0,标准差1 |
🔍 认识误区:在某些英文文献中,"Normalization"一词有时被宽泛地用于指代各种数据缩放方法,这可能导致混淆。在本文中,我们采用更为严格的定义,将归一化特指将数据缩放到特定范围的方法。
单位范数归一化详解
范数的概念
在进入单位范数归一化之前,我们需要先了解什么是范数 📏。
范数(Norm)是一种为向量空间内的所有向量赋予"长度"的函数。在机器学习中,我们常用的范数包括:
- L0范数:向量中非零元素的个数(严格来说不是范数,因为不满足范数的三角不等式)
- L1范数:向量中各元素绝对值之和,也称为曼哈顿距离(Manhattan Distance)
- L2范数:向量中各元素的平方和开平方,也称为欧氏长度(Euclidean Length)
- Lp范数:向量中各元素的p次方和的1/p次方
- L∞范数:向量中绝对值最大的元素
数学表示如下:
- L1范数: ∥ x ∥ 1 = ∑ i = 1 n ∣ x i ∣ \|x\|_1 = \sum_{i=1}^{n} |x_i| ∥x∥1=∑i=1n∣xi∣
- L2范数: ∥ x ∥ 2 = ∑ i = 1 n x i 2 \|x\|_2 = \sqrt{\sum_{i=1}^{n} x_i^2} ∥x∥2=∑i=1nxi2
- Lp范数: ∥ x ∥ p = ( ∑ i = 1 n ∣ x i ∣ p ) 1 / p \|x\|_p = \left(\sum_{i=1}^{n} |x_i|^p\right)^{1/p} ∥x∥p=(∑i=1n∣xi∣p)1/p
- L∞范数: ∥ x ∥ ∞ = max i ∣ x i ∣ \|x\|_{\infty} = \max_i |x_i| ∥x∥∞=maxi∣xi∣
单位范数归一化的定义
单位范数归一化是将向量缩放到单位长度(范数等于1)的过程。根据使用的范数类型不同,又可以分为L1归一化、L2归一化等。
单位范数归一化的核心目标是使每个样本的向量总长度为1。这通过将样本中的每个特征值除以该样本的某个范数来实现。
L1范数归一化
将向量除以其L1范数,使得向量各元素的绝对值之和等于1:
x ′ = x ∥ x ∥ 1 = x ∑ i = 1 n ∣ x i ∣ \mathbf{x}' = \frac{\mathbf{x}}{\|\mathbf{x}\|_1} = \frac{\mathbf{x}}{\sum_{i=1}^{n} |x_i|} x′=∥x∥1x=∑i=1n∣xi∣x
L1归一化后,所有特征值的绝对值和为1,也称为"曼哈顿归一化"。
L2范数归一化
将向量除以其L2范数,使得向量的欧氏长度等于1:
x ′ = x ∥ x ∥ 2 = x ∑ i = 1 n x i 2 \mathbf{x}' = \frac{\mathbf{x}}{\|\mathbf{x}\|_2} = \frac{\mathbf{x}}{\sqrt{\sum_{i=1}^{n} x_i^2}} x′=∥x∥2x=∑i=1nxi2x
L2归一化后的向量位于单位超球面上,也称为"向量归一化"或"单位向量化"。
单位归一化的几何解释
🌍 从几何角度看:
- L1归一化:将数据点投影到L1单位球面上,即各坐标轴投影之和等于1的表面
- L2归一化:将数据点投影到单位圆(二维)或单位球面(三维)或单位超球面(高维)上
常见实现方式
在Python中,我们可以通过以下方式实现单位范数归一化:
# 使用NumPy手动实现
def l1_normalize(x):return x / np.sum(np.abs(x), axis=1, keepdims=True)def l2_normalize(x):return x / np.sqrt(np.sum(np.square(x), axis=1, keepdims=True))# 使用Scikit-learn
from sklearn.preprocessing import normalize# L1范数归一化
X_normalized_l1 = normalize(X, norm='l1')# L2范数归一化(单位欧氏长度)
X_normalized_l2 = normalize(X, norm='l2')
L2归一化的数学原理
L2归一化的计算过程
L2归一化是最常用的单位范数归一化方法,其计算过程可分为以下步骤:
- 计算向量的L2范数(欧氏长度)
- 将向量的每个元素除以该范数
对于每个样本向量 (\mathbf{x} = (x_1, x_2, …, x_n)),其L2归一化后为:
x ′ = x ∥ x ∥ 2 = x x 1 2 + x 2 2 + . . . + x n 2 \mathbf{x}' = \frac{\mathbf{x}}{\|\mathbf{x}\|_2} = \frac{\mathbf{x}}{\sqrt{x_1^2 + x_2^2 + ... + x_n^2}} x′=∥x∥2x=x12+x22+...+xn2x
示例说明
假设我们有一个二维向量 ([3, 4]):
- 计算L2范数:(\sqrt{3^2 + 4^2} = \sqrt{9 + 16} = \sqrt{25} = 5)
- 归一化向量:([3/5, 4/5] = [0.6, 0.8])
归一化后的向量长度为:(\sqrt{0.6^2 + 0.8^2} = \sqrt{0.36 + 0.64} = \sqrt{1} = 1)
向量方向保持不变,但长度变为1。这也是为什么L2归一化适合用于只关心方向不关心大小的应用场景。
L2归一化与余弦相似度的关系
L2归一化与余弦相似度有着密切的关系。两个向量的余弦相似度定义为:
cosine ( a , b ) = a ⋅ b ∥ a ∥ 2 ∥ b ∥ 2 \text{cosine}(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\|_2 \|\mathbf{b}\|_2} cosine(a,b)=∥a∥2∥b∥2a⋅b
如果向量 (\mathbf{a}) 和 (\mathbf{b}) 已经通过L2范数归一化,则余弦相似度简化为它们的点积:
cosine ( a ′ , b ′ ) = a ′ ⋅ b ′ \text{cosine}(\mathbf{a}', \mathbf{b}') = \mathbf{a}' \cdot \mathbf{b}' cosine(a′,b′)=a′⋅b′
这就是为什么在计算文本相似度、推荐系统等应用中,常常先对特征向量进行L2归一化,然后直接计算点积作为相似度度量。
其他常见的归一化方法
除了单位范数归一化,还有其他几种常见的归一化方法,它们各有特点和适用场景。
Min-Max缩放(Min-Max Scaling)
将特征值线性变换到指定区间(通常是[0,1]或[-1,1]):
x ′ = x − min ( x ) max ( x ) − min ( x ) x' = \frac{x - \min(x)}{\max(x) - \min(x)} x′=max(x)−min(x)x−min(x)
适用于:
- 知道特征的确切边界时
- 需要在固定区间内缩放数据时(如图像处理中的像素值)
- 当特征的分布不是高斯分布时
Z-Score标准化(Standardization)
将特征转换为均值为0、标准差为1的分布:
x ′ = x − μ σ x' = \frac{x - \mu}{\sigma} x′=σx−μ
适用于:
- 不知道特征分布的最大最小值时
- 特征近似呈正态分布时
- 线性回归、逻辑回归等假设特征服从正态分布的算法
最大绝对值缩放(MaxAbs Scaling)
按照最大绝对值缩放,使得最大绝对值为1:
x ′ = x max ( ∣ x ∣ ) x' = \frac{x}{\max(|x|)} x′=max(∣x∣)x
适用于:
- 稀疏数据
- 数据中含有0值具有实际意义的场景
稳健缩放(Robust Scaling)
基于百分位数的缩放方法,对异常值不敏感:
x ′ = x − Q 2 Q 3 − Q 1 x' = \frac{x - Q_2}{Q_3 - Q_1} x′=Q3−Q1x−Q2
其中 (Q_1)、(Q_2) 和 (Q_3) 分别是第一四分位数(25%)、中位数(50%)和第三四分位数(75%)。
适用于:
- 数据包含大量异常值或极端值时
- 特征分布高度偏斜时
归一化方法的选择流程
各种归一化方法的比较
不同归一化方法的对比
方法 | 公式 | 结果特征 | 保持原始分布 | 对异常值敏感 | 适用场景 |
---|---|---|---|---|---|
Min-Max缩放 | (\frac{x - \min}{\max - \min}) | 范围固定[0,1] | 否 | 是 | 图像处理、神经网络 |
Z-Score标准化 | (\frac{x - \mu}{\sigma}) | 均值0,标准差1 | 是 | 是 | 线性回归、PCA |
L1归一化 | (\frac{x}{|x|_1}) | L1范数为1 | 否 | 不太敏感 | 稀疏特征、正则化 |
L2归一化 | (\frac{x}{|x|_2}) | L2范数为1 | 否 | 相对敏感 | 文本分类、余弦相似度 |
稳健缩放 | (\frac{x - Q_2}{Q_3 - Q_1}) | 中位数0,四分位差1 | 否 | 否 | 含异常值的数据 |
归一化的影响因素
选择合适的归一化方法时,需要考虑以下因素:
- 数据分布:正态分布适合Z-Score,均匀分布适合Min-Max
- 异常值:有异常值时避免Min-Max,可选稳健缩放
- 算法要求:不同算法对输入数据的要求不同(如SVM偏好标准化数据)
- 特征工程目标:方向重要时选L2归一化,比例重要时选其他方法
- 计算复杂度:在大数据场景中,可能需要考虑归一化的计算开销
实践案例
让我们通过几个实际案例来理解不同归一化方法的效果。
案例1:特征尺度不一致的数据
假设我们有一个数据集,包含"年龄"(范围20-80)和"年收入"(范围20000-200000)两个特征。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler, StandardScaler, Normalizer# 创建示例数据
np.random.seed(42)
age = np.random.randint(20, 80, 100)
income = np.random.randint(20000, 200000, 100)
X = np.column_stack((age, income))# 各种归一化方法
min_max_scaler = MinMaxScaler()
standard_scaler = StandardScaler()
l2_normalizer = Normalizer(norm='l2')X_minmax = min_max_scaler.fit_transform(X)
X_standard = standard_scaler.fit_transform(X)
X_l2norm = l2_normalizer.fit_transform(X)# 可视化比较
fig, axes = plt.subplots(2, 2, figsize=(12, 10))# 原始数据
axes[0, 0].scatter(X[:, 0], X[:, 1])
axes[0, 0].set_title('原始数据')
axes[0, 0].set_xlabel('年龄')
axes[0, 0].set_ylabel('年收入')# MinMax缩放
axes[0, 1].scatter(X_minmax[:, 0], X_minmax[:, 1])
axes[0, 1].set_title('MinMax缩放')
axes[0, 1].set_xlabel('归一化后的年龄')
axes[0, 1].set_ylabel('归一化后的年收入')# 标准化
axes[1, 0].scatter(X_standard[:, 0], X_standard[:, 1])
axes[1, 0].set_title('Z-Score标准化')
axes[1, 0].set_xlabel('标准化后的年龄')
axes[1, 0].set_ylabel('标准化后的年收入')# L2归一化
axes[1, 1].scatter(X_l2norm[:, 0], X_l2norm[:, 1])
axes[1, 1].set_title('L2归一化')
axes[1, 1].set_xlabel('L2归一化后的年龄')
axes[1, 1].set_ylabel('L2归一化后的年收入')plt.tight_layout()
plt.show()
观察结果,我们会发现:
- 原始数据中,收入的数值远大于年龄,导致两者在图上分布极不均衡
- MinMax缩放后,两个特征都被压缩到[0,1]区间,但点的分布模式不变
- Z-Score标准化后,两个特征的分布都集中在原点附近,且分布更均衡
- L2归一化后,所有点都被投影到单位圆上,形成一个弧形分布
案例2:文本向量的余弦相似度计算
在NLP任务中,L2归一化经常用于计算文档向量的相似度:
from sklearn.feature_extraction.text import TfidfVectorizer# 示例文档
documents = ["机器学习是人工智能的一个子领域","深度学习是机器学习的一种方法","自然语言处理是人工智能的应用","计算机视觉研究图像识别技术"
]# 使用TF-IDF向量化
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(documents)# 计算余弦相似度矩阵(方法1:手动计算)
from sklearn.metrics.pairwise import cosine_similarity
similarity_matrix = cosine_similarity(X)print("文档余弦相似度矩阵:")
print(np.round(similarity_matrix, 2))# 直接使用L2归一化,然后计算点积
from sklearn.preprocessing import normalize
X_normalized = normalize(X, norm='l2')
dot_product_matrix = X_normalized.dot(X_normalized.T).toarray()print("\n归一化后的点积矩阵(应该与余弦相似度相同):")
print(np.round(dot_product_matrix, 2))
输出结果会显示两种计算方法得到的相似度矩阵是一致的,证明了L2归一化与余弦相似度的关系。
在不同模型中的应用
不同的机器学习算法对特征缩放有不同的敏感度。下面我们来看看单位归一化等方法在不同模型中的应用。
1. 基于距离的算法 📏
**K最近邻(KNN)和K均值聚类(K-Means)**等基于距离的算法对特征尺度非常敏感:
- 为什么需要归一化:避免大尺度特征主导距离计算
- 推荐方法:MinMax缩放或Z-Score标准化
- 实践建议:
- KNN中,如果特征具有明确的物理意义和边界,优先使用MinMax缩放
- 如果数据分布接近正态,Z-Score标准化通常效果更好
- 对于衡量方向相似性的场景(如文本相似度),L2归一化效果好
2. 线性模型 📈
线性回归、逻辑回归和SVM等线性模型在特征尺度不一致时性能会受到影响:
- 为什么需要归一化:使各特征对模型的贡献均衡,加速收敛
- 推荐方法:Z-Score标准化
- 实践建议:
- 带有正则化的线性模型(如Ridge、Lasso)更需要特征缩放
- 对于带有L1正则的模型,有时L2归一化可以与其良好配合
3. 树模型 🌲
决策树、随机森林和梯度提升树等树模型对特征缩放不敏感:
- 为什么:树模型基于特征的排序或分割,而非原始值
- 推荐方法:通常不需要归一化
- 实践建议:
- 尽管不需要归一化,但异常值处理仍然重要
- 如果与其他需要归一化的算法一起使用,仍可应用归一化
4. 神经网络 🧠
深度学习模型对输入数据的尺度非常敏感:
- 为什么需要归一化:加速收敛,避免梯度爆炸或消失
- 推荐方法:MinMax缩放(到[0,1]或[-1,1])或Z-Score标准化
- 实践建议:
- 卷积神经网络(CNN)通常使用MinMax缩放将像素值归一化到[0,1]
- 循环神经网络(RNN)通常使用Z-Score标准化
- 对于文本嵌入向量,L2归一化有助于稳定训练过程
5. 主成分分析(PCA) 🔍
PCA作为降维技术,对特征缩放非常敏感:
- 为什么需要归一化:避免大方差特征主导主成分
- 推荐方法:Z-Score标准化
- 实践建议:
- PCA几乎总是需要标准化预处理
- 在某些应用中,使用带有L2归一化的PCA可以获得方向主成分
常见陷阱和注意事项
在应用归一化方法时,需要注意一些常见的陷阱:
1. 训练集和测试集的一致性 ⚖️
错误做法:对训练集和测试集分别进行归一化
正确做法:使用训练集的参数(如最小值、最大值、均值、标准差)来转换测试集
# 正确的归一化流程
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) # 拟合并转换训练集
X_test_scaled = scaler.transform(X_test) # 仅转换测试集,不拟合
2. 归一化的顺序 🔄
错误做法:先分割数据集,再对训练集和测试集分别归一化
正确做法:先归一化整个数据集,再进行分割,或者先分割后用训练集的参数归一化测试集
为什么这很重要?因为在实际应用中,模型部署后接收的新数据需要使用与训练数据相同的参数进行归一化,以确保预测的一致性。
3. 特征选择与归一化的关系 🔎
错误做法:先进行归一化,再进行特征选择
正确做法:根据算法特点决定顺序
- 对于受特征尺度影响的特征选择方法(如基于L1、L2正则化的方法),应先归一化再选择特征
- 对于不受特征尺度影响的方法(如基于信息增益的方法),顺序影响较小
4. 过度依赖单一归一化方法 🚫
错误做法:不考虑数据特点,固定使用某一种归一化方法
正确做法:根据数据分布特点和模型需求选择合适的归一化方法,必要时进行对比实验
5. 处理稀疏特征 📊
错误做法:对稀疏矩阵(如文本的TF-IDF表示)应用标准的MinMax或Z-Score
正确做法:
- 对于稀疏数据,优先考虑L1或L2归一化
- 或使用MaxAbs缩放以保持稀疏性
- 避免使用会破坏稀疏结构的方法(如Z-Score)
# 处理稀疏矩阵的正确方式
from sklearn.preprocessing import MaxAbsScaler, normalize
from scipy.sparse import csr_matrix# 假设X_sparse是一个稀疏矩阵
X_sparse = csr_matrix(X_sparse)# 方法1:MaxAbsScaler保持稀疏性
scaler = MaxAbsScaler()
X_scaled = scaler.fit_transform(X_sparse) # 结果仍是稀疏矩阵# 方法2:L2归一化
X_normalized = normalize(X_sparse, norm='l2') # 结果仍是稀疏矩阵
6. 避免数据泄露 🔒
错误做法:在交叉验证前对整个数据集进行归一化
正确做法:将归一化步骤包含在交叉验证的管道中,确保每个fold的训练集和验证集分别处理
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression# 正确的方法:在管道中包含归一化步骤
pipe = Pipeline([('scaler', StandardScaler()),('classifier', LogisticRegression())
])# 交叉验证会在每个fold中正确应用归一化
scores = cross_val_score(pipe, X, y, cv=5)
高级应用
随着机器学习的不断发展,单位归一化在一些高级应用场景中发挥着重要作用。
1. 深度学习中的批归一化(Batch Normalization) 🧠
批归一化是深度神经网络中的一项重要技术,它在每个mini-batch上进行归一化:
# PyTorch中的批归一化示例
import torch.nn as nnclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(784, 100)self.bn1 = nn.BatchNorm1d(100) # 批归一化层self.fc2 = nn.Linear(100, 10)def forward(self, x):x = self.fc1(x)x = self.bn1(x) # 应用批归一化x = F.relu(x)x = self.fc2(x)return x
批归一化与传统的数据预处理归一化的区别:
- 批归一化是网络结构的一部分,在训练过程中动态进行
- 对每个mini-batch内的数据进行归一化,而不是整个数据集
- 包含可学习的缩放和偏移参数,可以恢复原始分布的表达能力
2. 词嵌入中的归一化 📝
在自然语言处理中,对词嵌入向量进行L2归一化是一种常见的实践:
# 对Word2Vec嵌入向量进行L2归一化
from sklearn.preprocessing import normalize
import gensim# 加载预训练的词向量模型
model = gensim.models.KeyedVectors.load_word2vec_format('word2vec.bin', binary=True)# 提取词向量矩阵
word_vectors = model.vectors# L2归一化
normalized_vectors = normalize(word_vectors, norm='l2')
归一化词向量的好处:
- 使余弦相似度计算更简单(仅需点积)
- 减少高频词的向量长度偏大的现象
- 改善在下游任务中的表现
3. 对比学习中的特征归一化 🔄
对比学习是自监督学习的重要方法,其中特征归一化至关重要:
# SimCLR等对比学习框架中的特征归一化(PyTorch示例)
def normalized_features(features):features_norm = torch.norm(features, p=2, dim=1, keepdim=True)features_normalized = features.div(features_norm)return features_normalized# 计算对比损失
def contrastive_loss(features):features = normalized_features(features) # L2归一化# 计算相似度矩阵sim_matrix = torch.mm(features, features.t())# 后续损失计算...
在对比学习中,L2归一化有以下作用:
- 将所有特征向量投影到单位超球面上,使余弦相似度成为有效的相似性度量
- 防止模型通过简单地增大特征范数来减小损失
- 提高对比学习的稳定性和效果
4. 图神经网络中的特征归一化 🕸️
在图神经网络(GNN)中,节点特征的归一化对模型性能有显著影响:
# PyTorch Geometric中的特征归一化
import torch_geometric.nn as nn
from torch_geometric.nn import GCNConv
from torch_geometric.utils import normalize_features# 归一化节点特征
x_normalized = normalize_features(x) # 默认应用L2归一化# 在GNN中使用归一化特征
class GCN(torch.nn.Module):def __init__(self):super(GCN, self).__init__()self.conv1 = GCNConv(num_features, 16)self.conv2 = GCNConv(16, num_classes)def forward(self, x, edge_index):# x已经过归一化x = self.conv1(x, edge_index)x = F.relu(x)x = F.dropout(x, training=self.training)x = self.conv2(x, edge_index)return F.log_softmax(x, dim=1)
图神经网络中特征归一化的好处:
- 平衡不同节点的特征影响
- 改善消息传递机制的效果
- 加快模型收敛速度
总结与最佳实践
单位归一化的核心要点 🌟
经过全文的讨论,我们可以总结出关于单位归一化的几个核心要点:
- 单位归一化是一种重要的数据预处理方法,将向量缩放到单位长度(范数为1)
- L2归一化是最常用的单位范数归一化方式,特别适用于方向比大小更重要的场景
- 不同的归一化方法各有优缺点,需要根据数据特点和模型需求进行选择
- 正确应用归一化可以显著提升模型性能,加速收敛并提高稳定性
最佳实践建议 ✅
针对不同场景,以下是一些实用的最佳实践建议:
- 了解你的数据:在选择归一化方法前,先分析数据分布、特征尺度和异常值情况
- 考虑算法需求:不同算法对数据缩放的敏感度不同,选择适合的归一化方法
- 保持一致性:确保训练集和测试集使用相同的归一化参数
- 使用管道:将归一化步骤集成到机器学习管道中,避免数据泄露
- 进行对比实验:在关键应用中,对比不同归一化方法的效果
- 关注稀疏数据:对于稀疏矩阵,选择能保持稀疏性的归一化方法
- 注意时序数据:对于时间序列数据,可能需要特殊处理(如滑动窗口归一化)
归一化方法选择指南 📋
特征情况 | 建议的归一化方法 | 不推荐的方法 |
---|---|---|
正态分布特征 | Z-Score标准化 | Min-Max缩放 |
非正态分布特征 | Min-Max缩放, L2归一化 | Z-Score标准化 |
存在异常值 | 稳健缩放, 分位数变换 | Min-Max缩放 |
稀疏特征 | L1/L2归一化, MaxAbs缩放 | Z-Score标准化 |
方向重要性大于大小 | L2归一化 | Min-Max缩放 |
需要保持正负号 | Z-Score标准化, MaxAbs缩放 | 绝对值归一化 |
结语 🔚
单位归一化,特别是L2归一化,是机器学习中一项看似简单但作用深远的技术。掌握它不仅能帮助你更好地预处理数据,还能让你更深入地理解算法背后的数学原理。
在实践中,归一化并非一成不变的固定步骤,而是需要根据具体问题灵活选择的工具。通过本文的学习,希望你能够在面对不同的机器学习任务时,根据数据特点和模型需求,选择最合适的归一化方法,从而构建出更加高效、稳定的模型。
记住,在机器学习中,数据预处理往往与模型选择同等重要,甚至更为关键。正如古老的计算机谚语所说:“垃圾进,垃圾出”(Garbage In, Garbage Out)。良好的数据归一化是迈向成功模型的第一步。
希望这篇文章能够帮助你在《机器学习的一百个概念》系列中更好地理解单位归一化这一重要概念。下一篇文章中,我们将继续探索机器学习中的其他关键概念,敬请期待!🚀
相关文章:
机器学习的一百个概念(1)单位归一化
前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...
Python 笔记 (二)
Python Note 2 1. Python 慢的原因2. 三个元素3. 标准数据类型4. 字符串5. 比较大小: 富比较方法 rich comparison6. 数据容器 (支持*混装* )一、允许重复类 (list、tuple、str)二、不允许重复类 (set、dict)1、集合(set)2、字典(dict)3、特殊: 双端队列 deque 三、数据容器的共…...
【商城实战(97)】ELK日志管理系统的全面应用
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…...
3.使用epoll实现单线程并发服务器
目录 1. epoll的概述 2. 多线程与epoll的处理流程 2.1 多线程处理流程 2.2 epoll处理流程 3. epoll与多线程的比较 4. epoll的操作函数 4.1 epoll_create() 4.2 epoll_ctl() 4.3 epoll_wait() 5. 示例代码 6. epoll的工作模式 7. 使用O_NONBLOCK防止阻塞 8.运行代…...
蓝桥杯真题------R格式(高精度乘法,高精度加法)
对于高精度乘法和加法的同学可以学学这几个题 高精度乘法 高精度加法 文章目录 题意分析部分解全解 后言 题意 给出一个整数和一个浮点数,求2的整数次幂和这个浮点数相乘的结果最后四舍五入。、 分析 我们可以发现,n的范围是1000,2的1000次方非常大&am…...
PyCharm操作基础指南
一、安装与配置 1. 版本选择 专业版:支持 Web 开发(Django/Flask)、数据库工具、科学计算等(需付费)。 社区版:免费,适合纯 Python 开发。 2. 安装步骤 访问 JetBrains 官网 下载对应版本。…...
21 python __name__ 与 __main__
在办公室里,每个员工都有自己的工牌,上面写着姓名和部门。 一、__name__:模块的名字 Python 模块也有类似的 "工牌"——__name__属性,它记录了模块的身份: 直接运行时 → __name__ "__main__"&…...
NixVis 开源轻量级 Nginx 日志分析工具
NixVis NixVis 是一款基于 Go 语言开发的、开源轻量级 Nginx 日志分析工具,专为自部署场景设计。它提供直观的数据可视化和全面的统计分析功能,帮助您实时监控网站流量、访问来源和地理分布等关键指标,无需复杂配置即可快速部署使用。 演示…...
elementUI el-image图片加载失败解决
是不是,在网上找了一些,都不行,这里一行代码,解决,后端返回图片路径,el-image图片加载失败的问题 解决办法, vue项目里,index.html文件里加一行代码就可 <meta name"refe…...
lxd-dashboard 图形管理LXD/LXC
前言 LXD-WEBGUI是一个完全用AngularJS编写的Web应用程序,无需应用服务器、数据库或其他后端服务支持。只需要简单地托管静态HTML和JavaScript文件,就能立即投入使用。这个项目目前处于测试阶段,提供了直观的用户界面,帮助用户便捷地管理和控制LXD实例。 安装lxd-dashboa…...
C# MemoryStream 使用详解
总目录 前言 在.NET开发中,流(Stream)是一个用于处理输入和输出的抽象类,MemoryStream是流的一个具体实现,它允许我们在内存中读写数据,就像操作文件一样,而无需涉及磁盘 I/O 操作。尤其适合需…...
(二)万字长文解析:deepResearch如何用更长的思考时间换取更高质量的回复?各家产品对比深度详解
DeepResearch的研究背景 业务背景:用更长的等待时间,换取更高质量、更具实用性的结果 当前AI技术发展正经历从“即时响应”到“深度思考”的范式转变。用户对延迟的容忍度显著提升,从传统200ms的交互响应放宽至数秒甚至数分钟,以…...
Redis场景问题1:缓存穿透
Redis 缓存穿透是指在缓存系统(如 Redis)中,当客户端请求的数据既不在缓存中,也不在数据库中时,每次请求都会直接穿透缓存访问数据库,从而给数据库带来巨大压力,甚至可能导致数据库崩溃。下面为…...
数据结构(并查集,图)
并查集 练习版 class UnionFindSet { public:void swap(int* a, int* b){int tmp *a;*a *b;*b tmp;}UnionFindSet(size_t size):_ufs(size,-1){}int UnionFind(int x){}void Union(int x1, int x2){}//长分支改为相同节点int FindRoot(int x){}bool InSet(int x1, int x2)…...
深度学习篇---断点重训模型部署文件
文章目录 前言一、断点重训(Checkpoint)文件1. 动态图(DyGraph)模式.pdparams 文件.pdopt 文件.pdscaler 文件.pdmeta 或 .pkl 文件 2. 静态图(Static Graph)模式.pdparams 和 .pdopt 文件.ckpt 文件 3. 恢…...
chromem-go + ollama + bge-m3 进行文档向量嵌入和查询
Ollama 安装 https://ollama.com/download Ollama 运行嵌入模型 bge-m3:latest ollama run bge-m3:latestchromem-go 文档嵌入和查询 package mainimport ("context""fmt""runtime""github.com/philippgille/chromem-go" )func ma…...
运维面试题(十一)
1.如果一个硬盘 IO 时阻塞了,会发生什么情况? 进程/线程挂起:发起I/O操作的进程或线程会被操作系统置为阻塞状态(等待状态),直到I/O完成。CPU资源释放:阻塞的线程会让出CPU,操作系统…...
深度学习中常见的专业术语汇总
本硕博都是搞机械的匠人,当然也想做一下交叉学科的东西,蹭一下人工智能的热点。虽然世界是个草台班子,但是来都来了,咱也要把这场戏演好。 记得之前网上爆料有位大学生发了很多水文,对,是交叉学科的&#x…...
人工智能赋能医疗:开启智慧医疗新时代
在当今数字化浪潮的推动下,人工智能(AI)技术正以前所未有的速度渗透到各个行业,其中医疗领域更是成为AI技术大放异彩的重要舞台。从疾病诊断到治疗方案制定,从医疗影像分析到药物研发,AI正在为传统医疗带来…...
stable diffusion 本地部署教程 2025最新版
前提: 需要环境 git git下载地址Git - Downloading Package 直接装即可 python3.10.6 下载地址 Python Release Python 3.10.6 | Python.org 记得python环境一定要3.10.6!!! 第一个版本 项目地址https://github.…...
[Mac]利用Hexo+Github Pages搭建个人博客
由于我这台Mac基本没啥环境,因此需要从零开始配置,供各位参考。 注意⚠️:MacBook (M4)使用/bin/zsh作为默认Shell,其对应的配置文件为~/.zshrc 参考文档: HEXO系列教程 | 使用GitHub部署静态博客HEXO | 小白向教程 文…...
罗杰斯特回归
定义 逻辑回归其实就是原来的线性回归加了激活函数,这个函数其实就是sigmoid函数,把一个回归的连续数值压缩到了0到1的空间,其实只要有函数能够满足把数值压缩到0,1之间就可以(因为0到1之间的数值就是概率值) 对于分类…...
27_promise
插入一下前端助手测试,顺手可以用来做安全 promise promise 是一个es6新增的语法 汉语:承诺的意思 作用:是专门用来解决回调地狱!!!! 什么是回调函数? <script>// 回调函数 callback回调// 就是把函数A当作参数传递到函数B中// 在函…...
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 目录 【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 前言: 连接步骤说明 一. 硬件连接 支持的相机接口类型: 连接步骤 2. 软件配置 Visio…...
红宝书第十九讲:详解JavaScript的Fetch API与Ajax请求
红宝书第十九讲:详解JavaScript的Fetch API与Ajax请求 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、基本概念:为什么需要Fetch? Fetch API是浏览器提供的现代网络请求工…...
【深度学习新浪潮】具身智能及其发展前景分析
一、具身智能的定义 具身智能(Embodied Intelligence) 是指通过物理载体(如机器人)与环境实时交互,实现感知、决策与行动闭环的智能系统。其核心在于将人工智能与物理实体结合,强调“智能源于身体与环境的互动”,而非仅依赖虚拟算法。具身智能的典型特征包括多模态感知…...
练习题:111
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 指定文件路径和名称: 定义要写入的内容: 打开文件并写入内容: 异常处理: 输出提示信息: 运行思路 结束语 Python题…...
第三次作业
1、将你的虚拟机的网卡模式设置为nat模式,给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 首先将虚拟机在vmware编辑里将网卡模式改为nat 然后用nmcli c mod ens160 ipv4.addresses 192.168.254.100 nmcli c mod ens160 ipv4.addresses 192.168.254.200…...
Oracle数据库数据编程SQL<3.1 PL/SQL 匿名块 及 流程控制中的条件判断、循环、异常处理和随机函数应用>
PL/SQL部分 在SQL的基础上增加了一些过程化的控制语句。 过程化控制语句包括:类型定义、判断、循环、游标、异常处理(例外处理) 目录 PL/SQL匿名块 一、匿名块基本结构 1、匿名块由三个部分组成: 2、注意事项: …...
CEF 给交互函数, 添加控制台是否显示交互参数log开关
CEF 控制台添加一函数,枚举 注册的供前端使用的CPP交互函数有哪些 CEF 多进程模式时,注入函数,获得交互信息-CSDN博客 这两篇文章,介绍了注入函数,在控制台中显示 各自提供的交互函数信息。 有些场景下,我们还需要更详细的信息,比如想知道 彼此传递的参数, 如果每次调…...
如何用 Postman 正确传递 Date 类型参数,避免服务器解析错误?
如何在 Postman 中传递 Date 类型参数。调试工具如何模拟发送用户端的当前时间呢? Postman 传递 Date 类型参数教程...
从代码学习深度学习 - 含并行连结的网络(GoogLeNet)PyTorch版
文章目录 前言一、GoogLeNet的理论基础1.1 背景与创新点1.2. Inception模块的工作原理二、完整代码实现与解析2.1. 环境准备与工具函数2.2. 数据加载 - Fashion-MNIST2.3. Inception模块设计2.4. GoogLeNet完整模型2.5. 训练函数2.6. 运行训练三、训练结果与分析3.1. 性能分析3…...
进程Kill杀死后GPU显存没有释放仍然被占用,怎么杀死僵尸进程
参考链接: https://blog.csdn.net/qq_37591986/article/details/131118109 使用下面的命令: fuser -v /dev/nvidia0 | awk {print $0} | xargs kill -9一般来说他会杀掉整个用户的所有进程。...
Deepseek API+Python 测试用例一键生成与导出 V1.0.3
** 功能详解** 随着软件测试复杂度的不断提升,测试工程师需要更高效的方法来设计高覆盖率的测试用例。Deepseek API+Python 测试用例生成工具在 V1.0.3 版本中,新增了多个功能点,优化了提示词模板,并增强了对文档和接口测试用例的支持,极大提升了测试用例设计的智能化和易…...
【字符设备驱动开发–IMX6ULL】(一)简介
【字符设备驱动开发–IMX6ULL】(一)简介 一、Linux驱动与裸机开发区别 1.裸机驱动开发回顾 1、底层,跟寄存器打交道,有些MCU提供了库。 spi.c:主机驱动(换成任何一个设备之后只需要调用此文件里面的…...
MaxKB 如何通过Nginx修改浮框提示文字
在使用MaxKB做第三方嵌入的时候,总会有想Diy前端样式的场景,下面就通过Nginx的方式,实现浮框样式的改变。 一、效果对比 修改前: 修改后: 前后对比: 修改了提示文字。去掉了图标后面的白框 下面讲一下该…...
中小型企业网络的搭建
1.1 网络逻辑拓扑、布线方案的设计 1.1.1 网络设计依据 网络设计应遵循以下基本原则: 高效性:确保网络架构能够支持企业日常业务的高效运行。 可靠性:采用冗余设计,确保网络的高可用性,避免单点故障。 可扩展性…...
第二卷:海盐城血战(37-72回)正反人物群像
第二卷:海盐城血战(37-72回)正反人物群像 核心矛盾:寒门军事崛起 → 内部倾轧 → 制度性腐败 主题:通过人物群像展现寒门胜利的虚幻性与权力异化的必然性 一、正派阵营(寒门抗争势力) 1. 刘裕…...
qt之使用redis与其他程序(python)交互同通信
一、前言 有需求,趁热调试出了嵌入式系统的算法环境安装和远程桌面以及一些其他的之前一直未调试出搁置的功能,趁热继续调试进阶功能redis通信,redis与sqlite各有千秋,redis可以作为在嵌入式系统下多个程序之间相互通信的中间件&…...
Pycharm(七):几个简单案例
一.剪刀石头布 需求:和电脑玩剪刀石头布游戏 考察点:1.随机数;2.判断语句 import random # numrandom.randint(1,3) # print(num) # print(**30) #1.录入玩家手势 playerint(input(请输入手势:(1.剪刀 2.石头 3&…...
05.AI搭建preparationの(transformers01)BertTokenizer实现分词编码
一、下载 bert-base-chinese镜像下载 二、简介作用: 模型每个参数占用的字节大小模型大小模型大小层数头数GPT-14 个字节的 FP32 精度浮点数117M446MB1212GPT-22 个字节的 FP161.5亿到1.75亿0.5GB到1.5GB4816GPT-32 个字节的 FP161.75万亿(17500亿&a…...
Perl 环境安装指南
Perl 环境安装指南 引言 Perl是一种广泛使用的解释型、动态编程语言,以其强大的文本处理能力和灵活性著称。本文将为您详细介绍Perl环境的安装过程,包括系统要求、安装步骤以及注意事项。 系统要求 在安装Perl之前,请确保您的计算机满足以下基本要求: 操作系统:Window…...
Visual Studio中创建和配置设置文件(Settings.settings) - 详细步骤指南——待调试
#在Visual Studio中创建和配置设置文件(Settings.settings) - 详细步骤指南 在Visual Studio中创建和配置应用程序设置文件,用于保存用户上次输入的值。 第一步:添加设置文件 1. **打开你的项目**:在Visual Studio中打开你的AutoCAD插件项目 …...
Nginx的时钟精度陷阱:request_time与upstream_response_time差异分析
在elasticsearch 采集nginx日志分析的场景下发现, request_time 小于upstream_response_time ,于是才有了这边文章。 在 Nginx 中,upstream_response_time 和 request_time 使用不同的系统时钟和精度机制来记录时间,这可能导致 u…...
参加李继刚线下活动启发:未来提示词还会存在吗?
上周六,我参加了李继刚老师组织的线下活动。 现场干货满满,尤其是关于 AI 时代提示词的价值、与 AI 沟通的艺术等话题,李老师的分享如同醍醐灌顶,让我对 AI 人机协作有了更深的理解。 将几点核心收获整理出来,与大家…...
C++作用域辨识详解
在 C 中,作用域(Scope)定义了变量、函数、类等标识符的可见性和生命周期。理解作用域对于编写清晰、高效的代码至关重要。以下是 C 中作用域的详细分类和说明。 1. 全局作用域(Global Scope) 全局作用域是指在所有函…...
MYTOOL-记事本
一、前言 目录 1.原型设计 2.程序实现 3.最终界面说明 二、环境 windows10 每个软件工具前期会设计大概的原型,我设计的原型工具使用Axure RP9,很不错的一个设计工具 三、正文 1.原型设计 2.程序实现 3.最终界面说明 四、结语...
混合知识表示系统框架python示例
前文我们已经深入学习了框架表示法、产生式规则和一阶谓词逻辑,并对它们进行了深度对比,发现它们在不同的应用场景下各有优缺点。 一阶谓词逻辑适合复杂逻辑推理场景,具有数学定理证明、形式化系统规范的优点;产生式规则适合动态决策系统,支持实时决策(如风控、诊断),规…...
Vue2——常用指令总结、指令修饰符、v-model原理、computed计算属性、watch监听器、ref和$refs
文章目录 一、概念理解二、指令1. 常用内置指令总结2. 常用指令修饰符3. 自定义指令4. v-model原理表单类组件封装 三、补充1. computed计算属性2. watch监视器3. ref和$refs 一、概念理解 【事件处理函数】 事件处理函数应该写到一个跟data同级的配置项(methods&a…...
2025-3-29算法打卡
一,回文判定 1.题目描述: 题目描述 给定一个长度为 nn 的字符串 SS。请你判断字符串 SS 是否回文。 输入描述 输入仅 11 行包含一个字符串 SS。 1≤∣S∣≤1061≤∣S∣≤106,保证 SS 只包含大小写、字母。 输出描述 若字符串 SS 为回…...