我有一个巨大的数据集,从中我得到了两组数据点,然后我必须对它们进行绘图和比较。这两个绘图的范围不同,所以我希望它们在[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
对于所有的数据集。我不能想出如何让两个图在一个范围内进行比较。
9条答案
按热度按时间0ejtzxu11#
使用以下方法,使用数据序列中的最小值和最大值在0到1范围内归一化数据:
drkbr07n2#
使用scikit:www.example.comhttp://scikit-learn.org/stable/modules/preprocessing.html#scaling-features-to-a-range
它有内置的功能来将特征缩放到指定的范围。你会在这里找到其他的功能来规范化和标准化。
请看这个例子:
wmtdaxz33#
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
jchrr9hc4#
查找数组的范围是由
numpy
内置函数numpy.ptp()
提供的,您的问题可以通过以下方式解决:xxslljrj5#
我试着把事情简单化。试试这个:
我能看到
ZeroDivisionError
的唯一原因是右值中的数据是常数(所有值都相同),是这样吗?92vpleto6#
为了给其他答案提供一些背景知识,下面是一个推导:
通过点
(x1, y1)
和(x2, y2)
的直线可表示为:其中
现在从
0
到1
的归一化意味着以及
(or反之亦然,具体取决于您的需要)
然后该等式简化为
njthzxwz7#
你可以将样本中的每个数字除以样本中所有数字的总和。
tct7dpnv8#
我更喜欢类似于Marissa Novak's和RZhang's答案的sci-kit学习预处理工具,尽管我喜欢不同的结构:
虽然这比RZhang's answer更冗长,而且不太适合原始的“巨大”数据集用例,但我更喜欢它,因为它对我的大多数应用程序(〈10^3个值)都具有可读性。
rng =(0,1)得出:
例如,rng =(0.3,0.8),得到:
ef1yzkbh9#
一个简单的方法来规范化0和1之间的任何值,只是除以最大值的所有值,从所有的值。将得到的值在0到1的范围。