python使用如下方法规范化数组_关于python:规范化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)的作用是什么? 我怎么了?

请注意,这不是标准化的传统公式,通常用(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. ]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值