Кажется, изначально вы полагали, что ваши данные распределены равномерно, и теперь вы видите количество записей в каждом равномерно распределенном бункере. Теперь вы можете обновить свое мнение о распределении ваших данных: в каждом бункере данные распределены равномерно, но бины с более высоким результатом имеют большую концентрацию.
Ваш обновленный дистрибутив сообщит вам, что вы считаете, что количество результатов q равно сумме всех результатов в сегментах, где максимальная граница меньше q, плюс
(q-min(q))/(max(q)-min(q))*size(q)+
, где min(q)
и max(q)
дают максимальные и минимальные границы сегмента, к которому принадлежит q, а size(q)
- это количество результатов в сегменте, к которому принадлежит q
. Это кусочно-линейная функция, где наклон в сегменте i - это его относительный размер к общему. Теперь разделите на общее количество результатов, чтобы получить распределение вероятностей. Чтобы получить места, где вы должны делать запросы, найдите десять значений x, где эта кусочная функция равна .1, .2, .3 .... 1.0. Это намного проще, чем инвертировать произвольную функцию, если вы используете кусочно-линейное свойство, например, если вы пытаетесь найти x, связанный с .2, сначала найдите контейнер i такой, что min(.2)=lower_bnd_bucket(i)/total<=.2<=upper_bnd_bucket(i)=max(.2)
, Это даст вам min(.2)
max(.2)
и size(.2)
. Тогда вам просто нужно инвертировать линейную функцию, связанную с этим сегментом
x=(.2-sum_of_buckets_lessthan_i)*(max(.2)-min(.2))/size(.2)+min(.2)
Обратите внимание, что размер не должен быть 0, поскольку вы делите на него, что имеет смысл (если блок равен 0, его следует пропустить ). Наконец, если вы хотите, чтобы запрошенные вами места были целыми числами, вы можете округлить значения, используя предпочитаемые критерии. Что мы делаем здесь, так это обновляем с Байесом нашу веру в то, где будут находиться 10 децилей, основываясь на наблюдениях за распределением в 10 местах, которые вы уже запросили. Вы можете уточнить это далее, как только увидите результат этого запроса, и в конечном итоге вы достигнете сходимости.
Для примера в вашей таблице, чтобы найти обновленный верхний предел сегмента 1, вы проверяете, что 2569/264118 <0,1 (первые десять процентов), затем вы проверяете это (2569 + 14023) / 264118 <0,1 </p>
и, наконец, вы проверяете это ((2569 + 14023 + 123762) / 264118)> 0,1
, поэтому ваша новая оценка для дециля должна быть между 1014640 и 1141470. Ваша новая оценка для верхнего порога первого сегмента равна
decile_1 = (. 1- (2569 + 14023) / 264118) * (1141470-1014640) / (123762/264118) + 1014640 = 1024703
аналогично, ваша оценка верхней границы для второго сегмента равна: (.2- (2569 + 14023) / 264118) * (1141470 -1014640) / (123762/264118) + 1014640 = 1051770. Обратите внимание, что эта линейная интерполяция будет работать до обновления верхнего предела сегмента 6, так как ((2569 + 14023 + 123762) / 264118) <. 6 и теперь вам нужно будет использовать ограничения для старого сегмента 10 при обновлении ковши 6 и выше. </p>