|
|
|
Вычисление вероятностей попадания объекта X на место Y, в зависимости от одного параметра.
|
|||
|---|---|---|---|
|
#18+
Задача следующая. Есть M клиентов, готовых платить бабло за каждый показ на рекламной площадке. Рекламная площадка представляет из себя список мест от 1 до k>=5. Чем больше клиент платит за показ, тем выше его вероятность оказаться на первом месте. Требуется расписать клиенту таблицу вероятностей для первых 5 мест. В первой строчке информация о самом клиенте с его ставкой, далее идут 4 строки с конкурентами по убыванию вероятностей для первого места и далее строка со "всеми остальными". Поскольку мест для расчета немного, решил для каждого места реализовать свой алгоритм. Для первого места все просто: P1(x) = x / sum(Xi), где i = 1..M Для второго места сложнее: P2(x) = Sum( P1(Xi) * (x / sum(Xj)) ), где i = 1..M, кроме позиции x; j = 1..M при j != i. Иначе говоря, суммируем произведения вероятностей показа каждого объекта на первом месте, кроме x и вероятностей показа на втором месте без учета уже показанного на первом (звучит ужасно!). Для третьего места еще сложнее: P3(x) = Sum ( P1(Xi)*P2(Xj)* (x / sum(Xk)) ), где i=1..M, кроме позиции x; j = 1..M, кроме позиции x и j != i; k = 1..M, при k != i и k != j. Далее я расписал на бумаге подробные формулы для 4, 5 и 6 объектов, упростил их и реализовал соответствующие алгоритмы. Считаю алгоритмы работающими, если, как минимум, возвращаемые ими вероятности для данного места в сумме дают 1. Для первого и второго случая все работает корректно, а в третьем стабильно не хватает до единицы от 0.2 до 0.3. Вот готовая программа на PHP: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. Алгоритм много раз трассировал на соответствие математическим выкладкам - все работает корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 14:30 |
|
||
|
Вычисление вероятностей попадания объекта X на место Y, в зависимости от одного параметра.
|
|||
|---|---|---|---|
|
#18+
Если сами формулы верные (для второго места выглядит правильно, по-крайней мере словестное описание, а дальше не вникал) то теряете точность при суммировании длинных рядов. Вообщем-то проблема стара как компьютерный мир. Как это отслеживать на PHP не знаю, на C существуют специальные либы в соответсвии с IEEE стандартом. Погуглите на тему "алгоритм сумирования Кахана/Kahan summation algorithm", может поможет. А на PHP я даже не понимаю в переменных какого типа/длины Вы храните суммируемые обьекты и накапливаемую сумму. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 19:01 |
|
||
|
Вычисление вероятностей попадания объекта X на место Y, в зависимости от одного параметра.
|
|||
|---|---|---|---|
|
#18+
Вообще представление от платформы зависит - вплоть до IEEE. Попробую bcmath использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 14:43 |
|
||
|
Вычисление вероятностей попадания объекта X на место Y, в зависимости от одного параметра.
|
|||
|---|---|---|---|
|
#18+
Да нет, проблема где-то в формулах третьего уровня. Вот результат с использованием библиотеки точных чисел: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. В первом элементе массива тестовые цены за показ - 5, 10, 15, 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 16:09 |
|
||
|
Вычисление вероятностей попадания объекта X на место Y, в зависимости от одного параметра.
|
|||
|---|---|---|---|
|
#18+
Вот результат с использованием библиотеки точных чисел: А это што ещё за зверь? Я видел библиотеку где длина слова не фиксирована и в зависимости от заказанной точности выходного результата может рости до 1МБ, так даже её авторы не называли библиотекой "точных" чисел. Всё-таки я грешу на точность. Если применять алгоритм Кахана влом, ну... попробуйте с формулами поиграться. Скажем для третьего уровня можно переписать в "более реккурентном" виде так: P3(x) = P1(x) * Sum (Sum ( P1(Xi)*P2(Xj)* (1 / 1 - P1(Xi) - P1(Xj))) Не думаю что поможет, но шанс есть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2008, 20:48 |
|
||
|
Вычисление вероятностей попадания объекта X на место Y, в зависимости от одного параметра.
|
|||
|---|---|---|---|
|
#18+
Уупс, пропустил одну пару скобок, но Вы поймёте что я имел ввиду... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2008, 20:51 |
|
||
|
Вычисление вероятностей попадания объекта X на место Y, в зависимости от одного параметра.
|
|||
|---|---|---|---|
|
#18+
Вот ее я, видимо и использовал - bcmath зовется. Точность относительная, разумеется ) Я сделал иначе: при вычислении вероятностей для первого месте меняем цену: Код: plaintext Затем при вычислении вероятностей второго места аналогично вычисляем: Код: plaintext 1. 2. 3. и т.д. Погонял эти два алгоритма на разных тестовых данных - величины для вторых мест (которые у меня в первом случае работают верно) совпадают с погрешностью в пределах 2%. Этот алгоритм намного проще и эффективнее, и таблица получается хорошая - у кого на первом месте вероятность большая, на остальных местах падает и в сумме дает сотку, у кого маленькая - растет. Фиг знает, насколько это правомерно, но работает ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2008, 13:25 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35263088&tid=1345356]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
144ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 423ms |

| 0 / 0 |
