public Apriori(double minSupport, double minConfidence, IEnumerable <IAprioriData <T> > datas) { _minSupport = minSupport; _minConfidence = minConfidence; _datas = new List <IEnumerable <T> >(); _setDatas = new List <SetData <T> >(); _supportTable = new Dictionary <T, double>(); var itemHashset = new HashSet <T>(); foreach (var data in datas) { var list = data.GetData(); _datas.Add(list); foreach (T item in list) { itemHashset.Add(item); } } foreach (T item in itemHashset) { SetData <T> set = new SetData <T>(); set.Set.Add(item); if (CheckSupport(set)) { _setDatas.Add(set); } _supportTable.Add(item, set.Support); } }
private bool CheckSupport(SetData <T> setData) { var set = setData.FullSet; double count = 0; foreach (var data in _datas) { if (data.Intersect(set).Count() == set.Count()) { count++; } } setData.Support = count / _datas.Count; return(setData.Support >= _minSupport); }
public void Train() { Show(); List <SetData <T> > newSetDatas = new List <SetData <T> >(); Dictionary <IEnumerable <T>, T> exist = new Dictionary <IEnumerable <T>, T>(); for (int i = 0; i < _setDatas.Count; i++) { for (int j = 0; j < _setDatas.Count; j++) { if (i == j) { continue; } var fullSetI = _setDatas[i].FullSet; var fullSetJ = _setDatas[j].FullSet; var union = fullSetI.Union(fullSetJ); if (union.Count() == fullSetI.Count() + 1) { var select = union.Except(fullSetI).ElementAt(0); bool hasSameSet = false; foreach (var v in exist) { if (v.Key.Except(fullSetI).Count() == 0 && select.Equals(v.Value)) { hasSameSet = true; break; } } if (hasSameSet) { continue; } SetData <T> set = new SetData <T>(); set.Set = new HashSet <T>(fullSetI); set.Select = select; set.Confidence = _setDatas[i].Support; if (CheckSupport(set) && CheckConfidence(set)) { set.Lift = set.Confidence / _supportTable[select]; newSetDatas.Add(set); exist.Add(fullSetI, select); } } } } if (newSetDatas.Count > 0) { _setDatas = newSetDatas; Train(); } }
private bool CheckConfidence(SetData <T> setData) { setData.Confidence = setData.Support / setData.Confidence; return(setData.Confidence >= _minConfidence); }