2010-04-24 7 views
0

Je le fichier d'entrée contient un grand nombre de transactions commecomment trouver les ensembles d'objets fréquents au maximum de gros fichier de données transactionnelles

ID de transaction Articles

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 

je veux l'apparition de chaque élément unique comme

Item Name Count 
Bread 9 
Milk 8 
Coffee 7 
Juice 6 

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

et de ce i Je veux un fp-tree maintenant en traversant cet arbre, je veux les itemsets fréquents maximum comme suit

L'idée de base de la méthode est de disposer des nœuds dans chaque "couche" de bas en haut. Le concept de "couche" est différent du concept commun de couche dans un arbre. Les nœuds dans une "couche" signifient que les nœuds correspondent au même élément et se trouvent dans une liste chaînée de la "Table des têtes". Pour les nœuds d'une "couche", la méthode NBN sera utilisée pour disposer les nœuds de gauche à droite le long de la liste chaînée. Pour utiliser la méthode NBN, deux champs supplémentaires seront ajoutés à chaque nœud dans l'arborescence FP ordonnée. L'étiquette de champ du noeud N stocke l'information de savoir si N est un ensemble d'éléments fréquent maximal, et le compte de champ 'stocke les informations de compte de support dans les noeuds à gauche.

Sur la figure, le premier noeud à disposer est "jus: 2". Si le min_sup est égal ou inférieur à 2 alors "pain, lait, café, jus" est un itemet maximal fréquent. Tout d'abord, affichez le jus: 2 et définissez l'étiquette de champ "café: 3" comme "false" (l'étiquette de chaque noeud est "true" au départ). Ensuite, vérifiez si le jus de quatre itemsets droit: 1 est le sous-ensemble de jus: 2. Si l'itemet un noeud "juice: 1" correspondant à est le sous-ensemble de juice: 2 mettre l'étiquette de champ du noeud "false". Dans le processus suivant lorsque l'étiquette de champ du noeud éliminé est FAUX, nous pouvons omettre le noeud après le même marquage. Si le min_sup est supérieur à 2 alors vérifiez si le jus de quatre droit: 1 est le sous-ensemble du jus: 2. Si l'itemet un nœud "jus: 1" correspondant à est le sous-ensemble de jus: 2 alors réglez le nombre de champs 'du noeud avec la somme du premier compte' et 2 Après tous les noeuds "jus" disposés, commencez à disposer le noeud "café: 3".

Toutes les suggestions ou le code source disponible, bienvenue.

merci à l'avance

+0

Veuillez trouver l'image h ere http://www.ade-technologies.com/OrderFP_Tree.jpg –

+0

La 1ère partie serait simple: unpivot les données. La 2ème partie semble totalement indépendante. – gbn

+0

Vous ne savez pas exactement ce que vous cherchez ici. Ne serait-il pas plus facile de tout mettre dans une matrice (1 pour acheté, 0 pour non acheté) et utiliser l'algorithme FP-Growth? –

Répondre

0

Cela peut être fait directement dans 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 

Ce retour

BREAD 9 
MILK 8 
COFFEE 7 
JUICE 6 
     1 

L'entrée vide provient de la virgule à la fin de la transaction T9

T9 Milk, Bread, Coffee, 
Questions connexes