⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlg_3c.cpp

📁 bayes分类的数值实现
💻 CPP
字号:
// DLG_3C.cpp : implementation file
//

#include "stdafx.h"
#include "第一次作业.h"
#include "DLG_3C.h"
#include "DLG_SORT3.h""
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// DLG_3C dialog


DLG_3C::DLG_3C(CWnd* pParent /*=NULL*/)
	: CDialog(DLG_3C::IDD, pParent)
{
	have_check=true;
	//{{AFX_DATA_INIT(DLG_3C)

	x1 =-2;
	x2 =2;
	w1_x11 = 0;
	w1_x12 = 2;
	w1_x13 = 1;
	w1_x21 = 0;
	w1_x22 = 1;
	w1_x23 = 0;
	w2_x11 = -1;
	w2_x12 = -2;;
	w2_x13 = -2;
	w2_x21 = 1;
	w2_x22 = 0;
	w2_x23 = -1;
	w3_x11 = 0;
	w3_x12 = 0;
	w3_x13 = 1;
	w3_x21 = -2;
	w3_x22 = -1;
	w3_x23 = -2;
	
	g_x1 = 0.0f;
	g_x2 = 0.0f;
	g_x3 = 0.0f;
	Gx1 = _T("");
	Gx2 = _T("");
	Gx3 = _T("");
	m_Radio1 = 0;
	
/*
	x1 =0;
	x2 =0;
	w1_x11 = 0;
	w1_x12 = 1;
	w1_x13 = 2;
	w1_x21 = 0.57735;
	w1_x22 = -1.1547;
	w1_x23 = 0.57735;
	w2_x11 = -2;
	w2_x12 = -1;;
	w2_x13 = -2;
	w2_x21 = 1;
	w2_x22 = 0;
	w2_x23 = -1;
	w3_x11 = 0;
	w3_x12 = 1;
	w3_x13 = -1;
	w3_x21 = -1;
	w3_x22 = -2;
	w3_x23 = -2;
*/

	//}}AFX_DATA_INIT
	
}


void DLG_3C::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(DLG_3C)
	DDX_Control(pDX, IDC_RADIO_IS, m_CtrRadio1);
	DDX_Control(pDX, IDC_RADIO_NOT, m_CtrRadio2);
	DDX_Text(pDX, IDC_EDIT_ResultClass, Result_Class);
	DDX_Text(pDX, IDC_EDIT_3C_x1, x1);
	DDX_Text(pDX, IDC_EDIT_3C_x2, x2);
	DDX_Text(pDX, IDC_EDIT_3X111, w1_x11);
	DDX_Text(pDX, IDC_EDIT_3X112, w1_x12);
	DDX_Text(pDX, IDC_EDIT_3X113, w1_x13);
	DDX_Text(pDX, IDC_EDIT_3X121, w1_x21);
	DDX_Text(pDX, IDC_EDIT_3X122, w1_x22);
	DDX_Text(pDX, IDC_EDIT_3X123, w1_x23);
	DDX_Text(pDX, IDC_EDIT_3X211, w2_x11);
	DDX_Text(pDX, IDC_EDIT_3X212, w2_x12);
	DDX_Text(pDX, IDC_EDIT_3X213, w2_x13);
	DDX_Text(pDX, IDC_EDIT_3X221, w2_x21);
	DDX_Text(pDX, IDC_EDIT_3X222, w2_x22);
	DDX_Text(pDX, IDC_EDIT_3X223, w2_x23);
	DDX_Text(pDX, IDC_EDIT_3X311, w3_x11);
	DDX_Text(pDX, IDC_EDIT_3X312, w3_x12);
	DDX_Text(pDX, IDC_EDIT_3X313, w3_x13);
	DDX_Text(pDX, IDC_EDIT_3X321, w3_x21);
	DDX_Text(pDX, IDC_EDIT_3X322, w3_x22);
	DDX_Text(pDX, IDC_EDIT_3X323, w3_x23);
	DDX_Text(pDX, IDC_EDIT_gx1, g_x1);
	DDX_Text(pDX, IDC_EDIT_gx2, g_x2);
	DDX_Text(pDX, IDC_EDIT_gx3, g_x3);
	DDX_Text(pDX, IDC_EDIT_SORT_Gx1, Gx1);
	DDX_Text(pDX, IDC_EDIT_SORT_Gx2, Gx2);
	DDX_Text(pDX, IDC_EDIT_SORT_Gx3, Gx3);
	DDX_Radio(pDX, IDC_RADIO_IS, m_Radio1);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DLG_3C, CDialog)
	//{{AFX_MSG_MAP(DLG_3C)
	ON_BN_CLICKED(IDC_RADIO_IS, OnRadioIs)

	ON_BN_CLICKED(IDC_RADIO_NOT, OnRadioNot)
	ON_BN_CLICKED(IDC_BUTTON_BEGIN, OnButtonBegin)
	ON_BN_CLICKED(IDC_BUTTON_3C_RESULT, OnButton3cResult)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DLG_3C message handlers

void DLG_3C::OnRadioIs() 
{
	// TODO: Add your control notification handler code here
	have_check=true;
	m_CtrRadio1.SetCheck(true);
	m_CtrRadio2.SetCheck(false);

}

void DLG_3C::OnRadioNot() 
{
	// TODO: Add your control notification handler code here
	have_check=false;
	m_CtrRadio2.SetCheck(true);
	m_CtrRadio1.SetCheck(false);

}

void DLG_3C::OnButtonBegin() 
{
	// TODO: Add your control notification handler code here
	int i,j;
	UpdateData(true);//获取输入信息
	//均值
	Average_X1[0]=(w1_x11+w1_x12+w1_x13)/3;
	Average_X1[1]=(w1_x21+w1_x22+w1_x23)/3;
	Average_X2[0]=(w2_x11+w2_x12+w2_x13)/3;
	Average_X2[1]=(w2_x21+w2_x22+w2_x23)/3;
	Average_X3[0]=(w3_x11+w3_x12+w3_x13)/3;
	Average_X3[1]=(w3_x21+w3_x22+w3_x23)/3;
	
	//协方差矩阵
	E1[0]=(pow(w1_x11-Average_X1[0],2)
		+pow(w1_x12-Average_X1[0],2)
		+pow(w1_x13-Average_X1[0],2))/2;
	E1[1]=E1[2]=((w1_x11-Average_X1[0])*(w1_x21-Average_X1[1])
		+(w1_x12-Average_X1[0])*(w1_x22-Average_X1[1])
		+(w1_x13-Average_X1[0])*(w1_x23-Average_X1[1]))/2;
	E1[3]=(pow(w1_x21-Average_X1[1],2)
		+pow(w1_x22-Average_X1[1],2)
		+pow(w1_x23-Average_X1[1],2))/2;
	E2[0]=(pow(w2_x11-Average_X2[0],2)
		+pow(w2_x12-Average_X2[0],2)
		+pow(w2_x13-Average_X2[0],2))/2;
	E2[1]=E2[2]=((w2_x11-Average_X2[0])*(w2_x21-Average_X2[1])
		+(w2_x12-Average_X2[0])*(w2_x22-Average_X2[1])
		+(w2_x13-Average_X2[0])*(w2_x23-Average_X2[1]))/2;
	E2[3]=(pow(w2_x21-Average_X2[1],2)
		+pow(w2_x22-Average_X2[1],2)
		+pow(w2_x23-Average_X2[1],2))/2;
	E3[0]=(pow(w3_x11-Average_X3[0],2)
		+pow(w3_x12-Average_X3[0],2)
		+pow(w3_x13-Average_X3[0],2))/2;
	E3[1]=E3[2]=((w3_x11-Average_X3[0])*(w3_x21-Average_X3[1])
		+(w3_x12-Average_X3[0])*(w3_x22-Average_X3[1])
		+(w3_x13-Average_X3[0])*(w3_x23-Average_X3[1]))/2;
	E3[3]=(pow(w3_x21-Average_X3[1],2)
		+pow(w3_x22-Average_X3[1],2)
		+pow(w3_x23-Average_X3[1],2))/2;
	//协方差矩阵行列式值
	abs_E1=E1[0]*E1[3]-E1[1]*E1[2];
	abs_E2=E2[0]*E2[3]-E2[1]*E2[2];
	abs_E3=E3[0]*E3[3]-E3[1]*E3[2];
	if(abs_E1==0)
	{
		AfxMessageBox("协方差∑1的行列式值为0,不能对矩阵求逆。请重新输入!");
		return;
	}
	if(abs_E2==0)
	{
		AfxMessageBox("协方差∑2的行列式值为0,不能对矩阵求逆。请重新输入!");
		return;
	}
	if(abs_E3==0)
	{
		AfxMessageBox("协方差∑3的行列式值为0,不能对矩阵求逆。请重新输入!");
		return;
	}	
	//后验概率
	P1=P2=P3=1.0/3;
	//待定样本
	X[0]=x1;
	X[1]=x2;
	if(have_check)
	{
		
		//求协方差矩阵的逆矩阵
		Inv(E1,2);
		Inv(E2,2);
		Inv(E3,2);
		for( i=0;i<4;i++)//计算计算Wi
		{
			W1[i]=0-E1[i]/2;
			W2[i]=0-E2[i]/2;
			W3[i]=0-E3[i]/2;
		}
		//计算系数
		a[0][0]=W1[0];
		a[0][1]=W1[3];
		a[0][2]=E1[0]*Average_X1[0]+E1[1]*Average_X1[1];
		a[0][3]=E1[2]*Average_X1[0]+E1[3]*Average_X1[1];
		a[0][4]=W1[1]+W1[2];
		a[0][5]=0-(E1[0]*pow(Average_X1[0],2)+(E1[1]+E1[2])*Average_X1[0]*Average_X1[1]+E1[3]*pow(Average_X1[1],2))/2-log(abs_E1)/2+log(P1);
		g_x1=a[0][0]*x1*x1+a[0][1]*x2*x2+a[0][2]*x1+a[0][3]*x2+a[0][4]*x1*x2+a[0][5];

		
		a[1][0]=W2[0];
		a[1][1]=W2[3];
		a[1][2]=E2[0]*Average_X2[0]+E2[1]*Average_X2[1];
		a[1][3]=E2[2]*Average_X2[0]+E2[3]*Average_X2[1];
		a[1][4]=W2[1]+W2[2];
		a[1][5]=0-(E2[0]*pow(Average_X2[0],2)+(E2[1]+E2[2])*Average_X2[0]*Average_X2[1]+E2[3]*pow(Average_X2[1],2))/2-log(abs_E2)/2+log(P2);
		g_x2=a[1][0]*x1*x1+a[1][1]*x2*x2+a[1][2]*x1+a[1][3]*x2+a[1][4]*x1*x2+a[1][5];

		
		a[2][0]=W3[0];
		a[2][1]=W3[3];
		a[2][2]=E3[0]*Average_X3[0]+E3[1]*Average_X3[1];
		a[2][3]=E3[2]*Average_X3[0]+E3[3]*Average_X3[1];
		a[2][4]=W3[1]+W3[2];
		a[2][5]=0-(E3[0]*pow(Average_X3[0],2)+(E3[1]+E3[2])*Average_X3[0]*Average_X3[1]+E3[3]*pow(Average_X3[1],2))/2-log(abs_E3)/2+log(P3);
		g_x3=a[2][0]*x1*x1+a[2][1]*x2*x2+a[2][2]*x1+a[2][3]*x2+a[2][4]*x1*x2+a[2][5];

		//输出结果
		if(g_x1>g_x2&&g_x1>g_x3)
			Result_Class="ω1类";
		else if(g_x2>g_x1&&g_x2>g_x3)
			Result_Class="ω2类";
		else if(g_x3>g_x1&&g_x3>g_x1)
			Result_Class="ω3类";
		else
			Result_Class="未知";
		
	}
	else
	{
		for(i=0;i<4;i++)
			E[i]=E1[i]+E2[i]+E3[i];
		Inv(E1,2);
		Inv(E2,2);
		Inv(E3,2);
		Inv(E,2);

		for(i=0;i<3;i++)
			for(j=0;j<6;j++)
				a[i][j]=0;
		a[0][2]=E[0]*Average_X1[0];
		a[0][3]=E[3]*Average_X1[1];
		a[0][5]=-(E[0]*pow(Average_X1[0],2)+(E[1]+E[2])*Average_X1[0]*Average_X1[1]+E[3]*pow(Average_X1[1],2))/2+log(P1);
	
		a[1][2]=E[0]*Average_X2[0];
		a[1][3]=E[3]*Average_X2[1];
		a[1][5]=-(E[0]*pow(Average_X2[0],2)+(E[1]+E[2])*Average_X2[0]*Average_X2[1]+E[3]*pow(Average_X2[1],2))/2+log(P2);
	
		a[2][2]=E[0]*Average_X3[0];
		a[2][3]=E[3]*Average_X3[1];
		a[2][5]=-(E[0]*pow(Average_X3[0],2)+(E[1]+E[2])*Average_X3[0]*Average_X3[1]+E[3]*pow(Average_X3[1],2))/2+log(P3);
	
		g_x1=a[0][2]*x1+a[0][3]*x2+a[0][5];	
		g_x2=a[1][2]*x1+a[1][3]*x2+a[1][5];
		g_x3=a[2][2]*x1+a[2][3]*x2+a[2][5];

		if((g_x1>g_x2)&&(g_x1>g_x3))
			Result_Class="ω1类";
		else if((g_x2>g_x1)&&(g_x2>g_x3))
			Result_Class="ω2类";
		else if((g_x3>g_x1)&&(g_x3>g_x1))
			Result_Class="ω3类";
		else
			Result_Class="未知";
		
	}
	//用字符串记住各项的系数	    
	for(j=0;j<6;j++)
	{
		gcvt(a[0][j],4,ch1[j]);	
		str[0][j].Format(_T("%s"), ch1[j]); 
	}
	for(j=0;j<6;j++)
	{
		gcvt(a[1][j],4,ch2[j]);	
		str[1][j].Format(_T("%s"), ch2[j]); 
	}
	for(j=0;j<6;j++)
	{
		gcvt(a[2][j],4,ch3[j]);	
		str[2][j].Format(_T("%s"), ch3[j]); 
	}
	
	//输出分界函数
	for(i=0;i<3;i++)
	{
		if(a[i][1]==0)s[0]=str[i][0]="";
		else s[0]="*X1*X1+";
		if(a[i][1]==0)s[1]=str[i][1]="";
		else s[1]="*X2*X2+";
		if(a[i][2]==0)s[2]=str[i][2]="";
		else s[2]="*X1+";
		if(a[i][3]==0)s[3]=str[i][3]="";
		else s[3]="*X2+";
		if(a[i][4]==0)s[4]=str[i][4]="";
		else s[4]="*X1*X2+";		
		if(i==0)
			Gx1=str[0][0]+s[0]+ str[0][1]+s[1] +str[0][2]+s[2] +str[0][3]+s[3] +str[0][4]+s[4] +str[0][5];
		else if(i==1)
			Gx2=str[1][0]+s[0]+ str[1][1]+s[1] +str[1][2]+s[2] +str[1][3]+s[3] +str[1][4]+s[4] +str[1][5];
		else if(i==2)
			Gx3=str[2][0]+s[0]+ str[2][1]+s[1] +str[2][2]+s[2] +str[2][3]+s[3] +str[2][4]+s[4] +str[2][5];
		
	}	


	
	UpdateData(false);
}


void DLG_3C::Inv(float *a, int n)//矩阵求逆
{
	int i,j,k;
	for(k=0;k<n;k++)
	{
		for(i=0;i<n;i++)
		{
			if(i!=k)
				*(a+i*n+k)=-*(a+i*n+k)/(*(a+k*n+k));
		}
		*(a+k*n+k)=1/(*(a+k*n+k));
		for(i=0;i<n;i++)
		{
			if(i!=k)
			{
				for(j=0;j<n;j++)
				{
					if(j!=k)
						*(a+i*n+j)+=*(a+k*n+j)* *(a+i*n+k);
				}
			}
		}
		for(j=0;j<n;j++)
		{
			if(j!=k)
				*(a+k*n+j)*=*(a+k*n+k);
		}
	}
}



void DLG_3C::OnButton3cResult() 
{
	// TODO: Add your control notification handler code here
	DLG_SORT3 dlg;
	for(int i=0;i<3;i++)
		for(int j=0;j<6;j++)
		{
			dlg.a[i][j]=a[i][j];
		}
	
	dlg.Gx1=g_x1;
	dlg.Gx2=g_x2;
	dlg.Gx3=g_x3;
	dlg.m_Result=Result_Class;
	dlg.DoModal();
	UpdateData(true);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -