我在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" ]
]
}
当我单击按钮处理数据以及我需要的值minSupport
和minConfidence
(尚不需要)时,我将我的JSON反序列化为对象并将其保存到名为{的公共变量中{1}}下面是数据库类。
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
。
问题:考虑到我的itemPairs只获得Frequent Itemsets
,而不是BC, CD, DA
我知道我的逻辑是错误的。我的循环看起来会是什么让它起作用?
答案 0 :(得分:2)
正如您所指出的那样,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我。