📄 pp.cpp
字号:
#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 + -