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

📄 pp.cpp

📁 caim完善版离散化方法是一种研究数据挖掘方向的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			cout<<data[i][j]<<',';
			//cout<<data[i][j]<<'\t';
		}
		cout<<endl;
	}
}

//计算data的不一致率
double inconsistency()
{
	int a[N];
	int i=0,j=0,n=0,k=0,num=0;
	for(i=0;i<N;i++)
		a[i]=0;
	for(i=0;i<(N-1);i++)
	{
		j=i+1;
		while(j<N)
		{
			n=0;
			for(k=1;k<=A;k++)
			{
				if(data[i][k]==data[j][k]) n++;
				else break;
			}
			if((n==A)&&(data[i][A+1]!=data[j][A+1]))
			{
				a[i]=1;
				a[j]=1;
			}
			j++;
		}
	}
	num=0;
	for(i=0;i<N;i++)
	{
		if(a[i]==1) num++;
	}
	return((double)num/N);
}


//计算CAIM值
double CAIM(int i,int n,double selectvalue,double point[N],double canpoint[N],int l)
{ int r,m,cc,k,j,M[N+1],q[N+1][S+1],C[S+1],upper[S+1],a[N+1],qq[N+1],aa;
  double t=0.0,tt=0.0,w=0.0,caim=0.0;
  int flag=0;
  a[0]=0;
 // out();
  sort(i);
  for(r=1;r<=n;r++)
  { M[r]=0;
    qq[r]=0;
    a[r]=0;
  }
  for(cc=1;cc<=S;cc++)
  { upper[cc]=0;
    C[cc]=0;
  }
  for(r=1;r<=n;r++)
  {for(cc=1;cc<=S;cc++)
   q[r][cc]=0;}
//  for(k=1;k<=n;k++)
//  {for(j=1;j<=S;j++)
//		cout<<q[k][j]<<"  ";}
//  cout<<endl;
//	   out();
//cout<<"n="<<n<<" ";
    for(j=1;j<n;j++)
    if(selectvalue==point[j])
      flag=1;
  	if(flag==0)
  	{
		for(j=1;j<n;j++)
		{ 
			aa=n-1;
	        if(selectvalue>point[j-1]&&selectvalue<point[j])
			{  
				aa=j; break;
			}
		}
 // cout<<"n="<<n<<endl;
 // cout<<"aa="<<aa<<endl;
 // out();
  if(aa==1)
  { r=1; m=0;
    while((m<N)&&data[m][i]>point[r-1]&&data[m][i]<selectvalue)
	{ M[r]++;
	    for(cc=1;cc<=S;cc++)
		{ 
		  if(data[m][A+1]==cc)
		//  cout<<data[m][A+1];
		  q[r][cc]++; 
		}
//	  cout<<q[r][1]<<endl;
//	  cout<<q[r][2]<<endl;
//    cout<<q[r][3]<<endl;
//	  cout<<q[2][1]<<endl;
//	  cout<<q[2][2]<<endl;
//	  cout<<q[2][3]<<endl;
      m++;
	}
 // for(k=1;k<=n;k++)
 // {  for(j=1;j<=S;j++)
 //       cout<<q[k][j]<<endl;
 // }
//	cout<<"M["<<r<<"]="<<M[r]<<endl;
	a[r]=m;
 //   cout<<"a["<<r<<"]="<<a[r]<<endl;
	r++;
	while((m<N)&&data[m][i]>selectvalue&&data[m][i]<point[r-1])
	{ M[r]++;
	  for(cc=1;cc<=S;cc++)
		  if(data[m][A+1]==cc)
			  q[r][cc]++;
      m++;
	}
//for(k=1;k<=n;k++)
 // {  for(j=1;j<=S;j++)
 //       cout<<q[k][j]<<endl;
 // }
	a[r]=m;
//	cout<<"a["<<r<<"]="<<a[r]<<endl;
//	cout<<"M["<<r<<"]="<<M[r]<<endl;
    for(r=aa+2;r<=n;r++)
	{ while((m<N)&&data[m][i]>point[r-2]&&data[m][i]<point[r-1])
	  { M[r]++;
	    for(cc=1;cc<=S;cc++)
	      if(data[m][A+1]==cc)
              q[r][cc]++;
        m++;
	  }
      a[r]=m;
    }
  }
  if(aa!=1&&aa!=n-1)
  { m=0;
	for(r=1;r<aa;r++)
	{ while(data[m][i]>point[r-1]&&data[m][i]<point[r])
	  { M[r]++;
	    for(cc=1;cc<=S;cc++)
	      if(data[m][A+1]==cc)
              q[r][cc]++;
        m++;
	  }
      a[r]=m;
    }
    while(data[m][i]>point[r-1]&&data[m][i]<selectvalue)
	{ M[r]++;
	  for(cc=1;cc<=S;cc++)
	    if(data[m][A+1]==cc)
            q[r][cc]++;
      m++;
	}
	a[r]=m;
	r++;
    while(data[m][i]>selectvalue&&data[m][i]<point[r-1])
	{ M[r]++;
	  for(cc=1;cc<=S;cc++)
	    if(data[m][A+1]==cc)
            q[r][cc]++;
      m++;
	}
	a[r]=m;
    for(r=aa+2;r<=n;r++)
	{ while((m<N)&&(data[m][i]>point[r-2])&&(data[m][i]<point[r-1]))
	  { M[r]++;
	    for(cc=1;cc<=S;cc++)
	      if(data[m][A+1]==cc)
              q[r][cc]++;
        m++;
	  }
      a[r]=m;
    }
  }
  if(aa==n-1&&n>2)
  { m=0;
    for(r=1;r<aa;r++)
	{ while(data[m][i]>point[r-1]&&data[m][i]<point[r])
	  { M[r]++;
	    for(cc=1;cc<=S;cc++)
	      if(data[m][A+1]==cc)
              q[r][cc]++;
        m++;
	  }
      a[r]=m;
    }
    while(data[m][i]>point[r-1]&&data[m][i]<selectvalue)
	{ M[r]++;
	  for(cc=1;cc<=S;cc++)
	    if(data[m][A+1]==cc)
            q[r][cc]++;
      m++;
	}
	a[r]=m;
	r++;
    while((m<N)&&data[m][i]>selectvalue&&data[m][i]<point[r-1])
	{ M[r]++;
	  for(cc=1;cc<=S;cc++)
	    if(data[m][A+1]==cc)
            q[r][cc]++;
      m++;
	}
	a[r]=m;
  }
 // out();
  for(m=0;m<N;m++)
  {	for(j=1;j<=S;j++)
	  if(data[m][A+1]==j)
		  C[j]++;}
 
 // for(j=1;j<=S;j++)
 //     cout<<"C["<<j<<"]="<<C[j]<<endl;

  for(r=1;r<=n;r++)
  {  
	  for(j=1;j<=S;j++)
	  {     
		  for(m=a[r-1];m<a[r];m++)
			  if(data[m][A+1]==j)
			  { 
				  upper[j]+=M[r];
			      break;
			  }
	  }
  }
 // for(j=1;j<=S;j++)
  //    cout<<"upper["<<j<<"]="<<upper[j]<<endl;
//	     for(r=1;r<=l;r++)
   // for(j=1;j<=S;j++)
	//	cout<<q[r][j]<<"  ";
 /*
  for(r=1;r<=n;r++)
  { for(j=1;j<=S;j++)
  { 
	if(q[r][j]!=0)
      t=t*((double)pow(q[r][j],(double)(1/S)));
//	t=t*((double)sqrt(q[r][j]));
  }
	if(M[r]!=0)
      tt+=(double)(t/((double)(M[r])));
  }
  for(j=1;j<=S;j++)
  {
	 if(upper[j]!=0)
     w+=(double)((double)C[j]/(double)upper[j]);
  }
//  cout<<"tt="<<tt<<endl;
 // cout<<"w="<<w<<endl;
  t=logaaa(i,n,canpoint,l);
//  cout<<"log="<<t<<endl;
  caim=((double)tt*w)/(double)t;
	*/
  for(r=1;r<=n;r++)
  { 
	  for(j=1;j<=S;j++)
	  {
		  if(q[r][j]>qq[r])
			  qq[r]=q[r][j];
	  }
  }
  for(r=1;r<=n;r++)
	  t+=(((double)qq[r])*((double)qq[r]))/M[r];
  caim=(double)t/(double)n;
  }
  else
  {caim=-100;}
  return(caim);
}

//计算以互信息为底的对数
double logaaa(int i,int n,double canpoint[N],int l)
{ double I=0.0,H=0.0,aaa=0.0;
  int r,m,k,j,M[N+1],q[N+1][S+1],C[S+1];
  sort(i);
  for(r=1;r<=l;r++)
	  M[r]=0;
//  for(r=1;r<=l;r++)
//	  cout<<M[r]<<" ";
//  cout<<endl;
  for(r=1;r<=l;r++)
  {
	  for(j=1;j<=S;j++)
	  q[r][j]=0;
  }
//  for(k=1;k<=l;k++)
//  {  for(j=1;j<=S;j++)
//        cout<<q[k][j]<<" ";
//  }
 // cout<<endl;
  for(j=1;j<=S;j++)
	  C[j]=0;
  m=0;
  for(r=1;r<=l;r++)
  { while((m<N)&&data[m][i]>canpoint[r-1]&&data[m][i]<canpoint[r])
	{ 
	  M[r]++;
	  for(j=1;j<=S;j++)
	  {
		  if(data[m][A+1]==j)
            q[r][j]++;
	  }
      m++;  
  }
  }
 // for(k=1;k<=l;k++)
 // {  for(j=1;j<=S;j++)
 //       cout<<q[k][j]<<" ";
 //       cout<<endl;
 // }
  for(m=0;m<N;m++)
  {	for(j=1;j<=S;j++)
  {   
	  if(data[m][A+1]==j)
		  C[j]++;
  }
  }
// for(j=1;j<=S;j++)
 //     cout<<"C["<<j<<"]="<<C[j]<<endl;
  for(r=1;r<=l;r++)
  { for(j=1;j<=S;j++)
  {  
	  if(q[r][j]!=0)
	 { I+=(((double)q[r][j]/N))*log(((double)((double)q[r][j]*N)/((double)M[r]*C[j])));
      // cout<<"I="<<I<<"  ";
       H+=((double)((double)q[r][j]/(double)N))*log((double)((double)N/(double)q[r][j]));
	  // cout<<"H="<<H<<"  ";
	 }
  }
  }
//  cout<<"I="<<I<<endl;
 // cout<<"H="<<H<<endl;
  aaa=(double)(log(n))/log((double)((double)H/(double)I));
//  aaa=1000*n;
//  cout<<"aaa="<<aaa<<endl;
  return(aaa);
}

void replace(int i,double cutpoint[N],int ll)
{ 
  sort(i);
  int j,m,p,q,k;
  double z,plus=1.0;
  for(p=1;p<ll-1;p++)
  {    for(q=p+1;q<ll;q++)
	  {
		  if(cutpoint[p]>cutpoint[q])
		  {
			  z=cutpoint[p];
			  cutpoint[p]=cutpoint[q];
			  cutpoint[q]=z;
		  }
	  }
  }
 // for(k=0;k<ll;k++)
//	  cout<<"cutpoint["<<k<<"]="<<cutpoint[k]<<endl;
  m=0;
  for(j=1;j<=ll;j++)
  {  while((m<N)&&data[m][i]>cutpoint[j-1]&&data[m][i]<cutpoint[j])
  {  
	 data[m][i]=plus;
	 m++;
	 }
     plus++;
  }

}

//CAIM值从大到小排序
void findsort(int cai[N],double caivalue[N],int j,double caim)
{ 
	int m,k;
	for(m=j-1;m>0;m--)
	{ 
		if((caim<caivalue[m])||(caim==caivalue[m]))
			break;
	}
	for(k=j;k>m+1;k--)
	{
		cai[k]=cai[k-1];
		caivalue[k]=caivalue[k-1];
	}
	cai[m+1]=j;
	caivalue[m+1]=caim;
}

⌨️ 快捷键说明

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