归一化VS. numpy方式规范化?

Ouu*_*iii 5 python numpy normalization

我应该规范化一个数组.我读过有关规范化的内容并遇到一个公式:

在此输入图像描述

我为它写了以下函数:

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)
Run Code Online (Sandbox Code Playgroud)

这应该规范化元素数组.

然后我遇到了这个:https://stackoverflow.com/a/21031303/6209399 这说你可以通过简单地执行以下操作来规范化数组:

def normalize_list_numpy(list):
    normalized_list = list / np.linalg.norm(list)
    return normalized_list
Run Code Online (Sandbox Code Playgroud)

如果我test_array = [1, 2, 3, 4, 5, 6, 7, 8, 9]用我自己的函数和numpy方法规范化这个测试数组,我得到这些答案:

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
Run Code Online (Sandbox Code Playgroud)

为什么函数给出不同的答案?还有其他方法来规范化数据数组吗?怎么numpy.linalg.norm(list)办?我有什么问题?

ute*_*ngr 7

有不同类型的规范化.您正在使用min-max规范化.来自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))
Run Code Online (Sandbox Code Playgroud)

输出:

[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]
Run Code Online (Sandbox Code Playgroud)

MinMaxscaler完全使用您的公式进行规范化/缩放:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.minmax_scale.html

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

  • 不知道这个存在,+1.@OuuGii直接来自docs这个函数,"这个转换经常用作零均值,单位方差缩放的替代." (2认同)

Bra*_*mon 5

您引用的问题/答案未将您自己的公式与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.   ]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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