• 热门专题

基于朴素贝叶斯的花生品种识别

作者:  发布日期:2015-01-28 21:44:20
Tag标签:花生  品种  
  • 最近一段时间,正在学习机器学习与模式识别,为了验证算法,仍然用了之前做过的项目的一些图片作为数据采集的样本,进行数据采集。前段时间,做了一个花生籽粒的识别程序,是基于SVM+HOG的,这次则是采用朴素贝叶斯来进行识别。采集了20个品种,每个品种50个样本,共1K个数据。

    朴素贝叶斯分类器(Naive Bayes Classifier,或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。

    用于本次实验的部分图像如下所示:

    Book* book = xlCreateBook();
    
    	if (book->load("Data.xls"))
    	{
    		Sheet *sheet = book->getSheet(0);
    
    		int myrow = sheet->lastRow();
    		int mycol = sheet->lastCol();
    
    		if (sheet)
    		{
    			CvMat* importMat = cvCreateMat(myrow, mycol, CV_32FC1);  //存储导入数据
    
    			for (auto i = 0; i < myrow; ++i)
    			{
    				for (auto j = 0; j < mycol; j++)
    				{
    					double temp = sheet->readNum(i, j);
    					cvSetReal2D(importMat, i, j, temp);
    				}
    			}// end for
    
    			m_DataMat = cvCloneMat(importMat);
    		}// end if
    	}
    
    	book->release();
    
    	MessageBox("数据导入完成");
    
    	CvMat* dataMat = cvCloneMat(m_DataMat);
    
    	CvMat* lableMat = cvCreateMat(dataMat->rows, 1, CV_32FC1);		//构建样本的分类标签
    	cvZero(lableMat);
    
    	for (int i = 0; i < 20; ++i)			//共分了 20 个不同的种类
    	{
    		for (int j = 0; j < 50; ++j)		//每个品种共50个籽粒
    		{
    			cvSetReal2D(lableMat, i * 50 + j, 0, i + 1);
    		}
    	}
    
    	CvNormalBayesClassifier nbc;
    	nbc.train(dataMat, lableMat);
    	nbc.save("bayes.txt");
    
    	MessageBox("数据训练完成");
    
    	CvMat* nbcResult = cvCreateMat(dataMat->rows, 1, CV_32FC1);
    	CvMat* nbcRow = NULL;
    
    	for (int i = 0; i < dataMat->rows; ++i)
    	{
    		nbcRow = cvCreateMat(1, dataMat->cols, CV_32FC1);
    
    		for (int j = 0; j < dataMat->cols; ++j)
    		{
    			float temp = cvGetReal2D(dataMat, i, j);
    			cvSetReal2D(nbcRow, 0, j, temp);
    		}
    
    		unsigned int ret = 0;
    		ret = nbc.predict(nbcRow);
    		cvSetReal2D(nbcResult, i, 0, ret);
    		cvReleaseMat(&nbcRow);
    		nbcRow = NULL;
    	}
    
    	int nCount = 0;
    
    	for (int i = 0; i < 20; ++i)
    	{
    		for (int j = 0; j < 50; ++j)
    		{
    			int ret = cvGetReal2D(nbcResult, i * 50 + j, 0);
    			if (ret == (i + 1))
    			{
    				++nCount;
    			}
    		}
    	}
    
    	float recognize = 100 * nCount / 20 / 50;
    
    	CString str;
    	str.Format("朴素贝叶斯 识别率为: %f", recognize);
    	str = str + "%";
    	MessageBox(str);



延伸阅读:

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规