实验5聚类.docx
- 文档编号:29798333
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:31
- 大小:26.48KB
实验5聚类.docx
《实验5聚类.docx》由会员分享,可在线阅读,更多相关《实验5聚类.docx(31页珍藏版)》请在冰豆网上搜索。
实验5聚类
实验5聚类
聚类分析(亦称为群集分析)是对于统计数据分析的一门技术,在许多领域受到广泛应用,包括机器学习,数据挖掘,模式识别,图像分析以及生物信息。
聚类把相似的样本通过静态分类的方法分成不同的子集,在同一个子集中的成员都有相似的一些属性,常见的包括在坐标系中更加短的空间距离等。
WEKA中包含有12中内置的聚类算法,下面是其中部分算法的介绍。
Cobweb
概念聚类的一种,不仅聚类,而且更进一步来找出每一个类的特征描述。
该方法并不显式地产生数据集的聚类,而是用分类树的形式表现层次聚类。
分类树的每一个节点表示了一个概念和对于这个概念(此概念总概了这个节点下的记录)的可能性描述。
可能性描述包括形成这个类的可能以及在某个条件下类中记录的可能,表示为P(Ai=Vij|Ck),Ai=Vij是个“属性-值”对,Ck是类。
CU(剪切值)的Ai=Vij表示了在条件Ck和没有条件Ck之下的偏差。
Cobweb以递增的方式将记录加入到分类树中去,它对于一个新的记录计算它与以分好的类的匹配度,选择最好的节点将这个新的记录放进去。
这个方法先将新记录暂时放到每一个已经形成的类中,然后计算每次放入后的CU值,值最大的就是要找的最匹配的类。
Cobweb也计算将这个新的记录作为一个新的节点时CU的值,如果这个值比上述过程所得到的都要大的话,就建立一个新类。
上述的操作对于的记录的顺序很敏感,Cobweb利用两个操作来将这种敏感性降到最低,这就是合并和分裂的方法,当对一个新的记录进行分类的时候,两个最好的类就可能被合并,当然这些决定必须根据CU值来确定。
Cobweb基于这样一个假设:
在每个属性上的概率分布是彼此独立的。
但这个假设并不总是成立。
分类树对于偏斜的输入数据不是高度平衡的,它可能导致时间和空间复杂性的剧烈变化。
Cobweb不适用于聚类大型数据库的数据。
DBScan
DBScan其基本思想:
只要领域中的密度(对象或者数据样本的数目)超过了某个阀值,就继续聚类。
换句话说,对给定簇中的每个数据样本,在给定半径的邻域内至少必须包含规定的阀值个点。
很明显,这样的方法可以用来过滤噪声数据,发现任意形状的簇。
对于给定的样本,称在其半径e范围内的一个记录为这个记录的ε-邻居。
如果一个记录的ε-邻居的个数超过最小值MinPts,就将这个记录称为中心记录。
一个数据集D,说一个样本p是样本q的直接密度可达记录,如果p是q的ε-邻居,并且q是个中心记录。
给定一串样本点p1,p2….pn,p=p1,q=pn,假如对象pi从pi-1直接密度可达,就说p是q的密度可达,如果pq都是一个记录o的密度可达,就称pq密度相连。
DBScan首先扫描数据库,记录每一个样本的ε-邻居个数,如果一个记录的ε-邻居个数大于一个阈限值,就这个记录叫做中心记录。
这样一个新的以这个记录为中心的类就产生了。
接着,寻找这个记录的所有密度可达记录,这个过程可能会将一些类也合并过来,直到没有新的纪录加入为止。
因为DBScan使用簇的基于密度的定义,因此它是相对抗噪声的,并且能处理任意形状和大小的簇。
但是如果簇的密度变化很大,例如ABCD四个簇,AB的密度远大于CD,而且AB附近噪声的密度与簇CD的密度相当,当MinPs较大时,无法识别簇CD,簇CD和AB附近的噪声都被认为是噪声;当MinPs较小时,能识别簇CD,但AB跟其周围的噪声被识别为一个簇。
EM
求参数极大似然估计的一种方法,它可以从非完整数据集中对参数进行估计。
包含两个步骤:
E步骤-计算期望值,M步骤-重新计算参数值
E-步:
计算完整数据的对数似然函数的期望,记为:
Q(Θ|Θ(t))=E{Lc(Θ;Z)|X;Θ(t)};
M-步:
通过最大化Q(Θ|Θ(t))来获得新的Θ
直观地理解EM算法,它也可被看作为一个逐次逼近算法:
事先并不知道模型的参数,可以随机的选择一套参数或者事先粗略地给定某个初始参数λ0,确定出对应于这组参数的最可能的状态,计算每个训练样本的可能结果的概率,在当前的状态下再由样本对参数修正,重新估计参数λ,并在新的参数下重新确定模型的状态,这样,通过多次的迭代,循环直至某个收敛条件满足为止,就可以使得模型的参数逐渐逼近真实参数。
HierarchicalClusterer
包括分裂(自顶向下)与合并(自底向上)两种形式。
层次聚类算法产生一个嵌套聚类的层次,算法最多包含N步,在第t步,执行的操作就是在前t-1步的聚类基础上生成新聚类。
缺点是当在算法开始阶段,若出现聚类错误,那么这种错误将一直会被延续,无法修改。
SimpleKMeans
对于输入量k,将n个数据对象划分为k个聚类,使得所获得的聚类满足:
同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
查看基本k-均值算法实现步骤可以发现,该聚类算法将所有数据点样本都进行了指派,不识别噪声。
选择适当的初始聚类中心是算法的关键,不同的初始聚类中心可能导致截然不同的聚类结果。
它不能处理非球形簇,不同尺寸和不同密度的簇。
XMeans
k-means的改进,在总体记录中通过k-means产生聚类,再分别对每个聚类进行k-means式的迭代,将某些子类再进行聚类,直到达到用户设定的迭代次数为止。
实验内容:
1、使用不同的聚类算法对数据集进行分类。
2、通过各种不同的可视化选项观察聚类结果(Visualize...)。
3、WEKA可以支持增加新算法,根据书上324页例11.4,为WEKA添加一个新聚类算法。
packageweka.clusterers;
importweka.classifiers.rules.DecisionTableHashKey;
importweka.core.Capabilities;
importweka.core.Instance;
importweka.core.Instances;
importweka.core.Option;
importweka.core.Utils;
importweka.core.WeightedInstancesHandler;
importweka.core.Capabilities.Capability;
importweka.core.matrix.Matrix;
importweka.filters.Filter;
importweka.filters.unsupervised.attribute.ReplaceMissingValues;
importjava.util.Enumeration;
importjava.util.HashMap;
importjava.util.Random;
importjava.util.Vector;
publicclassmohusuanfa
extendsRandomizableClusterer
implementsNumberOfClustersRequestable,WeightedInstancesHandler{
staticfinallongserialVersionUID=-2134543132156464L;
privateReplaceMissingValuesm_ReplaceMissingFilter;
privateintm_NumClusters=2;
privateMatrixD;
privatedoublem_fuzzifier=2;
privateInstancesm_ClusterCentroids;
privateInstancesm_ClusterStdDevs;
privateint[][][]m_ClusterNominalCounts;
privateint[]m_ClusterSizes;
privatedouble[]m_Min;
privatedouble[]m_Max;
privateintm_Iterations=0;
privatedouble[]m_squaredErrors;
publicmohusuanfa(){
super();
m_SeedDefault=10;//初始化种子个数
setSeed(m_SeedDefault);
}
publicStringglobalInfo(){
return"Clusterdatausingthefuzzykmeansalgorithm";
}
publicCapabilitiesgetCapabilities(){
Capabilitiesresult=super.getCapabilities();
result.disableAll();
result.enable(Capability.NO_CLASS);
//attributes
result.enable(Capability.NOMINAL_ATTRIBUTES);
result.enable(Capability.NUMERIC_ATTRIBUTES);
result.enable(Capability.MISSING_VALUES);
returnresult;
}
publicvoidbuildClusterer(Instancesdata)throwsException{
getCapabilities().testWithFail(data);
m_Iterations=0;
m_ReplaceMissingFilter=newReplaceMissingValues();
Instancesinstances=newInstances(data);//实例
instances.setClassIndex(-1);
m_ReplaceMissingFilter.setInputFormat(instances);
instances=Filter.useFilter(instances,m_ReplaceMissingFilter);
m_Min=newdouble[instances.numAttributes()];
m_Max=newdouble[instances.numAttributes()];
for(inti=0;i m_Min[i]=m_Max[i]=Double.NaN;//随机分配不定值 } m_ClusterCentroids=newInstances(instances,m_NumClusters);//聚类中心 int[]clusterAssignments=newint[instances.numInstances()]; for(inti=0;i updateMinMax(instances.instance(i));//更新最大最小值 } RandomRandomO=newRandom(getSeed());//随机数 intinstIndex; HashMapinitC=newHashMap(); DecisionTableHashKeyhk=null; for(intj=instances.numInstances()-1;j>=0;j--){ instIndex=RandomO.nextInt(j+1); hk=newDecisionTableHashKey(instances.instance(instIndex), instances.numAttributes(),true); if(! initC.containsKey(hk)){ m_ClusterCentroids.add(instances.instance(instIndex)); initC.put(hk,null); } instances.swap(j,instIndex); if(m_ClusterCentroids.numInstances()==m_NumClusters){ break; } } m_NumClusters=m_ClusterCentroids.numInstances();//聚类个数=聚类中心个数 D=newMatrix(solveD(instances).getArray());//求聚类中心到每个实例的距离 inti,j; intn=instances.numInstances(); Instances[]tempI=newInstances[m_NumClusters]; m_squaredErrors=newdouble[m_NumClusters]; m_ClusterNominalCounts=newint[m_NumClusters][instances.numAttributes()][0]; MatrixU=newMatrix(solveU(instances).getArray());//初始化隶属矩阵U doubleq=0;//初始化价值函数值 while(true){ m_Iterations++; for(i=0;i InstancetoCluster=instances.instance(i); intnewC=clusterProcessedInstance(toCluster,true);clusterAssignments[i]=newC; } m_ClusterCentroids=newInstances(instances,m_NumClusters); for(i=0;i tempI[i]=newInstances(instances,0); } for(i=0;i tempI[clusterAssignments[i]].add(instances.instance(i)); } for(i=0;i double[]vals=newdouble[instances.numAttributes()]; for(j=0;j doublesum1=0,sum2=0; for(intk=0;k sum1+=U.get(i,k)*U.get(i,k)*instances.instance(k).value(j); sum2+=U.get(i,k)*U.get(i,k); } vals[j]=sum1/sum2; } m_ClusterCentroids.add(newInstance(1.0,vals)); } D=newMatrix(solveD(instances).getArray()); U=newMatrix(solveU(instances).getArray());//计算新的聿属矩阵U doubleq1=0;//新的价值函数值 for(i=0;i for(j=0;j q1+=Math.pow(U.get(i,j),getFuzzifier())*D.get(i,j)*D.get(i,j); } } if(q1-q<2.2204e-16){ break; } q=q1; } m_ClusterStdDevs=newInstances(instances,m_NumClusters); m_ClusterSizes=newint[m_NumClusters]; for(i=0;i double[]vals2=newdouble[instances.numAttributes()]; for(j=0;j if(instances.attribute(j).isNumeric()){//判断属性是否是数值型的? ! vals2[j]=Math.sqrt(tempI[i].variance(j)); }else{ vals2[j]=Instance.missingValue(); } } m_ClusterStdDevs.add(newInstance(1.0,vals2));//1.0代表权值,vals2代表属性值 m_ClusterSizes[i]=tempI[i].numInstances(); } } privateintclusterProcessedInstance(Instanceinstance,booleanupdateErrors){ doubleminDist=Integer.MAX_VALUE; intbestCluster=0; for(inti=0;i doubledist=distance(instance,m_ClusterCentroids.instance(i)); if(dist minDist=dist; bestCluster=i; } } if(updateErrors){ m_squaredErrors[bestCluster]+=minDist; } returnbestCluster; } publicintclusterInstance(Instanceinstance)throwsException{ m_ReplaceMissingFilter.input(instance); m_ReplaceMissingFilter.batchFinished(); Instanceinst=m_ReplaceMissingFilter.output(); returnclusterProcessedInstance(inst,false); } privateMatrixsolveD(Instancesinstances){ intn=instances.numInstances(); MatrixD=newMatrix(m_NumClusters,n); for(inti=0;i for(intj=0;j D.set(i,j,distance(instances.instance(j),m_ClusterCentroids.instance(i))); if(D.get(i,j)==0){ D.set(i,j,0.000000000001); } } } returnD; } privateMatrixsolveU(Instancesinstances){ intn=instances.numInstances(); inti,j; MatrixU=newMatrix(m_NumClusters,n); for(i=0;i for(j=0;j doublesum=0; for(intk=0;k sum+=Math.pow(D.get(i,j)/D.get(k,j),2/(getFuzzifier()-1)); } U.set(i,j,Math.pow(sum,-1)); } } returnU; } privatedoubledistance(Instancefirst,Instancesecond){ doubleval1; doubleval2; doubledist=0.0; for(inti=0;i val1=first.value(i); val2=second.value(i); dist+=(val1-val2)*(val1-val2); } dist=Math.sqrt(dist); returndist; } privatevoidupdateMinMax(Instanceinstance){ for(intj=0;j if(! instance.isMissing(j)){ if(Double.isNaN(m_Min[j])){ m_Min[j]=instance.value(j); m_Max[j]=instance.value(j); }else{ if(instance.value(j) m_Min[j]=instance.value(j); }else{ if(instance.value(j)>m_Max[j]){ m_Max[j]=instance.value(j); } } } } } } pub
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验5 聚类 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)