啊啊

// naiveBayesClassify.cpp : 定义控制台应用程序的入口点。
//

//#include "stdafx.h"
#include<iostream>
#include<iomanip>
#include<string>
#include<map>
#include<vector>
#include <tchar.h>
//#include<math.h>

using namespace std;



//save the training data
typedef vector<vector<string>> strDVect;
//save all possible condition probabilitys
typedef map<string, map<string, map<string, double>>> thriMap;
//service for thriMap
typedef map<string, map<string, double>> doubleMap;
typedef map<string, double> strMap;
//save the kind of aim attribute value
typedef map<string, int> aimMap;
//kind of every attribute including aim attribute value
typedef map<string, int> attMap;
//const for denominator and numerator
double K = 1;
//sample
typedef vector<string> sampleVect;


//check the three dimensions map and return 4 states
int existRecord(thriMap prob, string aimValue, string attName, string attValue)
{
	thriMap::const_iterator iterThri = prob.find(aimValue);
	if (iterThri == prob.end())
		return 1;
	doubleMap::const_iterator iterDouble = iterThri->second.find(attName);
	if (iterDouble == iterThri->second.end())
		return 2;
	strMap::const_iterator iterSingle = iterDouble->second.find(attValue);
	if (iterSingle == iterDouble->second.end())
		return 3;
	return 4;
}

void show(thriMap prob)
{
	thriMap::iterator iterThri = prob.begin();
	for (; iterThri != prob.end(); iterThri++)
	{
		doubleMap::iterator iterDouble = iterThri->second.begin();
		for (; iterDouble != iterThri->second.end(); iterDouble++)
		{
			strMap::iterator iterSingle = iterDouble->second.begin();
			for (; iterSingle != iterDouble->second.end(); iterSingle++)
			{
				cout << iterThri->first << " " << iterDouble->first << " " << iterSingle->first << " " << iterSingle->second << endl;
			}
		}
	}
}

//get all possible statistics
//three dimensions hash prob, first key notes aim attribute value,second key notes refence attribute name,
//third key notes reference attribute value, the value notes the refence attribute value number
void getConditionStat(strDVect datas, thriMap &prob, aimMap &aimNum)
{
	int i, j, k, m, n;
	m = datas.size();
	n = datas[0].size();

	doubleMap doubleMapIns;
	strMap strMapIns;
	thriMap::iterator iterThri;
	doubleMap::iterator iterDouble;
	for (i = 1; i < m; i++)
	{
		//save all possible statistics
		for (j = 0; j < n - 1; j++)
		{
			switch (existRecord(prob, datas[i][n - 1], datas[0][j], datas[i][j]))
			{
			case 1:
				//must clear
				strMapIns.clear();
				doubleMapIns.clear();
				strMapIns.insert(make_pair(datas[i][j], 1));
				doubleMapIns.insert(make_pair(datas[0][j], strMapIns));
				prob.insert(make_pair(datas[i][n - 1], doubleMapIns));
				break;
			case 2:
				strMapIns.clear();
				strMapIns.insert(make_pair(datas[i][j], 1));
				prob.find(datas[i][n - 1])->second.insert(make_pair(datas[0][j], strMapIns));
				break;
			case 3:
				prob.find(datas[i][n - 1])->second.find(datas[0][j])->second.insert(make_pair(datas[i][j], 1));
				break;
			case 4:
				prob.find(datas[i][n - 1])->second.find(datas[0][j])->second.find(datas[i][j])->second++;
				break;
			}
		}
		//save the kind of aim attribute value
		if (aimNum.find(datas[i][n - 1]) != aimNum.end())
		{
			aimNum.find(datas[i][n - 1])->second++;
		}
		else
		{
			aimNum.insert(make_pair(datas[i][n - 1], 1));
		}
	}
}

void getConditionProb(thriMap &prob, aimMap aimNum, attMap attKind)
{
	//save all possible condition probabilitys
	thriMap::iterator iterThri = prob.begin();
	for (; iterThri != prob.end(); iterThri++)
	{
		doubleMap::iterator iterDouble = iterThri->second.begin();
		for (; iterDouble != iterThri->second.end(); iterDouble++)
		{
			strMap::iterator iterSingle = iterDouble->second.begin();
			for (; iterSingle != iterDouble->second.end(); iterSingle++)
			{
				//add const K,L to  denominator and numerator
				//the part of "attKind.find(iterDouble->first)->second*K" add the weight of kind of refence attribute。
				iterSingle->second = (iterSingle->second + K) / (attKind.find(iterDouble->first)->second*K + aimNum.find(iterThri->first)->second);
			}
		}
	}
}

void getClassification(strDVect datas, thriMap prob, aimMap aimNum, attMap attKind, sampleVect sampleIns, int records)
{

	//save all the probability
	double sum = 0;
	double max = 0;
	double pp;
	string classKind;
	//获得极大后验假设
	double h_map;
	aimMap::const_iterator iterAim = aimNum.begin();
	for (; iterAim != aimNum.end(); iterAim++)
	{
		//get prior probability
		//the part of "((--attKind.end())->second*K" add the weight of the kind of aim attribute。
		pp = (double)(iterAim->second + K) / ((--attKind.end())->second*K + records);
		//获得极大使然假设
		double h_ml = 1;
		for (int i = 0; i < sampleIns.size(); i++)
		{
			if (existRecord(prob, iterAim->first, datas[0][i], sampleIns.at(i)) != 4)
			{
				cout << "there is no value of attrubute " << datas[0][i] << endl;
				h_ml *= K;
			}
			else
			{
				h_ml *= prob.find(iterAim->first)->second.find(datas[0][i])->second.find(sampleIns.at(i))->second;
			}
		}
		h_map = pp*h_ml;
		if (h_map > max)
		{
			max = h_map;
			classKind = iterAim->first;
		}
		sum += h_map;
	}
	//normalize
	max = max / sum;
	cout << "the the most class is " << classKind << ", and the probability is " << max << endl;



}

int _tmain(int argc, _TCHAR* argv[])
{
	int i, j, m, n;
	//m:number of training data,n: number of attributes
	m = 15; n = 5;
	strDVect datas(m);
	for (i = 0; i < m; i++)
	{
		datas[i].resize(n);
	}
	//first row save attributes
	datas[0][0] = "age";
	datas[0][1] = "inco";
	datas[0][2] = "student";
	datas[0][3] = "credit_rating";
	datas[0][4] = "class:buys_computer";

	datas[1][0] = "<=30";
	datas[1][1] = "high";
	datas[1][2] = "no";
	datas[1][3] = "fair";
	datas[1][4] = "no";

	datas[2][0] = "<=30";
	datas[2][1] = "high";
	datas[2][2] = "no";
	datas[2][3] = "excellent";
	datas[2][4] = "no";

	datas[3][0] = "31..40";
	datas[3][1] = "high";
	datas[3][2] = "no";
	datas[3][3] = "fair";
	datas[3][4] = "yes";

	datas[4][0] = ">40";
	datas[4][1] = "medi";
	datas[4][2] = "no";
	datas[4][3] = "fair";
	datas[4][4] = "yes";

	datas[5][0] = ">40";
	datas[5][1] = "low";
	datas[5][2] = "yes";
	datas[5][3] = "fair";
	datas[5][4] = "yes";

	datas[6][0] = ">40";
	datas[6][1] = "low";
	datas[6][2] = "yes";
	datas[6][3] = "excellent";
	datas[6][4] = "no";

	datas[7][0] = "31..40";
	datas[7][1] = "low";
	datas[7][2] = "yes";
	datas[7][3] = "excellent";
	datas[7][4] = "yes";

	datas[8][0] = "<=30";
	datas[8][1] = "medi";
	datas[8][2] = "no";
	datas[8][3] = "fair";
	datas[8][4] = "no";

	datas[9][0] = "<=30";
	datas[9][1] = "low";
	datas[9][2] = "yes";
	datas[9][3] = "fair";
	datas[9][4] = "yes";

	datas[10][0] = ">40";
	datas[10][1] = "medi";
	datas[10][2] = "yes";
	datas[10][3] = "fair";
	datas[10][4] = "yes";

	datas[11][0] = "<=30";
	datas[11][1] = "medi";
	datas[11][2] = "yes";
	datas[11][3] = "excellent";
	datas[11][4] = "yes";

	datas[12][0] = "31..40";
	datas[12][1] = "medi";
	datas[12][2] = "no";
	datas[12][3] = "excellent";
	datas[12][4] = "yes";

	datas[13][0] = "31..40";
	datas[13][1] = "high";
	datas[13][2] = "yes";
	datas[13][3] = "fair";
	datas[13][4] = "yes";

	datas[14][0] = ">40";
	datas[14][1] = "medi";
	datas[14][2] = "no";
	datas[14][3] = "excellent";
	datas[14][4] = "no";

	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			cout.width(15);
			cout << setiosflags(ios::left) << datas[i][j];

		}
		cout << endl;
	}
	thriMap prob;
	aimMap aimNum;
	attMap attKind;
	attKind.insert(make_pair("age", 3));
	attKind.insert(make_pair("inco", 3));
	attKind.insert(make_pair("student", 2));
	attKind.insert(make_pair("credit_rating", 2));
	attKind.insert(make_pair("class:buys_computer", 2));

	getConditionStat(datas, prob, aimNum);
	//init K
	K = (double)1 / (m - 1);
	getConditionProb(prob, aimNum, attKind);
	show(prob);
	sampleVect sampleIns;
	sampleIns.push_back("31..40");
	sampleIns.push_back("high");
	sampleIns.push_back("no");
	sampleIns.push_back("fair");
	getClassification(datas, prob, aimNum, attKind, sampleIns, m - 1);

	system("pause");
}

本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值