📄 贝叶斯决策dlg.cpp
字号:
m=j=0;
if(filedialog.DoModal()==IDOK)
{
pFileName=filedialog.GetPathName();
m_List3.ResetContent();
m_List2.ResetContent();
m_List1.ResetContent();
m_List4.ResetContent();
f=0;
}
if (pFileName!="")
{
fp=fopen(pFileName,"r");
fscanf(fp,"%d,",&i);
fscanf(fp,"%d,",&k);
m_Lei=i;
m_TeZheng=k;
n=new int[i];
move=true;
for(m=0;m<i;m++)
fscanf(fp,"%d,",&n[m]);
for(m=0;m<i;m++)
j+=n[m];
master=new int [j*k];
for(m=0;m<j*k;m++)
fscanf(fp,"%d,",&master[m]);
fclose(fp);
m_List1.ResetContent();
for(m=1;m<=i;m++)
{
str.Format("第%d类",m);
m_List1.AddString((LPCTSTR)str);
}
m_List1.SetCurSel(0);
m_List2.ResetContent();
for(m=1;m<=k;m++)
{
str.Format("特征%d",m);
m_List2.AddString((LPCTSTR)str);
}
m_List2.SetCurSel(0);
m_List3.ResetContent();
for(m=0;m<n[0];m++)
{
str.Format("%d",master[m]);
m_List3.AddString((LPCTSTR)str);
}
UpdateData(false);
}
}
void CMyDlg::OnSelchangeList1()
{
// TODO: Add your control notification handler code here
int l,g,m;
int num;
CString str;
m=num=0;
l=m_List2.GetCurSel();
g=m_List1.GetCurSel();
m_List3.ResetContent();
for(m=0;m<g;m++)
num+=n[m];
for(m=0;m<n[g];m++)
{
str.Format("%d",master[num*m_TeZheng+n[g]*(l)+m]);
m_List3.AddString((LPCTSTR)str);
}
}
void CMyDlg::OnSelchangeList2()
{
// TODO: Add your control notification handler code here
int l,g,m;
int num;
CString str;
m=num=0;
l=m_List2.GetCurSel();
g=m_List1.GetCurSel();
m_List3.ResetContent();
for(m=0;m<g;m++)
num+=n[m];
for(m=0;m<n[g];m++)
{
str.Format("%d",master[num*m_TeZheng+n[g]*(l)+m]);
m_List3.AddString((LPCTSTR)str);
}
// m_List2.GetText(i,str);
}
void CMyDlg::OnSelchangeList3()
{
// TODO: Add your control notification handler code here
int i; CString str;
i=m_List3.GetCurSel();
m_List3.GetText(i,str);
}
void CMyDlg::OnButton2()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if (k==0||i==0)
{
MessageBox("训练样本不合格!");
return;
}
if(f==k)
{
MessageBox("样本已经达到上限!");
return;
}
if(m_X!="")
{
m_List4.AddString((LPCTSTR)m_X);
f++;
}
else
{
MessageBox("请输入样本值!");
return;
}
UpdateData(false);
}
void CMyDlg::OnRadio1()
{
// TODO: Add your control notification handler code here
select=true;
((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(1);
((CButton*)GetDlgItem(IDC_RADIO2))->SetCheck(0);
}
void CMyDlg::OnRadio2()
{
// TODO: Add your control notification handler code here
select=false;
((CButton*)GetDlgItem(IDC_RADIO2))->SetCheck(1);
((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(0);
}
///////////////////////////////////////////
void CMyDlg::ivy(double *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 CMyDlg::mult(double *m1,double *m2,double *result,int i_1,int j_12,int j_2)
{
int i,j,k;
for(i=0;i<i_1;i++)
for(j=0;j<j_2;j++)
{
result[i*j_2+j]=0.0;
for(k=0;k<j_12;k++)
result[i*j_2+j]+=m1[i*j_12+k]*m2[j+k*j_2];
}
return;
}
void CMyDlg::transpose(double *m1,double *m2,int m,int n)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
m2[j*m+i]=m1[i*n+j];
return;
}
int CMyDlg::Max(double *s,int m)
{
double a,b;
int k=0;
a=s[0];
b=a-1;
for(int s1=1;s1<m;s1++)
{
if(a<=s[s1])
{
b=a;
a=s[s1];
k=s1;
}
}
if (a==b)
{
return -1;
}
else
return k+1;
}
double CMyDlg::GetValue(double *A,int N)
{
int i,j,m,n,s,t,k=1;
double *a,f=1,c,x,sn;
a=new double[N*N];
for(i=0;i<N*N;i++)
a[i]=A[i];
for (i=0,j=0;i<N&&j<N;i++,j++)
{
if (a[i*N+j]==0)
{
for (m=i;a[m*N+j]==0;m++);
if (m==N)
{
sn=0;
return sn;
}
else
for (n=j;n<N;n++)
{
c=a[i*N+n];
a[i*N+n]=a[m*N+n];
a[m*N+n]=c;
}
k*=(-1);
}
for (s=N-1;s>i;s--)
{
x=a[s*N+j];
for (t=j;t<N;t++)
a[s*N+t]-=a[i*N+t]*(x/a[i*N+j]);
}
}
for (i=0;i<N;i++)
f*=a[i*N+i];
sn=k*f;
delete a;
return sn;
}
void CMyDlg::OnButton3()
{
// TODO: Add your control notification handler code here
int i;
for(i=m_List4.GetCount()-1;i>=0;i--)/*这个小程序来自于小组的其他成员*/
{
if(m_List4.GetSel(i))
{
m_List4.DeleteString(i);
f--;
}
}
UpdateData(FALSE);
}
void CMyDlg::OnButton4()
{
// TODO: Add your control notification handler code here
int a=m_List4.GetCount();
for(int l=0;l<a;l++)
m_List4.DeleteString(0);
f=0;
UpdateData(FALSE);
}
int CMyDlg::Select(double x,double y)
{
double *E,*e,*pj,*E1,*g;
double *m1;
double *m2;
double *m3;
double m4=0;
double p3;
double p1=0;
double x1[2];
int p2;
int result;
int m,j,a,b,c,num=0;
E=new double [k*k];
g=new double [i];
E1=new double [k*k];
e=new double [k*k*i];
pj=new double [k*i];
m1=new double [k];
m2=new double [k];
m3=new double [k];
x1[0]=x;
x1[1]=y;
for(m=0;m<i;m++)
for(a=0;a<k;a++)
{
pj[m*k+a]=0;
num=0;
for(c=0;c<m;c++)
{
num+=n[c]*k;
}
num+=n[m]*a;
for(j=0;j<n[m];j++)
pj[m*k+a]+=master[num+j];
pj[m*k+a]/=n[m];
}
for(j=0;j<i;j++)
{
num=0;
for(c=0;c<j;c++)
{
num+=n[c]*k;
}
for(m=0;m<k;m++)
{
for(a=0;a<k;a++)
{
e[j*k*k+m*k+a]=0;
for(c=0;c<n[j];c++)
{
e[j*k*k+m*k+a]+=(pj[j*k+m]-master[num+n[j]*m+c])*(pj[j*k+a]-master[num+n[j]*a+c]);
}
e[j*k*k+m*k+a]/=n[m]-1;
}
}
}
num=0;
for(b=0;b<i;b++)
num+=n[b];
///////协方差相等//////////////////////////
if(select)
{
for(j=0;j<k;j++)
for(m=0;m<k;m++)
{
E[j*k+m]=0;
for(a=0;a<i;a++)
E[j*k+m]+=e[a*k*k+j*k+m];
}
ivy(E,k);
for(m=0;m<i;m++)
{
for(a=0;a<k;a++)
m1[a]=x1[a]-pj[m*k+a];
transpose(m1,m2,1,k);
mult(m1,E,m3,1,k,k);
mult(m3,m2,&m4,1,k,1);
p1=1.0*n[m]/num;
g[m]=-0.5*(m4)+log(p1);
}
}
/////////////两类协方差不等/////////
else
{
for(m=0;m<i;m++)
{
for(a=0;a<k*k;a++)
{
E[a]=e[m*k*k+a];
E1[a]=e[m*k*k+a];
}
ivy(E1,k);
for(a=0;a<k;a++)
m1[a]=x1[a]-pj[m*k+a];
transpose(m1,m2,1,k);
mult(m1,E1,m3,1,k,k);
mult(m3,m2,&m4,1,k,1);
p1=1.0*n[m]/num;
p3=GetValue(E,k);
g[m]=-0.5*(m4)+log(p1)-0.5*log(p3);
}
}
delete m1;delete m2;delete m3;delete e;
delete E;delete E1;delete pj;
result=Max(g,i);
delete g;
return result;
}
void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CFont font;
font.CreateFont(15,6,0,0,700,0,0,0,0,0,0,0,0,"宋体");
((CStatic*)GetDlgItem(IDC_STATIC_lei))->SetFont(&font);
/* CStatic *out=((CStatic*)GetDlgItem(IDC_STATIC_MAP));
CDC *pDC=out->GetDC();
CRect rect;
out->GetClientRect(&rect);
if (rect.PtInRect(point)&&move==false)*/
if (move==false&&(point.x-412)>=-x0+10&&(point.x-412)<=x0-10&&(point.y-228)>=-y0+10&&(point.y-228)<=y0-10)
{
::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
CStatic *out=((CStatic*)GetDlgItem(IDC_STATIC_MAP));
CDC *pDC=out->GetDC();
point.x-=412;
point.y-=228;
CRect rect;
out->GetClientRect(&rect);
if(k==2)
{
CString str;
if (Select((1.0*point.x)/m_f,(-1.0*point.y)/m_f)!=-1)
{
str.Format("该点在第 %d 类",Select((1.0*point.x)/m_f,(-1.0*point.y)/m_f));
}
else
str="该点在边界上";
CWnd::SetDlgItemText(IDC_STATIC_lei,str);
str.Format("%f",1.0*point.x/m_f);
CWnd::SetDlgItemText(IDC_STATIC_X,str);
str.Format("%f",1.0*(-point.y)/m_f);
CWnd::SetDlgItemText(IDC_STATIC_Y,str);
}
}
else if(move==false)
{
CWnd::SetDlgItemText(IDC_STATIC_lei,"");
CWnd::SetDlgItemText(IDC_STATIC_X,"");
CWnd::SetDlgItemText(IDC_STATIC_Y,"");
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
CDialog::OnMouseMove(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -