使用SQL查询的数据挖掘操作(模糊Apriori算法)-使用SQL对其进行编码

使用SQL查询的数据挖掘操作(模糊Apriori算法)-使用SQL对其进行编码,sql,data-mining,apriori,Sql,Data Mining,Apriori,我有一张桌子: 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

我有一张桌子:

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  
和两个空白表格:

Table  ITEMSET
  
"ITEM_SET" "Support" 



Table Confidence
  
"ANTECEDENT" "CONSEQUENT" 

我需要为每笔交易中出现的每个项目找到模糊值:

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    
例如,我使用最小支持度10%->0.1
我需要删除I5、I6、I8,因为它的值<0.1=>修剪步骤

{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  
然后存储:

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

2种组合

注意:这是之后的第一步,最有可能需要使用repeat或recursive,因为该过程将继续进行,直到不可能有其他项目组合。
然后从剩下的内容中,我需要找到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个组合

然后执行另一个连接步骤合并通过修剪的项目集

{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  
执行另一个修剪步骤删除小于0.1的值,即{I1,I3,I4}

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

4个组合

通过修剪K+4(4个组合)的组合项集

**因为没有包含此项的事务

由于没有可能的组合,进程停止后


此时,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:

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

Opps:我刚刚注意到你半年前问过这个问题,所以我想继续下去是没有意义的。如果您仍然需要此答案,请留下评论。

您可以随时修改格式,而不是为此道歉。我首先用规则空格替换那些
s,然后突出显示整个表并点击“code”按钮。看起来像两行binary.code按钮的那个,thx我现在就修复它,它应该更好,thx再修复一次如果你开始使用的话,你应该用芬兰语,因为还有其他人可能需要它。@Ariel除了OP之外的用户也可以从你的答案中受益,即使答案已经十年了。你仍然可以继续并完成你的答案。它仍然是知识和经验的源泉