我有一个巨大的数据集,我可以从中获得两组数据点,然后我必须绘制和比较。这两个图的范围不同,所以我希望它们在[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
表示所有数据集。我无法弄清楚如何将两个图都放在一个范围内进行比较。
答案 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类更方便。
答案 6 :(得分:0)
只是为了为其他答案提供一些背景,这里有一个推导:
通过点(x1, y1)
和(x2, y2)
的直线可以表示为:
y = y1 + slope * (x - x1)
哪里
slope = (y2 - y1) / (x2 - x1)
现在,从 0
到 1
的标准化意味着
y1 = 0, y2 = 1
和
x1 = x_min, x2 = x_max
(反之亦然,取决于您的需要)
等式减少到
y = (x - x_min) / (x_max - x_min)