如何按权重缩放列表?

时间:2018-05-03 15:40:06

标签: python statistics

假设我有

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]

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

2 个答案:

答案 0 :(得分:1)

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

使用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,程序类似;计算均值和标准差,并按元素执行此过程。

答案 1 :(得分:0)

来自@coldspeed回答:

如果你想让更多的值进一步消失,你应该使用看起来像抛物线的函数,比如square(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])