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

📄 fisherview.cpp

📁 fisher判别函数分类的实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:

}

//得到每个类的均值向量
void CFisherView::GetMeanValue(Kind &typePer)
{
	int i, j;
	float sum;
	for(j=0; j<ITEMNUM; j++)
	{
		sum = 0;
		for(i=0; i<typePer.num; i++)
			sum += typePer.a[i][j];
		typePer.m[j] = sum/typePer.num;
	}


}


//得到每个类的离散度矩阵
void CFisherView::GetInnerDiffer(Kind &typePer)
{
	int i,j,k;
	for(i=0; i<ITEMNUM; i++)
		for(j=0; j<ITEMNUM; j++)
		{
			typePer.s[i][j] = 0;
            for(k=0; k<typePer.num; k++)
			{
				typePer.s[i][j] += (typePer.a[k][i]-typePer.m[i])*(typePer.a[k][j]-typePer.m[j]);
			}
		}

}


//得到总的离散度矩阵
void CFisherView::GetTotalDiffer()
{
	int i, j;
	for(i=0; i<ITEMNUM; i++)
		for(j=0; j<ITEMNUM; j++)
		{
			totalDiffer[i][j] = 0;
			totalDiffer[i][j] = boy.s[i][j] + girl.s[i][j];
		}

}


//得到逆矩阵
bool CFisherView::GetReveMatrix()
{
	    CMatrix matrix;
//	totalDiffer[0][0]=1;
//	totalDiffer[0][1]=2;
//	totalDiffer[1][0]=3;
//	totalDiffer[1][1]=4;
	if(!matrix.ReMatrix(totalDiffer))
		return false;
	for(int i=0; i<ITEMNUM; i++)
		for(int j=0; j<ITEMNUM; j++)
			reveMatrix[i][j] = matrix.reveMatrix[i][j];
		return true;
	
//	for(int i=0; i<ITEMNUM; i++)
//		for(int j=0; j<ITEMNUM; j++)
//			reveMatrix[i][j] = totalDiffer[i][j];
//   bool reve = brinv(&reveMatrix[0][0],ITEMNUM);
////   if(reve)
////	   return true;
////   else
////	   return false;
////	
//   return true;

}


//得到投影向量w
void CFisherView::GetProjectVector()
{
	int i,j,k;
	for(j=0; j<ITEMNUM; j++)
	{
		proVtr[j] = 0;
		for(i=0; i<ITEMNUM; i++)
			proVtr[j] += reveMatrix[j][i]*(boy.m[i]-girl.m[i]);

	}
    
}


//得到参数阈值y0
void CFisherView::GetParaValue()
{
	int i,j;
	float proAvg[CLASSNUM] = {0};
	for(i=0; i<ITEMNUM; i++)
		proAvg[0] += proVtr[i]*boy.m[i];
	for(i=0; i<ITEMNUM; i++)
		proAvg[1] += proVtr[i]*girl.m[i];
	parValue = (proAvg[0] + proAvg[1])/2;

}


//测试数据归一化
void CFisherView::ChangeTestData()
{
    int i,j;
	for(i=0; i<vPr.size(); i++) 
		for(j=0; j<ITEMNUM; j++)
			if(square[j]>0.01||square[j]<-0.01)
			vPr[i].b[j] = (vPr[i].a[j] - avg[j])/square[j];
	   
}


//得到测试记录的每个标签
void CFisherView::GetClassLabel()
{
	int i,j;
	float lastValue;
	for(i=0; i<vPr.size(); i++)
	{
		lastValue = 0;
		for(j=0; j<ITEMNUM; j++)
			lastValue += proVtr[j]*vPr[i].b[j];
		
		if(lastValue > parValue)
			vPr[i].testType = 1;
		else
			vPr[i].testType = 0;
	}

}

//得到每个类错别个数,总的错别个数
void CFisherView::GetEvalueValue()
{
	int i;
	errorCnt = 0;
	errBoy = 0;
	errGrl = 0;
	for(i=0; i<vPr.size(); i++)
		if(vPr[i].testType != vPr[i].trueType)
		{
			if(vPr[i].trueType == 1)
				errBoy++;
			else
				errGrl++;
			errorCnt++;
		}
   
}


//训练另一组数据Ionosphere
void CFisherView::OnAnothertraining() 
{
	// TODO: Add your command handler code here
    boy.num = 0;
	boy.type = 1;
	girl.num = 0;
	girl.type = 0;
	if(!LoadAnotherTrainingdata())
	   return;
	ChangeData();
	GetMeanValue(boy);
	GetMeanValue(girl);
	GetInnerDiffer(boy);
	GetInnerDiffer(girl);
	GetTotalDiffer();
	if(!GetReveMatrix())
	{
		AfxMessageBox("没有逆矩阵");
		exit(0);
	}
	GetProjectVector();
	GetParaValue();
	
}


//载入另一组训练数据Ionosphere
bool CFisherView::LoadAnotherTrainingdata()
{
	int pathlen;
	char curPath[100];
	CString filePath = "";
	GetCurrentDirectory(pathlen,curPath);  //保存当前目录
    CFileDialog dlg(true);
	if(dlg.DoModal() == IDOK);
       filePath = dlg.GetPathName();  //系统的当前目录变了
    SetCurrentDirectory(curPath);
    if(filePath == "")
		return false;
	FILE * fp;
	if((fp=fopen(filePath,"r")) == NULL)
		return false;
	char ch;
	bool label;
	int cnt = 0, i;
	CString item = "";
	float tempAay[ITEMNUM];
	ch = fgetc(fp);
	while(ch != '#')
	{
		if(ch == '\n')
		{
           if(item == "g")
		   {
			   for(i=0; i<cnt; i++)
				   boy.a[boy.num][i] = tempAay[i];
			   boy.num++;
		   }
           else
		   {
			   for(i=0; i<cnt; i++)
				   girl.a[girl.num][i] = tempAay[i];
			   girl.num++;
		   }
           item = "";
		   cnt = 0;
		  
		}
		else if(ch == ',')
		{
			tempAay[cnt++] = atof(item);
			item = "";
		}
		else
		{
			item += ch;
		}
		ch = fgetc(fp);
	//	if(boy.num + girl.num > 300)
	//		break;
	}
   
    return true;

}


//测试另一组数据
void CFisherView::OnAnothertestdata() 
{
	// TODO: Add your command handler code here
	if(!LoadAnotherTestData())
		return;
	ChangeTestData();
	GetClassLabel();
	GetEvalueValue();
//	LookAtData();
	Invalidate();
   
}

//得到另一组测试数据Ionosphere
bool CFisherView::LoadAnotherTestData()
{
	int pathlen;
	char curPath[100];
	CString filePath = "";
	GetCurrentDirectory(pathlen,curPath);  //保存当前目录
    CFileDialog dlg(true);
	if(dlg.DoModal() == IDOK);
       filePath = dlg.GetPathName();  //系统的当前目录变了
    SetCurrentDirectory(curPath);
    if(filePath == "")
		return false;
	FILE * fp;
	if((fp=fopen(filePath,"r")) == NULL)
		return false;
    char ch;
	int cnt = 0;
	CString item = "";
	TestPer perNode;
	if(!vPr.empty())
		vPr.clear();
	ch = fgetc(fp);
	while(ch != '#')
	{
		if(ch == '\n')
		{
			if(item == "g")
				perNode.trueType = 1;
			else
				perNode.trueType = 0;
            cnt = 0;
			item = "";
			vPr.push_back(perNode);
		}
		else if(ch == ',')
		{
             perNode.a[cnt++] = atof(item);
			 item = "";
		}
	
		else
		{
		   item += ch;
				
		}
		ch = fgetc(fp);
	}
   fclose(fp);
   return true;


}

//求得逆矩阵
bool CFisherView::brinv( float a[],int n)
{
	int *is,*js,i,j,k=0,l,u,v;
    float d,p;
//	float a[ITEMNUM*ITEMNUM];
//	for(i=0; i<ITEMNUM; i++)
//		for(j=0; j<ITEMNUM; j++)
//			a[k++] = b[i][j];
    is = (int*)malloc(n*sizeof(int));
    js = (int*)malloc(n*sizeof(int));
    for (k=0; k<=n-1; k++)
      { 
		d = 0.0;
        for (i=k; i<=n-1; i++)
        for (j=k; j<=n-1; j++)
          { l = i*n+j; 
		    p = fabs(a[l]);
            if (p>d) 
			{ d=p; is[k]=i; js[k]=j;}
          }
        if (d +1.0 == 1.0)
          { 
			free(is); free(js); 
            return false;
          }
        if (is[k] != k)
          for (j=0; j<=n-1; j++)
            { u=k*n+j; v=is[k]*n+j;
              p=a[u]; a[u]=a[v]; a[v]=p;
            }
        if (js[k]!=k)
          for (i=0; i<=n-1; i++)
            { u=i*n+k; v=i*n+js[k];
              p=a[u]; a[u]=a[v]; a[v]=p;
            }
        l=k*n+k;
        a[l]=1.0/a[l];
        for (j=0; j<=n-1; j++)
          if (j!=k)
            { u=k*n+j; a[u]=a[u]*a[l];}
        for (i=0; i<=n-1; i++)
          if (i!=k)
            for (j=0; j<=n-1; j++)
              if (j!=k)
                { u=i*n+j;
                  a[u]=a[u]-a[i*n+k]*a[k*n+j];
                }
        for (i=0; i<=n-1; i++)
          if (i!=k)
            { u=i*n+k; a[u]=-a[u]*a[l];}
      }
    for (k=n-1; k>=0; k--)
      { if (js[k]!=k)
          for (j=0; j<=n-1; j++)
            { u=k*n+j; v=js[k]*n+j;
              p=a[u]; a[u]=a[v]; a[v]=p;
            }
        if (is[k]!=k)
          for (i=0; i<=n-1; i++)
            { u=i*n+k; v=i*n+is[k];
              p=a[u]; a[u]=a[v]; a[v]=p;
            }
      }

	k=0;
//	for(i=0;i<ITEMNUM;i++)
//		for(j=0;j<ITEMNUM;j++)
//			b[i][j]=a[k++];
    free(is); free(js);
    return true;

}

⌨️ 快捷键说明

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