Python 4种方法对不同数量级数据归一化

在机器学习和数据处理过程中,对不同数量级的数据进行归一化是一项重要的预处理步骤。归一化可以将数据缩放到同一范围,避免某些特征因数值较大而主导模型训练。

Python 提供了多种方法对数据进行归一化,以下介绍一些常用的归一化方法以及python实现。

①MinMaxScaler:将所有数据缩放到0到1的范围,保留了每列数据的比例关系。

原理:通过线性变换将数据压缩到[0, 1]区间,公式为:

优点:保留原始数据分布,简单直观。

缺点:对异常值非常敏感,异常值会极大地影响缩放效果。

②StandardScaler:对数据进行标准化,使其均值为0,标准差为1,适用于假设数据符合正态分布的情况。

原理:对数据进行标准化处理,使其均值为0,标准差为1,公式为:

其中,μ为均值,σ为标准差。

优点:适合正态分布数据,消除量纲影响。

缺点:对非正态分布的数据表现一般。
③MaxAbsScaler:按每列数据的最大绝对值进行缩放,保留了数据的稀疏性。

原理:根据每列数据的最大绝对值进行缩放,使数据范围在[-1, 1]之间,公式为:

优点:适合稀疏数据,保留稀疏性。

缺点:对异常值依然敏感。

④RobustScaler:对数据的中位数和四分位距进行缩放,减少异常值对归一化的影响。

原理:基于中位数和四分位间距(IQR)对数据进行缩放,公式为:

其中,IQR为第75百分位数减去第25百分位数。

优点:对异常值有较强的鲁棒性。

缺点:对于分布极端不均的数据,效果可能不理想。

下面是归一化的Python程序:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler, StandardScaler, MaxAbsScaler, RobustScaler

# 生成不同数量级的数据
def generate_data():
    np.random.seed(42)
    data1 = np.random.randint(1, 10, 100)  # 数量级1-10
    data2 = np.random.randint(100, 1000, 100)  # 数量级100-1000
    data3 = np.random.randint(10000, 100000, 100)  # 数量级10000-100000
    return np.vstack((data1, data2, data3)).T

# 归一化方法
def apply_normalization(data):
    scalers = {
        "MinMaxScaler": MinMaxScaler(),  # 将数据线性缩放到[0, 1]区间
        "StandardScaler": StandardScaler(),  # 标准化(z-score),均值为0,标准差为1
        "MaxAbsScaler": MaxAbsScaler(),  # 以最大绝对值缩放,范围[-1, 1]
        "RobustScaler": RobustScaler(),  # 使用中位数和IQR缩放,减少异常值影响
    }
    return {name: scaler.fit_transform(data) for name, scaler in scalers.items()}

# 绘图函数
def plot_normalization(data, methods):
    fig, axs = plt.subplots(len(methods) + 1, 1, figsize=(12, 18))

    # 原始数据
    axs[0].plot(data, alpha=0.7)
    axs[0].set_title("Original Data (Different Scales)")
    axs[0].grid(True)

    # 绘制归一化后的数据
    for i, (name, norm_data) in enumerate(methods.items(), start=1):
        axs[i].plot(norm_data, alpha=0.7)
        axs[i].set_title(f"Data Normalized with {name}")
        axs[i].grid(True)

    plt.tight_layout()
    plt.show()

# 主程序
if __name__ == "__main__":
    data = generate_data()  # 生成数据
    normalized_data = apply_normalization(data)  # 归一化处理
    plot_normalization(data, normalized_data)  # 显示结果

效果如下:


相关文章

怎样用Python进行数据转换和归一化

怎样用Python进行数据转换和归一化 1、概述 实际的数据库极易受到噪声、缺失值和不一致数据的侵扰,因为数据库太大,并且多半来自多个异种数据源,低质量的数据将会导致低质量的数据分析结果,大量的数据...

提升数据质量的秘密武器:最小-最大归一化全揭秘

最小-最大归一化(Min-Max Normalization)是一种常见的数据预处理技术,用于将特征数据缩放到一个固定的范围(通常是[0, 1])。这种归一化方法通过将数据按比例缩放,使得数据集的最小...

python对音频的处理

首先,我们需要 import 几个工具包,一个是 python 标准库中的 wave 模块,用于音频处理操作,另外两个是 numpy 和 matplot,提供数据处理函数一:读取本地音频数据处理音频第...

再见了,Python~

这几天,很多同学问到,关于Python数据分析方面的操作。用起来头疼,需要不断的查询。所以,今天给大家总结了100个最最核心的操作。如果再遇到问题,这里直接查看,超级方便,基本日常使用的都有了~需要本...

在Python中将函数作为参数传入另一个函数中

在我们的Python学习中,我们学到的众多令人瞠目结舌的事实之一是,你可以将函数传入其他函数。你可以来回传递函数,因为在Python中,函数是对象。在使用Python的第一周,你可能不需要了解这些,但...