с учетом 10 функций y = a + bx и 1000 точек данных (x, y) с округлением до целых чисел, как получить 10 лучших (a, b) кортежей ?

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

fee = fixed + variable*transaction_price

«Схема комиссий» - это пара (фиксированная, переменная) , используемая группой кредитных карт, например«Дебетовые золотые бизнес-карты MasterCard, выпущенные Первым национальным банком Голливуда». Мы считаем, что в любой момент времени используется менее 10 различных схем оплаты, но мы не получаем от наших партнеров полного и текущего списка схем оплаты. (да, я знаю, что некоторые «схемы комиссионных» более сложны, чем приведенное выше уравнение из-за ограничений и других ошибок, но известно, что в наших транзакциях используются только схемы a + bx ).

Вот проблема, которую мы пытаемся решить: мы хотим использовать данные о комиссиях для каждой транзакции, чтобы вывести используемые схемы комиссионных. Затем мы можем сравнить этот список со схемами оплаты, которые каждый клиент должен использовать в соответствии со своим банком.

Данные, которые мы получаем о каждой транзакции, представляют собой кортеж данных: (card_id, transaction_price, fee) .

transaction_price и комиссия указаны в центах. Банк пересчитывает дробные центы для каждой транзакции до тех пор, пока совокупная сумма не превысит одного цента, а затем к комиссии за эту транзакцию будет добавлен «цент округления». Мы не можем предсказать, к какой транзакции будет добавлен «округляющий процент».

card_id идентифицирует группу карт, которые используют одну и ту же схему оплаты. В обычный день из 10 000 транзакций может быть несколько сотен уникальных card_id . Несколько card_id будут иметь общую схему оплаты.

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

card_id    transaction_price       fee        fixed        variable
=======================================================================
12345      200                     22         ?            ?
67890      300                     21         ?            ?
56789      150                      8         ?            ?
34567      150                      8         ?            ?
34567      150    "rounding cent"-> 9         ?            ?
34567      150                      8         ?            ?

Конечный результат, который нам нужен, - это такой короткий список с 10 или меньшим количеством записей, показывающих схемы оплаты, которые лучше всего соответствуют нашим данным. Как это:

fee_scheme_id       fixed     variable
======================================
1                      22            0
2                      21            0
3                       ?            ?
4                       ?            ?
...

Средняя плата составляет около 8 центов. Это означает, что центы округления имеют огромное влияние, а приведенный выше вывод требует большого количества данных.

Средняя транзакция составляет 125 центов. Цена сделки всегда находится в пределах 5 центов.

Нам нужен короткий список схем комиссий, которые «подходят» 98% + из 3000+ транзакций, которые каждый клиент получает каждый день. Если этих данных недостаточно для достижения 98% уверенности, мы можем использовать данные за несколько дней.

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

Есть предложения, как подойти к этой проблеме? Реализация может быть на C # или T-SQL, в зависимости от того, что имеет наибольший смысл с учетом алгоритма.

9
задан Justin Grant 22 December 2011 в 20:36
поделиться