Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как лучше сделать запрос для определения похожести событий? / 12 сообщений из 12, страница 1 из 1
22.04.2008, 14:20
    #35271361
horal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
Привет всем!

собственно, есть такая интересная задачка:

У объекта есть события в жизни

каждое событие характирезуется 12-ю параметрами.

нужно найти объекты у которых совпадает наибольшее число событий.

критерий похожести событий: наличие одинаковых параметров.

событие: 0|1 ( т.е. если или нет )
( 12 атрибутов ): 1 0 1 0 1 0 1 0 0 0 1 1

получается, что для каждого объекта нужно взять все события

и каждое событие сравнить с каждым событие других объектов.

как на данный момент решается вопрос:

SELECT MAX(t1+1+t2+1+t3+1+t4+1+t5+1+t6+1+t7+1+t8+1+t9+1+t10+1+t11+1+t12+1) as top
id FROM events where group_id=1 ...

наиболее похожие - там где сумма максимальна.


Можно ли как-то упростить это дело?

подскажите что покурить :-)
...
Рейтинг: 0 / 0
22.04.2008, 14:48
    #35271472
Gold_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
а может одно число и побитово устанвливать события. Затем побитово умножать и далеепринимать решение
...
Рейтинг: 0 / 0
22.04.2008, 14:49
    #35271479
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
не совсем понятно, а отсутствие события - не является критерием похожести ? если является - то Вам нужно считать ещё и количество нулей.


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
22.04.2008, 15:53
    #35271746
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
Gold_а может одно число и побитово устанвливать события. Затем побитово умножать и далеепринимать решение+1. Каждое событие - число, составленное из битов - параметров события.
Для сравнения событий делаем XOR, у кого больше, тот более похож.
...
Рейтинг: 0 / 0
22.04.2008, 16:15
    #35271855
DAISER
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
pamirКаждое событие - число, составленное из битов - параметров события.
Для сравнения событий делаем XOR, у кого больше, тот более похож.
А может, всё-таки, у кого меньше, если XOR? Да и, например, 100000b > 000110b, а первое событие больше похоже.
...
Рейтинг: 0 / 0
22.04.2008, 16:30
    #35271931
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
DAISER pamirКаждое событие - число, составленное из битов - параметров события.
Для сравнения событий делаем XOR, у кого больше, тот более похож.
А может, всё-таки, у кого меньше, если XOR? Да и, например, 100000b > 000110b, а первое событие больше похоже.Ошибся я немного, после XOR нужно подсчитать количество бит в результате =1 (т.е. количество совпадений). И вот уже это число - у кого больше, тот и более похож.
...
Рейтинг: 0 / 0
22.04.2008, 16:33
    #35271935
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
pamir DAISER pamirКаждое событие - число, составленное из битов - параметров события.
Для сравнения событий делаем XOR, у кого больше, тот более похож.
А может, всё-таки, у кого меньше, если XOR? Да и, например, 100000b > 000110b, а первое событие больше похоже.Ошибся я немного, после XOR нужно подсчитать количество бит в результате =1 (т.е. количество совпадений). И вот уже это число - у кого больше, тот и более похож.Ну да, у кого МЕНЬШЕ!
Ибо единицы дадут несовпадающие события. Ну или подсчитывать количество нулевых битов.
...
Рейтинг: 0 / 0
22.04.2008, 17:14
    #35272100
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
seb=> select * from events;
 id | t1 | t2 | t3 | t4 | group_id
----+----+----+----+----+----------
   1  |   1  |   0  |   1  |   0  |         1 
   2  |   0  |   0  |   0  |   0  |         1 
   3  |   0  |   1  |   0  |   0  |         1 
   4  |   0  |   1  |   1  |   0  |         1 
( 4  rows)

seb=> select *, (a.t1 # b.t1) + (a.t2 # b.t2) + (a.t3 # b.t3) + (a.t4 # b.t4) as d from events a cross join events b;
 id | t1 | t2 | t3 | t4 | group_id | id | t1 | t2 | t3 | t4 | group_id | d
----+----+----+----+----+----------+----+----+----+----+----+----------+---
   1  |   1  |   0  |   1  |   0  |         1  |   1  |   1  |   0  |   1  |   0  |         1  |  0 
   1  |   1  |   0  |   1  |   0  |         1  |   2  |   0  |   0  |   0  |   0  |         1  |  2 
   1  |   1  |   0  |   1  |   0  |         1  |   3  |   0  |   1  |   0  |   0  |         1  |  3 
   1  |   1  |   0  |   1  |   0  |         1  |   4  |   0  |   1  |   1  |   0  |         1  |  2 
   2  |   0  |   0  |   0  |   0  |         1  |   1  |   1  |   0  |   1  |   0  |         1  |  2 
   2  |   0  |   0  |   0  |   0  |         1  |   2  |   0  |   0  |   0  |   0  |         1  |  0 
   2  |   0  |   0  |   0  |   0  |         1  |   3  |   0  |   1  |   0  |   0  |         1  |  1 
   2  |   0  |   0  |   0  |   0  |         1  |   4  |   0  |   1  |   1  |   0  |         1  |  2 
   3  |   0  |   1  |   0  |   0  |         1  |   1  |   1  |   0  |   1  |   0  |         1  |  3 
   3  |   0  |   1  |   0  |   0  |         1  |   2  |   0  |   0  |   0  |   0  |         1  |  1 
   3  |   0  |   1  |   0  |   0  |         1  |   3  |   0  |   1  |   0  |   0  |         1  |  0 
   3  |   0  |   1  |   0  |   0  |         1  |   4  |   0  |   1  |   1  |   0  |         1  |  1 
   4  |   0  |   1  |   1  |   0  |         1  |   1  |   1  |   0  |   1  |   0  |         1  |  2 
   4  |   0  |   1  |   1  |   0  |         1  |   2  |   0  |   0  |   0  |   0  |         1  |  2 
   4  |   0  |   1  |   1  |   0  |         1  |   3  |   0  |   1  |   0  |   0  |         1  |  1 
   4  |   0  |   1  |   1  |   0  |         1  |   4  |   0  |   1  |   1  |   0  |         1  |  0 
( 16  rows)
d - количество различающихся полей в данной паре. соответственно - чем меньше число - тем более "похоже" (меньше битов в соответствующих позициях отличаются)

pamir , если я не путаюсь - то имхо нельзя хорить _число_ и смотреть результат, нужно хорить биты, каждый в отдельности. число нельзя потому-что результат будет зависить от _позиции_ различающихся битов. и он может быть как больше так и меньше :)

например:
Код: plaintext
1.
2.
In [3]: p int('10111', 2) ^ int('10001', 2)
6
разница - два бита
Код: plaintext
1.
2.
In [4]: p int('110111', 2) ^ int('10111', 2)
32
разница - один бит.


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
22.04.2008, 17:24
    #35272134
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
pamir pamirОшибся я немного, после XOR нужно подсчитать количество бит в результате =1 (т.е. количество совпадений). И вот уже это число - у кого больше, тот и более похож.Ну да, у кого МЕНЬШЕ!
Ибо единицы дадут несовпадающие события. Ну или подсчитывать количество нулевых битов.точно, что-то не внимательно я Вас прочитал, пропустил Ваш пост про "нужно подсчитать количество бит в результате" - всё правильно :)
...
Рейтинг: 0 / 0
22.04.2008, 17:31
    #35272166
horal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
pamir pamir DAISER pamirКаждое событие - число, составленное из битов - параметров события.
Для сравнения событий делаем XOR, у кого больше, тот более похож.
А может, всё-таки, у кого меньше, если XOR? Да и, например, 100000b > 000110b, а первое событие больше похоже.Ошибся я немного, после XOR нужно подсчитать количество бит в результате =1 (т.е. количество совпадений). И вот уже это число - у кого больше, тот и более похож.Ну да, у кого МЕНЬШЕ!
Ибо единицы дадут несовпадающие события. Ну или подсчитывать количество нулевых битов.

да, нужно подсчитать количество единиц.

Т.е. надо функцию писать какую-то?

или как еще можно подсчитать кол-во единич в результате?

А как правильно использовать BIT_XOR (expr) ?

select * From where t1 XOR 100 = max - как это правильно напистаь?
...
Рейтинг: 0 / 0
22.04.2008, 17:40
    #35272208
horal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
Ёш[src]seb=> select * from events;
(4 rows)

seb=> select *, (a.t1 # b.t1) + (a.t2 # b.t2) + (a.t3 # b.t3) + (a.t4 # b.t4) as d from events a cross join events b;




--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери


(a.t3 # b.t3) - Это умножение?
...
Рейтинг: 0 / 0
22.04.2008, 17:50
    #35272239
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как лучше сделать запрос для определения похожести событий?
horal(a.t3 # b.t3) - Это умножение?это xor
Код: plaintext
1.
2.
3.
4.
seb=> \do
. . .
 pg_catalog | #    | bigint                      | bigint                      | bigint                      | bitwise xor
. . .
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как лучше сделать запрос для определения похожести событий? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]