%% BFSN 广度优先搜索邻居的聚类算法
function A=BFSN_Algorithm(G,r,lambda)
%G为相似矩阵
%r为邻居门限,相似度大于r的为邻居;未分类的元素对某类所有的元素,如果是邻居则令x(i)=1,否则为0,i为类元素的下标
%lamda为类区分的元素,对x求和并除以元素个数,若此值大于lamda,则该元素属于这类
A={};%A为聚类结果
k=1;%k为分类计数
n=size(G,1);%n为待分类的元素个数
member=1:n;%创建元素向量
while numel(member)~=0 %只要member中还有元素就继续
a=member(1);%从member中取出一个元素
%新建空类A并将a送入Ak类
Ak=a;
%从member中删除a
member(1)=[];
%扫描member中的所有元素
%queue为广度优先搜索使用的队列
%将a送入queue中
queue=a;
%已访问过的元素
visited=zeros(1,n);
%如果队列非空说明还有没有检验过的邻居
while numel(queue)~=0
%一个元素出队
p=queue(1);
queue(1)=[];
%扫描member中所有元素
for count=1:numel(member)
%用member(count)作为待分类的元素
%p是从queue中取出,找到p的所有未访问邻居
if G(p,member(count))>r && visited(member(count))==0
%满足if的member(count)是未访问过的邻居
%放入queue中
queue=[queue member(count)];
%member(count)已经访问过了
visited(member(count))=1;
if sum(G(member(count),Ak)>r)/numel(Ak)>=lambda
%满足if的元素属于Ak类,根据lambda门限判断
Ak=[Ak member(count)];
member(count)=-1;
end
end
end
%删除member中已分类的元素
member(member==-1)=[];
end
%将Ak保存在cell数组A的第k个位置
A{k}=Ak;
%k指向下一个分类
k=k+1;
end