基于K中心点数据挖掘课程设计论文原创Word格式.docx
《基于K中心点数据挖掘课程设计论文原创Word格式.docx》由会员分享,可在线阅读,更多相关《基于K中心点数据挖掘课程设计论文原创Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
(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)调用数据库,把数据库中的数据提取出来进行挖掘。
下面是代码
///<
summary>
///初始化数据库对象
/summary>
DsStaffDataContextDataContext=newDsStaffDataContext();
///获取数据库表中数据
returns>
<
/returns>
publicList<
Staff>
GetStaff()
{
//用链表List初始化数据对象
List<
aStaff=newList<
();
//查询数据库中的Staff表
varStaffTable=frompinDataContext.Staffs
selectp;
//遍历查询出来的表,然后将每一条记录放入初始化的链表List对象aStaff中
foreach(StaffaStaffRowinStaffTable)
aStaff.Add(aStaffRow);
}
returnaStaff;
(2)从n个对象的集合中随意选取k个对象作为初始化的中心点,下面是实现的函数:
///<
///初始化中心点
paramname="
k"
>
分成k簇<
/param>
OrgionListStaff"
原数据<
ChangedListStaff"
改变后数据<
InitCentainPoint(intk,List<
OrgionListStaff,outList<
ChangedListStaff)
_Staff=newList<
(k);
//随机数生成器
Randomccy=newRandom();
//保持随机数
int>
randomList=newList<
for(inti=0;
i<
k;
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)将每个剩余的对象指派到最近的中心点所代表的簇
///指派每个剩余的对象给离它最近的中心点所代表的簇
数据<
CentainPoint"
中心点集合<
SetClusterList(intk,List<
ChangedListStaff,List<
CentainPoint)
//得到数据的个数
intcount=ChangedListStaff.Count;
//指派每个剩余的对象给离它最近的中心点所代表的簇
count;
double>
tempPointDistance=newList<
//如果不是中心点(Flag代表是否为中心点,1为中心点)
if(!
ChangedListStaff[i].Flag.Equals
(1))
//计算剩余的点到每个中心点的距离,然后分到距离最小的那一簇里面
for(intj=0;
j<
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;
///代价函数
random"
可能成为新中心点这个数据的位置<
j"
原有中心点在数据中的位置<
ListStaff"
所有数据(用链表形式进行保存)<
publicdoubleGetS(intrandom,intj,List<
ListStaff)
//获取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中心点算法
K_method(intk,List<
OrgionListStaff)
//初始化总代价
doubles=0;
//判断是否所有的中心点不在变化标志
boolChanged=true;
//初始化一个随机数生成器
//得到所有数据的个数
intcount=OrgionListStaff.Count;
//初始化整个数据变化后保存的链表集合
ChangedListStaff=newList<
//初始化k个中心点保存链表集合
CentainPoint=this.InitCentainPoint(k,OrgionListStaff,outChangedListStaff);
while(Changed)
ChangedListStaff=this.SetClusterList(k,OrgionListStaff,CentainPoint);
//得到原始的中心点集合
FirstCentainPoint=CentainPoint;
//得到一个随机数
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);
//如果总代价<
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"
?
configuration>
<
configSections>
/configSections>
connectionStrings>
addname="
Kpam.Properties.Settings.DataMinConnectionString"
connectionString="
DataSource=.;
InitialCatalog=DataMin;
IntegratedSecurity=True"
providerName="
System.Data.SqlClient"
/>
/connectionStrings>
/configuration>
数据表存储类型
publicpartialclassStaff:
INotifyPropertyChanging,INotifyPropertyChanged
privatestaticPropertyChangingEventArgsemptyChangingEventArgs=newPropertyChangingEventArgs(String.Empty);
privatestring_StaffID;
privatestring_Name;
privateSystem.Nullable<
_Age;
_Height;
_Weight;
_Flag;
_Cluster;
publicStaff()
{
OnCreated();
}
[Column(Storage="
_StaffID"
DbType="
NVarChar(50)NOTNULL"
CanBeNull=false,IsPrimaryKey=true)]
publicstringStaffID
get
{
returnthis._StaffID;
}
_Name"
NVarChar(50)"
)]
publicstringName
returnthis._Name;
_Age"
Int"
publicSystem.Nullable<
Age
returnthis._Age;
_Height"
Float"
Height
returnthis._Height;
_Weight"
Weight
returnthis._Weight;
_Flag"
Flag
returnthis._Flag;
_Cluster"
Cluster
returnthis._Cluster;
(2)基类算法代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Collections;
namespaceKpam
{
publicclassKCentain
GetStaf