zoukankan      html  css  js  c++  java
  • 数据规范化

    数据规范化就是消除量纲的影响,这点很重要。

    对算法的作用

    在以梯度和矩阵为核心的算法中,譬如逻辑回归、神经网络、svm,规范化能加快求解速度,

    在以距离计算为核心的算法中,譬如KNN、Kmeans,规范化能提高模型的精度,

    在树模型中,无需规范化。

    概述

    数据规范化有很多种方法,总体可以分为线性的和非线性的,线性的规范化包括中心化处理和缩放处理中心化是把数据减去某个值, 以平移到某个位置,缩放是把数据除以某个值,把数据固定在某个范围。取log也是一种缩放处理。

    常用的数据规范化方法有归一化、标准化、极差标准化、log等

    归一化

    x-min/max-min,把数据规范在(0, 1)之间,当然也可以是其他范围

    归一化容易受到异常值的影响,所以一般不是首选,如果标准化效果不好时,可以试试归一化

    在不涉及梯度、矩阵、距离的算法中,可以先试试归一化,如图像处理

    示例代码

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import MinMaxScaler
    
    
    np.set_printoptions(2)
    np.random.seed(10)
    
    data = np.random.uniform(-5, 5, size=(100, 1))        # 注意数据必须是2维的
    data = np.random.normal(-5, 5, size=(100, 1))
    print(data.T)
    plt.plot(data, '.')
    
    # 归一化
    scaler = MinMaxScaler()
    scaler = scaler.fit(data)
    data2 = scaler.transform(data)
    print(data2.T)
    plt.plot(data2, 'ro')
    
    # 数据还原
    old_data = scaler.inverse_transform(data2)           # 逆操作
    print(old_data.T)
    
    # 归一化到指定范围
    scaler2 = MinMaxScaler(feature_range=[2, 4])        # 归一到指定范围内
    scaler2.fit(old_data)
    data3 = scaler2.transform(old_data)
    plt.plot(data3, 'y*')
    
    plt.show()
    
    
    # 当特征很多时,fit会报错,表示计算不了,此时用 partial_fit
    scaler3 = MinMaxScaler()
    scaler3.partial_fit(data)
    data4 = scaler3.transform(data)
    print(data4.T)

    MinMaxScaler  fit  transform  fit_transform  inverse_transform  partial_fit

    标准化

    通常说的标准化是指标准差标准化,即 x-mean/std

    std在一定程度上代表了数据的"跨度",可以理解为取值范围,也可以理解为量纲,除以标准差就是消除量纲

    也可以做一些其他尝试,比如 x-min/std,这叫正规化

    x-mean/max-min,这叫极差标准化    

    示例代码

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import StandardScaler
    
    
    np.set_printoptions(precision=2)
    np.random.seed(10)
    
    data = np.random.uniform(-5, 5, size=(100, 1))
    print(data.T)
    plt.plot(data, '.')
    
    scaler = StandardScaler()
    scaler.fit(data)
    print(scaler.mean_)     # [-0.15]
    print(scaler.var_)      # [7.56]
    
    data = scaler.transform(data)
    print(data.mean())      # -1.97064586871e-17    0
    print(data.var())       # 1
    
    old_data = scaler.inverse_transform(data)
    print(old_data.T)
    plt.plot(data, 'ro')
    
    plt.show()

    另一个函数实现标准化

    import numpy as np
    from sklearn.preprocessing import MinMaxScaler, StandardScaler, scale
    
    
    data = np.random.uniform(-5, 5, size=(20, 1))
    
    data1 = MinMaxScaler().fit_transform(data)
    print(data1.T)
    data2 = StandardScaler().fit_transform(data)
    print(data2.T)
    data3 = scale(data)
    print(data3.T)      # ==data2

    还有很多不太常用的,sklearn也提供了API

  • 相关阅读:
    获取其他线程的数据用 queue, 多进程Q
    self: 限制并发量asyncio
    asyncio 中给running 的loop 动态添加 Future Task
    雾里看花之 Python Asyncio
    python协程之动态添加任务
    异步IO( asyncio) 协程
    加快phpstorm、rubymine、pycharm系列IDE运行速度的方法
    scrapy 'fcntl' has no attribute 'F_GETFD
    sitemap index
    Django模板系统 运算
  • 原文地址:https://www.cnblogs.com/yanshw/p/10701828.html
Copyright © 2011-2022 走看看