Python使用算法生成知识图谱的x、y坐标和聚类(networkx、sklearn、Kamada-Kawai布局)

通过Kamada-Kawai算法或力引导布局算法生成知识图谱节点坐标

Kamada-Kawai算法是一种用于图数据可视化的布局算法,它通过模拟物理系统中的力来定位图中的节点。

Kamada-Kawai算法的核心思想是利用弹簧模型中的力学原理,将图中的节点视为带有电荷的粒子,通过计算节点间的斥力和连接点之间的引力来确定每个节点的位置。这种算法特别适合于展示大规模复杂网络中的社区结构或者模块化现象,因为它能够使得图中的社区或模块在空间上紧密地聚集在一起。

具体来说,Kamada-Kawai算法包括以下几个步骤:

  1. 初始化节点位置:所有节点最初随机分布在一个二维平面上。
  2. 计算节点间的作用力:每对节点之间都有一个基于它们之间距离的斥力,而相连的节点之间则有一个基于它们之间距离的引力。
  3. 根据力的平衡调整节点位置:节点会根据所受力的大小和方向移动到新的位置,以达到力的平衡状态。
  4. 迭代优化:重复上述过程,直到系统达到稳态,即所有节点的位置不再发生显著变化。

由于Kamada-Kawai算法涉及到大量的迭代计算,其时间复杂度相对较高,这在处理小规模数据时可能是可以接受的,但随着数据规模的增大,计算成本也随之增加。因此,对于大规模的图数据,可能需要采用分布式并行计算的方式来降低计算时间和提高效率。

AgglomerativeClustering 算法生成聚类

AgglomerativeClustering 是 scikit-learn(一个用于数据挖掘和数据分析的 Python 库)中的一个层次聚类算法。它使用自下而上的方法,通过计算不同类别之间的相似度或距离,将最接近的两个类别合并在一起,直到所有数据点都被归为一个类别为止。

安装工具包:

pip install networkx
pip install matplotlib
pip install scikit-learn

生成知识图谱的x、y坐标和聚类样例代码如下:

# -*-coding:utf-8-*-
import networkx as nx
from networkx.algorithms import community
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering

'''
    使用算法生成知识图谱的x、y坐标和聚类
'''


def get_laidu_networkx_index_and_cluster(nodes, edges, n_clusters_=3):
    # 获取每个实体分配坐标和聚类
    G = nx.Graph()
    # 创建一个无向图并添加节点和边
    G.add_nodes_from(nodes)
    G.add_edges_from(edges)

    # 使用Kamada-Kawai布局算法计算节点的位置
    pos = nx.kamada_kawai_layout(G)
    # 力导向布局
    # pos = nx.spring_layout(G, k=1, iterations=50)

    # pos 是一个字典,其键是节点,值是对应的 (x, y) 坐标
    # 你可以直接访问这些坐标
    x_coords = {node: pos[node][0] for node in G.nodes()}
    y_coords = {node: pos[node][1] for node in G.nodes()}

    x_y_dict = {}
    x_y_arr = []
    for key in nodes:
        x_y_obj = {
            'id': len(x_y_arr),
            'x': x_coords.get(key),
            'y': y_coords.get(key),
        }
        x_y_dict[key] = x_y_obj
        x_y_arr.append([x_coords.get(key), y_coords.get(key)])
    # 打印坐标
    print("X Coordinates:", x_coords)
    print("Y Coordinates:", y_coords)

    ##设置分层聚类函数
    linkages = ['ward', 'average', 'complete']
    ac = AgglomerativeClustering(linkage=linkages[1], n_clusters=n_clusters_)
    ac.fit(x_y_arr)
    ##每个数据的分类
    lables = ac.labels_
    print(f"聚类 lables={lables}")
    coordinates = {}
    for key in x_y_dict:
        index = x_y_dict.get(key).get('id')
        coordinates[key] = lables[index]

    # 绘制图形
    plt.figure(figsize=(10, 10))
    nx.draw(G, pos, with_labels=True, node_color='lightblue', edge_color='gray')
    plt.title('Knowledge Graph Layout using Kamada-Kawai Algorithm')
    plt.show()

    return coordinates, x_y_dict


if __name__ == '__main__':
    nodes = ['a', 'b', 3, 4, 5, 6, 7, 8]
    edges = [('a', 'b'), ('a', 3), ('b', 3), (3, 4), (4, 5), (5, 6), (7, 8), (3, 8), (8, 'a'), (8, 'b')]
    coordinates, x_y_dict = get_laidu_networkx_index_and_cluster(nodes, edges, 3)
    print(coordinates)
    print(x_y_dict)

运行生成的图谱:
在这里插入图片描述

AgglomerativeClustering聚类样例代码:

from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle  ##python自带的迭代器模块

##产生随机数据的中心
centers = [[1, 1], [-1, -1], [1, -1]]
##产生的数据个数
n_samples = 3000
##生产数据
X, lables_true = make_blobs(n_samples=n_samples, centers=centers, cluster_std=0.6,
                            random_state=0)

for arr in X:
    print(arr)

##设置分层聚类函数
linkages = ['ward', 'average', 'complete']
n_clusters_ = 5
ac = AgglomerativeClustering(linkage=linkages[2], n_clusters=n_clusters_)
##训练数据
ac.fit(X)

##每个数据的分类
lables = ac.labels_

##绘图
plt.figure(1)
plt.clf()

colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
    ##根据lables中的值是否等于k,重新组成一个True、False的数组
    my_members = lables == k
    ##X[my_members, 0] 取出my_members对应位置为True的值的横坐标
    plt.plot(X[my_members, 0], X[my_members, 1], col + '.')

plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()

运行生成的图谱:
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值