private void readType()
        {
            FreeContainer.FreeTable(MainFormContainers.SoilType);
            InputData id = new InputData(); MainFormContainers.SoilType = id.InputCSV(Config.soilhabitat);

            changeGrid2(MainFormContainers.SoilType); MessageBox.Show("类型数据更换完成!");
        }
예제 #2
0
 public bool MatrixAnalysis(DataTable dt, int level)
 {
     FreeContainer.FreeTable(HProfile);
     string[] column = { "剖面编号", "预测类型" };
     for (int i = 0; i < column.Length; i++)
     {
         DataColumn dc = new DataColumn(column[i]);
         HProfile.Columns.Add(dc);
     }
     for (int i = 0; i < dt.Rows.Count; i++)
     {
         DataRow dr = HProfile.NewRow();
         dr[0] = dt.Rows[i][0].ToString();
         double min = 2;
         int    col = 1;
         for (int j = 1; j < dt.Columns.Count; j++)
         {
             if (Convert.ToDouble(dt.Rows[i][j]) < min && Convert.ToDouble(dt.Rows[i][j]) != 0)
             {
                 min = Convert.ToDouble(dt.Rows[i][j]);
                 col = j;
             }
         }
         dr[1] = ReadType(level, dt.Columns[col].ColumnName.ToString());
         HProfile.Rows.Add(dr);
     }
     return(true);
 }
예제 #3
0
 /// <summary>
 /// 计算各类型土壤分类精确度
 /// </summary>
 /// <param name="mix">混淆矩阵</param>
 /// <returns></returns>
 bool MixAccuracy(DataTable mix)
 {
     FreeContainer.FreeTable(AMatrix);
     AMatrix.Columns.Add(new DataColumn("  ", typeof(string))); //添加列
     AMatrix.Columns.Add(new DataColumn("用户精度", typeof(string)));
     AMatrix.Columns.Add(new DataColumn("错分率", typeof(string)));
     for (int i = 0; i < mix.Rows.Count; i++)//遍历混淆矩阵计算各类型精确度
     {
         DataRow dr = AMatrix.NewRow();
         dr[0] = mix.Rows[i][0].ToString();
         int    sum = 0, num = 0;
         double ua = 0, cm = 0;
         for (int j = 1; j < mix.Columns.Count; j++)
         {
             sum += Convert.ToInt32(mix.Rows[i][j]);
             if (mix.Columns[j].ToString() == mix.Rows[i][0].ToString())
             {
                 num = Convert.ToInt32(mix.Rows[i][j]);
             }
         }
         ua    = Convert.ToDouble(num) / Convert.ToDouble(sum);
         cm    = 1.0 - ua;
         dr[1] = (ua * 100).ToString("f2") + "%";
         dr[2] = (cm * 100).ToString("f2") + "%";
         AMatrix.Rows.Add(dr);
     }
     return(true);
 }
 /// <summary>
 /// 清空目录树、表格,并且清空测试集数据
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void toolStripButton6_Click(object sender, EventArgs e)
 {
     FreeContainer.FreeTreeNode(treeView1, 0);
     FreeContainer.FreeTable(MainFormContainers.Testset);
     FreeContainer.FreeGrid(dataGridView1);
     progressBar1.Value = 0;
 }
예제 #5
0
 /// <summary>
 /// 直方图训练方法
 /// </summary>
 /// <param name="Test">测试集</param>
 /// <param name="Train">训练集</param>
 /// <param name="levels">分类级别</param>
 /// <param name="equation">距离函数指令</param>
 /// <returns></returns>
 public bool GetHistAnswer(List <string> Test, List <string> Train, int levels, int equation)
 {
     FreeContainer.FreeTable(BriefAccu);
     string[] column = { "实验序号", "总正确率" };
     for (int i = 0; i < column.Length; i++)
     {
         DataColumn dc = new DataColumn(column[i]);
         BriefAccu.Columns.Add(dc);
     }
     for (int i = 0; i < Test.Count && i < Train.Count; i++)
     {
         List <string> TestSample  = new List <string>();
         List <string> TrainSample = new List <string>();
         GetSamplelist(Test[i], out TestSample);             //从测试集文件中取出剖面ID
         GetSamplelist(Train[i], out TrainSample);           //从训练集文件中取出剖面ID
         HistogramMatrix(TestSample, TrainSample, equation); //计算距离矩阵
         AnswerAnalysis(Matrix, levels);                     //计算匹配剖面
         AccuracyAnalysis(Profile, i + 1);                   //计算匹配剖面类型
         MixMatrix(Profile);                                 //计算混淆矩阵
         MixAccuracy(MMatrix);                               //计算该次实验的总精确度
         OutputData od = new OutputData();                   //输出该次实验结果
         od.ExportToCsv(Config.MatrixFolder, "实验" + (i + 1).ToString() + "混淆矩阵", MMatrix);
         od.ExportToCsv(Config.MatrixFolder, "实验" + (i + 1).ToString() + "匹配结果", AMatrix);
         AuxiliaryFunc.percent += 90 / Train.Count;
     }
     return(true);
 }
예제 #6
0
        /// <summary>
        /// 计算正确率
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="num"></param>
        /// <returns></returns>
        private bool AccuracyAnalysis(DataTable dt, int num)
        {
            FreeContainer.FreeTable(Accuracy);
            string[] column = { "实验序号", "正确率" };
            for (int i = 0; i < column.Length; i++)
            {
                DataColumn dc = new DataColumn(column[i]);
                Accuracy.Columns.Add(dc);
            }
            int sum = 0;

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (dt.Rows[i][3].ToString() == "是")
                {
                    sum++;
                }
            }
            double  degree = Convert.ToDouble(sum) / Convert.ToDouble(dt.Rows.Count);
            DataRow dr     = Accuracy.NewRow();
            DataRow dr0    = BriefAccu.NewRow();

            dr[0]  = "实验" + num.ToString(); dr[1] = (degree * 100).ToString("f2") + "%";
            dr0[0] = "实验" + num.ToString(); dr0[1] = (degree * 100).ToString("f2") + "%";
            Accuracy.Rows.Add(dr);
            BriefAccu.Rows.Add(dr0);
            return(true);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            FreeContainer.FreeGrid(dataGridView1);
            FreeContainer.FreeGrid(dataGridView2);
            level = Convert.ToInt32(comboBox1.SelectedIndex + 1);
            Thread newthread0 = new Thread(new ThreadStart(RunTask));
            Thread newthread  = new Thread(new ThreadStart(match));

            newthread0.Start(); newthread.Start();
        }
예제 #8
0
        public bool HistogramSet(List <string> testset, List <string> trainset, int order)
        {
            if (testset.Count > 0)
            {
                FreeContainer.FreeTable(HMatrix);
                for (int i = 0; i < trainset.Count + 1; i++)
                {
                    if (i == 0)
                    {
                        DataColumn dc = new DataColumn(" ");
                        HMatrix.Columns.Add(dc);
                    }
                    else
                    {
                        DataColumn dc = new DataColumn(trainset[i - 1]);
                        HMatrix.Columns.Add(dc);
                    }
                }
                for (int i = 0; i < testset.Count; i++)
                {
                    DataRow dr = HMatrix.NewRow();
                    dr[0] = testset[i];
                    List <double> l1 = new List <double>();
                    ReadHistogram(Config.uksoilhistogram, testset[i], out l1);
                    for (int j = 0; j < trainset.Count; j++)
                    {
                        AuxiliaryFunc.percent = Convert.ToInt32((i + 1) * (j + 1) / testset.Count / trainset.Count * 95);
                        List <double> l2 = new List <double>();
                        ReadHistogram(Config.soilhistogram, trainset[j], out l2);
                        switch (order)
                        {
                        case 0: dr[j + 1] = Distance_Fomula.Euclidean(l1, l2).ToString(); break;

                        case 1: dr[j + 1] = Distance_Fomula.X2(l1, l2).ToString(); break;

                        case 2: dr[j + 1] = Distance_Fomula.Dxy(l1, l2).ToString(); break;

                        default: break;
                        }
                    }
                    HMatrix.Rows.Add(dr);
                }
                return(true);
            }
            else
            {
                MessageBox.Show("测试集为空!");
                return(false);
            }
        }
        public bool MatrixCal(List <string> testset, List <string> trainset, int order)
        {
            if (testset.Count > 0)
            {
                FreeContainer.FreeTable(HMatrix);
                SpecAngel sa = new SpecAngel();
                WaveShape ws = new WaveShape();
                InputData id = new InputData();
                for (int i = 0; i < trainset.Count + 1; i++)
                {
                    if (i == 0)
                    {
                        DataColumn dc = new DataColumn(" ");
                        HMatrix.Columns.Add(dc);
                    }
                    else
                    {
                        DataColumn dc = new DataColumn(trainset[i - 1]);
                        HMatrix.Columns.Add(dc);
                    }
                }
                for (int i = 0; i < testset.Count; i++)
                {
                    DataRow dr = HMatrix.NewRow();
                    dr[0] = testset[i];
                    DataTable dt1 = id.InputCSV(Config.uksoilfolder + @"\" + testset[i] + ".csv");
                    for (int j = 0; j < trainset.Count; j++)
                    {
                        AuxiliaryFunc.percent = Convert.ToInt32((i + 1) * (j + 1) / testset.Count / trainset.Count * 95);
                        DataTable dt2 = id.InputCSV(Config.soilfolder + @"\" + trainset[i] + ".csv");
                        switch (order)
                        {
                        case 0: dr[j + 1] = sa.SAcal(dt1, dt2).ToString(); break;

                        case 1: dr[j + 1] = ws.WaveCal(dt1, dt2).ToString(); break;

                        default: break;
                        }
                    }
                    AuxiliaryFunc.percent += Convert.ToDouble(i) / Convert.ToDouble(testset.Count) * 90;
                    HMatrix.Rows.Add(dr);
                }
                return(true);
            }
            else
            {
                MessageBox.Show("测试集为空!");
                return(false);
            }
        }
예제 #10
0
        /// <summary>
        /// 计算直方图距离矩阵
        /// </summary>
        /// <param name="testset"></param>
        /// <param name="trainset"></param>
        /// <param name="groups"></param>
        /// <param name="order"></param>
        /// <returns></returns>
        public bool HistogramMatrix(List <string> testset, List <string> trainset, int order)
        {
            FreeContainer.FreeTable(Matrix);
            for (int i = 0; i < trainset.Count + 1; i++)
            {
                if (i == 0)
                {
                    DataColumn dc = new DataColumn();
                    Matrix.Columns.Add(dc);
                }
                else
                {
                    DataColumn dc = new DataColumn(trainset[i - 1]);
                    Matrix.Columns.Add(dc);
                }
            }
            for (int i = 0; i < testset.Count; i++)
            {
                DataRow dr = Matrix.NewRow();
                dr[0] = testset[i];
                List <double> l1 = new List <double>();
                ReadHistogram(Config.soilhistogram, testset[i], out l1);
                for (int j = 0; j < trainset.Count; j++)
                {
                    List <double> l2 = new List <double>();
                    ReadHistogram(Config.soilhistogram, trainset[j], out l2);
                    if (l1.Count > 0 && l2.Count > 0)//防止剖面缺失
                    {
                        switch (order)
                        {
                        case 0: dr[j + 1] = Distance_Fomula.Euclidean(l1, l2).ToString(); break;

                        case 1: dr[j + 1] = Distance_Fomula.X2(l1, l2).ToString(); break;

                        case 2: dr[j + 1] = Distance_Fomula.Dxy(l1, l2).ToString(); break;

                        default: break;
                        }
                    }
                    else
                    {
                        dr[j + 1] = 9999.ToString();//9999表示剖面缺失
                    }
                }
                Matrix.Rows.Add(dr);
            }
            return(true);
        }
예제 #11
0
        /// <summary>
        /// 计算非特征值距离矩阵
        /// </summary>
        /// <param name="testset">测试集剖面</param>
        /// <param name="trainset">训练集剖面</param>
        /// <param name="order"></param>
        /// <returns></returns>
        public bool NormalMatrix(List <string> testset, List <string> trainset, int order)
        {
            FreeContainer.FreeTable(Matrix);
            SpecAngel sa = new SpecAngel();
            WaveShape ws = new WaveShape();
            InputData id = new InputData();

            for (int i = 0; i < trainset.Count + 1; i++)
            {
                if (i == 0)
                {
                    DataColumn dc = new DataColumn();
                    Matrix.Columns.Add(dc);
                }
                else
                {
                    DataColumn dc = new DataColumn(trainset[i - 1]);
                    Matrix.Columns.Add(dc);
                }
            }
            for (int i = 0; i < testset.Count; i++)
            {
                DataRow dr = Matrix.NewRow();
                dr[0] = testset[i];
                DataTable dt1 = id.InputCSV(Config.uksoilfolder + "\\" + testset[i].Substring(1, testset[i].Length - 2) + ".csv");
                for (int j = 0; j < trainset.Count; j++)
                {
                    DataTable dt2 = id.InputCSV(Config.soilfolder + "\\" + trainset[j].Substring(1, trainset[j].Length - 2) + ".csv");
                    if (dt1.Rows.Count > 0 && dt2.Rows.Count > 0)//防止剖面缺失
                    {
                        switch (order)
                        {
                        case 0: dr[j + 1] = sa.SAcal(dt1, dt2).ToString(); break;

                        case 1: dr[j + 1] = ws.WaveCal(dt1, dt2).ToString(); break;

                        default: break;
                        }
                    }
                    else
                    {
                        dr[j + 1] = 9999.ToString();//9999表示剖面缺失
                    }
                }
                Matrix.Rows.Add(dr);
            }
            return(true);
        }
예제 #12
0
        /// <summary>
        /// 根据匹配结果计算混淆矩阵
        /// </summary>
        /// <param name="dt">匹配结果</param>
        /// <returns></returns>
        bool MixMatrix(DataTable dt)
        {
            FreeContainer.FreeTable(MMatrix);
            Hashtable h1 = new Hashtable(); //存储预测类型
            Hashtable h2 = new Hashtable(); //存储真实类型

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (!h1.ContainsKey(dt.Rows[i][1].ToString()))
                {
                    h1.Add(dt.Rows[i][1].ToString(), h1.Count + 1);//预测
                }
                if (!h2.ContainsKey(dt.Rows[i][2].ToString()))
                {
                    h2.Add(dt.Rows[i][2].ToString(), h2.Count + 1);//真实
                }
            }
            MMatrix.Columns.Add(new DataColumn(" "));
            foreach (string key in h1.Keys)
            {
                MMatrix.Columns.Add(new DataColumn(key, typeof(int)));
            }
            foreach (string key in h2.Keys)
            {
                DataRow dr = MMatrix.NewRow();
                dr[0] = key;
                for (int j = 1; j < MMatrix.Columns.Count; j++)
                {
                    dr[j] = 0;
                }
                MMatrix.Rows.Add(dr);
            }
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                int row = Convert.ToInt32(h2[dt.Rows[i][2].ToString()]);
                int col = Convert.ToInt32(h1[dt.Rows[i][1].ToString()]);
                MMatrix.Rows[row - 1][col] = Convert.ToInt32(MMatrix.Rows[row - 1][col]) + 1;
            }
            return(true);
        }
예제 #13
0
        /// <summary>
        /// 下拉框2,选项更改触发事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            FreeContainer.FreeTable(dt);
            InputData id = new InputData();
            string    fold;

            if (comboBox1.SelectedIndex == 0)
            {
                fold = Config.soilfolder;
            }
            else
            {
                fold = Config.uksoilfolder;
            }
            dt = id.InputCSV(fold + @"\" + comboBox2.SelectedItem.ToString() + ".csv");
            comboBox3.Items.Clear();
            for (int i = 1; i <= dt.Rows.Count; i++)
            {
                comboBox3.Items.Add(i.ToString() + "nm");
            }
            comboBox3.SelectedIndex = 0;
        }
예제 #14
0
        /// <summary>
        /// 计算匹配矩阵
        /// </summary>
        /// <param name="dt">匹配矩阵表格</param>
        /// <param name="levels">分类级别</param>
        /// <returns></returns>
        public bool AnswerAnalysis(DataTable dt, int levels)
        {
            FreeContainer.FreeTable(Profile);
            string[] column = { "土壤编号", "预测类型", "真实类型", "是否匹配" };
            for (int i = 0; i < column.Length; i++)
            {
                DataColumn dc = new DataColumn(column[i]);
                Profile.Columns.Add(dc);
            }

            for (int i = 1; i < dt.Rows.Count; i++)
            {
                DataRow dr = Profile.NewRow();
                dr[0] = dt.Rows[i][0].ToString();
                double min = 2;
                int    col = 1;
                for (int j = 1; j < dt.Columns.Count; j++)
                {
                    if (Convert.ToDouble(dt.Rows[i][j]) < min && Convert.ToDouble(dt.Rows[i][j]) != 0)
                    {
                        min = Convert.ToDouble(dt.Rows[i][j]);
                        col = j;
                    }
                }
                dr[1] = ReadType(levels, dt.Columns[col].ColumnName.ToString());
                dr[2] = ReadType(levels, dt.Rows[i][0].ToString());
                if (dr[1].ToString() == dr[2].ToString())
                {
                    dr[3] = "是";
                }
                else
                {
                    dr[3] = "否";
                }
                Profile.Rows.Add(dr);
            }
            return(true);
        }
 /// <summary>
 /// 每五秒清理一次
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void timer1_Tick(object sender, EventArgs e)
 {
     FreeContainer.ClearMemory();
 }