📄 fisherview.cpp
字号:
}
//得到每个类的均值向量
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 + -