繁体   English   中英

C#中apriori算法的数据挖掘问题

[英]Data Mining issue with the apriori algorithm in C#

我正在C#中创建自己的apriori算法实现。 对于此项目,不允许将其他库等用于apriori算法。

以下是我的testData.json 请注意,这些是字符串,这意味着我的项目集可能不仅是像A这样的字符,而且是像candy这样的单词。

注意:我将在测试时使用20 (20%)的支持。

{
    "transactions": [
        [ "B", "C" ],
        [ "B", "C", "D" ],
        [ "A", "D" ],
        [ "A", "B", "C", "D" ],
        [ "C", "D" ],
        [ "C", "D", "E" ],
        [ "A", "B" ]
    ]
}

当我单击一个按钮来处理数据以及所需的值minSupportminConfidence (尚不需要)时,我将JSON反序列化为Object并将其保存到名为database的公共变量中。这是Database类。

public class Database
{
    public List<List<string>> transactions { get; set; }
}

单击按钮时,我调用方法GenerateCandidateItemSet() 这是我遇到问题的地方。

private Dictionary<string, int> C1 = new Dictionary<string, int>();
private void GenerateCandidateItemSet()
{
    foreach (List<string> transaction in database.transactions)
    {
        foreach (string item in transaction)
        {
            if (C1.ContainsKey(item))
            {
                C1[item]++;
            }
            else
            {
                C1.Add(item, 1);
            }
        }
    }

    // Check our frequency, remove items with low support
    foreach (string key in C1.Keys.ToList())
    {
        double frequency = (C1[key] * 100) / (database.transactions.Count);
        if (frequency < minSupport)
        {
            C1.Remove(key);
        }
    }

    // Pairing check stuff
    List<string[]> itemPairs = new List<string[]>();
    List<string> items = C1.Keys.ToList();

    foreach (string item in items)
    {
        // FIX THIS LOOP LATER TO CONTAIN ALL PAIRS
        List<string> itemArray = new List<string>();
        if (item != items.Last())
        {
            itemArray.Add(item);
            itemArray.Add(items[items.IndexOf(item) + 1]);
            itemPairs.Add(itemArray.ToArray());
        }
    }
    GenerateItemSetRecursive(itemPairs);
}

在以下部分之前: //Pairing check stuff C1值为:

在此处输入图片说明

循环完成后,我需要获取以下内容:

BC, BD, BA, CD, CA, DA

如果我要插入AB, AD, BC, BD, CD ,结果将是ABD, BCD等。

基本上,我需要找到交易的Frequent Itemsets

问题:考虑到我只获得我的itemPairs的BC, CD, DA ,而不是BC, BD, BA, CD, CA, DA我知道我的逻辑是错误的。 我的循环如何运行?

如您所指出的, C1.Keys.ToList()为您提供{"B", "C", "D", "A"}

您的代码正在执行的操作是遍历该列表,并添加下一个元素以创建一个对(假定它不是最后一个元素)。

逐步执行代码-您将看到第一个迭代为您提供{"B", "C"} ,下一个迭代为您提供{"C", "D"} ,然后再为您提供{"D", "A"} 最后一次迭代将用于列表的最后一个元素,因此items.Last()计算结果为true,并且不会添加任何内容。

现在进行工作的一种简单方法是在残破的循环内添加另一个循环。 目的是当您迭代"B" ,不仅要添加{"B", "C"} ,还要添加{"B", "D"}{"B", "A"} ,以及类似地,您对"C"的外部迭代将同时找到{"C", "D"}{"C", "A"}

我希望这会有所帮助-如果您仍然对此感到困难,请随时在C#聊天中对我执行ping操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM