Sorting by best combinations of two

Обновить

December 2018

Просмотры

107 раз

4

У меня есть список «продуктов» , где каждый человек имеет две особенности, например: цена и рейтинг книг или времени и цены на билеты и т.д.
Книги (10, 15) , где 10 является цена в долларах (дешевле лучше) и 15 является оценка от 0 до 100 (чем больше , тем лучше).

L = [(150, 100), (50, 15), (20, 70), (10, 40), (76, 30)]

Список должен быть отсортирован по лучшей комбинации цены и рейтинга.
У меня есть 2 решения до сих пор, лучший, чтобы найти «вес» для каждой пары путем умножения price*(1/rating)и сортировки этого «веса», тем меньше , тем лучше.

res1 = {}
for i in L:
    res1[i] = i[0]*(1./i[1])
# {(10, 40): 0.25, (20, 70): 0.2857, (50, 15): 3.3333, (76, 30): 2.5333, (150, 100): 1.5}
sorted(res1, key=lambda x: res1[x])
# [(10, 40), (20, 70), (150, 100), (76, 30), (50, 15)]

Второе решение является более сложным и менее представительным. Она требует, чтобы отсортировать два раза - по цене и по рейтингу (рейтинг - наоборот) и пытается найти спички. «Вес» будет индекс в первом отсортированного списка умножается (или суммирование) по индексу во втором отсортированном списке.

L1 = sorted(L, key=lambda x: x[0])
L2 = sorted(L, key=lambda x: x[1], reverse=True)
res = {}
for i in L:
    res[i] = (L1.index(i)+1) * (L2.index(i)+1)
res
# {(10, 40): 3, (20, 70): 4, (50, 15): 15, (76, 30): 16, (150, 100): 5}
sorted(res, key=lambda x: res[x])
# [(10, 40), (20, 70), (150, 100), (50, 15), (76, 30)]

При использовании второго варианта с большим количеством данных , она показывает менее репрезентативные результаты.
Но я устал изобретать колесо, поэтому , которые математика и алгоритмические решения , которые вы можете предложить? Интересно , если этот вопрос имеет решение , когда 3 и больше возможностей: цена, снабжающие время, вес, рейтинг и т.д.

Обновление: Благодаря @georgesl за указание на это. Как я могу иметь дело с выбросами, например , очень и очень плохая книга, но это очень дешево ?? Я думаю , что они должны рассматриваться как - то иначе.

2 ответы

1

Почему вы не объедините ваши ответы, как, что

L = [(150, 100), (50, 15), (20, 70), (10, 40), (76, 30)]
sorted(L, key=lambda x: x[0] / (x[1] * 1.0))
# [(10, 40), (20, 70), (150, 100), (76, 30), (50, 15)]

PS Если вы хотите получить ответ поплавок лучший способ умножить на 1,0 номера. Он работает быстрее, чем разделить или запустить свой номер вfloat

1

Ваша цель состоит в том, чтобы заказать продукцию в соответствии с «лучшей комбинацией» цены и рейтинга. Вы рассмотрели два алгоритма, и сообщить о том , что первый , кажется, работает лучше. То , что вы не говорите нам, и вы , вероятно , не имеют, это способ измерения , какие заказы лучше. Так что никто не может предложить лучший способ, потому что мы не знаем , что вы собираетесь любить. Насколько важно качество (рейтинг) для вас? Вы могли бы заботиться о нем больше, или меньше, чем я. Короче говоря: Вы должны либо независимую метрику доброты порядка (например, на основе количества людей , которые на самом деле покупают продукт), или учебный набор , который вы вручную заказали так , как вы хотите их видеть.

Предположив у вас есть обучающий набор, вы можете попробовать различный рейтинг и измерить , насколько близко они приходят к упорядочению вы хотите (на обучающих данных, по крайней мере, но вы будете надеяться , что алгоритм обобщается на другие данные). Один из способов измерить то есть с ранговой корреляцией статистикой.

Там целое семейство решений , которые являются линейными комбинациями ваших функций: a * price + b * rating, где a, вероятно , отрицательным , так как низкая цена хорошая. Чем больше b, тем важнее оценка качества. Вы можете установить aи bдать вам оптимальное ранжирование. Или вы можете «вписаться» в более сложную модель, например , с участием квадратики или отношений. Все , что вам нужно , это способ измерения благости полученного заказа.