Показать сообщение отдельно
  #1 (permalink)  
Старый 18.04.2010, 19:16
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Ранговая корреляция · Функция ранжирования
function rank(array) {
	var i, j, count, index, pos, posSum, val, sorted = array.slice(0).sort(function (a, b) {
		return a - b;
	});
	for (i = 0; i < array.length; i++) {
		val = array[i];
		if (typeof val != "number") {
			continue;
		}
		array[i] = null;
		if (array.indexOf(val) == -1) {
			array[i] = {value: sorted.indexOf(val) + 1};
		} else {
			array[i] = val;
			pos = sorted.indexOf(val);
			posSum = 0;
			count = 0;
			index = [];
			for (j = 0; j < array.length; j++) {
				if (array[j] === val) {
					++count;
					++pos;
					posSum += pos;
					array[j] = null;
					index.push(j);
				}
			}
			val = posSum / count;
			for (j = 0; j < index.length; j++) {
				array[index[j]] = {value: val};
			}
		}
		
	}
	for (i = 0; i < array.length; i++) {
		array[i] = array[i].value;
		
	}
	return array;
}

alert(rank([1, 3, 52, 6, 100, 64, 71, 100, 100, 100]).join(", "));

Сообщение от http://wiki.myword.ru/index.php/Корреляция_ранговая
Процедура ранжирования начинается с расположения переменных по возрастанию их значений. Разным значениям присваиваются ранги, обозначаемые натуральными числами. Если встречаются несколько равных по значению переменных, им присваивается усредненный ранг.
4-й (с нуля), 7-й, 8-й и 9-й элементы массива имеют одинаковые значения, а так же 4-й элемент является 7-м (с единицы) по возрастанию, следовательно остальные получают ранг 8, 9 и 10, но нам нужен их усредненный ранг: (7 + 8 + 9 + 10) / 4 = 8,5.

Простого алгоритма не нагуглил, пришлось делать самому. Может кому еще пригодится)
rank correlation

Последний раз редактировалось Octane, 18.04.2010 в 19:35.
Ответить с цитированием