【问题标题】:How to scale a list by a weight?如何按重量缩放列表?
【发布时间】:2018-10-14 00:01:48
【问题描述】:

假设我有

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]

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

【问题讨论】:

  • 您能否提供您自己进行的任何尝试以及上述所需的输出?
  • @Ian:一种方法是对所有值求平方:小于 1 的值会变小,大于 1 的值会变大,变化率取决于距离。
  • 使用对数值?
  • 请提供一个示例,说明您最终希望达到/获得什么。也许您可以使用消耗权重来应用“标准化”。也许:ln = 6, coeff = [1/(1 + abs(l/2 -i)) for i in range(6)] 也看看 numpy 的数组,它可能对你有帮助。
  • 添加了一些示例。另外,我在使用平方方法时遇到了问题,因为数量越来越少。我打算让“小数字”(低于平均水平)更大,而“大数字”(高于平均水平)更小。

标签: python statistics


【解决方案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,过程类似;计算均值和标准差,并按元素执行此过程。

【讨论】:

  • 如何使用这种方法控制元素的缩放比例?
  • @IanFieldhouse 如果你想选择任意的最小值和最大值,你应该考虑 min-max 缩放。
  • @IanFieldhouse 例如(arr - arr.min()) / (arr.max() - arr.min()) * (80 - .6) + .6
【解决方案2】:

来自@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])

【讨论】:

    猜你喜欢
    • 2014-01-11
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多