假设我有
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])