计算机系统应用教程网站

网站首页 > 技术文章 正文

22数据预处理:归一化-正则化

btikc 2025-01-04 17:25:27 技术文章 11 ℃ 0 评论


前言

在前一篇文章中已经和大家分享过了21数据预处理:标准化,常用的标准化处理方法有两类四种,其中scale函数,minmax_scale函数对应的有其类的实现方法。标准化处理过程是个“物理过程”,是属于对特征向量列的线性变换,数据在进行标准化处理前后不改变其位次和分布形态。

本文是前一篇文章的继续,都属于数据预处理。

归一化

归一化是缩放单个样本以具有单位范数的过程。使每个样本的范数为1。如果使用点积或任何其他核函数来量化任何样本间的相似度,则在计算相似性之前必须要进行归一处处理。这个观点基于向量空间模型(Vector Space Model),经常在文本分类和内容聚类中使用。

范数

范数(norm)是数学中的一种基本概念。在泛函分析中,它定义在赋范线性空间中,并满足一定的条件,即①非负性;②齐次性;③三角不等式。它常常被用来度量某个向量空间(或矩阵)中的每个向量的长度或大小。

sklearn归一化方法

sklearn.preprocessing模块的normalize函数提供了一个快速简单的方法,在类似数组的数据集上执行l1 或 l2 范数。归一化、正则化的过程是将每个样本缩放到单位范数(使得每个样本的范数为1)。

如果计算两个样本之间的相似性这个方法会很有用。其主要思想是对每个样本计算其p阶范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p阶范数(l1-norm,l2-norm)等于1。

p阶范数的计算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p


该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。

normalize函数对样本数据进行归一化

Signature:

normalize(X, norm='l2', *, axis=1, copy=True, return_norm=False)

Docstring:

Scale input vectors individually to unit norm (vector length).

作用:将行向量按单位范数(向量长度)缩放。

norm:用来归一化每个非零样本的范数,'l1', 'l2', or 'max', optional ('l2' by default) 。

axis:0,1。默认为1,按照样本行归一化。

与Normalizer类实现相同功效。Normalizer类提供了实现归一化处理的转化API(Transformer API)。

For any vector

V = (x, y, z),

|V| = sqrt(x*x + y*y + z*z) gives the length of the vector.

When we normalize a vector, we actually calculate

V/|V| = (x/|V|, y/|V|, z/|V|).

It is easy to see that a normalized vector has length 1. This is because:

| V/|V| | = sqrt((x/|V|)*(x/|V|) + (y/|V|)*(y/|V|) + (z/|V|)*(z/|V|)) ?

= sqrt(x*x + y*y + z*z) / |V| = |V| / |V| = 1

?示例

from sklearn.preprocessing import Normalizer
from sklearn.preprocessing import normalize

X = [[ 1., -1.,  2.],
        [ 2.,  0.,  0.],
        [ 0.,  1., -1.]]
     
X_normalized = normalize(X, norm='l2',axis=1)

使用processing.Normalizer类实现归一化

preprocessing 预处理模块提供的 Normalizer 类,使用 Transformer API 实现了相同的操作,?算法相同,结果一样。

归一化前后对数据分布的影响

为了保持前后连贯,呈现一致,依然使用前一篇文章 21数据预处理:标准化 用到的数据集进行演示。类似程序就不在此重复了,您可以通过查阅前一篇文章 21数据预处理:标准化 ,就可以查看到演示用原始数据。这里,只是给出结果。分布变了,样本可比。

import seaborn as sns
sns.set_style(style="ticks")

X_normalized = normalize(X) #按行
f = sns.jointplot(x=X_normalized[:,0], y=X_normalized[:,1], kind="hex", color="#4CB391")
f.set_axis_labels("Median Income", "Number of households")
f.fig

结论

?标准化

对不同特征向量的伸缩变换的目的是使得不同度量之间的特征具有可比性。同时不改变原始数据的分布。

标准化使得不同度量之间的特征具有可比性,对目标函数的影响体现在几何分布上,而不是数值上,不改变原始数据的分布。

归一化(正则化)

对不同特征维度的伸缩变换的目的是使各个样本特征维度对目标函数的影响权重是一致的,即使得那些扁平分布的数据伸缩变换成类圆形。归一化改变了原始数据的一个分布。归一化后,提高迭代求解的收敛速度,提高迭代求解的精度。


感兴趣的,可以关注我的微信公众号:曾老师会计与统计

或者关注我的今日头条公众号:曾老师财务数据Hub

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表