如何按权重缩放列表?



假设我有

values = [0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50]

我想按权重缩放每个元素,因此值离平均值越远,它们就越快变小(或变大(。也就是说,使"小数字"(低于平均值的数字(变大,使"大数字"(超过平均值的数字(变小。

假设平均值为 1,然后:

scale(values) -> [0.6, 0.7, 0.8, 1, 1.5, 4, 8, 12, 20]

超过平均值的值会远(2 到 1.5,但 50 到 20(下降得越快,而低于平均值的值越远,增加得越快(0.5 到 0.8,但 0.1 到 0.6(。

我尝试搜索"如何规范化数据",但这样的答案平等地缩放所有值。例如

scaled = [(i - min(values))/max(values) for i in values]

此外,我需要控制值缩放的权重。

也许,您正在寻找最小-最大缩放,这使您可以指定任意的下限和上限。

使用 numpy,实现很简单:

import numpy as np
arr = np.array([0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50])
l, h = .6, 80

(arr - arr.min()) / (arr.max() - arr.min()) * (h - l) + l
array([ 0.6       ,  0.75911824,  1.23647295,  2.03206413,  3.62324649,
8.39679359, 16.35270541, 32.26452906, 80.        ])

使用python,过程是相似的;计算平均值和标准偏差,并逐个元素执行此过程。

从@coldspeed答案:

如果你想让更多的值进一步偏离,你应该使用一个看起来像抛物线的函数,比如平方(x-x**2(函数。

In [1]: import numpy
In [2]: vls = numpy.array([0.6, 0.7, 0.8, 1, 3, 8, 15, 40, 80])
In [3]: arr = vls
In [4]: 
...: (arr - arr.mean()) / np.std(arr) 
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-4-f9f164a1e884> in <module>()
1 
----> 2 (arr - arr.mean()) / np.std(arr)
NameError: name 'np' is not defined
In [5]: np = numpy
In [6]: 
...: (arr - arr.mean()) / np.std(arr) 
Out[6]: 
array([-0.62731596, -0.62338705, -0.61945814, -0.61160032, -0.53302212,
-0.33657662, -0.06155292,  0.92067457,  2.49223857])
...: ((arr - arr.mean()) / np.std(arr)) ** 2
Out[8]: 
array([  3.93525316e-01,   3.88611416e-01,   3.83728389e-01,
3.74054953e-01,   2.84112582e-01,   1.13283823e-01,
3.78876235e-03,   8.47641671e-01,   6.21125309e+00])

最新更新