规范化 VS。 numpy 规范化方法?

新手上路,请多包涵

我应该标准化一个数组。我读过规范化并遇到了一个公式:

在此处输入图像描述

我为它编写了以下函数:

 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) 是做什么的?我错了什么?

原文由 OuuGiii 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 898
2 个回答

有不同类型的规范化。您正在使用最小-最大规范化。来自 scikit learn 的 min-max 归一化如下。

 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/generated/sklearn.preprocessing.minmax_scale.html

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

原文由 utengr 发布,翻译遵循 CC BY-SA 3.0 许可协议

您引用的问题/答案并未明确将您自己的公式与您在此处使用的 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 是峰峰值即

沿轴的值范围(最大值 - 最小值)。

正如@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。所以你在这里谈论两个不同的领域,一个是统计,另一个是线性代数。

原文由 Brad Solomon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏