Это должно быть легко.
У меня есть список чисел. Как масштабировать значения списка между -1.0
и 1.0
для min = -1
и max = 1.0
?
Это должно быть легко.
У меня есть список чисел. Как масштабировать значения списка между -1.0
и 1.0
для min = -1
и max = 1.0
?
Найдите min и max
то для каждого шкалы чисел x
до 2 * (x - min)/( max - min) - 1
Просто, чтобы проверить -
Если это длинный список precomputing c = 2/(max - min)
, а масштабирование с помощью c * x - 1
- хорошая идея.
Это стандартная нормализация
1 - получить минимальное и максимальное значение в списке (MinVal, MaxVal)
2 - преобразовать каждое число, используя эти выражения signedNormal = (((originalNumber - Minimum)/(Максимум - Минимум)) * 2.0) - 1.0
Я сознательно сделал это неэффективным, чтобы быть ясным - более эффективным было бы
double min = myList.GetMinimum();
double max = myList.GetMaximum();
double signedRangeInverse = 1.0 / (max - min);
for(int i = 0;i < myList.NumberOfItems();i++)
myList[i] = (((myList[i] - min) * signedRangeInverse) * 2.0) - 1
Нет смысла в пересчете диапазона каждый раз Нет точки в диапазоне деления, много быстрее
Если вы хотите, чтобы 0 оставалось равным 0 в конечном результате:
например
[ -5, -3, -1, 0, 2, 4]
Число с наибольшей величиной составляет -5. Мы можем получить это равным -1 путем умножения на 0,2 (-1/-5). (Остерегайтесь деления на 0, если ваши номера - все 0.)
Итак, умножьте все элементы на 0.2. Это даст:
[-1, -0.6, -0.2, 0, 0.4, 0.8]
Обратите внимание, что
[ -5, -5, -5 ] -> [ -1, -1, -1 ]
и
[ 5, 5, 5 ] -> [ 1, 1, 1 ]
и
[ 0, 0, 0 ] -> [ 0, 0, 0 ]
Это может быть или не быть тем, чего вы хотите. Спасибо @Hammerite за то, что он предложил мне этот очень полезный комментарий:)