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

📄 pp.cpp

📁 caim完善版离散化方法是一种研究数据挖掘方向的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "iostream.h"
#include "stdlib.h"
#include "stdio.h"
#include "iostream.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"

const int A=4;//data中条件属性的个数
const int S=3;//data中类的个数
const int N=150;//data中样本的个数

double data[N][A+2]={
1,5.1,3.5,1.4,0.2,1,
2,4.9,3.0,1.4,0.2,1,
3,4.7,3.2,1.3,0.2,1,
4,4.6,3.1,1.5,0.2,1,
5,5.0,3.6,1.4,0.2,1,
6,5.4,3.9,1.7,0.4,1,
7,4.6,3.4,1.4,0.3,1,
8,5.0,3.4,1.5,0.2,1,
9,4.4,2.9,1.4,0.2,1,
10,4.9,3.1,1.5,0.1,1,
11,5.4,3.7,1.5,0.2,1,
12,4.8,3.4,1.6,0.2,1,
13,4.8,3.0,1.4,0.1,1,
14,4.3,3.0,1.1,0.1,1,
15,5.8,4.0,1.2,0.2,1,
16,5.7,4.4,1.5,0.4,1,
17,5.4,3.9,1.3,0.4,1,
18,5.1,3.5,1.4,0.3,1,
19,5.7,3.8,1.7,0.3,1,
20,5.1,3.8,1.5,0.3,1,
21,5.4,3.4,1.7,0.2,1,
22,5.1,3.7,1.5,0.4,1,
23,4.6,3.6,1.0,0.2,1,
24,5.1,3.3,1.7,0.5,1,
25,4.8,3.4,1.9,0.2,1,
26,5.0,3.0,1.6,0.2,1,
27,5.0,3.4,1.6,0.4,1,
28,5.2,3.5,1.5,0.2,1,
29,5.2,3.4,1.4,0.2,1,
30,4.7,3.2,1.6,0.2,1,
31,4.8,3.1,1.6,0.2,1,
32,5.4,3.4,1.5,0.4,1,
33,5.2,4.1,1.5,0.1,1,
34,5.5,4.2,1.4,0.2,1,
35,4.9,3.1,1.5,0.1,1,
36,5.0,3.2,1.2,0.2,1,
37,5.5,3.5,1.3,0.2,1,
38,4.9,3.1,1.5,0.1,1,
39,4.4,3.0,1.3,0.2,1,
40,5.1,3.4,1.5,0.2,1,
41,5.0,3.5,1.3,0.3,1,
42,4.5,2.3,1.3,0.3,1,
43,4.4,3.2,1.3,0.2,1,
44,5.0,3.5,1.6,0.6,1,
45,5.1,3.8,1.9,0.4,1,
46,4.8,3.0,1.4,0.3,1,
47,5.1,3.8,1.6,0.2,1,
48,4.6,3.2,1.4,0.2,1,
49,5.3,3.7,1.5,0.2,1,
50,5.0,3.3,1.4,0.2,1,
51,7.0,3.2,4.7,1.4,2,
52,6.4,3.2,4.5,1.5,2,
53,6.9,3.1,4.9,1.5,2,
54,5.5,2.3,4.0,1.3,2,
55,6.5,2.8,4.6,1.5,2,
56,5.7,2.8,4.5,1.3,2,
57,6.3,3.3,4.7,1.6,2,
58,4.9,2.4,3.3,1.0,2,
59,6.6,2.9,4.6,1.3,2,
60,5.2,2.7,3.9,1.4,2,
61,5.0,2.0,3.5,1.0,2,
62,5.9,3.0,4.2,1.5,2,
63,6.0,2.2,4.0,1.0,2,
64,6.1,2.9,4.7,1.4,2,
65,5.6,2.9,3.6,1.3,2,
66,6.7,3.1,4.4,1.4,2,
67,5.6,3.0,4.5,1.5,2,
68,5.8,2.7,4.1,1.0,2,
69,6.2,2.2,4.5,1.5,2,
70,5.6,2.5,3.9,1.1,2,
71,5.9,3.2,4.8,1.8,2,
72,6.1,2.8,4.0,1.3,2,
73,6.3,2.5,4.9,1.5,2,
74,6.1,2.8,4.7,1.2,2,
75,6.4,2.9,4.3,1.3,2,
76,6.6,3.0,4.4,1.4,2,
77,6.8,2.8,4.8,1.4,2,
78,6.7,3.0,5.0,1.7,2,
79,6.0,2.9,4.5,1.5,2,
80,5.7,2.6,3.5,1.0,2,
81,5.5,2.4,3.8,1.1,2,
82,5.5,2.4,3.7,1.0,2,
83,5.8,2.7,3.9,1.2,2,
84,6.0,2.7,5.1,1.6,2,
85,5.4,3.0,4.5,1.5,2,
86,6.0,3.4,4.5,1.6,2,
87,6.7,3.1,4.7,1.5,2,
88,6.3,2.3,4.4,1.3,2,
89,5.6,3.0,4.1,1.3,2,
90,5.5,2.5,4.0,1.3,2,
91,5.5,2.6,4.4,1.2,2,
92,6.1,3.0,4.6,1.4,2,
93,5.8,2.6,4.0,1.2,2,
94,5.0,2.3,3.3,1.0,2,
95,5.6,2.7,4.2,1.3,2,
96,5.7,3.0,4.2,1.2,2,
97,5.7,2.9,4.2,1.3,2,
98,6.2,2.9,4.3,1.3,2,
99,5.1,2.5,3.0,1.1,2,
100,5.7,2.8,4.1,1.3,2,
101,6.3,3.3,6.0,2.5,3,
102,5.8,2.7,5.1,1.9,3,
103,7.1,3.0,5.9,2.1,3,
104,6.3,2.9,5.6,1.8,3,
105,6.5,3.0,5.8,2.2,3,
106,7.6,3.0,6.6,2.1,3,
107,4.9,2.5,4.5,1.7,3,
108,7.3,2.9,6.3,1.8,3,
109,6.7,2.5,5.8,1.8,3,
110,7.2,3.6,6.1,2.5,3,
111,6.5,3.2,5.1,2.0,3,
112,6.4,2.7,5.3,1.9,3,
113,6.8,3.0,5.5,2.1,3,
114,5.7,2.5,5.0,2.0,3,
115,5.8,2.8,5.1,2.4,3,
116,6.4,3.2,5.3,2.3,3,
117,6.5,3.0,5.5,1.8,3,
118,7.7,3.8,6.7,2.2,3,
119,7.7,2.6,6.9,2.3,3,
120,6.0,2.2,5.0,1.5,3,
121,6.9,3.2,5.7,2.3,3,
122,5.6,2.8,4.9,2.0,3,
123,7.7,2.8,6.7,2.0,3,
124,6.3,2.7,4.9,1.8,3,
125,6.7,3.3,5.7,2.1,3,
126,7.2,3.2,6.0,1.8,3,
127,6.2,2.8,4.8,1.8,3,
128,6.1,3.0,4.9,1.8,3,
129,6.4,2.8,5.6,2.1,3,
130,7.2,3.0,5.8,1.6,3,
131,7.4,2.8,6.1,1.9,3,
132,7.9,3.8,6.4,2.0,3,
133,6.4,2.8,5.6,2.2,3,
134,6.3,2.8,5.1,1.5,3,
135,6.1,2.6,5.6,1.4,3,
136,7.7,3.0,6.1,2.3,3,
137,6.3,3.4,5.6,2.4,3,
138,6.4,3.1,5.5,1.8,3,
139,6.0,3.0,4.8,1.8,3,
140,6.9,3.1,5.4,2.1,3,
141,6.7,3.1,5.6,2.4,3,
142,6.9,3.1,5.1,2.3,3,
143,5.8,2.7,5.1,1.9,3,
144,6.8,3.2,5.9,2.3,3,
145,6.7,3.3,5.7,2.5,3,
146,6.7,3.0,5.2,2.3,3,
147,6.3,2.5,5.0,1.9,3,
148,6.5,3.0,5.2,2.0,3,
149,6.2,3.4,5.4,2.3,3,
150,5.9,3.0,5.1,1.8,3,
};

void sort(int n);//对data数据根据属性n进行排序
void out();//输出data数据
double inconsistency();//计算data的不一致率
double CAIM(int i,int n,double selectvalue,double point[N],double canpoint[N],int l);//计算CAIM值
double logaaa(int i,int n,double canpoint[N],int l);//计算以互信息为底的对数
void findsort(int cai[N],double caivalue[N],int j,double caic);//CAIC值从大到小排序
void replace(int i,double cutpoint[N],int ll);//断点选择完后进行替换
//函数声明

void main()
{
  double globalcaim,caim,v;
  double candidatecutpoint[N],cutpoint[N],temp,tempdata[N][A+2];
  int i,j,l,n,ll,x,y,k,b,c,w;
  int cai[N];
  double caivalue[N];
  for(i=0;i<N;i++)
  {   for(j=0;j<A+2;j++)
		  tempdata[i][j]=data[i][j];
  }
  //out();
  for(k=1;k<N;k++)
  {
	  cai[k]=0;
      caivalue[k]=0;
  }
  candidatecutpoint[0]=-100000;
  cutpoint[0]=-100000;
  cutpoint[1]=100000;
  cout<<"*****************************"<<endl;
  cout<<"       CAIM离散化算法"<<endl;
  cout<<"*****************************"<<endl;  
  for(i=1;i<=A;i++)
  { 
  	w=1;
  	globalcaim=0.0;
	caim=0.0;
	sort(i);
	cutpoint[0]=-100000;
    cutpoint[1]=100000;
    cout<<"*********************"<<endl;
	cout<<"    *************"<<endl;
	cout<<"        *****"<<endl;
 //   out();
 //   cout<<"i="<<i<<endl;
    temp=data[0][i];
//	cout<<temp<<" ";
	j=1;
	l=1;
    while(j<N)
	{  
	   if(temp==data[j][i])
	       j++;
	   else {candidatecutpoint[l]=(double)((temp+data[j][i])/2);
		     temp=data[j][i];
			 l++;
	   }
    }
    candidatecutpoint[l]=100000;
//	cout<<"i="<<i<<endl;
	for(j=0;j<=l;j++)
		cout<<candidatecutpoint[j]<<"  ";
	cout<<endl;
	cout<<"i="<<i<<endl;
    ll=1;
	for(n=2;n<=l;n++)
	{ x=0;
      for(j=1;j<l;j++)
	  { caim=CAIM(i,n,candidatecutpoint[j],cutpoint,candidatecutpoint,l);
	    cout<<"caim="<<caim<<endl;
		findsort(cai,caivalue,j,caim);
		//cout<<"caim="<<caim<<endl;
	//	out();
        //if(caic>globalcaic)
		if((caim>globalcaim))
		{ globalcaim=caim;
		  y=j;
	      x=1;
		}
		cout<<"globalcaim="<<globalcaim<<endl;
	  }
       if((x==0)&&(n<=S))
       { globalcaim=caivalue[1];
		  y=cai[1];
	      x=1;
		  cout<<"globalcaim!!!!!!="<<globalcaim<<endl;
	   }
     	 //	  for(k=1;k<l;k++)
     //	      cout<<"cai["<<k<<"]="<<cai[k]<<"   "<<"caivalue["<<k<<"]="<<caivalue[k]<<endl;   
	  cutpoint[ll]=candidatecutpoint[y];
//	  cout<<"cutpoint["<<ll<<"]="<<cutpoint[ll]<<endl;
	  cutpoint[ll+1]=100000;
      ll++;
cout<<"globalcaim#########="<<globalcaim<<endl;
	//  cout<<"x="<<x<<endl;
	  if(x==0) 
	  {
		 cutpoint[ll-1]=100000;
		 // for(c=2;c<=ll;c++)
		 // {
		//	  cutpoint[c-1]=cutpoint[c];
		//  }
		 ll--;
	      //for(k=0;k<=ll;k++)
			  //cout<<"cutpoint["<<k<<"]="<<cutpoint[k]<<endl;  
	      break; 
	  }
      for(b=1;b<ll-1;b++)
     {    for(c=b+1;c<ll;c++)
	    {
		  if(cutpoint[b]>cutpoint[c])
		  {
			  v=cutpoint[b];
			  cutpoint[b]=cutpoint[c];
			  cutpoint[c]=v;
		  }
	    }
     }
    // for(k=0;k<=ll;k++)
	// cout<<"cutpoint["<<k<<"]="<<cutpoint[k]<<endl;  
	}
	
    replace(i,cutpoint,ll);
	cout<<"inconsistency="<<inconsistency()<<endl;
	if(inconsistency()>0)
	{

		do{	
			sort(0);
	    //	out();
	   	    for(k=0;k<N;k++)
			    data[k][i]=tempdata[k][i];
		    sort(i);
		   // out();
			{   
	        	cutpoint[ll]=candidatecutpoint[cai[w]];
	        	cutpoint[ll+1]=100000;
			}
	        ll++;
	        w++;
	        /* for(b=1;b<ll-1;b++)     
              {    for(c=b+1;c<ll;c++)
	             {
		           if(cutpoint[b]>cutpoint[c])
		             {
			           v=cutpoint[b];
			           cutpoint[b]=cutpoint[c];
			           cutpoint[c]=v;
		             }
	             }
              }
	      for(j=1;j<l;j++)
	        {
	        	caim=CAIM(i,n,candidatecutpoint[j],cutpoint,candidatecutpoint,l);
	            //cout<<"caim="<<caim<<endl;
	            findsort(cai,caivalue,j,caim);
	        }  */  
            //for(k=0;k<ll;k++)
	           // cout<<"cutpoint["<<k<<"]="<<cutpoint[k]<<endl;  
            replace(i,cutpoint,ll);
	        cout<<"inconsistency="<<inconsistency()<<endl;
		//	out();
		}while(inconsistency()>0);
	}
//	for(k=0;k<ll;k++)
//	   cout<<"cutpoint["<<k<<"]="<<cutpoint[k]<<endl;  
  }
  sort(0);
  out();
  cout<<"inconsistency="<<inconsistency()<<endl;
}


//对data数据根据属性n进行排序
void sort(int n)
{
  

  int i=0,j=0,k=0;
  double a;


  k=0;
  for(i=0;i<A+2;i++)
  {
	  if(n!=i) k++;
	  else break;
  }
  if(k==(A+2))
  {
	cout<<"依据错误的属性序号进行排序!"<<endl;
	exit(0);
  }

  for(i=0;i<N;i++)
  {
	  j=i;
	  k=i;
	  while(j<N)
	  {
		  if(data[j][n]<data[k][n])
		  {
			  k=j;
		  }
		  j++;
	  }
	  for(j=0;j<A+2;j++)
	  {
		  a=data[i][j];
		  data[i][j]=data[k][j];
		  data[k][j]=a;
	  }

  }
}

//输出data数据
void out()
{
	int i,j;
	for(i=0;i<N;i++)
	{
		for(j=0;j<A+2;j++)

⌨️ 快捷键说明

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