网络分析(Network Analysis)入门篇(一) 网络节点的性质

目录

  1. 网络节点的性质
  2. 网络的性质
  3. 网络层次性评价
  4. 动态网络演化——随机图模型
  5. 动态网络演化——有偏好的交友模型

网络分析是数据挖掘中重要的一部分,涉及到的知识和图论有一定的联系,这里讲到的网络分析更倾向于社交网络分析,可以是人与人之间的好友关系,电子邮件的发送关系,也可以推广到互联网网站之间的关系等等。

为什么我们要研究网络分析呢,随着大数据时代的到来,人们积累数据的意识也越来越强烈,那么如何在积累到的数据中获得我们想要的信息,越来越受到人们的关注。社交网络,QQ空间或者朋友圈的公开评价,公司电子邮件的记录,疾病的发展,网站的访问,等等。越来越多的可以连成网络的数据被保存下来,那么学会分析这些数据可以帮助我们在杂乱的连接关系中找到我们所需要的信息。

比如说有人研究一个公司在繁盛时期的邮件发送网络以及工作往来的联系,与其和该公司破产前夕的网络进行对比分析,从中发现在破产前公司的邮件往来变得复杂,而且一个员工开始面对多个上司的指令,进而整个公司的管理开始从一个层次明晰的组织(可以用层次hierarchy度量)发展为一个结构不清晰的组织,而在这时业绩也出现了不断下滑的趋势,因此构成了公司倒闭的重要原因之一。

为了入门网络分析,我们先直观的看一个网络的结构图,下图就是一个经典的网络,其中每个节点(Node)代表着人,而每个边(Edge)代表着朋友关系。
简单社交网络示意图
图分为有向(directed)图无向(undirected)图。所谓的有向图就是连接两个节点之间的边是有方向的,比如说一个代表债务的图,一个人A欠另一个B钱,那么B是债主A是欠债人,这个关系就是单向的,因此边就用带箭头的线来表示。无向图,例如代表婚姻关系的图,那么A是B的配偶,B自然也是A的配偶,因此二者关系平等就用没有箭头或者双向箭头的线来表示。有的时候边也是有权重的,这个权重可以代表二者连接关系的紧密程度,节点为ip地址,你经常访问百度,那么你的ip地址和百度的ip地址的连接更紧密,边的权重也就更大。

下面介绍三个网络中节点的重要的性质。

  1. 度中心性(Degree Centrality): 一个节点直接相连的节点的个数。假如在一个社交网络中,节点代表的是人,边代表的是好友关系,那么一个节点的度中心性越大,就说明这个人的好友越多。这样的人可能是比较有名望的人物,如果需要散布一些消息的话,这样的人最适合,因为他的一条状态可以被很多很多的人看到。
  2. 紧密中心性(Closeness Centrality): 一个节点到其他所有节点的最短距离的加和,或者是加和的倒数。通常来讲紧密中心性是加和的倒数,也就是说紧密中心性的值在0到1之间,紧密中心性越大则说明这个节点到其他所有的节点的距离越近,越小说明越远。在一些定义中不取倒数,就是该节点到其他节点的最短距离加和,这样定义的话紧密中心性越小说明该点到其他点的距离越近。紧密中心性刻画了一个节点到其他所有节点的性质,在社交网络中,一个人的紧密中心性越大说明这个人能快速的联系到所有的人,可能自己认识的不多,但是有很知名的朋友,可以通过他们快速的找到其他人。
  3. 中介中心性(Betweenness Centrality): 一个点位于网络中多少个两两联通节点的最短路径上,就好像“咽喉要道”一样,如果联通两个节点A和B的最短路径一定经过点C,那么C的中介中心性就加一,如果说A和B最短路径有很多,其中有的最短路径不经过C,那么C的中介中心性不增加。中介中心性刻画了一个节点掌握的资源多少,在社交网络中,一个人的中介中心性越大说明这个人掌握了更多的资源而且不可替代(必须经过他,不存在其他的最短路径),就好像房屋中介一样,一边是买房的人一边是卖房的人,买卖双方要想联系就要经过中介。

以上是节点的重要的性质,在下一节中我们会介绍整个网络的性质。

  • 48
    点赞
  • 232
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 以下是一个简单的图神经网络节点分类的代码示例: ```python import torch import torch.nn.functional as F from torch_geometric.nn import GCNConv class GCN(torch.nn.Module): def __init__(self, num_features, num_classes): super(GCN, self).__init__() self.conv1 = GCNConv(num_features, 16) self.conv2 = GCNConv(16, num_classes) def forward(self, x, edge_index): x = F.relu(self.conv1(x, edge_index)) x = F.dropout(x, training=self.training) x = self.conv2(x, edge_index) return F.log_softmax(x, dim=1) ``` 这个模型使用了 PyTorch Geometric 库中的 GCNConv 层来进行图卷积操作。输入的节点特征 x 和边索引 edge_index 会被传入两个 GCNConv 层中,最后输出一个经过 softmax 处理的概率分布,表示每个节点属于不同类别的概率。 ### 回答2: 图神经网络(Graph Neural Network,GNN)是一种用于处理图结构数据的深学习模型。节点分类是GNN的一种常见任务,通过将节点分为不同的类别来预测节点的标签。 下面是一个简单的图神经网络节点分类的代码示例: 1. 首先导入所需的库,包括PyTorch和DGL(Deep Graph Library): ```python import torch import torch.nn as nn import dgl import dgl.function as fn from dgl.nn.pytorch import GraphConv ``` 2. 定义图神经网络模型,这里使用了两层Graph Convolutional Network(GCN): ```python class GCN(nn.Module): def __init__(self, in_feats, hid_feats, out_feats): super(GCN, self).__init__() self.conv1 = GraphConv(in_feats, hid_feats) self.conv2 = GraphConv(hid_feats, out_feats) def forward(self, g, features): x = torch.relu(self.conv1(g, features)) x = self.conv2(g, x) return x ``` 3. 创建图和特征,并初始化模型: ```python # 创建图 g = dgl.graph(([0, 1, 2, 3], [1, 2, 3, 0])) # 创建节点特征 features = torch.tensor([[0.0], [1.0], [2.0], [3.0]]) # 创建标签(用于训练) labels = torch.tensor([0, 1, 0, 1]) # 初始化模型 in_feats = features.shape[1] hid_feats = 2 out_feats = 2 model = GCN(in_feats, hid_feats, out_feats) ``` 4. 定义损失函数和优化器: ```python criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.01) ``` 5. 进行模型训练: ```python def train(epoch): model.train() optimizer.zero_grad() logits = model(g, features) loss = criterion(logits, labels) loss.backward() optimizer.step() print('Epoch {}, Loss: {:.4f}'.format(epoch, loss.item())) for epoch in range(100): train(epoch) ``` 以上代码中,首先定义了一个两层的GCN模型,然后创建了一个包含4个节点的图和对应的节点特征和标签。接着定义了损失函数和优化器,并进行了模型的训练。每个epoch,模型会前向传播计算输出,然后计算损失并进行反向传播更新模型参数。 这只是一个简单的示例,实际应用中可能还需要进行更复杂的模型设计和调参。此外,为了更好地处理大规模图数据,还可以使用更高级的图神经网络模型和优化算法。 ### 回答3: 图神经网络(Graph Neural Network,简称GNN)是一种能够处理图数据的神经网络模型。节点分类是GNN的一种常见任务,即给定一个图,预测出每个节点的类别。下面是一个简单的例子,演示了如何使用DGL库构建一个GNN模型来进行节点分类的代码。 首先,需要导入必要的库,包括DGL库和其他相关的深学习库: ```python import dgl import torch import torch.nn as nn import torch.nn.functional as F from dgl.nn import GraphConv ``` 接下来,定义一个GNN模型类,继承自`nn.Module`: ```python class GNN(nn.Module): def __init__(self, in_dim, hidden_dim, num_classes): super(GNN, self).__init__() self.graph_conv1 = GraphConv(in_dim, hidden_dim) self.graph_conv2 = GraphConv(hidden_dim, hidden_dim) self.graph_conv3 = GraphConv(hidden_dim, num_classes) def forward(self, g, features): h = self.graph_conv1(g, features) h = F.relu(h) h = self.graph_conv2(g, h) h = F.relu(h) h = self.graph_conv3(g, h) return h ``` 在`__init__`函数中,定义了三个GraphConv层,每个层的输入维、隐藏层维和输出类别数目分别为`in_dim`、`hidden_dim`和`num_classes`。在`forward`函数中,通过多次使用GraphConv层和ReLU激活函数进行特征的传播和变换。 最后,训练和评估模型的代码如下所示: ```python # 构建图数据 g = dgl.graph(([0, 1, 2, 3, 4], [1, 2, 3, 4, 0])) features = torch.randn(5, in_dim) labels = torch.tensor([0, 1, 0, 1, 0]) # 初始化模型和优化器 model = GNN(in_dim, hidden_dim, num_classes) optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 训练模型 for epoch in range(num_epochs): logits = model(g, features) loss = F.cross_entropy(logits, labels) optimizer.zero_grad() loss.backward() optimizer.step() print('Epoch {}, Loss: {}'.format(epoch, loss.item())) # 评估模型 with torch.no_grad(): logits = model(g, features) predicted_labels = torch.argmax(logits, dim=1) accuracy = torch.sum(predicted_labels == labels).item() / len(labels) print('Accuracy: {}'.format(accuracy)) ``` 在训练阶段,通过计算预测值和真实标签之间的交叉熵损失来优化模型。在评估阶段,使用训练好的模型对新的样本进行预测,并计算准确率。 以上是一个简单的图神经网络节点分类的代码示例,实际应用中可以根据具体情况进行调整和扩展。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值