当前位置: 代码迷 >> GIS >> GIS信息关联规则开掘——Apriori算法的实现(下)
  详细解决方案

GIS信息关联规则开掘——Apriori算法的实现(下)

热度:332   发布时间:2016-05-05 06:06:41.0
GIS信息关联规则挖掘——Apriori算法的实现(下)

上篇说明了原理,这篇就直接上核心代码了~


代码比较长,所以理解可能有点麻烦,核心思路就是计算选择的维度后遍历数据,逐步进行循环计算置信度,并淘汰每次循环后的最低值。

这里有一点要注意的,我一开始想用arraylist构造一个堆栈结构进行数据遍历的存储跟计算,因为这样效率比较高。。

但是后来发现,那么做的话,如果以后想要对类型跟因子的种类、数量进行修改的话,需要对代码进行大量重构才能实现功能的更新,而对于我朋友这样的代码苦手来说估计跟写天书差不多。。于是在实现的时候我放弃了部分效率,将每个类型单独设置一个数据表,然后每个表写入该类型所有的因子,最后通过在数据库读取这些表的形式进行数据的遍历计算。这样的话,后期想要更改类型跟因子,可以通过直接在数据库修改的方式进行处理,代码也不需要大改了。

(=。= 没办法额,毕竟不是每个人都会写代码的。。。)

namespace FManage{    public partial class Analy : Form    {        private System.Windows.Forms.CheckBox[] checkBoxFactors;        private DataSet ds;        private int[] rowTables;        private int[] flag;        private int[] dimention;        private int[] fee;        private int p;        public Analy()        {            InitializeComponent();            this.panel1.SuspendLayout();            this.SuspendLayout();        //数据加载过程略            this.checkBoxFactors = new System.Windows.Forms.CheckBox[6];		//设置要素选择项            for (int i = 0; i < 6; i++)            {                this.checkBoxFactors[i] = new System.Windows.Forms.CheckBox();                this.checkBoxFactors[i].AutoSize = true;                this.checkBoxFactors[i].Location = new System.Drawing.Point(90 + i % 3 * 150, 28 + (int)Math.Floor(Convert.ToDouble(i / 3) * 40));                this.checkBoxFactors[i].Size = new System.Drawing.Size(84, 16);                this.checkBoxFactors[i].TabIndex = i + 1;                this.checkBoxFactors[i].UseVisualStyleBackColor = true;                this.panel1.Controls.Add(this.checkBoxFactors[i]);            }            this.panel1.ResumeLayout(false);            this.panel1.PerformLayout();            this.ResumeLayout(false);            this.PerformLayout();        }        private void Analy_Load(object sender, EventArgs e)        {            rowTables = new int[8];            for (int i = 0; i < 8; i++)            {                rowTables[i] = ds.Tables[i].Rows.Count;            }            dimention = new int[8];            for (int i = 0; i < 8; i++)            {                dimention[i] = ds.Tables[i].Rows.Count;            }        }		//计算选择维度        private void countfee(ref int[] fee)        {            int p;            for (int i = 0; i < dimention[7]; i++)            {                p = 0;                for (int j = 0; j < 7; j++)                {                    if (flag[j] == 1)                        fee[i] += System.Convert.ToInt32(ds.Tables[7].Rows[i].ItemArray[j + 1]) * (int)Math.Pow(10, p++);                }            }        }	        private void CircleString(int a, int end, ref string[] finalString, ref int[] needle, string[][] tempString)        {            for (int i = 0; i < tempString[a].Length; i++)            {                needle[a] = i;                if (a == end - 1)                {                    for (int j = 0; j < end; j++)                    {                        finalString[p++] = tempString[j][needle[j]];                    }                }                else                {                    CircleString(a + 1, end, ref finalString, ref needle, tempString);                }            }        }        private void CircleCalculationString(int a, int end, ref string[] finalCalculation, ref int[] needleCalculation, string[][] tempCalculation)        {            for (int i = 0; i < tempCalculation[a].Length; i++)            {                needleCalculation[a] = i;                if (a == end - 1)                {                    for (int j = 0; j < end; j++)                    {                        finalCalculation[p++] = tempCalculation[j][needleCalculation[j]];                    }                }                else                {                    CircleCalculationString(a + 1, end, ref finalCalculation, ref needleCalculation, tempCalculation);                }            }        }		//计算支持度和置信度        private void buttonCalculate_Click(object sender, EventArgs e)        {            double zhichiduNumber = Convert.ToDouble(rank1.Text) / 100;            double zhixinduNumber = Convert.ToDouble(rank2.Text) / 100;            fee = new int[dimention[7]];            flag = new int[7];            flag[0] = 1;            for (int i = 0; i < 6; i++)            {                if (this.checkBoxFactors[i].Checked)                    flag[i + 1] = 1;                else                    flag[i + 1] = 0;            }            countfee(ref fee);            #region ShowString            string[][] tempString = new string[flag.Sum() - 1][];            int temp = 0;            for (int i = 0; i < flag.Sum() - 1; i++)            {                do { temp++; if (temp == 7)break; } while (flag[temp] == 0);                tempString[i] = new string[dimention[temp]];                for (int j = 0; j < dimention[temp]; j++)                {                    tempString[i][j] = ds.Tables[temp].Rows[j].ItemArray[1].ToString();                }            }            int[] needleString = new int[flag.Sum() - 1];            for (int i = 0; i < flag.Sum() - 1; i++)            {                needleString[i] = 0;            }            int finalNumber = 1;            for (int i = 1; i < 7; i++)            {                if (flag[i] == 1)                    finalNumber *= ds.Tables[i].Rows.Count;            }            DataTable showTable = new DataTable("showTable");            DataColumn finalCol = showTable.Columns.Add("ID", typeof(Int32));            finalCol.AllowDBNull = false;            finalCol.Unique = true;            for (int i = 1; i < 7; i++)            {                if (flag[i] == 1)                    showTable.Columns.Add(ds.Tables[7].Columns[i + 1].ColumnName, typeof(String));            }            showTable.Columns.Add("支持度(%)", typeof(double));            showTable.Columns.Add("置信度(%)", typeof(double));            string[] showString = new string[finalNumber * (flag.Sum() - 1)];            p = 0;            CircleString(0, flag.Sum() - 1, ref showString, ref needleString, tempString);            DataRow showRow;            p = 0;            for (int i = 0; i < finalNumber; i++)            {                showRow = showTable.NewRow();                showRow[0] = i + 1;                for (int j = 0; j < flag.Sum() - 1; j++)                {                    showRow[j + 1] = showString[p++];                }                showRow[flag.Sum()] = 0;                showRow[flag.Sum() + 1] = 0;                showTable.Rows.Add(showRow);            }            #endregion            #region Calculation            string[][] tempCalculation = new string[flag.Sum()][];            temp = 0;            for (int i = 0; i < flag.Sum(); i++)            {                tempCalculation[i] = new string[dimention[temp]];                for (int j = 0; j < dimention[temp]; j++)                {                    tempCalculation[i][j] = ds.Tables[temp].Rows[j].ItemArray[0].ToString();                }                do { temp++; if (temp == 7)break; } while (flag[temp] == 0);            }            int[] needleCalculation = new int[flag.Sum()];            for (int i = 0; i < flag.Sum(); i++)            {                needleCalculation[i] = 0;            }            finalNumber = 1;            for (int i = 0; i < 7; i++)            {                if (flag[i] == 1)                    finalNumber *= ds.Tables[i].Rows.Count;            }            DataTable calculationTable = new DataTable("calculationTable");            for (int i = 0; i < 7; i++)            {                if (flag[i] == 1)                    calculationTable.Columns.Add(ds.Tables[7].Columns[i + 1].ColumnName, typeof(String));            }            string[] finalCalculation = new string[finalNumber * flag.Sum()];            p = 0;            CircleCalculationString(0, flag.Sum(), ref finalCalculation, ref needleCalculation, tempCalculation);            DataRow calculationRow;            p = 0;            for (int i = 0; i < finalNumber; i++)            {                calculationRow = calculationTable.NewRow();                for (int j = 0; j < flag.Sum(); j++)                {                    calculationRow[j] = finalCalculation[p++];                }                calculationTable.Rows.Add(calculationRow);            }            #endregion            int[] objectiveFee = new int[finalNumber];            for (int i = 0; i < finalNumber; i++)            {                for (int j = 0; j < flag.Sum(); j++)                {                    objectiveFee[i] += System.Convert.ToInt32(calculationTable.Rows[i].ItemArray[j]) * (int)Math.Pow(10, j);                }            }            double[,] times = new double[3, finalNumber / 2];            for (int i = 0; i < finalNumber / 2; i++)            {                for (int j = 0; j < dimention[7]; j++)                {                    if (objectiveFee[i] == fee[j])                        times[0, i]++;                }            }            for (int i = finalNumber / 2; i < finalNumber; i++)            {                for (int j = 0; j < dimention[7]; j++)                {                    if (objectiveFee[i] == fee[j])                        times[1, i - finalNumber / 2]++;                }            }            for (int i = 0; i < finalNumber / 2; i++)            {                times[2, i] = times[0, i] + times[1, i];            }            double[] zhichidu = new double[finalNumber / 2];            for (int i = 0; i < finalNumber / 2; i++)            {                zhichidu[i] = times[2, i] / 1000.0;            }            double[] zhixindu = new double[finalNumber / 2];            for (int i = 0; i < finalNumber / 2; i++)            {                if (times[2, i] > 0)                {                    zhixindu[i] = ((int)(times[0, i] / times[2, i] * 10000)) / 10000.0;                }                else                    zhixindu[i] = 0;            }            for (int i = 0; i < finalNumber / 2; i++)            {                showTable.Rows[i][flag.Sum()] = zhichidu[i];                showTable.Rows[i][flag.Sum() + 1] = zhixindu[i];            }            for (int i = 0; i < showTable.Rows.Count; i++)            {                showTable.Rows[i][0] = i + 1;                showTable.Rows[i][flag.Sum()] = (int)(Convert.ToDouble(showTable.Rows[i][flag.Sum()]) * 1000) / 10.0;                showTable.Rows[i][flag.Sum() + 1] = (int)(Convert.ToDouble(showTable.Rows[i][flag.Sum() + 1]) * 1000) / 10.0;            }            this.dataGridView1.DataSource = null;            this.dataGridView1.DataSource = showTable.DefaultView;            this.dataGridView1.Visible = true;        }    }}