资源描述
精品学习资料范文
数据挖掘实验报告
篇一:数据挖掘实验报告
数据挖掘实验报告
——K-最临近分类算法
学号:311062202 姓名:汪文娟
一、 数据源说明
1.数据理解
选择第二包数据Iris Data Set,共有150组数据,考虑到训练数据集的随机性和多样性,选择rowNo模3不等于0的100组作为训练数据集,剩下的50组做测试数据集。
(1)每组数据有5个属性,分别是:1. sepal length in cm
2. sepal wrowNoth in cm
3. petal length in cm
4. petal wrowNoth in cm
5. class:
-- Iris Setosa
-- Iris Versicolour
-- Iris Virginica
(2) 为了操作方便,对各组数据添加rowNo属性,且第一组rowNo=1。
2.数据清理
现实世界的数据一般是不完整的、有噪声的和不一致的。数据清理例程试图填充缺失的值,光滑噪声并识别离群点,并纠正数据中的不一致。
a) 缺失值:当数据中存在缺失值是,忽略该元组(注意:本文选用的第二组数据Iris
Data Set的Missing Attribute Values: None)。
b) 噪声数据:本文暂没考虑。
二、 K-最临近分类算法
KNN(k Nearest Neighbors)算法又叫k最临近方法,假设每一个类包含多个样本数据,而且每个数据都有一个唯一的类标记表示这些样本是属于哪一个分类, KNN就是计算每个样本数据到待分类数据的距离,如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本
有关。因此,采用这种方法可以较好地避免样本的不平衡问题。另外,由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。 该方法的不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。
(1)算法思路:
K-最临近分类方法存放所有的训练样本,在接受待分类的新样本之前不需构造模型,并且直到新的(未标记的)样本需要分类时才建立分类。K-最临近分类基于类比学习,其训练样本由N维数值属性描述,每个样本代表N维空间的一个点。这样,所有训练样本都存放在N维模式空间中。给定一个未知样本,k-最临近分类法搜索模式空间,找出最接近未知样本的K个训练样本。这K个训练样本是未知样本的K个“近邻”。“临近性”又称为相异度(Dissimilarity),由欧几里德距离定义,其中两个点 X(x1,x2,?xn)和Y(y1,y2,?yn)的欧几里德距离是:
D(x,y)?(x1?y1)?(x2?y2)?...?(xn?yn)222
未知样本被分配到K个最临近者中最公共的类。在最简单的情况下,也就是当K=1时,未知样本被指定到模式空间中与之最临近的训练样本的类。
(2)算法步骤:
step.1---初始化距离为最大值
step.2---计算未知样本和每个训练样本的距离dist
step.3---得到目前K个最临近样本中的最大距离maxdist
step.4---如果dist小于maxdist,则将该训练样本作为K-最近邻样本
step.5---重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完
step.6---统计K-最近邻样本中每个类标号出现的次数
step.7---选择出现频率最大的类标号作为未知样本的类标号
三、 算法源代码
////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// KNN.cpp K-最近邻分类算法
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include stdlib.h
#include stdio.h
#include memory.h
#include string.h
#include iostream.h
#include math.h
#include fstream.h
////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 宏定义
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
#define ATTR_NUM 4//属性数目
#define MAX_SIZE_OF_TRAINING_SET 1000//训练数据集的最大大小 #define MAX_SIZE_OF_TEST_SET100 //测试数据集的最大大小 #define MAX_VALUE 10000.0//属性最大值
#define K 7
//结构体
struct dataVector {
};
struct distanceStruct {
};
////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 全局变量
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
struct dataVector gTrainingSet[MAX_SIZE_OF_TRAINING_SET]; //训练数据集 struct dataVector gTestSet[MAX_SIZE_OF_TEST_SET];//测试数据集 struct distanceStruct gNearestDistance[K]; //K个最近邻距离 int ID; //ID号 double distance; //距离 char classLabel[15]; //分类标号 int ID; //ID号 char classLabel[15]; //分类标号 double attributes[ATTR_NUM]; //属性
int curTrainingSetSize=0;//训练数据集的大小 int curTestSetSize=0; //测试数据集的大小 ////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 求 vector1=(x1,x2,...,xn)和vector2=(y1,y2,...,yn)的欧几里德距离
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
double Distance(struct dataVector vector1,struct dataVector vector2)
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 得到gNearestDistance中的最大距离,返回下标
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
int GetMaxDistance()
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 对未知样本Sample分类
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
char* Classify(struct dataVector Sample)
{
double dist=0; int maxid=0,freq[K],i,tmpfreq=1;; char *curClassLable=gNearestDistance[0].classLabel; memset(freq,1,sizeof(freq)); //step.1---初始化距离为最大值 for(i=0;i i++) int maxNo=0; for(int i=1;i i++) { } if(gNearestDistance[i].distance gNearestDistance[maxNo].distance) maxNo = i; double dist,sum=0.0; for(int i=0;i ATTR_NUM;i++) { } dist=sqrt(sum); return dist; sum+=(vector1.attributes[i]-vector2.attributes[i])*(vector1.attributes[i]-vector2.attributes[i]); return maxNo;
} { } //step.2---计算K-最近邻距离 for(i=0;i curTrainingSetSize;i++) {} //step.3---统计每个类出现的次数 for(i=0;i i++){ } //step.4---选择出现频率最大的类标号 for(i=0;i i++) {} return curClassLable; if(freq[i] tmpfreq){} tmpfreq=freq[i]; curClassLable=gNearestDistance[i].classLabel; for(int j=0;j j++) { } if((i!=j) (strcmp(gNearestDistance[i].classLabel,gNearestDistance[j].classLabel)==0)) { } freq[i]+=1; //step.2.1---计算未知样本和每个训练样本的距离 dist=Distance(gTrainingSet[i],Sample); //step.2.2---得到gNearestDistance中的最大距离 maxid=GetMaxDistance(); //step.2.3---如果距离小于gNearestDistance中的最大距离,则将该样本作为K-最近邻样本 if(dist gNearestDistance[maxid].distance) { } gNearestDistance[maxid].ID=gTrainingSet[i].ID; gNearestDistance[maxid].distance=dist; strcpy(gNearestDistance[maxid].classLabel,gTrainingSet[i].classLabel); gNearestDistance[i].distance=MAX_VALUE;
//////////////////////////////////////////////////////////////////////////////////////////////////////// //
// 主函数
//
篇二:数据挖掘实验报告1
甘肃政法学院 本科生实验报告
(一)
姓名:贾燚
学院:计算机科学学院
专业:信息管理与信息系统 班级:10级信管班
实验课程名称:数据仓库与数据挖掘 实验日期:2012年10月12日 指导教师及职称:朱正平
实验成绩:
开课时间:2011-2012学年二学期
甘肃政法学院实验管理中心印制
篇三:数据挖掘实验报告4
甘肃政法学院 本科生实验报告
(四)
姓名: 贾燚
学院:计算机科学学院
专业:信息管理与信息系统 班级:10级信管班
实验课程名称:数据仓库与数据挖掘 实验日期:2012年11月9日 指导教师及职称:朱正平
实验成绩:
开课时间:2011-2012学年二学期
甘肃政法学院实验管理中心印制
展开阅读全文