在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C#实现Apriori算法 实例源码下载

C#实现Apriori算法 实例源码下载

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:3.84M
  • 下载次数:26
  • 浏览次数:741
  • 发布时间:2017-04-02
  • 实例类别:C#语言基础
  • 发 布 人:crazycode
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 算法 Apriori

实例介绍

【实例简介】

【实例截图】

【核心代码】

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections;
using System.IO;
using System.Threading;

namespace Apriori
{
    //关联规则的右半部分,例如 1^2^7 ==> 3^5 [12, 0.50],即箭头右边的部分
    public class RuleRightPart
    {
        public string items;
        public int support;
        public double confidence;

        public RuleRightPart()
        { }

        public RuleRightPart(string str, int i, double d)
        {
            this.items = str;
            this.support = i;
            this.confidence = d;
        }
    }

    public class Apriori
    {
        static void Main(string[] args)
        {
            Apriori apriori = new Apriori(200, 0.05, 0.5);
            apriori.GetRules();
        }

        public Apriori()
        { }

        public Apriori(int _maxId, double _support, double _confidence)
        {
            this.maxId = _maxId;
            this.support = _support;
            this.confidence = _confidence;
        }

        public static string sDataFile = @"D:\Projects\Apriori\Data\test.txt";//保存事务集的文件路径

        private int maxId;           //事务的最大编号
        private double support;      //支持度
        private double confidence;   //置信度
        
        private List<DataItem> AllTransactions = new List<DataItem>();  //所有事务
        private List<bool> NeedReview = new List<bool>();               //判断某事务是否需要遍历

        /// <summary>
        /// 从文件中加载所有事务
        /// </summary>
        private void LoadAllItems()
        {
            string sLine;
            string[] strArray;
            char[] separator = { '\t' };

            int[] aPrev = new int[maxId   1];
            int[] aCurr = new int[maxId   1];

            try
            {
                StreamReader sr = new StreamReader(sDataFile, Encoding.Default, false);

                sLine = sr.ReadLine();
                while (sLine != null)
                {
                    strArray = sLine.Split(separator, System.StringSplitOptions.RemoveEmptyEntries);

                    //利用数组去重和排序                    
                    foreach (string str in strArray)
                    {
                        int ix = int.Parse(str);
                        if ((ix <= maxId) && (aPrev[ix] == aCurr[ix]))
                              aCurr[ix];
                    }

                    List<int> l = new List<int>();
                    for (int ix = 0; ix <= maxId;   ix)
                        if (aCurr[ix] == 1   aPrev[ix])
                        {
                            l.Add(ix);
                            aPrev[ix] = aCurr[ix];
                        }

                    DataItem item = new DataItem(l);
                    AllTransactions.Add(item);
                    NeedReview.Add(true);

                    sLine = sr.ReadLine();
                }

                sr.Close();
            }
            catch (IOException e)
            {
                Console.WriteLine(e.ToString());
            }
        }

        public Dictionary<string, int> ItemsSupport = new Dictionary<string, int>();//频繁项集与支持度

        /// <summary>
        /// 生成单项的频繁项集合
        /// </summary>
        /// <returns></returns>
        private List<DataItem> GenerateLevel1Set()
        {
            List<DataItem> setLevel1 = new List<DataItem>();

            int[] itemFreq = new int[maxId 1];
            for (int ix = 0; ix <= maxId;   ix)
                itemFreq[ix] = 0;

            foreach (DataItem item in AllTransactions)
                foreach (int ix in item.items)
                      itemFreq[ix];

            for (int ix = 0; ix <= maxId;   ix)
                if (itemFreq[ix] >= support * AllTransactions.Count)
                {
                    List<int> l = new List<int>();
                    l.Add(ix);
                    DataItem item = new DataItem(l);
                    setLevel1.Add(item);

                    ItemsSupport.Add(ix.ToString(), itemFreq[ix]);
                }

            return setLevel1;
        }

        private List<DataItem> HighLevelFreqItems = new List<DataItem>();//高层频繁项集-用于生成关联规则

        /// <summary>
        /// 由低层的频繁项集生成高层的频繁项集
        /// </summary>
        /// <param name="setLowLevel">低层的频繁项集</param>
        /// <returns>高层的频繁项集</returns>
        private List<DataItem> GenerateHighLevelSet(List<DataItem> setLowLevel)
        {
            List<DataItem> setHighLevel = new List<DataItem>();

            List<DataItem> setTmp = new List<DataItem>();                   //候选的高层项集
            Dictionary<string, int> dic = new Dictionary<string, int>();    //候选的高层项集与它们的支持度

            //低层的频繁项集组合生成的候选的高层项集
            for (int ix = 0; ix < setLowLevel.Count;   ix)
            {
                for (int iy = ix   1; iy < setLowLevel.Count;   iy)
                {
                    DataItem itemComb = new DataItem();
                    if (setLowLevel[ix].Combine(setLowLevel[iy], ref itemComb))
                    {
                        //剪枝 - 判断所有低一层的子集是否频繁项集
                        List<DataItem> subSets = new List<DataItem>();
                        if (itemComb.GetLowSubSets(ref subSets))
                        {
                            int ik=0;
                            for (; ik<subSets.Count;   ik)
                                if (!ItemsSupport.ContainsKey(subSets[ik].ToString()))
                                    break;

                            if (ik == subSets.Count)
                            {
                                setTmp.Add(itemComb);
                                dic.Add(itemComb.ToString(), 0);
                            }
                        }
                    }
                }
            }
            if (setTmp.Count == 0)
                return setHighLevel;

            //计算候选的高层项集的支持度
            for (int ix = 0; ix < AllTransactions.Count;   ix)
            {
                bool flag = false;
                if (NeedReview[ix])
                {
                    foreach (DataItem item in setTmp)
                    {
                        if (AllTransactions[ix].Contains(item))
                        {
                              dic[item.ToString()];
                            flag = true;
                        }
                    }
                }
                NeedReview[ix] = flag;
            }

            foreach (string str in dic.Keys)
            {
                if (dic[str] >= support * AllTransactions.Count)
                {
                    DataItem item = new DataItem(str);
                    setHighLevel.Add(item);
                    HighLevelFreqItems.Add(item);
                    ItemsSupport.Add(str, dic[str]);
                }
            }

            return setHighLevel;
        }

        //关联规则
        public Dictionary<string, List<RuleRightPart>> AssociationRules = new Dictionary<string, List<RuleRightPart>>();
        
        /// <summary>
        /// 根据高层频繁项集生成关联规则
        /// </summary>
        private void GenerateAssociationRules()
        {
            if (HighLevelFreqItems.Count == 0)
                return;

            List<DataItem> subSet1 = new List<DataItem>();
            List<DataItem> subSet2 = new List<DataItem>();

            foreach (DataItem item in HighLevelFreqItems)
            {
                if (item.GetAllSubSets(ref subSet1, ref subSet2))
                {
                    int nSize = subSet1.Count;
                    for (int ix = 0; ix < nSize;   ix)
                    {
                        string sLeft = subSet1[ix].ToString();

                        int nSupportLeft = ItemsSupport[sLeft];
                        int nSupportAll = ItemsSupport[item.ToString()];
                        double dConfidence = (double)nSupportAll / (double)nSupportLeft;

                        if (dConfidence >= confidence)
                        {
                            RuleRightPart rp = new RuleRightPart(subSet2[ix].ToString(), nSupportAll, dConfidence);
                            if (AssociationRules.ContainsKey(sLeft))
                                AssociationRules[sLeft].Add(rp);
                            else
                            {
                                List<RuleRightPart> l = new List<RuleRightPart>();
                                l.Add(rp);
                                AssociationRules.Add(sLeft, l);
                            }
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 输出所有的关联规则
        /// </summary>
        private void PrintAssociationRule()
        {
            if (AssociationRules.Count == 0)
                return;

            Console.WriteLine("关联规则:");
            foreach(string str in AssociationRules.Keys)
            {
                foreach (RuleRightPart rp in AssociationRules[str])
                {
                    Console.Write(str   " ==> "   rp.items   " [");
                    Console.Write(rp.support);
                    Console.Write(", ");
                    Console.Write(rp.confidence);
                    Console.Write("]\n");
                }
            }
        }

        /// <summary>
        /// 生成频繁项集
        /// </summary>
        public void GetFreqItems()
        {
            //GenerateTestFile();
            LoadAllItems();
            List<DataItem> setLevel = GenerateLevel1Set();
            Console.WriteLine("单项的频繁项集合:");
            DataItem.PrintListItems(setLevel);
            Console.Write('\n');

            int ix = 2;
            List<DataItem> setHighLevel = new List<DataItem>();
            while (setLevel.Count != 0)
            {
                setHighLevel = GenerateHighLevelSet(setLevel);
                if (setHighLevel.Count != 0)
                {
                    Console.WriteLine(ix.ToString()   "-项的频繁项集合:");
                    DataItem.PrintListItems(setHighLevel);
                    Console.Write('\n');
                }
                  ix;
                setLevel.Clear();
                setLevel = setHighLevel;
            }
        }

        /// <summary>
        /// 生成关联规则
        /// </summary>
        public void GetRules()
        {
            GetFreqItems();

            GenerateAssociationRules();
            PrintAssociationRule();
        }

        /// <summary>
        /// 随机生成初始的事务文件
        /// </summary>
        private void GenerateTestFile()
        {
            int nRow = 100;     //行数
            int nColumn = 20;   //每行最多包含的项数

            try
            {
                StreamWriter sw = new StreamWriter(sDataFile, false, Encoding.Default);

                for (int ix = 0; ix < nRow;   ix)
                {
                    Random r = new Random();
                    int nSize = r.Next(nColumn-5, nColumn 5);
                    for (int iy = 0; iy < nSize;   iy)
                    {
                        int nPaperId = r.Next(1, maxId   1);
                        sw.Write(nPaperId);
                        sw.Write('\t');
                    }
                    sw.Write('\n');

                    //如果计算机运行速度很快,并且触发Randm函数间隔时间很短,就有可能产生一样的随机数
                    Thread.Sleep(20);
                }

                sw.Close();
            }
            catch (IOException e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

标签: 算法 Apriori

实例下载地址

C#实现Apriori算法 实例源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警