📄 seminaive.cpp
字号:
// SemiNaiveDoc.cpp: implementation of the CSemiNaiveDoc class.
//
//////////////////////////////////////////////////////////////////////
/////aaaaaaaaaaaaaaaa
//#include "ZssWidthScaler.h"
//#include "ZssWidthScalar.h"
#include "String.h"
#include "stdlib.h"
#include "math.h"
#include "stdafx.h"
#include "../RSet.h"
#include "fstream.h"
#include "SemiNaive.h"
#define ZSSLEN 15
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSemiNaive::CSemiNaive()
{
//InfoTable=NULL;
Cut=NULL;
NewTable=NULL;
MidCut=NULL;
pAttName=NULL;
pDataType=NULL;
pStringTable=NULL;
pStringTableResult=NULL;
pStrResult=NULL;
strCuts=NULL;
pNonStringTable=NULL;
}
CSemiNaive::~CSemiNaive()
{
int i;
if(Cut!=NULL)
{
for(i=0;i<iNonStrAttNum;i++)
delete []Cut[i];
delete []Cut;
}
if(NewTable!=NULL)
{
for(i=0;i<iRecordNum;i++)
delete []NewTable[i];
delete []NewTable;
}
if(MidCut!=NULL)
{
for(i=0;i<iNonStrAttNum;i++)
delete []MidCut[i];
delete []MidCut;
}
if(pAttName)
{
for(i=0;i<iNonStrAttNum;i++)
delete []pAttName[i];
delete[] pAttName;
}
if(pDataType)
{
for(i=0;i<iNonStrAttNum+1;i++)
delete []pDataType[i];
delete[] pDataType;
}
if(pStringTable!=NULL)
{
for(i=0;i<iRecordNum;i++)
{
for(int j=0;j<iStrAttNum;j++)
delete[] pStringTable[i][j];
delete[] pStringTable[i];
}
delete[] pStringTable;
}
if(pStringTableResult!=NULL){
for(i=0;i<iRecordNum;i++)
delete[] pStringTableResult[i];
delete[] pStringTableResult;
}
if(pStrResult){
for(i=0;i<iRecordNum;i++){
for(int j=0;j<iStrAttNum;j++)
delete[] pStrResult[i][j];
delete[] pStrResult[i];
}
delete[] pStrResult;
}
if(pNonStringTable){
for(i=0;i<iRecordNum;i++)
delete[] pNonStringTable[i];
delete[] pNonStringTable;
}
if(strCuts)
delete[] strCuts;
}
BOOL CSemiNaive::OnSemiNaivedis()
{//具体实现离散化的地方
GetMidCut();
GetCut();
GetNewTable();
if(iStrAttNum!=0)
doString();
return TRUE;
}
//把每个属性上出现的不同的值存入MidCut数组中,并按从小到大的顺序进行排序
void CSemiNaive::GetMidCut()
{
int i,j,k;
int num=0;
int num1=0;
int flag=0;
MidCut=new float*[iNonStrAttNum];
Cut=new float*[iNonStrAttNum];
//MidCut为后选的断点集的上下界的集合,
//MidCut[i][0]为第i个属性后选的断点集的上下界的个数
//MidCut[i]是经过排序的,由小到大
for(i=0;i<iNonStrAttNum;i++)
{
float exchange;
float *Mid;
Mid=new float[iRecordNum+1];
Mid[++num]=pNonStringTable[0][i];
for(j=1;j<iRecordNum;j++)
{
for(k=1;k<=num;k++)
{
if(pNonStringTable[j][i]==Mid[k])
{
flag=1;
break;
}
}
if(flag==0)
{
Mid[++num]=pNonStringTable[j][i];
}
flag=0;
}
Mid[0]=(float)num;
MidCut[i]=new float[num+1];
Cut[i]=new float[num];
Cut[i][0]=0;
MidCut[i][0]=Mid[0];
for(j=1;j<num;j++)
for(k=j+1;k<=num;k++)
if(Mid[j]>Mid[k])
{
exchange=Mid[j];
Mid[j]=Mid[k];
Mid[k]=exchange;
}
for(j=1;j<=num;j++)
MidCut[i][++num1]=Mid[j];
delete []Mid;
num=0;
num1=0;
flag=0;
}
}
//计算出每个属性的断点,并保存在cut数组中,cut[i][0]保存了第i个属性的断点个数
void CSemiNaive::GetCut()
{
int DeciNum;
//DeciNum为决策种类的个数
int i,j,k,m;
DeciNum=GetDeciNum();
float *DeciValue;
DeciValue=GetDeciValue();
int CutNum;
int j1;
int num;
int num1;
Cut=new float*[iAttNum];
//Cut存放的是两个属性值的中间值,即实际的断点值
for(i=0;i<iNonStrAttNum;i++)
{
CutNum=0;
Cut[i]=new float[(int)MidCut[i][0]];
for(j=1;j<(int)MidCut[i][0];j++)
{
float **valuej;
float **valuej1;
j1=j+1;
valuej=new float*[DeciNum+1];
for(k=0;k<DeciNum+1;k++)
valuej[k]=new float[2];
//value为每一个断点的上下界所决定的决策的个数,
//value[0][0]为最多决策的个数
//value[DeciNum][0]为条件属性值对应的决策
//value[DeciNum][1]为条件属性值对应的决策的数目
valuej1=new float*[DeciNum+1];
for(k=0;k<DeciNum+1;k++)
valuej1[k]=new float[2];
for(k=1;k<=DeciNum;k++)
valuej[k][0]=DeciValue[k-1];
for(k=1;k<=DeciNum;k++)
valuej1[k][0]=DeciValue[k-1];
for(k=1;k<=DeciNum;k++)
valuej[k][1]=0;
for(k=1;k<=DeciNum;k++)
valuej1[k][1]=0;
for(k=0;k<iRecordNum;k++)
if( pNonStringTable[k][i]==MidCut[i][j])
{
for(m=0;m<DeciNum;m++)
if( pNonStringTable[k][iNonStrAttNum]==valuej[m+1][0])
{
valuej[m+1][1]++;
}
}
for(k=0;k<iRecordNum;k++)
if( pNonStringTable[k][i]==MidCut[i][j1])
{
for(m=0;m<DeciNum;m++)
if( pNonStringTable[k][iNonStrAttNum]==valuej1[m+1][0])
{
valuej1[m+1][1]++;
}
}
float mid;
float mid1;
for(k=1;k<DeciNum;k++)
for(m=k+1;m<=DeciNum;m++)
{
if(valuej[k][1]<valuej[m][1])
{
mid=valuej[k][1];
mid1=valuej[k][0];
valuej[k][1]=valuej[m][1];
valuej[k][0]=valuej[m][0];
valuej[m][1]=mid;
valuej[m][0]=mid1;
}
}
num=1;
for(k=1;k<DeciNum;k++)
if(valuej[k+1][1]==valuej[1][1])
num++;
valuej[0][0]=(float)num;
num=0;
for(k=1;k<DeciNum;k++)
for(m=k+1;m<=DeciNum;m++)
{
if(valuej1[k][1]<valuej1[m][1])
{
mid=valuej1[k][1];
mid1=valuej1[k][0];
valuej1[k][1]=valuej1[m][1];
valuej1[k][0]=valuej1[m][0];
valuej1[m][1]=mid;
valuej1[m][0]=mid1;
}
}
num1=1;
for(k=1;k<DeciNum;k++)
if(valuej1[k+1][1]==valuej1[1][1])
num1++;
valuej1[0][0]=(float)num1;
num1=0;
if((int)valuej[0][0]<(int)valuej1[0][0])
{
for(k=0;k<(int)valuej[0][0];k++)
for(m=0;m<(int)valuej1[0][0];m++)
if(valuej[k+1][0]==valuej1[m+1][0])
num++;
if(num!=(int)valuej[0][0])
Cut[i][++CutNum]=(MidCut[i][j]+MidCut[i][j1])/2;
}
else if((int)valuej[0][0]>=(int)valuej1[0][0])
{
for(k=0;k<(int)valuej1[0][0];k++)
for(m=0;m<(int)valuej[0][0];m++)
if(valuej1[k+1][0]==valuej[m+1][0])
num1++;
if(num1!=(int)valuej1[0][0])
Cut[i][++CutNum]=(MidCut[i][j]+MidCut[i][j1])/2;
}
for(k=0;k<DeciNum+1;k++)
{
delete []valuej[k];
delete []valuej1[k];
}
delete []valuej;
delete []valuej1;
}
Cut[i][0]=(float)CutNum;
}
delete DeciValue;
}
//根据所产生的断点集得到离散化后的决策表并存入NewTable中
void CSemiNaive::GetNewTable()
{
int i,j,k;
int m;
NewTable=new int *[iRecordNum];
for(i=0;i<iRecordNum;i++)
{
NewTable[i]=new int[iNonStrAttNum+1];
for(j=0;j<iNonStrAttNum;j++)
{
m=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -