归一化带来[0,1]的范围

时间:2013-08-22 12:27:38

标签: python

我有一个巨大的数据集,我可以从中获得两组数据点,然后我必须绘制和比较。这两个图的范围不同,所以我希望它们在[0,1]的范围内。对于以下代码和特定数据集,我得到一个1的常量线作为数据集图,但这种规范化适用于其他集:

plt.plot(range(len(rvalue)),np.array(rvalue)/(max(rvalue)))

并且代码为:

oldrange = max(rvalue)-min(rvalue) #NORMALIZING
newmin=0
newrange = 1 + 0.9999999999 - newmin
normal = map(lambda x, r=float(rvalue[-1] - rvalue[0]): ((x - rvalue[0]) / r)*1 - 0, rvalue)
plt.plot(range(len(rvalue)),normal)

我收到错误:

ZeroDivisionError: float division by zero

表示所有数据集。我无法弄清楚如何将两个图都放在一个范围内进行比较。

7 个答案:

答案 0 :(得分:5)

查找数组的范围由numpy内置函数numpy.ptp()提供,您的问题可以是以下地址:

#First we should filter input_array so that it does not contain NaN or Inf.
input_array=np.array(some_data)
if np.unique(input_array).shape[0]==1:
    pass #do thing if the input_array is constant
else:
    result_array=(input_array-np.min(input_array))/np.ptp(input_array)
#To extend it to higher dimension, add axis= kwarvg to np.min and np.ptp

答案 1 :(得分:1)

我试图简化一些事情。试试这个:

oldmin = min(rvalue)
oldmax = max(rvalue)
oldrange = oldmax - oldmin
newmin = 0.
newmax = 1.
newrange = newmax - newmin
if oldrange == 0:            # Deal with the case where rvalue is constant:
    if oldmin < newmin:      # If rvalue < newmin, set all rvalue values to newmin
        newval = newmin
    elif oldmin > newmax:    # If rvalue > newmax, set all rvalue values to newmax
        newval = newmax
    else:                    # If newmin <= rvalue <= newmax, keep rvalue the same
        newval = oldmin
    normal = [newval for v in rvalue]
else:
    scale = newrange / oldrange
    normal = [(v - oldmin) * scale + newmin for v in rvalue]

plt.plot(range(len(rvalue)),normal)

我可以看到ZeroDivisionError的唯一原因是rvalue中的数据是否为常数(所有值都相同)。是这样的吗?

答案 2 :(得分:1)

使用scikit: http://scikit-learn.org/stable/modules/preprocessing.html#scaling-features-to-a-range

它内置了将功能扩展到指定范围的功能。您可以在此找到其他功能来规范化和标准化。

见这个例子:

>>> X_train = np.array([[ 1., -1.,  2.],
...                     [ 2.,  0.,  0.],
...                     [ 0.,  1., -1.]])
...
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5       ,  0.        ,  1.        ],
       [ 1.        ,  0.5       ,  0.33333333],
       [ 0.        ,  1.        ,  0.        ]])

答案 3 :(得分:1)

使用以下方法使用数据序列中的最小值和最大值对0到1范围内的数据进行标准化:

import numpy as np

def NormalizeData(data):
    return (data - np.min(data)) / (np.max(data) - np.min(data))

答案 4 :(得分:0)

归一化0到1之间的任何值的简单方法就是将所有值除以所有值中的最大值。将值带入0到1之间的范围。

答案 5 :(得分:0)

scikit_learn具有此功能
sklearn.preprocessing.minmax_scale(X, feature_range=(0, 1), axis=0, copy=True)

比使用MinMaxScale类更方便。

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.minmax_scale.html#sklearn.preprocessing.minmax_scale

答案 6 :(得分:0)

只是为了为其他答案提供一些背景,这里有一个推导:

通过点(x1, y1)(x2, y2)的直线可以表示为:

y = y1 + slope * (x - x1)

哪里

slope = (y2 - y1) / (x2 - x1)

现在,从 01 的标准化意味着

y1 = 0, y2 = 1

x1 = x_min, x2 = x_max

(反之亦然,取决于您的需要)

等式减少到

y = (x - x_min) / (x_max - x_min)