图论聚类
简介
图论聚类方法最早是由Zahn提出的,又称作最大(小)支撑聚类算法。图论聚类要建立与问题相适应的图,图的节点对应于被分析数据的最小单元,图的边或者是弧对应于最小数据之间的相似性度量。因此,每个最小处理单元之间都会有一个度量的表达,这就确保数据局部特性比较易于处理。图论聚类法是以样本数据的局域链接特征作为聚类的主要信息源,因而其优点是易于处理局部数据的特性。
图论聚类思想
图论分析中,把待分类的对象想x1,x2,x3,x4……看做一个全连接无向图G=[X,E]中的节点,然后给每一条边赋值,计算任意两点之间的距离(例如欧氏距离)定义为边的权值。并生成最小支撑树,设置阈值将对象进行聚类分析。
算法步骤
1. 利用prim算法构造最小支撑树。
2. 给定一个阈值r,在最小支撑树中移除权值大于阈值的边,形成森林。
3. 森林中包含剩下的所有的树。
4. 每棵树视为一个聚类。
Matlab算法实现
clear
clc
%creat sample
x1 = rand(9,1);
y1 = rand(9,1);
yuzhi = 0.05 %阈值
plot(x1,y1,'*');
%距离矩阵
for i=1:1:9
for j =1:1:9
dis(i,j) = (x1(i)-x1(j)).^ 2+ (y1(i) - y1(j)).^ 2 ;
if i == j
dis(i,j)=inf;
end
end
end
A =dis;
%prim最小支撑树
P = zeros(1, 9);
P(1,1) = 1;
V = 1:9;
V_P = V - P;
link = zeros(8,3); % start end dis
k=1;
while k<9
p = P(P~=0);
v = V_P(V_P~=0);
pv = min(min(A(p,v)));
[x, y] = find(A==pv);
for i=1:length(x)
if any(P==x(i)) &&any(V_P==y(i))
P(1,y(i)) = y(i);
V_P = V - P;
link(k, :) = [x(i),y(i),dis(x(i),y(i))]; %节点节点与节点之间的距离
k = k+1;
break;
end
end
end
%%画出最小支撑树
figure
for i=1:1:8
x = link(i,1:2)
plot(x1(x),y1(x));
hold on;
end
hold on
plot(x1,y1,'*')
cut_link = link;
k=0
%[a,b] = size(cut_link)
for i=1:1:8
cut = link(i,3)
if cut>yuzhi
cut_link(i-k,:) = [] ; %生成的森林
k=k+1;
end
end
%%画出聚类后数据
figure
[a,b] =size(cut_link);
for i=1:1:a
x = cut_link(i,1:2);
plot(x1(x),y1(x));
hold on;
end
hold on
plot(x1,y1,'*')
原始数据:
最小支撑树
移除权值大于阈值后: