表述方式一:
(1)设样本集合为S,确定两个阈值t1和t2,且t1>t2。
(2)任取一个样本点p属于S,作为一个Canopy,记为C,从S中移除p。
(3)计算S中所有点到p的距离dist。
(4)若dist<t1,则将相应点归到C,作为弱关联。
(5)检查所有dist,若dist<t2,则将相应点归到C并移出S,作为强关联。
(6)重复(2)~(5),直至S为空。
表述方式二:
(1)设样本集合为list,……
(2)取样本list的head作为p,作为一个canopy.记为C,从list中去除。
(3)任意选择点p,计算点p到每个canopy的距离dist。
(4)若 dist<T1 ,标记为弱标记;若 dist<T2 ,标记为强标记,并从list中删除。
(5)若p的标记没有发生变化且不是null, 或者dist>=T1,则将p作为一个新的canopy, 并从list中删除。
(6)若,则将p作为一个新的canopy, 并从list中删除。
(7)循环(3)~(6),至list为空。
附代码:
@@while ( list != null)
{
p=list.head;//or p=list.random(); Maybe the second is better!
centerlist.add(p);
list.del(p);
temp=list.head;
while( temp++ != list.end)
{
dist=distance(p,temp);
if ( dist < t1 ) p.sign=weaksign;
if ( dist < t2 ) { p.sign=sign; list.del(p); }
}
}
@@ p=list.head;
while ( list != null )
{
if( centerlist == null )
{
centerlist.add(p);
list.del(p);
p++;
continue;
}
node=centerlist.head;
oldsign=p.sign;
while( certerlist.tail != node )
{
dist=distance(node,p);
if( dist<T2 ) { p.sign=node.sign; list.del(p); }
else if( dist<T1 ) { p.sign=node.weaksign; }
node=node+sizeof(Node node);
}
if( dist>T1 || (oldsign == p.sign && p.sign != null )) { centerlist.add(p); list.del(p); }
if ( null == ++p ) p=list.head;
}