2009-08-04 2 views

ответ

11

Итерации, найдите максимальное значение (назовите его MAXVAL), затем повторите попытку и умножьте каждое значение в списке на (100/MAXVAL).

var ratio = 100.0/list.Max(); 
var normalizedList = list.Select(i => i * ratio).ToList(); 
+0

как насчет отрицательных чисел? – Kobi

+0

oh, а максимальное значение может быть 0, поэтому у вас есть 100/0. – Kobi

+1

Да, этот граничный случай, вероятно, должен быть проверен - хотя нет реального хорошего способа «нормализовать» список, который равен нулю. – Amber

8

Если у вас есть список строго положительных чисел, ответ Дава удовлетворит вас.

Если список может быть любым числом вообще, то вам также необходимо нормализовать нижний предел.

Предполагая, верхнюю границу 100 и нижней границей 0, вы хотите что-то вроде этого ...

var max = list.Max(); 
var min = list.Min(); 
var range = (double)(max - min); 
var normalised 
    = list.Select(i => 100 * (i - min)/range) 
     .ToList(); 

Handling случая, когда min == max остаются в качестве упражнения для читателя ...

+0

Hm ... Это даст вам список значений от 0 до 1 ... – Guffa

+0

Вы правы - я исправлю. – Bevan

6

чтобы нормализовать набор чисел, которые могут содержать отрицательные значения,
и определить диапазон нормированных весов:

List<int> list = new List<int>{-5,-4,-3,-2,-1,0,1,2,3,4,5}; 
double scaleMin = -1; //the normalized minimum desired 
double scaleMax = 1; //the normalized maximum desired 

double valueMax = list.Max(); 
double valueMin = list.Min(); 
double valueRange = valueMax - valueMin; 
double scaleRange = scaleMax - scaleMin; 

IEnumerable<double> normalized = 
    list.Select (i => 
     ((scaleRange * (i - valueMin)) 
      /valueRange) 
     + scaleMin); 
Смежные вопросы