如何从大型事务数据文件中查找最大频繁项集

时间:2010-04-24 11:45:15

标签: c# .net sql sql-server data-mining

我的输入文件包含大量的交易,比如

交易ID项目

T1 Bread, milk, coffee, juice
T2 Juice, milk, coffee
T3 Bread, juice
T4 Coffee, milk
T5 Bread, Milk
T6 Coffee, Bread
T7 Coffee, Bread, Juice
T8 Bread, Milk, Juice
T9 Milk, Bread, Coffee, 
T10 Bread
T11 Milk
T12 Milk, Coffee, Bread, Juice

我想要出现每个独特的项目,如

Item Name Count
Bread  9
Milk   8
Coffee 7
Juice  6

alt text http://www.ade-technologies.com/OrderFP_Tree.jpg

从那个我想要一个fp树现在通过遍历这个树我想要最大频繁项目集如下

方法的基本思想是从下到上配置每个“层”中的节点。 “层”的概念不同于树中层的常见概念。 “层”中的节点表示节点对应于相同的项并且位于“头表”的链表中。对于“层”中的节点,NBN方法将用于沿链表从左到右配置节点。要使用NBN方法,将在有序FP-Tree中的每个节点上添加两个额外字段。节点N的字段标签存储N是否是最大频繁项集的信息,字段计数'将支持计数信息存储在左边的节点中。

在图中,要处理的第一个节点是“juice:2”。如果min_sup等于或小于2,则“面包,牛奶,咖啡,果汁”是最大频繁项目集。首先输出juice:2并将“coffee:3”的字段标记设置为“false”(每个节点的字段标记最初为“true”)。接下来检查正确的四个项目集果汁:1是果汁的子集:2。如果itemset对应的一个节点“juice:1”是juice的子集:2将节点的字段标记设置为“false”。在以下过程中,当被配置节点的字段标签为FALSE时,我们可以在相同标记之后省略该节点。如果min_sup大于2,则检查正确的四个果汁:1是果汁的子集:2。如果itemset一个节点“juice:1”对应于juice的子集:2然后设置节点的字段数'与前一个计数'和2的总和在所有节点“juice”处理后,开始处理节点“coffee:3”。

任何建议或可用的源代码,欢迎。

提前致谢

1 个答案:

答案 0 :(得分:0)

这可以直接在SQL

中完成
CREATE TABLE dbo.TestTable
( FIELD1 VARCHAR(256) )
GO

INSERT INTO dbo.TestTable(FIELD1) VALUES
('T1 Bread, milk, coffee, juice')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T2 Juice, milk, coffee')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T3 Bread, juice')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T4 Coffee, milk')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T5 Bread, Milk')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T6 Coffee, Bread')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T7 Coffee, Bread, Juice')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T8 Bread, Milk, Juice')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T9 Milk, Bread, Coffee,')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T10 Bread')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T11 Milk')
INSERT INTO dbo.TestTable(FIELD1) VALUES
('T12 Milk, Coffee, Bread, Juice')
GO

--CREATE INDEX TestIndex ON dbo.TestTable(FIELD1)
--GO

;WITH Numbers AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS N
    FROM dbo.TestTable T1
    CROSS JOIN dbo.TestTable T2
),
Base AS
(
    SELECT SUBSTRING(FIELD1, 0, CHARINDEX(' ', FIELD1, 0)) AS TRANID,
    UPPER(REPLACE(SUBSTRING(FIELD1, CHARINDEX(' ', FIELD1, 0)+1, DATALENGTH(FIELD1)), ' ', '')) AS ITEMS
    FROM dbo.TestTable
),
Split AS
(
    SELECT TRANID, ITEMS, N, SUBSTRING(ITEMS, N, CHARINDEX(',', ITEMS + ',', N) - N) AS ELEMENT
    FROM Base 
    JOIN Numbers ON N <= DATALENGTH(Base.ITEMS) + 1
    AND SUBSTRING(',' + Base.ITEMS, N, 1) = ','
)
SELECT ELEMENT, COUNT(*) AS TOTAL
FROM Split
GROUP BY ELEMENT
ORDER BY TOTAL DESC

返回

BREAD   9
MILK    8
COFFEE  7
JUICE   6
        1  

空条目来自事务T9结束时的逗号

T9 Milk, Bread, Coffee,