规范化 VS。 numpy 规范化方法?
Normalization VS. numpy way to normalize?
我应该规范化一个数组。我读过有关规范化的内容并遇到了一个公式:
我为它写了下面的函数:
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)
这应该规范化元素数组。
然后我遇到了这个:
这表示您可以通过简单地执行此操作来规范化数组:
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)
是做什么的?我哪里弄错了?
您引用的 question/answer 并未明确将您自己的公式与您在此处使用的 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。所以你在这里谈论两个不同的领域,一个是统计,另一个是线性代数。
规范化有多种类型。您正在使用最小-最大规范化。来自 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 完全使用您的 normalization/scaling 公式:
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.minmax_scale.html
@OuuGiii:注意: 使用 Python 内置函数名称作为可变名称不是一个好主意。 list()
是一个 Python 内置函数,因此应避免将其用作变量。
python 的强大之处在于它的 broadcasting 属性,它允许您在不显式循环的情况下进行向量化数组操作。因此,您无需使用显式 for 循环编写函数,这既缓慢又耗时,尤其是当您的数据集太大时。
pythonic 做 min-max normalization 的方式是
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. ]
我应该规范化一个数组。我读过有关规范化的内容并遇到了一个公式:
我为它写了下面的函数:
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)
这应该规范化元素数组。
然后我遇到了这个: 这表示您可以通过简单地执行此操作来规范化数组:
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)
是做什么的?我哪里弄错了?
您引用的 question/answer 并未明确将您自己的公式与您在此处使用的 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。所以你在这里谈论两个不同的领域,一个是统计,另一个是线性代数。
规范化有多种类型。您正在使用最小-最大规范化。来自 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 完全使用您的 normalization/scaling 公式: http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.minmax_scale.html
@OuuGiii:注意: 使用 Python 内置函数名称作为可变名称不是一个好主意。 list()
是一个 Python 内置函数,因此应避免将其用作变量。
python 的强大之处在于它的 broadcasting 属性,它允许您在不显式循环的情况下进行向量化数组操作。因此,您无需使用显式 for 循环编写函数,这既缓慢又耗时,尤其是当您的数据集太大时。
pythonic 做 min-max normalization 的方式是
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. ]