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

📄 dlg_2c.cpp

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

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

/////////////////////////////////////////////////////////////////////////////
// DLG_2C dialog


DLG_2C::DLG_2C(CWnd* pParent /*=NULL*/)
	: CDialog(DLG_2C::IDD, pParent)
{
	have_check=true;
	//{{AFX_DATA_INIT(DLG_2C)
	g_x = 0.0f;
	Result_Class = _T("");
	Result_Gx =  _T("");
	x1 = 2;
	x2 = 0;
	w1_x11 = 1;
	w1_x12 = 1;
	w1_x13 = 2;
	w1_x21 = 1;
	w1_x22 = 0;
	w1_x23 = -1;
	w2_x11 = -1;
	w2_x12 = -1;
	w2_x13 = -2;
	w2_x21 = 1;
	w2_x22 = 0;
	w2_x23 = -1;
	m_Radio1 = 0;
	
	//}}AFX_DATA_INIT


}


void DLG_2C::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(DLG_2C)
	DDX_Control(pDX, IDC_RADIO_IS, m_CtrRadio1);
	DDX_Control(pDX, IDC_RADIO_NOT, m_CtrRadio2);
	DDX_Text(pDX, IDC_EDIT1_gx, g_x);
	DDX_Text(pDX, IDC_EDIT1_ResultClass, Result_Class);
	DDX_Text(pDX, IDC_EDIT_ResultGx, Result_Gx);
	DDX_Text(pDX, IDC_EDIT1_x1, x1);
	DDV_MinMaxFloat(pDX, x1, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT1_x2, x2);
	DDV_MinMaxFloat(pDX, x2, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X112, w1_x12);
	DDV_MinMaxFloat(pDX, w1_x12, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X113, w1_x13);
	DDV_MinMaxFloat(pDX, w1_x13, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X121, w1_x21);
	DDV_MinMaxFloat(pDX, w1_x21, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X122, w1_x22);
	DDX_Text(pDX, IDC_EDIT_X123, w1_x23);
	DDV_MinMaxFloat(pDX, w1_x23, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X211, w2_x11);
	DDV_MinMaxFloat(pDX, w2_x11, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X212, w2_x12);
	DDV_MinMaxFloat(pDX, w2_x12, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X213, w2_x13);
	DDV_MinMaxFloat(pDX, w2_x13, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X221, w2_x21);
	DDV_MinMaxFloat(pDX, w2_x21, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X222, w2_x22);
	DDV_MinMaxFloat(pDX, w2_x22, -10.f, 10.f);
	DDX_Text(pDX, IDC_EDIT_X223, w2_x23);
	DDV_MinMaxFloat(pDX, w2_x23, -10.f, 10.f);
	DDX_Radio(pDX, IDC_RADIO_IS, m_Radio1);
	DDX_Text(pDX, IDC_EDIT_X111, w1_x11);
	DDV_MinMaxDouble(pDX, w1_x11, -10., 10.);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DLG_2C, CDialog)
	//{{AFX_MSG_MAP(DLG_2C)
	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_RESULT, OnButtonResult)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DLG_2C message handlers

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

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

void DLG_2C::OnButtonBegin() 
{
	// TODO: Add your control notification handler code here
	int i;
	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;

	//协方差矩阵
	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;
	
	//协方差矩阵行列式值
	abs_E1=E1[0]*E1[3]-E1[1]*E1[2];
	abs_E2=E2[0]*E2[3]-E2[1]*E2[2];
	if(abs_E1==0)
	{
		AfxMessageBox("协方差∑1的行列式值为0,不能对矩阵求逆。请重新输入!");
		return;
	}
	if(abs_E2==0)
	{
		AfxMessageBox("协方差∑2的行列式值为0,不能对矩阵求逆。请重新输入!");
		return;
	}
	//后验概率
	P1=P2=0.5;
	Ln_P=0;
	Ln_E=log(abs_E1/abs_E2);
	//待定样本
	X[0]=x1;
	X[1]=x2;
	//如果协方差不相等
	if(have_check)
	{
		//协方差矩阵求逆
		Inv(E1,2);
		Inv(E2,2);
		
		a1[0]=E1[0];//X1平方的系数
		a1[1]=E1[3];//X2平方的系数
		a1[2]=0-(2*E1[0]*Average_X1[0]+E1[2]*Average_X1[1]+E1[0]*Average_X1[1]);//X1的系数
		a1[3]=0-(E1[2]*Average_X1[0]+E1[1]*Average_X1[0]+2*E1[3]*Average_X1[1]);//X2的系数
		a1[4]=(E1[1]+E1[2]);//X1*X2的系数
		a1[5]=E1[0]*pow(Average_X1[0],2)+(E1[1]+E1[2])*Average_X1[0]*Average_X1[1]+E1[3]*pow(Average_X1[1],2);//常数项
		
		a2[0]=E2[0];//X1平方的系数
		a2[1]=E2[3];//X2平方的系数
		a2[2]=0-(2*E2[0]*Average_X2[0]+E2[2]*Average_X2[1]+E2[0]*Average_X2[1]);//X1的系数
		a2[3]=0-(E2[2]*Average_X2[0]+E2[1]*Average_X2[0]+2*E2[3]*Average_X2[1]);//X2的系数
		a2[4]=(E2[1]+E2[2]);//X1*X2的系数
		a2[5]=E2[0]*pow(Average_X2[0],2)+(E2[1]+E2[2])*Average_X2[0]*Average_X2[1]+E2[3]*pow(Average_X2[1],2);//常数项
	
		//最后结果
		for(i=0;i<5;i++)
			a2[i]=(a1[i]-a2[i])/2;
		a2[5]=(a1[5]-a2[5])/2+Ln_E/2-Ln_P;//常数项
		//分类结果
		if(g_x<0)
			Result_Class="ω1类";
		else if(g_x>0)
			Result_Class="ω2类";
		else
			Result_Class="未知";

		
	}
	else
	{
		for(i=0;i<6;i++)
			a1[i]=a2[i]=0;	
		for(i=0;i<4;i++)
			E[i]=E1[i]+E2[i];
		
		//协方差矩阵求逆
		Inv(E1,2);
		Inv(E2,2);
		Inv(E,2);
		for(i=0;i<2;i++)
			X2_X1[i]=Average_X2[i]-Average_X1[i];
		
		//计算系数
		a2[2]=a1[2]=X2_X1[0]*E[0]+X2_X1[1]*E[2];//x1的系数
		a2[3]=a1[3]=X2_X1[0]*E[1]+X2_X1[1]*E[3];//x2的系数
		a1[5]=E[0]*pow(Average_X1[0],2)+(E[1]+E[2])*Average_X1[0]*Average_X1[1]+E[3]*Average_X1[1];
		a2[5]=E[0]*pow(Average_X2[0],2)+(E[1]+E[2])*Average_X2[0]*Average_X2[1]+E[3]*Average_X2[1];				
		a2[5]=(a1[5]-a2[5])/2-Ln_P;//常数项

		//显示结果
		if(g_x<0)
			Result_Class="ω1类";
		else if(g_x>0)
			Result_Class="ω2类";
		else
			Result_Class="ω1或ω2类";

		
		
	}
	//结果
	g_x=a2[0]*x1*x1+a2[1]*x2*x2+a2[2]*x1+a2[3]*x2+a2[4]*x1*x2+a2[5];	
	//显示分界函数
	for(i=0;i<6;i++)
	{
				gcvt(a2[i],4,ch[i]);
		a[i].Format(_T("%s"), ch[i]); //X1平方的系数
	}		
	if(a2[0]==0)a[0]=s1[0]="";
	else s1[0]="*X1*X1+";
	if(a2[1]==0)a[1]=s1[1]="";
	else s1[1]="*X2*X2+";
	if(a2[2]==0)a[2]=s1[2]="";
	else s1[2]="*X1+";
	if(a2[3]==0)a[3]=s1[3]="";
	else s1[3]="*X2+";
	if(a2[4]==0)a[4]=s1[4]="";
	else s1[4]="*X1*X2+";
	if(a2[5]==0)a[5]="0";		
	Result_Gx=a[0]+s1[0]+a[1]+s1[1]+a[2]+s1[2]+a[3]+s1[3]+a[4]+s1[4]+a[5]+s1[5];
		
	UpdateData(false);
}


void DLG_2C::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_2C::OnButtonResult() 
{
	// TODO: Add your control notification handler code here
	DLG_SORT dlg;
	for(int i=0;i<6;i++)
		dlg.a[i]=a2[i];//各项系数
	dlg.m_Gx=Result_Class;
	dlg.G_X="g(x)="+Result_Gx+"=0";
	UpdateData(true);
	dlg.DoModal();
}

⌨️ 快捷键说明

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