Как масштабировать список по весу? - PullRequest
0 голосов
/ 03 мая 2018

Допустим, у меня есть

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 голосов
/ 03 мая 2018

От ответа @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])
0 голосов
/ 03 мая 2018

Возможно, вы ищете минимальное максимальное масштабирование, это позволяет вам указать произвольные нижнюю и верхнюю границы.

С 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.        ])

С питоном процедура аналогична; вычислите среднее значение и стандартное отклонение и выполните этот процесс поэлементно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...