利用node2vec和k-means对图数据进行节点聚类分析
目录
- 1.k-means
- 2.karate_club_graph
- 3.davis_southern_women_graph
- 4.总结
在 node2vec代码实现及详细解析中我们详细地讨论了如何利用node2vec来对图的节点进行嵌入表示,并且最终得到了所有节点的维度为128的向量表示,借助节点的向量表示我们可以对节点进行一些分析。
1.k-means
最简单的想法就是对节点进行无监督分类,具体来讲就是聚类,根据其向量表示将相似的节点聚类在一起,关于k-means可以参考:机器学习之K_means(附简单手写代码),这里就不再详细解释了,这里直接给出代码:
def k_means(m, K):""":param m: node2vec的训练结果:param K: 类别数:return: 聚类结果"""nodes = list(G.nodes)# 任意选择K个节点作为初始聚类中心centers = []temp = []for i in range(K):t = np.random.randint(0, len(nodes) - 1)if nodes[t] not in centers:temp.append(nodes[t])centers.append(m[nodes[t]]) # 中心为128维向量# 迭代50次res = {}for i in range(K):res[i] = []for time in range(50):# clearfor i in range(K):res[i].clear()# 算出每个点的向量到聚类中心的距离nodes_distance = {}for node in nodes:# node到中心节点的距离node_distance = []for center in centers:node_distance.append(get_dis(m[node], center))nodes_distance[node] = node_distance # 保存node节点到各个中心的距离# 对每个节点重新划分类别,选择一个最近的节点进行分类,类别为0-5for node in nodes:temp = nodes_distance[node] # 存放着6个距离cls = temp.index(min(temp))res[cls].append(node)# 更新聚类中心centers.clear()for i in range(K):center = []for j in range(128):t = [m[node][j] for node in res[i]] # 第i个类别中所有node节点的第j个坐标center.append(np.mean(t))centers.append(center)return res
2.karate_club_graph
空手道俱乐部网络(karate_club_graph()):34个节点,每个节点代表成员,边记录了在俱乐部外互动的成对成员之间的联系。在研究期间,管理员“John A”和教练“Mr. Hi”(化名)之间发生了冲突,导致俱乐部一分为二。一半的成员围绕着Mr. Hi组成了一个新的俱乐部;另一部分的成员找到了新的教练或放弃了空手道。
简单来说,每一个节点都有一个标签(一共两种标签)。我们输出一下:
G = nx.karate_club_graph()
nodes = list(G.nodes.data())
print(nodes)
输出如下:
[(0, {'club': 'Mr. Hi'}), (1, {'club': 'Mr. Hi'}), (2, {'club': 'Mr. Hi'}), (3, {'club': 'Mr. Hi'}), (4, {'club': 'Mr. Hi'}), (5, {'club': 'Mr. Hi'}), (6, {'club': 'Mr. Hi'}), (7, {'club': 'Mr. Hi'}), (8, {'club': 'Mr. Hi'}), (9, {'club': 'Officer'}), (10, {'club': 'Mr. Hi'}), (11, {'club': 'Mr. Hi'}), (12, {'club': 'Mr. Hi'}), (13, {'club': 'Mr. Hi'}), (14, {'club': 'Officer'}), (15, {'club': 'Officer'}), (16, {'club': 'Mr. Hi'}), (17, {'club': 'Mr. Hi'}), (18, {'club': 'Officer'}), (19, {'club': 'Mr. Hi'}), (20, {'club': 'Officer'}), (21, {'club': 'Mr. Hi'}), (22, {'club': 'Officer'}), (23, {'club': 'Officer'}), (24, {'club': 'Officer'}), (25, {'club': 'Officer'}), (26, {'club': 'Officer'}), (27, {'club': 'Officer'}), (28, {'club': 'Officer'}), (29, {'club': 'Officer'}), (30, {'club': 'Officer'}), (31, {'club': 'Officer'}), (32, {'club': 'Officer'}), (33, {'club': 'Officer'})]
可以看到,所有成员被分为两类:Mr. Hi和Officer。
我们画出原始的图(不同的类别用不同的颜色标识):
color_map = []
ns = list(G.nodes.data())
nodes = list(g.nodes)
for node in nodes:if ns[node][1]['club'] == 'Mr. Hi':color_map.append('#DCBB8A')else:color_map.append('#98BBEF')
nx.draw(G, node_color=color_map, pos=pos, with_labels=True, node_size=1000)
plt.show()
如下所示:
使用node2vec得到所有节点的向量表示后,再进行聚类的效果如下:
可以发现,利用聚类来进行节点分类的效果很差劲(node2vec为下图,上图为原始图)
3.davis_southern_women_graph
戴维斯南方妇女社交网络,node2vec的表现如下:
4.总结
利用聚类直接对节点进行分类效果一般!
附:画图的完整代码:
def plot(g, m):""":param g: 图:param m: 节点的向量表示:return: none"""# 根据原始标签画图pos = nx.spring_layout(G)color_map = []ns = list(G.nodes.data())nodes = list(g.nodes)for node in nodes:if ns[node][1]['club'] == 'Mr. Hi':color_map.append('#DCBB8A')else:color_map.append('#98BBEF')plt.subplot(2, 1, 1)nx.draw(G, node_color=color_map, pos=pos, with_labels=True, node_size=1000)K = 2res = k_means(m, K)colors = ['#DCBB8A', '#98BBEF', 'navy', 'indigo', 'orange', 'blue']color_map.clear()for node in nodes:for i in range(len(res)):if node in res[i]:color_map.append(colors[i])break# drawplt.subplot(2, 1, 2)nx.draw(G, node_color=color_map, pos=pos, with_labels=True, node_size=1000)plt.show()
利用node2vec和k-means对图数据进行节点聚类分析相关推荐
- ICML 2022 重思考为图结构数据异常检测设计图神经网络 | 图数据异常节点检测 | 论文解读和代码复现
文章目录 一.引言 二.背景与挑战 三.论文主要内容 四.结果分析 五.代码复现 1. 环境配置 2. 结果复现 一.引言 Rethinking Graph Neural Networks for A ...
- 图神经网络(二)GCN的性质(2)GCN能够对图数据进行端对端学习
图神经网络(二)GCN的性质(2)GCN能够对图数据进行端对端学习 近几年,随着深度学习的发展,端对端学习变得越来越重要,人们普遍认为,深度学习的成功离不开端对端学习的作用机制.端对端学习实现了一种 ...
- 今天19:30 | 复旦大学青年副研究员许嘉蓉—《基于图数据的鲁棒机器学习 》
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 6月7日19:30,本期我们邀请到复旦大学青年副研究员许嘉蓉给大家带来精彩的分享! 哔哩哔哩直播通道 扫码关注AI TIME哔哩哔哩官方 ...
- 使用PyG进行图神经网络的节点分类、链路预测和异常检测
图神经网络(Graph Neural Networks)是一种针对图结构数据(如社交图.网络安全网络或分子表示)设计的机器学习算法.它在过去几年里发展迅速,被用于许多不同的应用程序.在这篇文章中我们将 ...
- 读取excel数据 画k线 成交量图
# -*- coding: utf-8 -*- """ Created on Tue Mar 23 18:32:15 2021@author: ""& ...
- 领峰:黄金k线走势图重要吗,如何利用其分析市场
目前在整个金融市场当中,人们所要选择的理财产品种类比较多,但人们在进行投资交易的过程中,首先要选择适合自己投资的具体产品,通过相互之间的对比和了解,能够看到黄金产品投资中的许多优势,这样给人们带来了更 ...
- 技术图文:如何利用 C# 爬取 ONE 的交易数据?
投资一个金融产品,最基本的就是拿到这个金融产品的交易数据,对这些数据进行可视化来判断趋势.去年,我在听 李笑来 讲区块链的课程上知道了 BigOne 这个由 INB 投资的交易所,而 ONE 是 Bi ...
- 在图数据上做机器学习,应该从哪个点切入?
作者 | David Mack 编译 | ronghuaiyang 来源 | AI公园(ID:AI_Paradise) [导读]很多公司和机构都在使用图数据,想在图上做机器学习但不知从哪里开始做,希望 ...
- kmeans改进 matlab,基于距离函数的改进k―means 算法
摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...
最新文章
- c语言退格的值是多少,在c语言里enter的键值是多少啊?
- AI加剧贫富分化不可避免,我们的职业会发生哪些变化?
- ESP32 OTA 接口简略说明
- iOS iOS9下修改回HTTP模式进行网络请求
- em oracle 安装,oracle-EM安装
- DCT原型 ——傅里叶级数
- php点击链接代码,php 获取超链接中文本的代码
- python 隐马尔科夫_机器学习算法之——隐马尔可夫(Hidden Markov ModelsHMM)原理及Python实现...
- 网络技术 几项技术!
- AD学习笔记(三)PCB封装库绘制
- S.O. 推出程序员身价计算器,看看自己值多少钱?
- 概率论基础-严士健 第二版 习题与补充3.2答案
- 宇视云所有故障排查思维导图
- 提高情商,从这几方面做
- OpenGL + Win32 SDK 开发框架的搭建(C语言版)
- 博客图片html代码,【html博客代码】图片羽化代码
- C语言|博客作业10
- 深度解决 SecurityException: User has not given permission to device UsbDevice
- 什么是CAS简单介绍
- 利用程序随机构造N个已解答的数独棋盘
热门文章
- python 中os.path 的一些路径常用函数
- Android 绘图和shape圆形
- 2021最新Linux从入门到精通(建议收藏,每日更新)
- silu to ONNX opset version 12 is not supported
- 走近刘文彬师哥,走进SB英语
- promise对象-代替回调函解决异步操作
- 纳斯达克支持XRP流动性指数XRPLX,XRP半小时涨超3%,突破0.3美元
- html火影忍者网页设计作品,《火影忍者》究极COSPLAY合集
- C4D 渲染出现大块黑色噪点
- 服装服饰行业使用SCRM会员管理软件是趋势吗?