使用Python对数据进行归一化规格化

标签: 程序开发 Python | 发表时间:2017-12-14 18:14 | 作者:标点符
出处:https://www.biaodianfu.com

数据归一化问题是数据挖掘中特征向量表达时的重要问题,当不同的特征成列在一起的时候,由于特征本身表达方式的原因而导致在绝对数值上的小数据被大数据“吃掉”的情况,这个时候我们需要做的就是对抽取出来的features vector进行归一化处理,以保证每个特征被分类器平等对待。先前的文章中已经介绍了几种常见的 数据归一化的方法,这里对主要整理了如何将这些公式和方法转化程Python代码。

min-max标准化(Min-Max Normalization)

也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 – 1]之间。转换函数如下:

    \[{x}_{normalization}=\frac{x-Min}{Max-Min}\]

x_min表示样本数据的最小值,x_max表示样本数据的最大值。

Python代码实现:

def max_min_normalization(x, max, min):
    return (x - min) / (max - min)

或:

def max_min_normalization(x):
    return [(float(i)-min(x))/float(max(x)-min(x)) for i in x]

找大小的方法除了使用list自带的max和min,推荐使用np.max和np.min,因为起功能更加强大。

>>> a = np.array([[0, 1, 6], [2, 4, 1]])
>>> np.max(a)
6
>>> np.max(a, axis=0) # max of each column
array([2, 4, 6])

参考链接: https://stackoverflow.com/questions/33569668/numpy-max-vs-amax-vs-maximum

如果想要将数据映射到[-1,1],则将公式换成:

    \[{x}_{normalization}=\frac{x-x_{mean}}{Max-Min}\]

x_mean 表示平均值。

Python代码实现:

import numpy as np

def normalization(x):
    return [(float(i)-np.mean(x))/(max(x)-min(x)) for i in x]

该标准化方法有一个缺点就是,如果数据中有一些偏离正常数据的异常点,就会导致标准化结果的不准确性。

z-score标准化

z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。

经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:

    \[{x}_{normalization}=\frac{x-\mu }{\sigma }\]

其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

Python实现:

def z_score_normalization(x,mu,sigma):  
    return (x - mu) / sigma

mu为均值,sigma为标注差,所以代码可以改写为:

#定义数组:x = numpy.array(x)
#获取二维数组列方向的均值:x.mean(axis = 0)
#获取二维数组列方向的标准差:x.std(axis = 0)

x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
x = numpy.array(x)
def z_score(x):
    return (x - np.mean(x)) / np.std(x, ddof = 1)

z-score标准化方法同样对于离群异常值的影响。改进的z-score标准化:将标准分公式中的均值改为中位数,将标准差改为绝对偏差。

    \[{x}_{normalization}=\frac{x-{x}_{center} }{\sigma_1 }\]

中位数是指将所有数据进行排序,取中间的那个值,如数据量是偶数,则取中间两个数据的平均值。

# 中位数 英文:median
# 对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。
# 如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
def get_median(data):
    data = sorted(data)
    size = len(data)
    if size % 2 == 0: # 判断列表长度为偶数
        median = (data[size/2]+data[size/2-1])/2
    if size % 2 == 1: # 判断列表长度为奇数
        median = data[(size-1)//2]
    return median

σ1为所有样本数据的绝对偏差,其计算公式为:

    \[\frac{1}{N} \sum_{1}^{n}|x_{i} - x_{center}|\]

Sigmoid函数

Sigmoid函数是一个具有S形曲线的函数,是良好的阈值函数,在(0, 0.5)处中心对称,在(0, 0.5)附近有比较大的斜率,而当数据趋向于正无穷和负无穷的时候,映射出来的值就会无限趋向于1和0,是个人非常喜欢的“归一化方法”,之所以打引号是因为我觉得Sigmoid函数在阈值分割上也有很不错的表现,根据公式的改变,就可以改变分割阈值,这里作为归一化方法,我们只考虑(0, 0.5)作为分割阈值的点的情况:

    \[{x}_{normalization}=\frac{1}{1+{e}^{-x}}\]

Python实现:

def sigmoid(X,useStatus):  
    if useStatus:  
        return 1.0 / (1 + np.exp(-float(X)));  
    else:  
        return float(X);

这里useStatus管理是否使用sigmoid的状态,方便调试使用。

sklearn中的归一化

sklearn.preprocessing 提供了一些实用的函数 用来处理数据的维度,以供算法使用。

1)均值-标准差缩放

即我们上边对应的z-score标准化。

from sklearn import preprocessing
import numpy as np

x_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
x_scaled = preprocessing.scale(x_train)
print(x_scaled)

# output:
# [[ 0.         -1.22474487  1.33630621]
#  [ 1.22474487  0.         -0.26726124]
#  [-1.22474487  1.22474487 -1.06904497]]

2)min-max标准化

from sklearn import preprocessing
import numpy as np

x_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
x_train_minmax = min_max_scaler.fit_transform(x_train)
print(x_train_minmax)

# output:
# [[ 0.5         0.          1.        ]
#  [ 1.          0.5         0.33333333]
#  [ 0.          1.          0.        ]]

3)最大值标准化(每个数值/每个维度的最大数值)

from sklearn import preprocessing
import numpy as np

x_train = np.array([[1., -1.,  2.],
                    [2.,  0.,  0.],
                    [0.,  1., -1.]])
max_abs_scaler = preprocessing.MaxAbsScaler()
x_train_maxabs = max_abs_scaler.fit_transform(x_train)
print(x_train_maxabs)

# output:
# [[ 0.5 -1.   1. ]
#  [ 1.   0.   0. ]
#  [ 0.   1.  -0.5]]

4)规范化

规范化是文本分类和聚类中向量空间模型的基础。

from sklearn import preprocessing
import numpy as np

x_train = np.array([[1., -1.,  2.],
                    [2.,  0.,  0.],
                    [0.,  1., -1.]])
x_normalized = preprocessing.normalize(x_train, norm='l2')
print(x_normalized)

# output:
# [[ 0.40824829 -0.40824829  0.81649658]
#  [ 1.          0.          0.        ]
#  [ 0.          0.70710678 -0.70710678]]

norm 该参数是可选的,默认值是l2(向量各元素的平方和然后求平方根),用来规范化每个非零向量,如果axis参数设置为0,则表示的是规范化每个非零的特征维度。

具体请参考: 范数规则化L0、L1与L2范数

5)二值化(将数据转换到0和1)

from sklearn import preprocessing
import numpy as np

x_train = np.array([[1., -1.,  2.],
                    [2.,  0.,  0.],
                    [0.,  1., -1.]])
binarizer = preprocessing.Binarizer().fit(x_train)
print(binarizer)
print(binarizer.transform(x_train))
# output:
# Binarizer(copy=True, threshold=0.0)
# [[ 1.  0.  1.]
#  [ 1.  0.  0.]
#  [ 0.  1.  0.]]

参考链接:

相关 [python 数据 归一化] 推荐:

使用Python对数据进行归一化规格化

- - 标点符
数据归一化问题是数据挖掘中特征向量表达时的重要问题,当不同的特征成列在一起的时候,由于特征本身表达方式的原因而导致在绝对数值上的小数据被大数据“吃掉”的情况,这个时候我们需要做的就是对抽取出来的features vector进行归一化处理,以保证每个特征被分类器平等对待. 先前的文章中已经介绍了几种常见的 数据归一化的方法,这里对主要整理了如何将这些公式和方法转化程Python代码.

数据归一化和两种常用的归一化方法

- - zzm
数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和 量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性. 原始数据经过数据标准 化处理后,各指标处于同一数量级,适合进行综合对比评价. 一、min-max标准化(Min-Max Normalization).

Python连接数据库之DB-API

- - 标点符
在Python中如果要连接数据库,不管是 MySQL、 SQL Server、 PostgreSQL亦或是SQLite,使用时都是采用游标的方式,所以就不得不学习Python DB-API. Python所有的数据库接口程序都在一定程度上遵守 Python DB-API 规范. DB-API定义了一系列必须的对象和数据库存取方式,以便为各种底层数据库系统和多种多样的数据库接口程序提供一致的访问接口.

Neo4j 推出基于 Python 的嵌入式图数据存储

- wang - python.cn(jobs, news)
Neo4j很早就在说,会推出一个嵌入在Python中的图数据库模块,让Python可以通过图数据库的API操作本地文件以存储图结构的数据(类似于很多支持SQLite的类库). 而今天Neo4j终于在官方博客上兑现了其承诺,并为自己的多次跳票表示抱歉. 目前最新版本在CPython2.7.2  Windows和Linux下都经过测试,在Python2.6版本下也可以正常工作.

飘逸的python - 大数据TopK问题的quick select解法

- - CSDN博客推荐文章
TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词.. 先排序,然后截取前k个数.. 时间复杂度:O(n*logn)+O(k)=O(n*logn). 维护容量为k的最小堆.根据最小堆性质,堆顶一定是最小的,如果小于堆顶,则直接pass,如果大于堆顶,则替换掉堆顶,并heapify整理堆,其中heapify的时间复杂度是logk..

使用python抓取并分析京东商品评论数据

- - 蓝鲸的网站分析笔记
本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化. 下面是要抓取的商品信息,一款女士文胸. 这个商品共有红色,黑色和肤色三种颜色, 70B到90D共18个尺寸,以及超过700条的购买评论. 京东商品评论信息是由JS动态加载的,所以直接抓取商品详情页的URL并不能获得商品评论的信息.

用Python爬取微博数据生成词云图片

- - 编程学习网
很早之前写过一篇怎么利用微博数据制作词云图片出来,之前的写得不完整,而且只能使用自己的数据,现在重新整理了一下,任何的微博数据都可以制作出来,放在今天应该比较应景. 一年一度的虐汪节,是继续蹲在角落默默吃狗粮还是主动出击告别单身汪加入散狗粮的行列就看你啦,七夕送什么才有心意,程序猿可以试试用一种特别的方式来表达你对女神的心意.

数据归一化,标准化的几种方法

- - zzm
归一化方法(Normalization Method). 把数变为(0,1)之间的小数. 主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内. 把有量纲表达式变为无量纲表达式. 归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量.

关于Python数据分析,这里有一条高效的学习路径

- -
谷歌的数据分析可以预测一个地区即将爆发的流感,从而进行针对性的预防;淘宝可以根据你浏览和消费的数据进行分析,为你精准推荐商品;口碑极好的网易云音乐,通过其相似性算法,为不同的人量身定制每日歌单……. 数据正在变得越来越常见,小到我们每个人的社交网络、消费信息、运动轨迹……,大到企业的销售、运营数据,产品的生产数据,交通网络数据…….

dropbox讲python

- chuang - Initiative
dropbox定制优化CPython虚拟机,自己搞了个malloc调度算法. 那个 !!!111cos(0). 期待这次PyCon China 2011.