图论聚类

简介

图论聚类方法最早是由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,'*')


原始数据:

                                                                                   

最小支撑树

移除权值大于阈值后:


  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python进行图论k聚类,需要用到networkx和scikit-learn库。以下是一个简单的示例: 首先,导入必要的库: ```python import networkx as nx import numpy as np from sklearn.cluster import KMeans ``` 接下来,创建一个图。这里使用networkx库创建了一个简单的图。你可以使用不同的方法创建不同的图,具体取决于你的需求。 ```python G = nx.Graph() G.add_edges_from([(1,2), (1,3), (2,3), (2,4), (3,4), (4,5), (5,6), (5,7), (6,7)]) ``` 然后,计算图中节点之间的距离。这里使用networkx库提供的最短路径算法来计算节点之间的距离。 ```python dist_matrix = np.zeros((len(G.nodes()), len(G.nodes()))) for i in range(len(G.nodes())): for j in range(i+1, len(G.nodes())): dist = nx.shortest_path_length(G, source=i+1, target=j+1) dist_matrix[i][j] = dist dist_matrix[j][i] = dist ``` 接下来,使用scikit-learn库的KMeans算法来进行聚类。这里将图中的节点分成3类。 ```python kmeans = KMeans(n_clusters=3, random_state=0).fit(dist_matrix) ``` 最后,将聚类结果可视化。这里使用networkx库提供的绘图功能来绘制图形,并根据聚类结果将节点分成不同的颜色。 ```python colors = ['r', 'g', 'b'] pos = nx.spring_layout(G) for i in range(len(G.nodes())): nx.draw_networkx_nodes(G, pos, nodelist=[i+1], node_color=colors[kmeans.labels_[i]]) nx.draw_networkx_edges(G, pos) nx.draw_networkx_labels(G, pos) plt.show() ``` 这个示例演示了如何使用Python进行图论k聚类。当然,这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值