private void readType() { FreeContainer.FreeTable(MainFormContainers.SoilType); InputData id = new InputData(); MainFormContainers.SoilType = id.InputCSV(Config.soilhabitat); changeGrid2(MainFormContainers.SoilType); MessageBox.Show("类型数据更换完成!"); }
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); }
/// <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; }
/// <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); }
/// <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(); }
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); } }
/// <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); }
/// <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); }
/// <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); }
/// <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; }
/// <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(); }