假设我有
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]
另外,我需要来控制缩放值的权重。
答案 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])