перераспределение диапазонов номеров по результатам запроса - PullRequest
0 голосов
/ 30 января 2020

Мне нужно найти способы перераспределения диапазонов номеров при параллельном экспорте из MySQL:

enter image description here

Пример вывода (SQL запроса результатов ):

enter image description here

Каков наилучший способ перераспределения диапазонов номеров после получения первоначальных результатов, чтобы результаты были более равномерно распределены?

(расчетный) желаемый результат:

enter image description here

1 Ответ

0 голосов
/ 04 февраля 2020

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

Ваш обновленный дистрибутив сообщит вам, что вы считаете, что количество результатов 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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...