2013-01-22 10 views
5

Potrzebuję opracować algorytm, który może zlokalizować pozycję pozycji danych w niektórych hierarchii. Mam hierarchię, która klasyfikuje elementy jakiegoś zestawu danych. Hierarchia jest taksonomiczna - najważniejszy element to najbardziej ogólna klasa, która pasuje do dowolnego elementu zestawu danych, głębsze elementy zawierają bardziej szczegółowe klasy, które pasują do pewnego podzbioru zbioru danych.Jak zlokalizować pozycję pozycji danych w hierarchii?

Weźmy na przykład hierarchię jachtów. Mamy klasę Jacht u góry. W następnym poziomie mamy Jacht żaglowy i Jacht motorowy. Jacht żaglowy ma dwoje dzieci - Cruising yacht i Jacht wyścigowy. Krążowniki mogą być dalej dzielone przez producenta, na przykład Bavaria Yachts i Dufour Yachts. Następnie każda z tych klas może być dalej podzielona przez rodzaj kadłuba, długość, obszar żagli i tak dalej.

To jest przykład z zestawu danych:

Drive Class Manufacturer Hull type Len Sails Area ... Model 
Sailing Cruiser Bavaria Yachts Mono-hull 25ft 560sqft ... Bavaria 32 
Sailing Cruiser Dufour Yachts Mono-hull 27ft 580sqft ... Dufour 32 Classic 

mogę łatwo mapować każdą próbkę do hierarchii, wyszukując go w głębokości pierwszego rzędu.

Jest to prosty problem wyszukiwania na pierwszy rzut oka, ale są pewne trudności.

Pierwsza trudność: elementy danych nie muszą zawierać wszystkich elementów. Zwykle element danych nie zawiera od 10 do 50 procent elementów. Wiele z tych elementów nie jest znaczących, na przykład jacht Dysk może być tylko Silnik lub Żagiel, więc nie przynosi wiele informacji (tylko 1 bit). Elementy te można łatwo wywnioskować za pomocą bardziej znaczących elementów, na przykład, jeśli znamy jacht Model, możemy wywnioskować wszystkie inne elementy (lub pola) elementu danych.

Druga trudność: niektóre elementy mogą się różnić między różnymi elementami danych, nawet jeśli odpowiadają one temu samemu miejscu w hierarchii (ten sam model jachtu). Na przykład Obszar żagli może się znacznie różnić, ponieważ właściciele łodzi modyfikują jachty na inne sposoby lub po prostu zaokrągloną wartość obszaru.

Jak już wspomniałem, muszę zlokalizować różne elementy danych z zestawu danych w hierarchii. Każdy element danych może być zlokalizowany z inną dokładnością. Precyzja to głębokość w hierarchii, w której proces wyszukiwania zostaje zatrzymany. Innymi słowy, potrzebuję uzyskać ścieżkę w hierarchii, która odpowiada każdemu elementowi danych, a ta ścieżka może być niekompletna. Na przykład algorytm może stwierdzić, że elementy danych odpowiadają jachtowi o numerze Juliet 23, ale rok produkcji wciąż może być nieznany.

Byłoby fajnie, gdybym mógł uzyskać wiele ścieżek z miarą prawdopodobieństwa dla każdego. Na przykład algorytm może zwrócić 4 ścieżki dla Juliet 23 dla różnych lat produkcyjnych, z których każdy ma 25% prawdopodobieństwa.

W tej chwili rozwiązuję ten problem za pomocą pierwszego wyszukiwania z pewnymi heurystykami. Daje dobre wyniki, ale myślę, że można uzyskać lepsze wyniki. Być może możesz sformułować ten problem w bardziej ogólny sposób, abym mógł poszukać informacji na jego temat.

Odpowiedz

1

myślę SQL może naprawdę pomóc rozwiązać swoje problemy,

na pierwszą trudność: użyć NVL (pole, wartość jeśli null)

Przykład: Rodzaj druku & produkcja roku (jeśli istnieją), jachtów regatowych

SELECT Y.TYPE, NVL(Y.PRDYEAR, 'UNKNOWN') 
FROM T_YACHT Y WHERE Y.CLASS = 'RACING' 

Przykład: aby wszystkie jachty, które Rok Produkcji jest ponad roku 2000

SELECT * FROM T_YACHT Y WHERE 
NVL(Y.PRDYEAR,TO_TIMESTAMP('01-01-0001','DD-MM-YYYY')) 
    > TO_TIMESTAMP('01-01-2000','DD-MM-YYYY') 

Dla Druga trudność: Redakcyjne GROUP BY \ kaskadowe-SQL \ odrębnych \ NVL

Przykład: zobacz, jak wiele rodzajów jachty wyścigowe są dostępne pod numerem

SELECT Y.TYPE, COUNT(Y.ID) AS YACHT_TYPE 
FROM T_YACHT Y 
WHERE Y.CLASS = 'RACING' 
GROUP BY Y.TYPE 
Powiązane problemy