数据挖掘实验报告(一)
姓名:李圣杰班级:计算机学号: 数据预处理
1304 1311610602
1
一、实验目的
1.学习均值平滑,中值平滑,边界值平滑的基本原理 2.掌握链表的使用方法 3.掌握文件读取的方法
二、实验设备
PC一台,dev-c++5.11
三、实验内容
数据平滑
假定用于分析的数据包含属性age。数据元组中age的值如下(按递增序):13, 15, 16, 16, 19, 20, 20, 21, 22, 22, 25, 25, 25, 25, 30, 33, 33, 35, 35, 35, 35, 36, 40, 45, 46, 52, 70。使用你所熟悉的程序设计语言进行编程,实现如下功能(要求程序具有通用性):
(a) 使用按箱平均值平滑法对以上数据进行平滑,箱的深度为3。 (b) 使用按箱中值平滑法对以上数据进行平滑,箱的深度为3。 (c) 使用按箱边界值平滑法对以上数据进行平滑,箱的深度为3。
四、实验原理
使用c语言,对数据文件进行读取,存入带头节点的指针链表中,同时计数,均值求三个数的平均值,中值求中间的一个数的值,边界值将中间的数转换为离边界较近的边界值
五、实验步骤
代码
#include
#define DATAFILE \#define VPT 10
//定义结构体
typedef struct chain{ int num;
struct chain *next; }* data;
//定义全局变量
data head,p,q; FILE *fp;
int num,sum,count=0; int i,j;
int *box; void mean(); void medain(); void boundary(); int main () {
//定义头指针
head=(data)malloc(sizeof(struct chain));
head->next=NULL;
/*打开文件*/
fp=fopen(DATAFILE,\ if(!fp)
exit(0); p=head;
while(!feof(fp)){
2
q=(data)malloc(sizeof(struct chain));
q->next=NULL;
fscanf(fp,\/*读一个数据*/
p->next=q; p=q;
count++; }
/* 关闭文件 */ fclose(fp);
//输出
printf(\源数据为:\\n\
printf(\共%d箱%d个数据\\n\ p=head->next; count=1; num=1;
while(p!=NULL){
if(count==1)printf(\箱%d:\
if(count==DEEP){
printf(\ num++; count=1; }
else{
printf(\ count++; }
p=p->next; }
mean(); medain(); boundary();
scanf(\ return 0; }
//均值
void mean(){
printf(\均值平滑后为:\ box=(int
*)malloc(sizeof(int)*num); p=head->next;
count=1; num=0; sum=0;
while(p!=NULL){
if(count==DEEP){ count=1;
sum=sum+p->num; box[num]=sum/DEEP; sum=0; num++; }
else{
sum=sum+p->num; count++; }
p=p->next; }
for (i=0;i p=head->next; printf(\离群值为:\ while(p!=NULL){ for(i=0;i for (j=0;j if(abs(p->num-box[i])>(int)VPT) { printf(\箱%d:\ printf(\ } p=p->next; } } } } //中值 void medain(){ printf(\中值平滑后为:\ 3 p=head->next; count=1; num=0; int mid; while(p!=NULL){ if(count==DEEP){ box[num]=sum; count=1; num++; } else { if(count==DEEP/2||count==DEEP/2+1) if(DEEP%2){ if(count==DEEP/2+1) sum=p->num; } else{ if(count==DEEP/2+1) sum=(p->num+mid)/2; else mid=p->num; } count++; } p=p->next; } for (i=0;i printf(\箱%d:\ for (j=0;j //边界值 void boundary(){ printf(\边界值平滑后为:\\n\p=head->next; count=1; box=(int *)malloc(sizeof(int)*num*2); num=0; while(p!=NULL){ if(count==DEEP){ box[2*num+1]=p->num; count=1; num++; } else{ if(count==1) { box[2*num]=p->num; } count++; } p=p->next; } p=head->next; count=1; num=0; while(p!=NULL){ if(count==1) printf(\箱%d:\ if((p->num-box[2*num])>(box[2*num+1]-p->num)){ printf(\\ } else printf(\ if(count==DEEP){ printf(\ count=0; num++; } count++; p=p->next; } } 实验数据文件:data.txt用空格分开 13 15 16 16 19 20 20 21 22 22 25 25 25 25 30 33 33 35 35 35 35 36 40 45 46 52 70 4 六、结果截图 5