我应该规范化数组。 我已经读过有关规范化的内容,并遇到了一个公式:


我为此编写了以下函数:

def normalize_list(list):
max_value = max(list)
min_value = min(list)
for i in range(0, len(list)):
list[i] = (list[i] - min_value) / (max_value - min_value)

那应该规范化元素数组。

然后我遇到了这个:https://stackoverflow.com/a/21031303/6209399

也就是说,您可以通过执行以下操作来标准化数组:

def normalize_list_numpy(list):
normalized_list = list / np.linalg.norm(list)
return normalized_list

如果使用我自己的函数和numpy方法对该测试数组test_array = [1, 2, 3, 4, 5, 6, 7, 8, 9]进行规范化,则会得到以下答案:

My own function: [0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0]
The numpy way: [0.059234887775909233, 0.11846977555181847, 0.17770466332772769, 0.23693955110363693, 0.29617443887954614, 0.35540932665545538, 0.41464421443136462, 0.47387910220727386, 0.5331139899831830

为什么函数给出不同的答案? 还有其他方法可以标准化数据数组吗? numpy.linalg.norm(list)的作用是什么? 我怎么了?

请注意,这不是标准化的传统公式,通常用(x-x_mean)/ stdev(x)表示,它将x标准化为正态分布。 (stdev是标准偏差。)

同意布拉德。您的公式将值缩放到区间[0,1],而"归一化"更通常意味着转换为均值0和方差1(在统计数据中),或者将向量缩放为相对于某些范数具有单位长度(通常为L2) )。

这不是所谓的标准化吗? @phg

@OuuGiii不,在没有正式引用的情况下,我想说"归一化"和"标准化"都是指减去均值并除以标准差,以使数据具有N?(0,1)分布。也许归一化可以采用您在线性代数上下文中提到的含义,但是我想说phg是主要用法。

香港专业教育学院尝试通过" x-x_mean)/ stdev(x)" @ BradSolomon的方式说,它仍然没有给出相同的答案,以麻木的方式规范化列表。 numpy方法有什么作用?

您定义的normalize_list_numpy与Im所说的@utengr也提到的缩放类型完全不同。这不是" NumPy方法",它只是实现特定比例缩放定义的NumPys方法。我的观点是从数学上讲,它们是完全不同的两件事。

@OuuGiii是的,至少根据此答案,归一化是指[0,1]范围,而标准化是指均值0方差1。

现在您已经看到"规范化"与上下文有关,请询问告诉您您应该做什么的人。不要问别人猜。

有不同类型的规范化。您正在使用最小-最大规格化。 scikit learning的最小-最大归一化如下。

import numpy as np
from sklearn.preprocessing import minmax_scale
# your function
def normalize_list(list_normal):
max_value = max(list_normal)
min_value = min(list_normal)
for i in range(len(list_normal)):
list_normal[i] = (list_normal[i] - min_value) / (max_value - min_value)
return list_normal
#Scikit learn version
def normalize_list_numpy(list_numpy):
normalized_list = minmax_scale(list_numpy)
return normalized_list
test_array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
test_array_numpy = np.array(test_array)
print(normalize_list(test_array))
print(normalize_list_numpy(test_array_numpy))

输出:

[0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0]
[0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0]

MinMaxscaler完全使用您的公式进行归一化/缩放:

http://scikit-learn.org/stable/modules/generation/sklearn.preprocessing.minmax_scale.html

@OuuGiii:注意:将Python内置函数名称用作变量名称不是一个好主意。 list()是Python的内置函数,因此应避免将其用作变量。

不知道这个存在,+ 1。 直接来自文档的@OuuGii,"此转换通常用作零均值,单位方差缩放的替代方法。"

@BradSolomon它在sklearn中经常用于特征缩放,然后再将其馈送到svm或knn等各种敏感分类器。

您引用的问题/答案未将您自己的公式与您在此处使用的np.linalg.norm(list)版本明确关联。

一个NumPy解决方案是这样的:

import numpy as np
def normalize(x):
x = np.asarray(x)
return (x - x.min()) / (np.ptp(x))
print(normalize(test_array))
# [ 0.     0.125  0.25   0.375  0.5    0.625  0.75   0.875  1.   ]

这里np.ptp是峰到峰,即

Range of values (maximum - minimum) along an axis.

此方法将值缩放为@phg指出的间隔[0,1]。

归一化的更传统定义是缩放为0均值和单位方差:

x = np.asarray(test_array)
res = (x - x.mean()) / x.std()
print(res.mean(), res.std())
# 0.0 1.0

或使用sklearn.preprocessing.normalize作为预设功能。

使用test_array / np.linalg.norm(test_array)创建的结果具有单位长度;您会看到np.linalg.norm(test_array / np.linalg.norm(test_array))等于1。因此,您在这里谈论的是两个不同的字段,一个是统计字段,另一个是线性代数。

谢谢,但是函数normalize_list_numpy()会做什么?

@OuuGiii它使向量的长度为1。

@OuuGiii查看np.linalg.norm(test_array np.linalg.norm(test_array))的结果以了解@phgs注释。

python的强大功能是它的广播属性,它使您可以进行向量化数组操作而无需显式循环。因此,您不需要为循环使用显式编写函数,这很慢且耗时,尤其是在您的数据集太大的情况下。

执行最小-最大规范化的pythonic方法是

test_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
normalized_test_array = (test_array - min(test_array)) / (max(test_array) - min(test_array))
output >> [ 0., 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1. ]