Операция интеллектуального анализа данных с использованием SQL-запроса (алгоритм Fuzzy Apriori) - Как мне кодировать его с помощью SQL? - PullRequest
9 голосов
/ 03 декабря 2010

Итак, у меня есть эта таблица:

Trans_ID    Name    Fuzzy_Value    Total_Item  
100          I1  0.33333333        3  
100          I2  0.33333333        3  
100          I5  0.33333333        3  
200          I2  0.5               2  
200          I5  0.5               2  
300          I2  0.5               2  
300          I3  0.5               2  
400          I1  0.33333333        3  
400          I2  0.33333333        3  
400          I4  0.33333333        3  
500          I1  0.5               2  
500          I3  0.5               2  
600          I2  0.5               2  
600          I3  0.5               2  
700          I1  0.5               2  
700          I3  0.5               2  
800          I1  0.25              4  
800          I2  0.25              4  
800          I3  0.25              4  
800          I5  0.25              4  
900          I1  0.33333333        3  
900          I2  0.33333333        3  
900          I3  0.33333333        3  
1000         I1  0.2               5  
1000         I2  0.2               5  
1000         I4  0.2               5  
1000         I6  0.2               5  
1000         I8  0.2               5  

и 2 пустых таблицы:

Table  ITEMSET

"ITEM_SET" "Support" 



Table Confidence

"ANTECEDENT" "CONSEQUENT" 

Мне нужно найти значение FUZZY для каждого элемента, который происходит в каждой транзакции:

I1 = Sum of (Fuzzy_Value from item I1 in trans 100 until 1000 which is trans: 100,400,500,700,800,900,1000)/Total Trans  
-> (.33333333+0.33333333+0.5+0.5+0.25+0.33333333+0.2)/10 = 0.244999999


I2 = Sum of (Fuzzy_Value from item I2 in trans 100 - 1000 which is trans:100,200,300,400,600,800,900,1000)/Total Trans  
-> (0.33333333+0.5+0.5+0.33333333+0.5+0.25+0.33333333)/10 = 0.274999999


I3 -> 0.258333333  
I4 -> 0.103333333  
I5 -> 0.058333333    
I6 -> 0.02    
I8 -> 0.02    

Для EX: я использую минимальную поддержку 10% -> 0,1
Мне нужно удалить I5, I6, I8, так как это значение <0,1 => шаг сокращения

затем сохраните

I1=0.244999999, I2=0.274999999, I3=0.258333333,I4=0.103333333  on new table 'ITEMSET' 

2 КОМБИНАЦИЯ

ПРИМЕЧАНИЕ: это основной 1-й шаг после наиболее вероятной необходимости использованияповторяющийся или рекурсивный, так как процесс будет продолжаться до тех пор, пока никакая другая комбинация предметов невозможна
, тогда из того, что осталось, мне нужно найти K + 1 набор предметов (который является набором из 2 комбинаций) => присоединиться к шагу

{I1,I2} =Sum of (Fuzzy_Value from item I1 + I2 in trans 100 - 1000 which is trans:100,400,800,900,1000)/Total Trans 
->(0.666666667+0.666666667+0.5+0.666666667+0.4)/9 = 0.29

*do the same for the rest*
{I1,I3} =(1+1+0.5+0.666666667)/9 = 0.316666667
{I1,I4} =(0.666666667+0.4)/9 = 0.106666667
{I2,I3} =(1+1+0.5+0.666666667)/9 = 0.316666667
{I2,I4} =(1+0.666666667+0.4)/9 =0.206666667
{I3,I4} =0  

Затем выполните еще один шаг Сокращение , удалив значение меньше 0,1, что составляет {I3, I4}

Store {I1,I2} = 0.29, {I1,I3} = 0.316666667, {I1,I4} =0.106666667, {I2,I3} = 0.316666667, {I2,I4} = 0.206666667  AT "ITEMSET" TABLE 

3 COMBINATION

После этого выполните еще один JOIN STEP , объединяющий наборы элементов, которые проходят обрезку

{I1,I2,I3} = Sum of (Fuzzy_Value from item I1 + I2 +I3 in trans 100 - 1000 which is trans:800,900)/Total Trans  
-> 0.75+1 = 0.175  
**Same for the rest**  
{I1,I2,I4} = 1+0.6 = 0.16  
{I2,I3,I4} = 0  

Сделайте еще один Шаг обрезки Removeing меньше 0,1 значения, которое составляет {I1, I3, I4}

Store {I1,I2,I3} = 0.176 AND {I1,I2,I4} = 0,16 AT "ITEMSET" TABLE  

4 КОМБИНАЦИЯ

Объединение наборов элементов, которые проходят сокращение K + 4 (4комбинация)

{I1,I2,I3,I4} = 0

**, поскольку ни одна транзакция, содержащая этот элемент

после остановки процесса, так как не осталось никакой возможной комбинации


, на данный момент база данных ITEMSET имеет:

ITEM_SET           Support  
{I1}               0.244999999
{I2}               0.274999999     
{I3}               0.258333333    
{I4}               0.103333333  
{I1,I2}            0.29    
{I1,I3}            0.316666667  
{I1,I4}            0.106666667  
{I2,I3}            0.316666667  
{I2,I4}            0.206666667  
{I1,I2,I3}         0.176  
{I1,I2,I4}         0,16  

как мне написать это в sql?большое спасибо

* примечание: при необходимости вы можете добавить еще одну таблицу

1 Ответ

1 голос
/ 23 июня 2011

Шаг 1:

CREATE TABLE ITEMSET
SELECT Name, SUM(Fuzzy_Value)/COUNT(*) Fuzzy_Value
FROM trans
GROUP BY ID
HAVING ROUND(SUM(Fuzzy_Value), 1) >= 0.1

Обратите внимание на функцию ROUND() - это важно, потому что у вас есть такие значения, как .33333, которые не суммируются в хорошем смысле.

Шаг 2:

ALTER TABLE ITEMSET ADD INDEX (Name)

SELECT a.Name Name1, b.Name Name2, SUM(Fuzzy_Value)/COUNT(*) Fuzzy_Value
FROM ITEMSET a JOIN ITEMSET b ON (a.Name != b.Name)
GROUP BY a.Name, b.Name
HAVING ROUND(SUM(Fuzzy_Value), 1) >= 0.1

Оппс: Я только что заметил, что вы спрашивали об этом полгода назад, так что, думаю, нет смысла продолжать.Если вам все еще нужен этот ответ, оставьте комментарий.

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