Exemplo n.º 1
0
        private void KFunctionForm_Load(object sender, EventArgs e)
        {
            #region 数据初始化

            IList  testSampleList = FeatureHelper.GetTestFeaturesList();       //获取原始测试
            KnNear kn             = new KnNear();
            //每个元素都存储在 KeyValuePair<TKey, TValue> 对象中
            IDictionary <int, double> map = new Dictionary <int, double>();
            //每个元素都存储在DictionaryEntry
            IDictionary dictionary = new Hashtable();
            //DictionaryEntry进行循环遍历

            ArrayList klist    = new ArrayList();
            ArrayList ratelist = new ArrayList();

            #endregion

            #region 获取K和识别率

            for (int k = 1; k < 50; k += 2)
            {
                int    testResult   = 0;
                double correctCount = 0;
                double correctRate  = 0.0;
                foreach (Features feature in testSampleList)
                {
                    testResult = kn.DoK_nearest(feature, FeatureHelper.GetFeaturesList(), k);
                    if (testResult > 0)
                    {
                        //检查结果是否正确
                        if (testResult == feature.classID)
                        {
                            correctCount++;
                        }
                    }
                }
                correctRate = (correctCount / Convert.ToDouble(testSampleList.Count)) * 100.0;
                map.Add(k, correctRate / 10);
                klist.Add(k);
                ratelist.Add(correctRate * 2);
            }

            #endregion

            #region 显示点图

            PreviewFunctionImage(klist, ratelist);

            #endregion
        }
Exemplo n.º 2
0
        // 分类运算
        private void classifyButton_Click(object sender, EventArgs e)
        {
            //前提检验
            if (SelectedPCXHelper.GetSelPCXFromLB().Count == 0 || SelectedPCXHelper.GetUnselPCXList().Count == 0)
            {
                MessageBox.Show(this, "您还未提取样本特征,或者还未设置测试样本集!", "提示信息", MessageBoxButtons.OK);
            }

            else
            {
                string correctRate = null; //正确率
                string myfilepath  = filepathText.Text.ToString();

                Features feature;

                #region 这里做一个文件名为unknown.pcx的判断

                string filename = FeatureHelper.GetUnknownName(myfilepath);
                if (filename.ToLower().Equals("unknown"))
                {
                    feature = new Features(myfilepath);
                }
                else
                {
                    int classID = Convert.ToInt32(FeatureHelper.GetUpperFoldername(myfilepath));
                    feature = new Features(myfilepath, classID);
                }

                #endregion

                #region Bayes分类法

                if (rbBayes.Checked)
                {
                    #region 数据初始化

                    CheckInit();
                    double correctCount = 0.0;

                    #endregion

                    IList sampleList = FeatureHelper.GetFeaturesList();            //获取原始训练样本
                    //从降维器获取降维后的新样本
                    IList newSampleList = MDAHelper.GetMDSampleList();
                    MVHelper.SetSampleList((ArrayList)newSampleList);

                    Bayes bayes = Bayes.GetInstance();
                    bayes.TrainSampleList = newSampleList;                 //向贝叶斯分类器注入降维后的训练样本

                    //int classID = Convert.ToInt32(FeatureHelper.GetUpperFoldername(myfilepath));
                    //Features feature = new Features(myfilepath, classID);
                    feature = MDAHelper.MDSample(feature);             //测试样本降维
                    int testClassID = bayes.DecisionFunction(feature); //用贝叶斯决策进行测试样本分类
                    //结果显示
                    lblunknownclassify.Text = testClassID.ToString("000");
                    if (feature.classID == testClassID)
                    {
                        lblerrorinfo.Text      = "Bayes分类法分类正确";
                        lblerrorinfo.ForeColor = Color.Green;
                    }

                    //unknown.pcx处理
                    else if (feature.classID == -1)
                    {
                    }
                    else
                    {
                        lblerrorinfo.Text      = "Bayes分类法分类失败";
                        lblerrorinfo.ForeColor = Color.Green;
                    }
                }

                #endregion

                #region Kn近邻法

                if (rbKn.Checked)
                {
                    #region 相关数据初始化

                    CheckInit();
                    int    testResult   = -1;
                    double correctCount = 0.0;
                    int    kvalue       = Constant.kvalue;

                    #endregion

                    #region  效的情况下进行计算

                    if (KCheck(kvalue))
                    {
                        KnNear my_knearest = new KnNear();

                        //int classID = Convert.ToInt32(FeatureHelper.GetUpperFoldername(myfilepath));
                        //Features currfeature = new Features(myfilepath, classID);
                        testResult = my_knearest.DoK_nearest(feature, FeatureHelper.GetFeaturesList(), kvalue);

                        //testResult为K近邻的分类结果
                        // 其实testResult的结果直接就是result求的值
                        string result = testResult.ToString("000");
                        lblunknownclassify.Text = result;
                        result = ResultConvert(result);

                        int testID = Convert.ToInt32(result);
                        if (testID > 0 && testID == feature.classID)
                        {
                            //correctRate = "分类正确率: " + Constant.kn_Rate;
                            lblerrorinfo.Text      = "Kn近邻法分类正确";
                            lblerrorinfo.ForeColor = Color.Green;
                        }

                        //unknown.pcx处理
                        else if (feature.classID == -1)
                        {
                        }

                        else
                        {
                            lblerrorinfo.Text      = "Kn近邻法分类失败!";
                            lblerrorinfo.ForeColor = Color.Green;
                        }
                    }

                    #endregion
                }

                #endregion

                #region 最近邻法

                if (rbnearest.Checked)
                {
                    #region 初始化

                    CheckInit();
                    int    testResult   = -1;
                    double correctCount = 0.0;

                    #endregion

                    #region 最近邻分类

                    if (NearestCheck())
                    {
                        Nearest nearest = new Nearest();
                        //int classID = Convert.ToInt32(FeatureHelper.GetUpperFoldername(myfilepath));
                        //Features currfeature = new Features(myfilepath, classID);
                        testResult = nearest.Do_Nearest(feature, FeatureHelper.GetFeaturesList());

                        string result = testResult.ToString("000");
                        lblunknownclassify.Text = result;
                        if (testResult > 0 && testResult == feature.classID)
                        {
                            lblerrorinfo.Text      = "最近邻法分类正确";
                            lblerrorinfo.ForeColor = Color.Green;
                        }

                        //unknown.pcx处理
                        else if (feature.classID == -1)
                        {
                        }

                        else
                        {
                            lblerrorinfo.Text      = "最近邻法分类失败!";
                            lblerrorinfo.ForeColor = Color.Green;
                        }
                    }

                    #endregion
                }

                #endregion
            }
        }
Exemplo n.º 3
0
        // 测试启动
        private void knTestButton_Click(object sender, EventArgs e)
        {
            int kvalue = Convert.ToInt32(kValueText.Text);

            Constant.kvalue = kvalue;

            #region K有效的情况下进行计算

            if (KCheck(kvalue))
            {
                #region 数据初始化

                double correctCount = 0;
                double correctRate  = 0.0;
                int    testResult   = 0;

                KnNear my_knearest = new KnNear();

                IList testSampleList = FeatureHelper.GetTestFeaturesList();        //获取原始测试
                #endregion

                #region DataGridView操作

                knDataGridView.DataSource = null;
                knDataGridView.Rows.Clear();
                knDataGridView.Refresh();

                DataSet   ds = new DataSet();
                DataTable dt = new DataTable();

                dt.Columns.Add("样本路径", typeof(string));
                dt.Columns.Add("样本测试结果类", typeof(string));
                dt.Columns.Add("所取K值", typeof(string));
                dt.Columns.Add("正误判断", typeof(string));
                foreach (Features feature in testSampleList)
                {
                    testResult = my_knearest.DoK_nearest(feature, FeatureHelper.GetFeaturesList(), kvalue);
                    if (testResult > 0)
                    {
                        DataRow row          = dt.NewRow();
                        string  rightOrWrong = "×";
                        row[0] = feature.Filepath;
                        row[1] = string.Format("类{0}", testResult);
                        row[2] = kvalue;
                        //检查结果是否正确
                        if (testResult == feature.classID)
                        {
                            correctCount++;
                            row[3] = " ";
                        }
                        else
                        {
                            row[3] = rightOrWrong;
                            //this.knDataGridView.DefaultCellStyle.ForeColor = Color.Red;
                        }
                        dt.Rows.Add(row);
                    }
                }
                ds.Tables.Add(dt);
                this.knDataGridView.DataSource = ds.Tables[0];

                #endregion

                #region Kn近邻法性能显示
                correctRate      = (correctCount / Convert.ToDouble(testSampleList.Count)) * 100.0;
                Constant.kn_Rate = correctRate.ToString("0.000") + "%";

                resultLabel.Text = "测试样本总数 " + testSampleList.Count + " ,Kn近邻法判断正确 "
                                   + correctCount + " 个,正确率为:" + Constant.kn_Rate;

                #endregion
            }

            #endregion
        }