Оцінка розміру перетину декількох множин за допомогою вибірки одного набору


10

Я працюю над алгоритмом, який повинен обчислити розмір набору, генерованого перетинами щонайменше 2 множин. Більш конкретно:

z=|A0An|

Набори, які перетинаються, генеруються за допомогою SQL-запитів, і, прагнучи швидко тримати речі, я отримую підрахунок кожного запиту достроково, потім беру набір з найменшим числом ( ) і використовую ці ідентифікатори як межі на решта великих запитів, тому перетин фактично стає:A0

z=|(A0A1)(A0An)|

Навіть ця стратегія залишає мені запускати кілька досить великих запитів, оскількиіноді можуть бути великими. Моя ідея розібратися з цим - взяти випадкову вибірку та перехрестити її з іншими наборами, перш ніж екстраполювати назад до належної оцінки . Моє запитання: який найкращий спосіб взяти вибірку, а потім екстраполювати, щоб повернутися до значення яке, якщо не зовсім точне, має передбачуваний діапазон помилок?|A0|A0zz


Ось що я спробував поки що (у псевдокоді, начебто):

sample_threshold := 10000
factor := 1
if (len(A0) > sample_treshold) {
    factor = sample_threshold / len(A0)
}

// Take a random sample of size 10000 from A0

// Intersect all the other sets with the A0 sample, then with each other
working_set := A0
for i, a := range A {
    a = intersect(A0, a)
    working_set = intersect(working_set, a)
}

z := len(working_set) * (1 / factor)

Цей код працює, але, здається, постійно переоцінюється z, менший розмір вибірки дає більш високу оцінку. Окрім того, я не впевнений, як би це масштабувалося з більш ніж двома множинами для перетину.

Я сподіваюся, що це питання має сенс, дайте мені знати, чи можу я щось уточнити далі. Крім того, якщо це питання поза темою або належить десь в іншому місці, будь ласка, дайте мені знати, і я з задоволенням перенесу його.


За коментарем Білла я провів кілька швидких випробувань, щоб показати розмір вибірки та помилку. Кожне відро розміром зразка було виконано 20 разів, і як ви бачите, є досить чітка тенденція:

Сюжет


Я думаю, що прості випадкові вибірки без заміни повинні працювати. Мене бентежить, що ви переоцінюєте. Це схоже на те, що воно точно відображає оцінку середньої сукупності за допомогою середньої вибірки з випадкової вибірки. Ви намагаєтеся оцінити ймовірність популяції того, що елемент знаходиться в перетині інших s. Я лапшив простим прикладом, і це чудово працює. Наскільки ви впевнені, що постійно завищуєте? Чи траплялося це як 15 разів із 20 чи 150 разів із 200? Чи є вибірка дійсно випадковою? A0A
Білл

1
@Bill Я додав графік розміру вибірки проти помилки, який ілюструє те, що я бачу. Це більше як 20 разів із 20. Що стосується випадкової вибірки, вона настільки ж випадкова ORDER BY RAND(), яка не є ідеальною, але повинна відповідати цій задачі.
Джиммі Сайчук

@JimmySawczuk Чи не було б краще просто перетинати "робочий набір" з "a" безпосередньо, а не "перетинатися (A0, a)"? Тому що "A0", мабуть, буде більшим, ніж поточний "робочий набір" в алгоритмі після першого запуску ... Я правильно це розумію?

Чи можете ви підтвердити, що ви дійсно маєте на увазі множини, а не мультисети (тобто, що у наборах немає дублікатів)? Тому що, якщо вони є, то за вашим методом легко переоцінити розмір «перехрестя». (Розглянемо випадок, коли - це лише 100 копій того ж елемента, і ти відібрав половину з них.)A0
Innuo

Також я можу запитати, чи розмір перехрестя, порівняно з розміром оригінальних наборів, надзвичайно малий? Якщо так, я думаю, що це пояснило б вашу проблему. Я провів декілька симуляцій (з меншими наборами), і я отримую досить послідовну, хоча і невелику, завищення.

Відповіді:


3

Якщо ваш набір має повторювані елементи (тобто це насправді мультисети), розмір перетину буде завищений вашою процедурою, оскільки ваш коефіцієнт масштабування використовує кількість вибірених елементів, а не кількість унікальних "типів", відібраних. Ви можете виправити оцінку, обчисливши коефіцієнт як відношення кількості унікальних елементів у випадковій вибірці до кількості унікальних елементів у повному наборі .A0A0


0

Як зазначає Іннуо , моя проблема полягала в тому, що дублікати в моєму вибірковому наборі , що призвело до того, що мій псевдокод був низьким, що, в свою чергу, призвело до того, що остаточна екстраполяція буде занадто високою, оскільки вона генерується через обертання . Видалення дублікатів вирішило цю проблему, і тепер алгоритм генерує графік розміру дельта проти зразка більше уздовж того, що я очікував (рядки вказують на похибку на рівні довіри 95% для цього розміру вибірки проти всієї сукупності ):A0factorzfactor

Сюжет

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.