对Weka中DBSCAN算法的分析以及在C#中的实现
2009-05-23 08:29:21 来源:WEB开发网buildClusterer方法中的代码比较简单,主要是提供一个处理入口。下面再来看expandCluster方法,这个方法要接收一个样本对象作为参数。在这个方法主要干几件事情:判断这个样本对象是不是核心对象,如果是核心对象再判断这个样本对象的epsilon邻域中的每一个对象,检查它们是不是核心对象,如果是核心对象则将其合并到当前的聚类中。源代码分析如下:
Weka.DBSCAN
//查找dataObject这个样本对象的epsilon邻域中的所有样本对象并将其存放到一个列表中,这个列表用于存放在密度区域过程扩展中欲处理的样本对象,后面还会用到这个列表
List seedList = database.epsilonRangeQuery(getEpsilon(), dataObject);
//判断dataObject是不是核心对象
if (seedList.size() < getMinPoints()) {
//如果不是核心对象则将其设置为噪声点
dataObject.setClusterLabel(DataObject.NOISE);
//将其设置为噪声点后要返回false以防止聚类编号的增加
return false;
}
//如果样本对象dataObject是核心对象,则对其邻域中的每一个对象进行处理
for (int i = 0; i < seedList.size(); i++) {
DataObject seedListDataObject = (DataObject) seedList.get(i);
//设置dataObject邻域中的每个样本对象的聚类标识,将其归为一个簇
seedListDataObject.setClusterLabel(clusterID);
//如果邻域中的样本对象与当前这个dataObject是同一个对象那么将其删除,如果在这里不做这个处理将会引起死循环
if (seedListDataObject.equals(dataObject)) {
seedList.remove(i);
i--;
}
}
//对dataObject的epsilon邻域中的每一个样本对象进行处理
for (int j = 0; j < seedList.size(); j++) {
//从邻域中取出一个样本对象seedListDataObject
DataObject seedListDataObject = (DataObject) seedList.get(j);
//查找seedListDataObject的epsilon邻域并取得其中所有的样本对象
List seedListDataObject_Neighbourhood = database.epsilonRangeQuery(getEpsilon(), seedListDataObject);
//判断seedListDataObject是不是核心对象
if (seedListDataObject_Neighbourhood.size() >= getMinPoints()) {
for (int i = 0; i < seedListDataObject_Neighbourhood.size(); i++){
DataObject p = (DataObject) seedListDataObject_Neighbourhood.get(i);
//如果seedListDataObject样本对象是一个核心对象则将这个样本对象邻域中的所有未被聚类的对象添加到seedList中
//并且设置其中未聚类对象或噪声对象的聚类标号为当前聚类标号
if (p.getClusterLabel() == DataObject.UNCLASSIFIED || p.getClusterLabel() == DataObject.NOISE) {
if (p.getClusterLabel() == DataObject.UNCLASSIFIED) {
//在这里将样本对象添加到seedList列表中的做法是一种广度优先的方法,通过这种方法来逐步扩展当前聚类。
//这是非常重要的一条语句。如果没有这句就不能形成扩展的查找趋势,不能找到一个完全的密度连接区域。
seedList.add(p);
}
p.setClusterLabel(clusterID);
}
}
}
//去除当前处理的样本点,其目的与前面一样,为了避免死循环
seedList.remove(j);
j--;
}
//查找到一个完整的密度连接区域后,返回真完成处理
return true;
- ››算法大全(3) 二叉树
- ››算法
- ››算法从哪学起
更多精彩
赞助商链接