konto usunięte

Temat: procent zgodności atrybutów

Przypuśćmy że mamy tabele user_atributes w której przechowujemy
szczegółowe określenie danych osobowych profilu użytkownika -
czy pali czy chce mieć dzieci etc..
tabela ta jest określona jako:


UserAttribute:
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
user_id:
type: integer(4)
notnull: true
attribute_id:
type: integer(2)
notnull: true
value:
type: string
notnull: true


i teraz potrzebował bym (nie wiem czy jako funkcję w bazie czy
jakoś to inaczej rozwiązać) określenie procent zgodności
profilu z innymi profilami i posortować po najbardziej
dopasowanych. Jak wiemy zwykłe where odpadają, przez moment
sądziłem by tworzyć tymczasowe kolumny z poziomu doctrina które
sprawdzają równość tych pól. tylko to rozwiązanie jest
strasznie mało elastyczne a na łączną punktację procentową
składa się jeszcze waga danych pól.

spotkał się ktoś z takim problemem?

konto usunięte

Temat: procent zgodności atrybutów

To całkiem poważne zagadnienie data miningowe :)

najprościej wydaje mi się tak:

atrybuty:
czy pali: 0/1
czy chce mieć dzieci: 0/1
czy lubi oglądać opery mydlane: 0/1
płeć: 0/1

teraz tworzysz wektory
masz osobe 1: (0,0,1,0) <- nie pali, nie chce miec dzieci, lubi opery i jest kobieta
masz osobe 2: (1,1,0,1)
i masz osobe 3: (0,0,1,1)

i obliczasz odleglość od ich "wierzchołków" np. metryką eulidesową (http://pl.wikipedia.org/wiki/Przestrze%C5%84_metryczna)

osoba 1 - osoba 2: sqrt((0-1)^2+(0-1)^2+(1-0)^2+(0-1)^2)=2
osoba 1 - osoba 3: sqrt((0-0)^2+(0-0)^2+(1-1)^2+(0-1)^2)=1
jak widać osoba 1 jest bliższa osobie 3 niż osobie 2

to jest chyba najprostsza metoda. Jak chcesz więcej to poszukaj o klasyfikacji w sieci (np. algorytm k-najbliższych sąsiadów)

podobny przykład bardzo dobrze został opisany tutaj:
http://www.amazon.com/Programming-Collective-Intellige...

konto usunięte

Temat: procent zgodności atrybutów

aaaaaa, procenty...
jeśli chcesz procenty to pełna zgodność to 0 a brak zgodności to sqrt(ilość atrybutów).
Jak ułożysz proporcję to wyjdą procenty ;)Krzysztof Drelczuk edytował(a) ten post dnia 03.02.10 o godzinie 11:50

konto usunięte

Temat: procent zgodności atrybutów

tylko jest tu problem że te wektory są jeszcze różnych wielkości bo jest np sytuacja że dla kogoś istotne są parametry takie a dla kogoś inne (tak sobie ustawi w profilu użytkownika że przy wyszukiwaniu bierz pod uwagę tylko określone parametry),
więc nie ma tak naprawdę stałego wektora wejściowego tylko za każdym razem jest inny. czasem wektor może mieć wielkość 3 a czasem 7 i mi bardziej chodzi o możliwość stworzenia funkcji która będzie robiła w kontekście obecnego rekordu obliczenia.
np tak ze podaje mu id użytkownika bazowego jako parametr.

jak wejde do funkcji to robie sobie zapytanie z wyciągnięciem atrybutów użytkownika bazowego i potem jakoś w pętli porównuje z rekordem dla którego funkcja jest wywoływana. tylko niestety nie wiem czy w ogóle dobrze mysle
Paweł B.

Paweł B. architekt baz danych
/ SQL Developer /BI
Developer

Temat: procent zgodności atrybutów

posortować po zgodności profilu z innymi profilami
zbuduj selecta

zjoinuj tabelę UserAttribute ze sobą samą po polu attribute_id raz wybierając naszego usera a drugi całą resztę:
... from UserAttribute A join UserAttribute B on A.attribute_id=B.attribute_id
where A.user_id=@user_id

porównaj pola value, jeśli zgodne to 1 else 0
pomnóż wynik przez wagę (w skali 0-1)
pogrupuj wg B.user_id i zagreguj iloczynem (suma logarytmów podniesiona do potęgi podstawy logarytmu)
otrzymane wyniki to wartości z przedziału 0-1 możesz nazwać "procentem zgodności", posortuj malejąco

miłej zabawy ;)

konto usunięte

Temat: procent zgodności atrybutów

Paweł B.:
posortować po zgodności profilu z innymi profilami
zbuduj selecta

zjoinuj tabelę UserAttribute ze sobą samą po polu attribute_id raz wybierając naszego usera a drugi całą resztę:
... from UserAttribute A join UserAttribute B on A.attribute_id=B.attribute_id
where A.user_id=@user_id

porównaj pola value, jeśli zgodne to 1 else 0
pomnóż wynik przez wagę (w skali 0-1)
pogrupuj wg B.user_id i zagreguj iloczynem (suma logarytmów podniesiona do potęgi podstawy logarytmu)
otrzymane wyniki to wartości z przedziału 0-1 możesz nazwać "procentem zgodności", posortuj malejąco

miłej zabawy ;)

jakby ktoś potrzebował to iloczyn o którym wspominasz w mysqlu to
exp(sum(log(coalesce(pole agregacji,1))) jeszcze tylko muszę jakoś wymyśleć jak stosować zmienne wagi dla pól ale wydaje mi się że mam sposób

konto usunięte

Temat: procent zgodności atrybutów

w sumie wystarczy mi samo sumowanie bo wagi są tak obliczone żeby łącznie dawały 100% jeśli wszystko jest zgodne.

do tego istnieje tabela attribute która ma pole score więc jeśli zjoinuje to z userAttribute to zapytanie wygląda następująco

select B.user_id, sum(((A.value = B.value)* C.score)) score
from user_attribute A
inner join user_attribute B
on
A.attribute_id = B.attribute_id
inner join
Attribute C on B.attribute_id = c.id
where A.user_id = ?
group by B.user_id
order by sum(((A.value = B.value)* C.score)) desc

przy okazji mam pytanie czy funkcja agregująca jest cachowana za 2 razem jak jej używam przy orderze?

Następna dyskusja:

procent zgodności atrybutów




Wyślij zaproszenie do