2014-10-27 2 views
0

У меня есть массив, который я хочу сортировать, основываясь на присвоении оценки каждому элементу массива.Сортировка/подсчет нелинейных сравнений

Предположим, что возможный диапазон баллов - 0-100. И чтобы получить этот балл, мы собираемся использовать 2 сравнительные точки данных: один с весом 75 и один с весом 25. Давайте назовем их valueA и valueB. И мы перенесем каждое значение в счет. Итак:

значение а (диапазон = 0-10,000)
VALUE млрд (диапазон = 0-70)
scoreA (диапазон = 0 - 75)
scoreB (диапазон = 0 - 25)
scoreTotal = scoreA + scoreB (0 - 100)

Теперь вопрос заключается в том, как переносить значение A на scoreA нелинейным способом с более тяжелым взвешиванием для того, чтобы быть близким к минимальному значению. Я имею в виду, что для valueA, 0 будет отличным счетом (75), но значение, скажем, 20, даст средний балл 37,5, а значение 100 будет давать очень низкий балл, например 5 , и тогда все большее будет иметь тенденцию к 0 (например, значение 5000 будет по существу 0). В идеале я мог бы настроить кривую с несколькими точками данных (например, 4 четверти точки), а затем алгоритм соответствовал бы этой кривой. Или, может быть, самое простое решение - создать кучу точек на кривой (скажем, 10) и сделать линейную транспозицию между каждым из этих 10 пунктов? Но я надеюсь, что есть намного более простой алгоритм для достижения этого, не вычисляя все точки на кривой, а затем, чтобы настроить 10 + переменных. Я бы предпочел 1 или 2 входа, чтобы определить, насколько крутая кривая. Возможное?

Мне не нужно что-то супер сложное или точное, просто простой алгоритм, поэтому есть больший вес для того, чтобы быть близким к минимуму диапазона, и менее утяжеленным для того, чтобы быть близким к максимальному диапазону. Надеюсь, это имеет смысл.

Моя статистика математика настолько ржавая Я даже не уверен, что это называется поиском решения. Все эти годы исчисления и статистики ничтожны.

Я реализую это в Objective C, но любой псевдокод c-ish/java-ish будет в порядке.

ответ

2

Функция вы можете попробовать это

max/[(log(x+2)/log(2))^N] 

где max либо 75 или 25 в вашем случае. Часть log(x+2)/log(2) гарантирует, что f(0) == max (вы можете заменить log(x+C)/log(C) здесь для любого C > 0; более высокий C замедлит спуск кривой); ^N определяет, насколько быстро ваша функция падает до 0 (вы можете играть с функцией here, чтобы получить представление о том, что происходит)

+0

Отличное простое решение. Благодаря! – Joel

+0

Есть ли способ сделать эту кривую более «S», в которой она сначала остается высокой, а затем падает и меняет форму в средней точке? Проблема с вышесказанным заключается в том, что всегда происходит быстрое первоначальное падение, что не является предполагаемым результатом. – Joel

+1

@Joel Вы можете попробовать [логистическую функцию] (http://en.wikipedia.org/wiki/Logistic_function), см. [Здесь] (https://www.desmos.com/calculator/xzggc2jmhu) для примера; '(max * 2)/(1 + 2^[x/C])', где 'C' определяет скорость спуска; это сгладит спуск –

Смежные вопросы