基于K中心点数据挖掘课程设计论文原创.docx
《基于K中心点数据挖掘课程设计论文原创.docx》由会员分享,可在线阅读,更多相关《基于K中心点数据挖掘课程设计论文原创.docx(28页珍藏版)》请在冰豆网上搜索。
基于K中心点数据挖掘课程设计论文原创
基于K-中心点算法实现
Ø算法描述
k中心点算法:
首先为每一个簇随意选择一个代表对象;剩余的对象其与代表的对象的距离分配给最近的一个簇。
然后反复的用非代表对象来替代代表对象,以改进聚类的质量。
聚类结果的质量用一个代价函数来估算,该函数度量对象与其参与对象之间的平均相异度。
为了确定非代表对象
是否是当前代表对象
的好的替代,对于每一个非代表对象P,考虑以下四种情况。
Ø第一种情况:
P当前隶属于代表对象
。
如果
被
所取代作为代表对象,并且P离其他代表对象
(i
j)最近,则P重新分配给
Ø第二种情况:
最近,则P重新分配给
Ø第三种情况:
,(i
j)。
最近,则对象的隶属不发生变化。
Ø第四种情况:
下面是我们这次实现这个k中心点算法的具体描述
输入:
结果簇的个数k和包含n个对象的数据集合
输出:
k个簇的集合,使得所有对象与其最近中心点的相异度总和最小
方法:
(6)从n个对象的集合中随意选取k个对象作为初始化的中心点;
(7)repeat;
(8)将每个剩余的对象指派到最近的中心点所代表的簇;
(9)随机地选择一个非代表对象
;
(10)计算用
交换代表对象Oj的总代价S;
(11)IfS<0,then用
替换
,形成新的k个代表对象的集合
(12)until不发生簇的重新分配。
Ø算法实现
为了实现k中心点算法我们采用的是语言是C#,开发工具是MicrsoftVisualStdio2008,数据库SQLServer2000,为了简单的进行模拟,我们使用了3维数据进行开发,下面将介绍主要的我们软件的主要实现过程。
⏹数据库设计:
为了进行实现k中心点算法进行数据挖掘分类,我们设计了一个非常简单的数据库,里面主要有一张关于人的分类,我们采用了人的年龄(age)、身高(height)、体重(weight)三个指标进行算法的模拟。
⏹主要算法代码
(1)调用数据库,把数据库中的数据提取出来进行挖掘。
下面是代码
///
///初始化数据库对象
DsStaffDataContextDataContext=newDsStaffDataContext();
///获取数据库表中数据
publicListGetStaff()
{
//用链表List初始化数据对象
ListaStaff=newList();
//查询数据库中的Staff表
varStaffTable=frompinDataContext.Staffs
selectp;
//遍历查询出来的表,然后将每一条记录放入初始化的链表List对象aStaff中
foreach(StaffaStaffRowinStaffTable)
aStaff.Add(aStaffRow);
}
returnaStaff;
(2)从n个对象的集合中随意选取k个对象作为初始化的中心点,下面是实现的函数:
///初始化中心点
///分成k簇
///原数据
///改变后数据
publicListInitCentainPoint(intk,ListOrgionListStaff,outListChangedListStaff)
List_Staff=newList(k);
//随机数生成器
Randomccy=newRandom();
//保持随机数
ListrandomList=newList();
for(inti=0;i{//生成一个随机数intrandom=ccy.Next(OrgionListStaff.Count-1);//当随机数集合中已经存在这个随机数的时候从新筛选,以免重复选择中心点while(randomList.Contains(random)){random=ccy.Next(OrgionListStaff.Count-1);}randomList.Add(random);StaffaStaff=OrgionListStaff[random];//属于第几簇OrgionListStaff[random].Cluster=i;//当前为中心点OrgionListStaff[random].Flag=1;_Staff.Add(aStaff);}ChangedListStaff=OrgionListStaff;return_Staff;}(3)将每个剩余的对象指派到最近的中心点所代表的簇//////指派每个剩余的对象给离它最近的中心点所代表的簇//////分成k簇///数据///中心点集合///publicListSetClusterList(intk,ListChangedListStaff,ListCentainPoint){//得到数据的个数intcount=ChangedListStaff.Count;//指派每个剩余的对象给离它最近的中心点所代表的簇for(inti=0;i{ListtempPointDistance=newList();//如果不是中心点(Flag代表是否为中心点,1为中心点)if(!ChangedListStaff[i].Flag.Equals(1)){//计算剩余的点到每个中心点的距离,然后分到距离最小的那一簇里面for(intj=0;j{doubletempAge=Math.Pow(ChangedListStaff[i].Age.Value-CentainPoint[j].Age.Value,2);doubletempHeight=Math.Pow(ChangedListStaff[i].Height.Value-CentainPoint[j].Height.Value,2);doubletempWeight=Math.Pow(ChangedListStaff[i].Weight.Value-CentainPoint[j].Weight.Value,2);doubletemp=Math.Sqrt(tempAge+tempHeight+tempWeight);tempPointDistance.Add(temp);}doublemin=tempPointDistance.Min();intindex=tempPointDistance.IndexOf(min);ChangedListStaff[i].Cluster=index;}}returnChangedListStaff;}(4)计算用Orandom交换代表对象Oj的总代价S;//////代价函数//////可能成为新中心点这个数据的位置///原有中心点在数据中的位置///所有数据(用链表形式进行保存)///publicdoubleGetS(intrandom,intj,ListListStaff){//获取j中心点属于第几簇intcluster=ListStaff[j].Cluster.Value;//获取原中心点数据数据项年龄intorgAge=ListStaff[j].Age.Value;//获取原中心点数据数据项身高doubleorgHeight=ListStaff[j].Height.Value;//获取原中心点数据数据项体重doubleorgWeight=ListStaff[j].Weight.Value;//获取可能成为新中心点数据数据项年龄intrandomAge=ListStaff[random].Age.Value;//获取可能成为新中心点数据数据项身高doublerandomHeight=ListStaff[random].Height.Value;//获取可能成为新中心点数据数据项体重doublerandomWeight=ListStaff[random].Weight.Value;doubleorgCount=0.0;doublerandomCount=0.0;doublesub=0.0;//获取这一簇里面存在的所有数据varclusterStaff=frompinListStaffwherep.Cluster.Equals(cluster)selectp;//遍历这一簇所有数据foreach(varcluserRowinclusterStaff){//计算距离doubleorgTempAge=Math.Pow(orgAge-cluserRow.Age.Value,2);doubleorgTempHeight=Math.Pow(orgHeight-cluserRow.Height.Value,2);doubleorgTempWeight=Math.Pow(orgWeight-cluserRow.Weight.Value,2);doubleorgDistance=Math.Sqrt(orgTempAge+orgTempHeight+orgTempWeight);doublerandomTempAge=Math.Pow(randomAge-cluserRow.Age.Value,2);doublerandomTempHeight=Math.Pow(randomHeight-cluserRow.Height.Value,2);doublerandomTempWeight=Math.Pow(randomWeight-cluserRow.Weight.Value,2);doublerandomDistance=Math.Sqrt(randomTempAge+randomTempHeight+randomTempWeight);orgCount+=orgDistance;randomCount+=randomDistance;}//得到交换后它们的代价sub=randomCount-orgCount;returnsub;}(5)核心函数k中心点算法(函数体内调用了上面的函数)//////k中心点算法//////分成k簇///原数据///publicListK_method(intk,ListOrgionListStaff){//初始化总代价doubles=0;//判断是否所有的中心点不在变化标志boolChanged=true;//初始化一个随机数生成器Randomccy=newRandom();//得到所有数据的个数intcount=OrgionListStaff.Count;//初始化整个数据变化后保存的链表集合ListChangedListStaff=newList();//初始化k个中心点保存链表集合ListCentainPoint=this.InitCentainPoint(k,OrgionListStaff,outChangedListStaff);while(Changed){//指派每个剩余的对象给离它最近的中心点所代表的簇ChangedListStaff=this.SetClusterList(k,OrgionListStaff,CentainPoint);//得到原始的中心点集合ListFirstCentainPoint=CentainPoint;for(intj=0;j{//得到一个随机数intrandom=ccy.Next(count-1);//如果这个数据是中心点,重新得到一个新的随机数(Flag是中心点标志)while(ChangedListStaff[random].Flag.Equals(1)){random=ccy.Next(count-1);if(random==count-1){random-=1;}if(random==0){random+=1;}}//得到交换中心点的总代价s=this.GetS(random,j,ChangedListStaff);//如果总代价<0if(s<0){//将Orandom换成新的中心点ChangedListStaff[random].Flag=1;//原中心点在数据的位置intOjIndex=ChangedListStaff.IndexOf(CentainPoint[j]);//把以前的中心点变成普通点ChangedListStaff[OjIndex].Flag=0;CentainPoint[j]=ChangedListStaff[random];}}//如果经过循环后所有中心点中心点都保持不变,循环结束if(FirstCentainPoint.Equals(CentainPoint)){//Changed为false后循环结束Changed=false;}else{//Changed为true后循环继续Changed=true;}}returnChangedListStaff;}Ø主界面解释(1)下面是我们软件的初始化主界面(图1-1),我们可以看到它是基于k中心点算法的一个数据挖掘软件,在右边是我们要进行处理的数据,我们将数据库中所有数据都提取到出来了,我们可以看到每一条记录有四个属性(姓名、年龄、身高、体重),而我们这个软件主要是针对其中的三个属性(年龄、身高、体重)进行数据挖掘,将他们进行数据分组,分组后的数据将会呈现在左边的分簇后数据的文本框中。图1-1(2)下面展示的是软件进行数据处理后的效果(如图1-2)我们在界面上输入8,将右边所有的数据分成8组,开始后经过数据处理展示出来的数据呈现在左边的分簇后数据的文本框中。图1-2仔细分析左边的分簇后数据的文本框中我们可以发现:各组之间我们通过普通的心算我们可以发现他们各组之间数据在年龄、身高、体重等综合因素比较下差距是比较大的,而族类之间的差距却是比较小。比如第1组与第2组,第一组中数据“邬海莹58岁-165厘米-60公斤”与第二组数据“熊玉莉1岁-30厘米-13公斤”,不论从年龄、身高和体重上面来说,他们之间的差距是比较大的,而第六组他们族类之间的数据比较后我们科研发现,不论是从年龄、身高还是体重方面他们之间的差距是非常小的。这与比较好的验证了k中心算法对于数据分类效果还是比较好的。Ø附录(源代码)(1)数据库代码xmlversion="1.0"encoding="utf-8"?>connectionString="DataSource=.;InitialCatalog=DataMin;IntegratedSecurity=True"providerName="System.Data.SqlClient"/>数据表存储类型publicpartialclassStaff:INotifyPropertyChanging,INotifyPropertyChanged{privatestaticPropertyChangingEventArgsemptyChangingEventArgs=newPropertyChangingEventArgs(String.Empty);privatestring_StaffID;privatestring_Name;privateSystem.Nullable_Age;privateSystem.Nullable_Height;privateSystem.Nullable_Weight;privateSystem.Nullable_Flag;privateSystem.Nullable_Cluster;publicStaff(){OnCreated();}[Column(Storage="_StaffID",DbType="NVarChar(50)NOTNULL",CanBeNull=false,IsPrimaryKey=true)]publicstringStaffID{get{returnthis._StaffID;}}[Column(Storage="_Name",DbType="NVarChar(50)")]publicstringName{get{returnthis._Name;}}[Column(Storage="_Age",DbType="Int")]publicSystem.NullableAge{get{returnthis._Age;}}[Column(Storage="_Height",DbType="Float")]publicSystem.NullableHeight{get{returnthis._Height;}}[Column(Storage="_Weight",DbType="Float")]publicSystem.NullableWeight{get{returnthis._Weight;}}[Column(Storage="_Flag",DbType="Int")]publicSystem.NullableFlag{get{returnthis._Flag;}}[Column(Storage="_Cluster",DbType="Int")]publicSystem.NullableCluster{get{returnthis._Cluster;}}(2)基类算法代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Collections;namespaceKpam{publicclassKCentain{//////初始化数据库对象///DsStaffDataContextDataContext=newDsStaffDataContext();//////获取数据库表中数据//////publicListGetStaf
//生成一个随机数
intrandom=ccy.Next(OrgionListStaff.Count-1);
//当随机数集合中已经存在这个随机数的时候从新筛选,以免重复选择中心点
while(randomList.Contains(random))
random=ccy.Next(OrgionListStaff.Count-1);
randomList.Add(random);
StaffaStaff=OrgionListStaff[random];
//属于第几簇
OrgionListStaff[random].Cluster=i;
//当前为中心点
OrgionListStaff[random].Flag=1;
_Staff.Add(aStaff);
ChangedListStaff=OrgionListStaff;
return_Staff;
(3)将每个剩余的对象指派到最近的中心点所代表的簇
///指派每个剩余的对象给离它最近的中心点所代表的簇
///数据
///中心点集合
publicListSetClusterList(intk,ListChangedListStaff,ListCentainPoint)
//得到数据的个数
intcount=ChangedListStaff.Count;
//指派每个剩余的对象给离它最近的中心点所代表的簇
for(inti=0;i{ListtempPointDistance=newList();//如果不是中心点(Flag代表是否为中心点,1为中心点)if(!ChangedListStaff[i].Flag.Equals(1)){//计算剩余的点到每个中心点的距离,然后分到距离最小的那一簇里面for(intj=0;j{doubletempAge=Math.Pow(ChangedListStaff[i].Age.Value-CentainPoint[j].Age.Value,2);doubletempHeight=Math.Pow(ChangedListStaff[i].Height.Value-CentainPoint[j].Height.Value,2);doubletempWeight=Math.Pow(ChangedListStaff[i].Weight.Value-CentainPoint[j].Weight.Value,2);doubletemp=Math.Sqrt(tempAge+tempHeight+tempWeight);tempPointDistance.Add(temp);}doublemin=tempPointDistance.Min();intindex=tempPointDistance.IndexOf(min);ChangedListStaff[i].Cluster=index;}}returnChangedListStaff;}(4)计算用Orandom交换代表对象Oj的总代价S;//////代价函数//////可能成为新中心点这个数据的位置///原有中心点在数据中的位置///所有数据(用链表形式进行保存)///publicdoubleGetS(intrandom,intj,ListListStaff){//获取j中心点属于第几簇intcluster=ListStaff[j].Cluster.Value;//获取原中心点数据数据项年龄intorgAge=ListStaff[j].Age.Value;//获取原中心点数据数据项身高doubleorgHeight=ListStaff[j].Height.Value;//获取原中心点数据数据项体重doubleorgWeight=ListStaff[j].Weight.Value;//获取可能成为新中心点数据数据项年龄intrandomAge=ListStaff[random].Age.Value;//获取可能成为新中心点数据数据项身高doublerandomHeight=ListStaff[random].Height.Value;//获取可能成为新中心点数据数据项体重doublerandomWeight=ListStaff[random].Weight.Value;doubleorgCount=0.0;doublerandomCount=0.0;doublesub=0.0;//获取这一簇里面存在的所有数据varclusterStaff=frompinListStaffwherep.Cluster.Equals(cluster)selectp;//遍历这一簇所有数据foreach(varcluserRowinclusterStaff){//计算距离doubleorgTempAge=Math.Pow(orgAge-cluserRow.Age.Value,2);doubleorgTempHeight=Math.Pow(orgHeight-cluserRow.Height.Value,2);doubleorgTempWeight=Math.Pow(orgWeight-cluserRow.Weight.Value,2);doubleorgDistance=Math.Sqrt(orgTempAge+orgTempHeight+orgTempWeight);doublerandomTempAge=Math.Pow(randomAge-cluserRow.Age.Value,2);doublerandomTempHeight=Math.Pow(randomHeight-cluserRow.Height.Value,2);doublerandomTempWeight=Math.Pow(randomWeight-cluserRow.Weight.Value,2);doublerandomDistance=Math.Sqrt(randomTempAge+randomTempHeight+randomTempWeight);orgCount+=orgDistance;randomCount+=randomDistance;}//得到交换后它们的代价sub=randomCount-orgCount;returnsub;}(5)核心函数k中心点算法(函数体内调用了上面的函数)//////k中心点算法//////分成k簇///原数据///publicListK_method(intk,ListOrgionListStaff){//初始化总代价doubles=0;//判断是否所有的中心点不在变化标志boolChanged=true;//初始化一个随机数生成器Randomccy=newRandom();//得到所有数据的个数intcount=OrgionListStaff.Count;//初始化整个数据变化后保存的链表集合ListChangedListStaff=newList();//初始化k个中心点保存链表集合ListCentainPoint=this.InitCentainPoint(k,OrgionListStaff,outChangedListStaff);while(Changed){//指派每个剩余的对象给离它最近的中心点所代表的簇ChangedListStaff=this.SetClusterList(k,OrgionListStaff,CentainPoint);//得到原始的中心点集合ListFirstCentainPoint=CentainPoint;for(intj=0;j{//得到一个随机数intrandom=ccy.Next(count-1);//如果这个数据是中心点,重新得到一个新的随机数(Flag是中心点标志)while(ChangedListStaff[random].Flag.Equals(1)){random=ccy.Next(count-1);if(random==count-1){random-=1;}if(random==0){random+=1;}}//得到交换中心点的总代价s=this.GetS(random,j,ChangedListStaff);//如果总代价<0if(s<0){//将Orandom换成新的中心点ChangedListStaff[random].Flag=1;//原中心点在数据的位置intOjIndex=ChangedListStaff.IndexOf(CentainPoint[j]);//把以前的中心点变成普通点ChangedListStaff[OjIndex].Flag=0;CentainPoint[j]=ChangedListStaff[random];}}//如果经过循环后所有中心点中心点都保持不变,循环结束if(FirstCentainPoint.Equals(CentainPoint)){//Changed为false后循环结束Changed=false;}else{//Changed为true后循环继续Changed=true;}}returnChangedListStaff;}Ø主界面解释(1)下面是我们软件的初始化主界面(图1-1),我们可以看到它是基于k中心点算法的一个数据挖掘软件,在右边是我们要进行处理的数据,我们将数据库中所有数据都提取到出来了,我们可以看到每一条记录有四个属性(姓名、年龄、身高、体重),而我们这个软件主要是针对其中的三个属性(年龄、身高、体重)进行数据挖掘,将他们进行数据分组,分组后的数据将会呈现在左边的分簇后数据的文本框中。图1-1(2)下面展示的是软件进行数据处理后的效果(如图1-2)我们在界面上输入8,将右边所有的数据分成8组,开始后经过数据处理展示出来的数据呈现在左边的分簇后数据的文本框中。图1-2仔细分析左边的分簇后数据的文本框中我们可以发现:各组之间我们通过普通的心算我们可以发现他们各组之间数据在年龄、身高、体重等综合因素比较下差距是比较大的,而族类之间的差距却是比较小。比如第1组与第2组,第一组中数据“邬海莹58岁-165厘米-60公斤”与第二组数据“熊玉莉1岁-30厘米-13公斤”,不论从年龄、身高和体重上面来说,他们之间的差距是比较大的,而第六组他们族类之间的数据比较后我们科研发现,不论是从年龄、身高还是体重方面他们之间的差距是非常小的。这与比较好的验证了k中心算法对于数据分类效果还是比较好的。Ø附录(源代码)(1)数据库代码xmlversion="1.0"encoding="utf-8"?>connectionString="DataSource=.;InitialCatalog=DataMin;IntegratedSecurity=True"providerName="System.Data.SqlClient"/>数据表存储类型publicpartialclassStaff:INotifyPropertyChanging,INotifyPropertyChanged{privatestaticPropertyChangingEventArgsemptyChangingEventArgs=newPropertyChangingEventArgs(String.Empty);privatestring_StaffID;privatestring_Name;privateSystem.Nullable_Age;privateSystem.Nullable_Height;privateSystem.Nullable_Weight;privateSystem.Nullable_Flag;privateSystem.Nullable_Cluster;publicStaff(){OnCreated();}[Column(Storage="_StaffID",DbType="NVarChar(50)NOTNULL",CanBeNull=false,IsPrimaryKey=true)]publicstringStaffID{get{returnthis._StaffID;}}[Column(Storage="_Name",DbType="NVarChar(50)")]publicstringName{get{returnthis._Name;}}[Column(Storage="_Age",DbType="Int")]publicSystem.NullableAge{get{returnthis._Age;}}[Column(Storage="_Height",DbType="Float")]publicSystem.NullableHeight{get{returnthis._Height;}}[Column(Storage="_Weight",DbType="Float")]publicSystem.NullableWeight{get{returnthis._Weight;}}[Column(Storage="_Flag",DbType="Int")]publicSystem.NullableFlag{get{returnthis._Flag;}}[Column(Storage="_Cluster",DbType="Int")]publicSystem.NullableCluster{get{returnthis._Cluster;}}(2)基类算法代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Collections;namespaceKpam{publicclassKCentain{//////初始化数据库对象///DsStaffDataContextDataContext=newDsStaffDataContext();//////获取数据库表中数据//////publicListGetStaf
ListtempPointDistance=newList();
//如果不是中心点(Flag代表是否为中心点,1为中心点)
if(!
ChangedListStaff[i].Flag.Equals
(1))
//计算剩余的点到每个中心点的距离,然后分到距离最小的那一簇里面
for(intj=0;j{doubletempAge=Math.Pow(ChangedListStaff[i].Age.Value-CentainPoint[j].Age.Value,2);doubletempHeight=Math.Pow(ChangedListStaff[i].Height.Value-CentainPoint[j].Height.Value,2);doubletempWeight=Math.Pow(ChangedListStaff[i].Weight.Value-CentainPoint[j].Weight.Value,2);doubletemp=Math.Sqrt(tempAge+tempHeight+tempWeight);tempPointDistance.Add(temp);}doublemin=tempPointDistance.Min();intindex=tempPointDistance.IndexOf(min);ChangedListStaff[i].Cluster=index;}}returnChangedListStaff;}(4)计算用Orandom交换代表对象Oj的总代价S;//////代价函数//////可能成为新中心点这个数据的位置///原有中心点在数据中的位置///所有数据(用链表形式进行保存)///publicdoubleGetS(intrandom,intj,ListListStaff){//获取j中心点属于第几簇intcluster=ListStaff[j].Cluster.Value;//获取原中心点数据数据项年龄intorgAge=ListStaff[j].Age.Value;//获取原中心点数据数据项身高doubleorgHeight=ListStaff[j].Height.Value;//获取原中心点数据数据项体重doubleorgWeight=ListStaff[j].Weight.Value;//获取可能成为新中心点数据数据项年龄intrandomAge=ListStaff[random].Age.Value;//获取可能成为新中心点数据数据项身高doublerandomHeight=ListStaff[random].Height.Value;//获取可能成为新中心点数据数据项体重doublerandomWeight=ListStaff[random].Weight.Value;doubleorgCount=0.0;doublerandomCount=0.0;doublesub=0.0;//获取这一簇里面存在的所有数据varclusterStaff=frompinListStaffwherep.Cluster.Equals(cluster)selectp;//遍历这一簇所有数据foreach(varcluserRowinclusterStaff){//计算距离doubleorgTempAge=Math.Pow(orgAge-cluserRow.Age.Value,2);doubleorgTempHeight=Math.Pow(orgHeight-cluserRow.Height.Value,2);doubleorgTempWeight=Math.Pow(orgWeight-cluserRow.Weight.Value,2);doubleorgDistance=Math.Sqrt(orgTempAge+orgTempHeight+orgTempWeight);doublerandomTempAge=Math.Pow(randomAge-cluserRow.Age.Value,2);doublerandomTempHeight=Math.Pow(randomHeight-cluserRow.Height.Value,2);doublerandomTempWeight=Math.Pow(randomWeight-cluserRow.Weight.Value,2);doublerandomDistance=Math.Sqrt(randomTempAge+randomTempHeight+randomTempWeight);orgCount+=orgDistance;randomCount+=randomDistance;}//得到交换后它们的代价sub=randomCount-orgCount;returnsub;}(5)核心函数k中心点算法(函数体内调用了上面的函数)//////k中心点算法//////分成k簇///原数据///publicListK_method(intk,ListOrgionListStaff){//初始化总代价doubles=0;//判断是否所有的中心点不在变化标志boolChanged=true;//初始化一个随机数生成器Randomccy=newRandom();//得到所有数据的个数intcount=OrgionListStaff.Count;//初始化整个数据变化后保存的链表集合ListChangedListStaff=newList();//初始化k个中心点保存链表集合ListCentainPoint=this.InitCentainPoint(k,OrgionListStaff,outChangedListStaff);while(Changed){//指派每个剩余的对象给离它最近的中心点所代表的簇ChangedListStaff=this.SetClusterList(k,OrgionListStaff,CentainPoint);//得到原始的中心点集合ListFirstCentainPoint=CentainPoint;for(intj=0;j{//得到一个随机数intrandom=ccy.Next(count-1);//如果这个数据是中心点,重新得到一个新的随机数(Flag是中心点标志)while(ChangedListStaff[random].Flag.Equals(1)){random=ccy.Next(count-1);if(random==count-1){random-=1;}if(random==0){random+=1;}}//得到交换中心点的总代价s=this.GetS(random,j,ChangedListStaff);//如果总代价<0if(s<0){//将Orandom换成新的中心点ChangedListStaff[random].Flag=1;//原中心点在数据的位置intOjIndex=ChangedListStaff.IndexOf(CentainPoint[j]);//把以前的中心点变成普通点ChangedListStaff[OjIndex].Flag=0;CentainPoint[j]=ChangedListStaff[random];}}//如果经过循环后所有中心点中心点都保持不变,循环结束if(FirstCentainPoint.Equals(CentainPoint)){//Changed为false后循环结束Changed=false;}else{//Changed为true后循环继续Changed=true;}}returnChangedListStaff;}Ø主界面解释(1)下面是我们软件的初始化主界面(图1-1),我们可以看到它是基于k中心点算法的一个数据挖掘软件,在右边是我们要进行处理的数据,我们将数据库中所有数据都提取到出来了,我们可以看到每一条记录有四个属性(姓名、年龄、身高、体重),而我们这个软件主要是针对其中的三个属性(年龄、身高、体重)进行数据挖掘,将他们进行数据分组,分组后的数据将会呈现在左边的分簇后数据的文本框中。图1-1(2)下面展示的是软件进行数据处理后的效果(如图1-2)我们在界面上输入8,将右边所有的数据分成8组,开始后经过数据处理展示出来的数据呈现在左边的分簇后数据的文本框中。图1-2仔细分析左边的分簇后数据的文本框中我们可以发现:各组之间我们通过普通的心算我们可以发现他们各组之间数据在年龄、身高、体重等综合因素比较下差距是比较大的,而族类之间的差距却是比较小。比如第1组与第2组,第一组中数据“邬海莹58岁-165厘米-60公斤”与第二组数据“熊玉莉1岁-30厘米-13公斤”,不论从年龄、身高和体重上面来说,他们之间的差距是比较大的,而第六组他们族类之间的数据比较后我们科研发现,不论是从年龄、身高还是体重方面他们之间的差距是非常小的。这与比较好的验证了k中心算法对于数据分类效果还是比较好的。Ø附录(源代码)(1)数据库代码xmlversion="1.0"encoding="utf-8"?>connectionString="DataSource=.;InitialCatalog=DataMin;IntegratedSecurity=True"providerName="System.Data.SqlClient"/>数据表存储类型publicpartialclassStaff:INotifyPropertyChanging,INotifyPropertyChanged{privatestaticPropertyChangingEventArgsemptyChangingEventArgs=newPropertyChangingEventArgs(String.Empty);privatestring_StaffID;privatestring_Name;privateSystem.Nullable_Age;privateSystem.Nullable_Height;privateSystem.Nullable_Weight;privateSystem.Nullable_Flag;privateSystem.Nullable_Cluster;publicStaff(){OnCreated();}[Column(Storage="_StaffID",DbType="NVarChar(50)NOTNULL",CanBeNull=false,IsPrimaryKey=true)]publicstringStaffID{get{returnthis._StaffID;}}[Column(Storage="_Name",DbType="NVarChar(50)")]publicstringName{get{returnthis._Name;}}[Column(Storage="_Age",DbType="Int")]publicSystem.NullableAge{get{returnthis._Age;}}[Column(Storage="_Height",DbType="Float")]publicSystem.NullableHeight{get{returnthis._Height;}}[Column(Storage="_Weight",DbType="Float")]publicSystem.NullableWeight{get{returnthis._Weight;}}[Column(Storage="_Flag",DbType="Int")]publicSystem.NullableFlag{get{returnthis._Flag;}}[Column(Storage="_Cluster",DbType="Int")]publicSystem.NullableCluster{get{returnthis._Cluster;}}(2)基类算法代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Collections;namespaceKpam{publicclassKCentain{//////初始化数据库对象///DsStaffDataContextDataContext=newDsStaffDataContext();//////获取数据库表中数据//////publicListGetStaf
doubletempAge=Math.Pow(ChangedListStaff[i].Age.Value-CentainPoint[j].Age.Value,2);
doubletempHeight=Math.Pow(ChangedListStaff[i].Height.Value
-CentainPoint[j].Height.Value,2);
doubletempWeight=Math.Pow(ChangedListStaff[i].Weight.Value-CentainPoint[j].Weight.Value,2);
doubletemp=Math.Sqrt(tempAge+tempHeight+tempWeight);
tempPointDistance.Add(temp);
doublemin=tempPointDistance.Min();
intindex=tempPointDistance.IndexOf(min);
ChangedListStaff[i].Cluster=index;
returnChangedListStaff;
(4)计算用Orandom交换代表对象Oj的总代价S;
///代价函数
///可能成为新中心点这个数据的位置
///原有中心点在数据中的位置
///所有数据(用链表形式进行保存)
publicdoubleGetS(intrandom,intj,ListListStaff)
//获取j中心点属于第几簇
intcluster=ListStaff[j].Cluster.Value;
//获取原中心点数据数据项年龄
intorgAge=ListStaff[j].Age.Value;
//获取原中心点数据数据项身高
doubleorgHeight=ListStaff[j].Height.Value;
//获取原中心点数据数据项体重
doubleorgWeight=ListStaff[j].Weight.Value;
//获取可能成为新中心点数据数据项年龄
intrandomAge=ListStaff[random].Age.Value;
//获取可能成为新中心点数据数据项身高
doublerandomHeight=ListStaff[random].Height.Value;
//获取可能成为新中心点数据数据项体重
doublerandomWeight=ListStaff[random].Weight.Value;
doubleorgCount=0.0;
doublerandomCount=0.0;
doublesub=0.0;
//获取这一簇里面存在的所有数据
varclusterStaff=frompinListStaff
wherep.Cluster.Equals(cluster)
//遍历这一簇所有数据
foreach(varcluserRowinclusterStaff)
//计算距离
doubleorgTempAge=Math.Pow(orgAge-cluserRow.Age.Value,2);
doubleorgTempHeight=Math.Pow(orgHeight-cluserRow.Height.Value,2);
doubleorgTempWeight=Math.Pow(orgWeight-cluserRow.Weight.Value,2);
doubleorgDistance=Math.Sqrt(orgTempAge+orgTempHeight+orgTempWeight);
doublerandomTempAge=Math.Pow(randomAge-cluserRow.Age.Value,2);
doublerandomTempHeight=Math.Pow(randomHeight-cluserRow.Height.Value,2);
doublerandomTempWeight=Math.Pow(randomWeight-cluserRow.Weight.Value,2);
doublerandomDistance=Math.Sqrt(randomTempAge+randomTempHeight+randomTempWeight);
orgCount+=orgDistance;
randomCount+=randomDistance;
//得到交换后它们的代价
sub=randomCount-orgCount;
returnsub;
(5)核心函数k中心点算法(函数体内调用了上面的函数)
///k中心点算法
publicListK_method(intk,ListOrgionListStaff)
//初始化总代价
doubles=0;
//判断是否所有的中心点不在变化标志
boolChanged=true;
//初始化一个随机数生成器
//得到所有数据的个数
intcount=OrgionListStaff.Count;
//初始化整个数据变化后保存的链表集合
ListChangedListStaff=newList();
//初始化k个中心点保存链表集合
ListCentainPoint=this.InitCentainPoint(k,OrgionListStaff,outChangedListStaff);
while(Changed)
ChangedListStaff=this.SetClusterList(k,OrgionListStaff,CentainPoint);
//得到原始的中心点集合
ListFirstCentainPoint=CentainPoint;
for(intj=0;j{//得到一个随机数intrandom=ccy.Next(count-1);//如果这个数据是中心点,重新得到一个新的随机数(Flag是中心点标志)while(ChangedListStaff[random].Flag.Equals(1)){random=ccy.Next(count-1);if(random==count-1){random-=1;}if(random==0){random+=1;}}//得到交换中心点的总代价s=this.GetS(random,j,ChangedListStaff);//如果总代价<0if(s<0){//将Orandom换成新的中心点ChangedListStaff[random].Flag=1;//原中心点在数据的位置intOjIndex=ChangedListStaff.IndexOf(CentainPoint[j]);//把以前的中心点变成普通点ChangedListStaff[OjIndex].Flag=0;CentainPoint[j]=ChangedListStaff[random];}}//如果经过循环后所有中心点中心点都保持不变,循环结束if(FirstCentainPoint.Equals(CentainPoint)){//Changed为false后循环结束Changed=false;}else{//Changed为true后循环继续Changed=true;}}returnChangedListStaff;}Ø主界面解释(1)下面是我们软件的初始化主界面(图1-1),我们可以看到它是基于k中心点算法的一个数据挖掘软件,在右边是我们要进行处理的数据,我们将数据库中所有数据都提取到出来了,我们可以看到每一条记录有四个属性(姓名、年龄、身高、体重),而我们这个软件主要是针对其中的三个属性(年龄、身高、体重)进行数据挖掘,将他们进行数据分组,分组后的数据将会呈现在左边的分簇后数据的文本框中。图1-1(2)下面展示的是软件进行数据处理后的效果(如图1-2)我们在界面上输入8,将右边所有的数据分成8组,开始后经过数据处理展示出来的数据呈现在左边的分簇后数据的文本框中。图1-2仔细分析左边的分簇后数据的文本框中我们可以发现:各组之间我们通过普通的心算我们可以发现他们各组之间数据在年龄、身高、体重等综合因素比较下差距是比较大的,而族类之间的差距却是比较小。比如第1组与第2组,第一组中数据“邬海莹58岁-165厘米-60公斤”与第二组数据“熊玉莉1岁-30厘米-13公斤”,不论从年龄、身高和体重上面来说,他们之间的差距是比较大的,而第六组他们族类之间的数据比较后我们科研发现,不论是从年龄、身高还是体重方面他们之间的差距是非常小的。这与比较好的验证了k中心算法对于数据分类效果还是比较好的。Ø附录(源代码)(1)数据库代码xmlversion="1.0"encoding="utf-8"?>connectionString="DataSource=.;InitialCatalog=DataMin;IntegratedSecurity=True"providerName="System.Data.SqlClient"/>数据表存储类型publicpartialclassStaff:INotifyPropertyChanging,INotifyPropertyChanged{privatestaticPropertyChangingEventArgsemptyChangingEventArgs=newPropertyChangingEventArgs(String.Empty);privatestring_StaffID;privatestring_Name;privateSystem.Nullable_Age;privateSystem.Nullable_Height;privateSystem.Nullable_Weight;privateSystem.Nullable_Flag;privateSystem.Nullable_Cluster;publicStaff(){OnCreated();}[Column(Storage="_StaffID",DbType="NVarChar(50)NOTNULL",CanBeNull=false,IsPrimaryKey=true)]publicstringStaffID{get{returnthis._StaffID;}}[Column(Storage="_Name",DbType="NVarChar(50)")]publicstringName{get{returnthis._Name;}}[Column(Storage="_Age",DbType="Int")]publicSystem.NullableAge{get{returnthis._Age;}}[Column(Storage="_Height",DbType="Float")]publicSystem.NullableHeight{get{returnthis._Height;}}[Column(Storage="_Weight",DbType="Float")]publicSystem.NullableWeight{get{returnthis._Weight;}}[Column(Storage="_Flag",DbType="Int")]publicSystem.NullableFlag{get{returnthis._Flag;}}[Column(Storage="_Cluster",DbType="Int")]publicSystem.NullableCluster{get{returnthis._Cluster;}}(2)基类算法代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Collections;namespaceKpam{publicclassKCentain{//////初始化数据库对象///DsStaffDataContextDataContext=newDsStaffDataContext();//////获取数据库表中数据//////publicListGetStaf
//得到一个随机数
intrandom=ccy.Next(count-1);
//如果这个数据是中心点,重新得到一个新的随机数(Flag是中心点标志)
while(ChangedListStaff[random].Flag.Equals
random=ccy.Next(count-1);
if(random==count-1)
random-=1;
if(random==0)
random+=1;
//得到交换中心点的总代价
s=this.GetS(random,j,ChangedListStaff);
//如果总代价<0
if(s<0)
//将Orandom换成新的中心点
ChangedListStaff[random].Flag=1;
//原中心点在数据的位置
intOjIndex=ChangedListStaff.IndexOf(CentainPoint[j]);
//把以前的中心点变成普通点
ChangedListStaff[OjIndex].Flag=0;
CentainPoint[j]=ChangedListStaff[random];
//如果经过循环后所有中心点中心点都保持不变,循环结束
if(FirstCentainPoint.Equals(CentainPoint))
//Changed为false后循环结束
Changed=false;
else
//Changed为true后循环继续
Changed=true;
Ø主界面解释
(1)下面是我们软件的初始化主界面(图1-1),我们可以看到它是基于k中心点算法的一个数据挖掘软件,在右边是我们要进行处理的数据,我们将数据库中所有数据都提取到出来了,我们可以看到每一条记录有四个属性(姓名、年龄、身高、体重),而我们这个软件主要是针对其中的三个属性(年龄、身高、体重)进行数据挖掘,将他们进行数据分组,分组后的数据将会呈现在左边的分簇后数据的文本框中。
图1-1
(2)下面展示的是软件进行数据处理后的效果(如图1-2)
我们在界面上输入8,将右边所有的数据分成8组,开始后经过数据处理展示出来的数据呈现在左边的分簇后数据的文本框中。
图1-2
仔细分析左边的分簇后数据的文本框中我们可以发现:
各组之间我们通过普通的心算我们可以发现他们各组之间数据在年龄、身高、体重等综合因素比较下差距是比较大的,而族类之间的差距却是比较小。
比如第1组与第2组,第一组中数据“邬海莹58岁-165厘米-60公斤”与第二组数据“熊玉莉1岁-30厘米-13公斤”,不论从年龄、身高和体重上面来说,他们之间的差距是比较大的,而第六组他们族类之间的数据比较后我们科研发现,不论是从年龄、身高还是体重方面他们之间的差距是非常小的。
这与比较好的验证了k中心算法对于数据分类效果还是比较好的。
Ø附录(源代码)
(1)数据库代码
xmlversion="1.0"encoding="utf-8"?
>
connectionString="DataSource=.;InitialCatalog=DataMin;IntegratedSecurity=True"providerName="System.Data.SqlClient"/>数据表存储类型publicpartialclassStaff:INotifyPropertyChanging,INotifyPropertyChanged{privatestaticPropertyChangingEventArgsemptyChangingEventArgs=newPropertyChangingEventArgs(String.Empty);privatestring_StaffID;privatestring_Name;privateSystem.Nullable_Age;privateSystem.Nullable_Height;privateSystem.Nullable_Weight;privateSystem.Nullable_Flag;privateSystem.Nullable_Cluster;publicStaff(){OnCreated();}[Column(Storage="_StaffID",DbType="NVarChar(50)NOTNULL",CanBeNull=false,IsPrimaryKey=true)]publicstringStaffID{get{returnthis._StaffID;}}[Column(Storage="_Name",DbType="NVarChar(50)")]publicstringName{get{returnthis._Name;}}[Column(Storage="_Age",DbType="Int")]publicSystem.NullableAge{get{returnthis._Age;}}[Column(Storage="_Height",DbType="Float")]publicSystem.NullableHeight{get{returnthis._Height;}}[Column(Storage="_Weight",DbType="Float")]publicSystem.NullableWeight{get{returnthis._Weight;}}[Column(Storage="_Flag",DbType="Int")]publicSystem.NullableFlag{get{returnthis._Flag;}}[Column(Storage="_Cluster",DbType="Int")]publicSystem.NullableCluster{get{returnthis._Cluster;}}(2)基类算法代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Collections;namespaceKpam{publicclassKCentain{//////初始化数据库对象///DsStaffDataContextDataContext=newDsStaffDataContext();//////获取数据库表中数据//////publicListGetStaf
connectionString="DataSource=.;InitialCatalog=DataMin;IntegratedSecurity=True"
providerName="System.Data.SqlClient"/>
数据表存储类型
publicpartialclassStaff:
INotifyPropertyChanging,INotifyPropertyChanged
privatestaticPropertyChangingEventArgsemptyChangingEventArgs=newPropertyChangingEventArgs(String.Empty);
privatestring_StaffID;
privatestring_Name;
privateSystem.Nullable_Age;
privateSystem.Nullable_Height;
privateSystem.Nullable_Weight;
privateSystem.Nullable_Flag;
privateSystem.Nullable_Cluster;
publicStaff()
OnCreated();
[Column(Storage="_StaffID",DbType="NVarChar(50)NOTNULL",CanBeNull=false,IsPrimaryKey=true)]
publicstringStaffID
get
returnthis._StaffID;
[Column(Storage="_Name",DbType="NVarChar(50)")]
publicstringName
returnthis._Name;
[Column(Storage="_Age",DbType="Int")]
publicSystem.NullableAge
returnthis._Age;
[Column(Storage="_Height",DbType="Float")]
publicSystem.NullableHeight
returnthis._Height;
[Column(Storage="_Weight",DbType="Float")]
publicSystem.NullableWeight
returnthis._Weight;
[Column(Storage="_Flag",DbType="Int")]
publicSystem.NullableFlag
returnthis._Flag;
[Column(Storage="_Cluster",DbType="Int")]
publicSystem.NullableCluster
returnthis._Cluster;
(2)基类算法代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Collections;
namespaceKpam
publicclassKCentain
publicListGetStaf
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1