【问题标题】:how to find maximum frequent item sets from large transactional data file如何从大型事务数据文件中找到最大频繁项集
【发布时间】:2011-02-11 20:34:00
【问题描述】:

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

交易 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-tree 通过遍历这棵树我想要最大频繁项集如下

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

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

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

提前致谢

【问题讨论】:

  • 请在此处找到图片ade-technologies.com/OrderFP_Tree.jpg
  • 第一部分很简单:取消透视数据。第二部分似乎完全不相关。
  • 不确定您在此处寻找什么。将它们全部放在一个矩阵中(1 表示已购买,0 表示未购买)并使用 FP-Growth 算法不是更容易吗?

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


【解决方案1】:

这可以直接在 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, 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2021-09-30
    • 1970-01-01
    • 2016-01-26
    • 2014-01-28
    • 2021-04-21
    相关资源
    最近更新 更多