使用逻辑回归的梯度下降训练
梯度下降
梯度下降算法及其变体(Adam、SGD 等。)已经成为许多机器学习应用中非常流行的训练(优化)算法。优化算法可以非正式地分为两类——基于梯度的和无梯度的(例如粒子群、遗传算法等。).你可以猜到,梯度下降是一种基于梯度的算法。为什么梯度在训练机器学习中很重要?
训练机器学习模型的目的是通过改变可训练参数来最小化基础事实和预测之间的损失或误差。梯度是导数在多维空间中的延伸,它告诉我们损失或误差最佳最小化的方向。如果你还记得向量微积分课上,梯度被定义为最大变化率。因此,梯度下降的公式很简单:
θj 是可训练参数,j. α是学习率。J(θ)是一个成本函数。
在下图中,从起点(峰)到最佳点(谷)的最短距离是沿着渐变轨迹。相同的原理适用于多维空间,这通常是机器学习训练的情况。
为了演示梯度下降如何应用于机器学习训练,我们将使用逻辑回归。
逻辑回归
二元情况
为了理解 LR 的工作原理,让我们想象以下场景:我们想根据年龄(x1)、年收入(x2)和教育程度(x3)来预测一个人的性别(男性= 0,女性= 1)。如果 Y 是预测值,则此问题的逻辑回归模型将采用以下形式:
Z = B0+B1(x1)+B2(x2)+B3(x3)
Y = 1.0 / (1.0 + e^-Z)
b0 通常称为“偏差”,b1、b2 和 b3 称为“权重”。
z 具有与线性回归相同的形式,而 Y 是 sigmoid 激活函数。y 取 0 到 1 之间的值。如果 Y 小于 0.5,我们推断预测输出为 0,如果 Y 大于 0.5,我们推断输出为 1。
现在,我们准备看看下面 LR 的更正式的形式:
φn 是 Xn 在特征空间中的增广变换。tn 是类标签。σ是一个 s 形激活。w 是权重向量(包括偏差项)。p(C1 |φ)和 p(C2 |φ)分别是给定φ时分配给 C1 和 C2 的概率。
给定上述公式,这里的主要目标是在给定权重(W)的情况下最大化观察数据的可能性。似然函数是观测数据的联合分布,如下所示:
π是乘积算子。
从似然函数可以看出,y 是伯努利分布。
当处理概率时,最好转换成对数,因为对数将乘积转换成总和,从而避免了取非常小的数的乘积的问题(通常用于概率)。下面是负对数似然(NLL)及其相对于权重的梯度。NLL 用于将最大化问题转化为最小化问题。本质上,最小化 NLL 相当于最大化可能性。
多类案件
LR 的二进制情况可以通过改变符号扩展到多类情况。
假设有 K 类。因此,p(Ck)是在给定φ的情况下分配给类 k 的概率。
代替 sigmoid 激活,softmax 激活用于将类分数(ak)转换成适当的概率。
w 是权重矩阵(DxK) — D 是特征空间维度。
似然函数和负似然(NLL)如下所示。
y 现在是多元分布的。
MNIST 分类
MNIST 是一个经典数据集,由手绘数字(0 到 9 之间)的黑白图像组成。我们将使用 PyTorch 实现多类逻辑回归来对 MNIST 的数字进行分类。因为我们想要演示梯度下降算法,所以我们不使用 torch.optim 中的内置算法。为了简单起见,我们将使用 torch.autograd,而不是手动计算梯度。这个演示来自 PyTorch 网站。
下载数据集
以下代码下载数据集(训练集和验证集)并转换成相应的 numpy 数组。
from pathlib import Path
import requests
import pickle
import gzipDATA_PATH = Path("data")
PATH = DATA_PATH / "mnist"
PATH.mkdir(parents=True, exist_ok=True)
URL = "http://deeplearning.net/data/mnist/"FILENAME = "mnist.pkl.gz"
if not (PATH / FILENAME).exists():
content = requests.get(URL + FILENAME).content
(PATH / FILENAME).open("wb").write(content)with gzip.open((PATH / FILENAME).as_posix(), "rb") as f:
((x_train, y_train), (x_valid, y_valid), _) = pickle.load(f, encoding="latin-1")
转换为张量
在使用 PyTorch 时,我们需要将上面的 numpy 数组转换成张量。
import torch
x_train, y_train, x_valid, y_valid = map(torch.tensor, (x_train, y_train, x_valid, y_valid))
初始化权重和偏差
接下来,我们将创建和初始化权重和偏差张量。我们使用 Xavier 初始化用于权重,同时用零值初始化偏置。因为我们希望 torch.autograd 负责梯度计算,所以我们需要将 requires_grad 设置为 True,以便 PyTorch 可以跟踪梯度计算所需的操作。
import math
weights = torch.randn(784, 10) / math.sqrt(784)
weights.requires_grad_()
bias = torch.zeros(10, requires_grad=True)
似然函数
我们需要评估的可能性是 yk(φ)。要得到 yk(φ),我们首先需要对 ak 求值。它不返回 yk(φ),而是返回 log(yk(φ)),这对以后计算损失函数很有用。
**def** **log_softmax**(x):
**return** x **-** x**.**exp()**.**sum(**-**1)**.**log()**.**unsqueeze(**-**1)
**def** **model**(xb):
**return** log_softmax(xb **@** weights **+** bias)
损失函数—负对数似然(NLL)
现在,我们可以使用似然来计算总体负对数似然,这是 MNIST 逻辑回归的损失函数。
**def** **nll**(input, target):
**return** **-**input[range(target**.**shape[0]), target]**.**mean()
训练循环
到目前为止,我们已经实现了训练 MNIST 逻辑回归所需的所有必要功能。我们将实施小批量培训。
bs **=** 64 *# batch size* loss_func **=** nll
lr **=** 0.5 *# learning rate*
epochs **=** 2 *# how many epochs to train for*
**for** epoch **in** range(epochs):
**for** i **in** range((n **-** 1) **//** bs **+** 1):
start_i **=** i ***** bs
end_i **=** start_i **+** bs
xb **=** x_train[start_i:end_i]
yb **=** y_train[start_i:end_i]
pred **=** model(xb)
loss **=** loss_func(pred, yb)
loss**.**backward()
**with** torch**.**no_grad():
weights **-=** weights**.**grad ***** lr
bias **-=** bias**.**grad ***** lr
weights**.**grad**.**zero_()
bias**.**grad**.**zero_()
。loss_func 上的 backward()执行参数更新所需的所有梯度计算。一旦计算出梯度。backward(),权重和偏差由梯度和学习率的乘积更新。学习率(LR)用于控制收敛。大 LR 会过冲,而小 LR 会减慢收敛。
一旦权重和偏差被更新,它们的梯度被设置为零;否则,梯度将在下一批中累积。
总结
上面实现的梯度下降非常基本,但足以演示它是如何工作的。PyTorch 和 TensorFlow 等现代机器学习框架有更复杂的梯度下降变体,如 SGD、Adam 等。尽管如此,当我们需要训练机器学习模型时,理解梯度下降如何工作是有益的。
本文中的等式摘自 Christopher M. Bishop 的《模式识别和机器学习》。
毕业于 GANs:从理解生成性对抗网络到经营自己的网络
阅读如何生成对抗性网络(GANs)的研究和评估已经发展,然后实现自己的 GAN 生成手写数字
Visualization of the latent space for the MNIST dataset — you can make your own GAN that generates MNIST-like handwritten digits later in the post!
生殖对抗网络(GANs)已经接管了公众的想象力——通过人工智能生成的名人渗透流行文化,创造出在高端艺术拍卖会上以数千美元的价格在出售的艺术。
在本帖中,我们将探索:
- 甘斯简介
- 了解和评估 GANs
- 经营自己的 GAN
有大量的资源可以了解 GANs,所以本文的重点是了解如何评估 GANs。我们还将指导您运行自己的 GAN 来生成手写数字,如 MNIST。
Here’s one run of the GAN we’ll show you how to implement later on — see how the handwritten digits it generates become increasingly realistic as training progresses!
关于 GANs 的简要介绍
自 2014 年 Ian Goodfellow 的’Generative Adversarial Networks’论文发表以来,GANs 取得了爆炸式的进展,并带来了越来越现实的成果。
就在三年前,你可以在这个 Reddit 帖子上找到 Ian Goodfellow 对一个询问你是否可以用 GANs 发短信的用户的回复:
“gan 尚未应用于 NLP,因为 gan 仅针对实值数据定义。
gan 的工作原理是训练一个输出合成数据的生成器网络,然后对合成数据运行一个鉴别器网络。鉴频器网络输出相对于合成数据的梯度告诉您如何稍微改变合成数据,使其更加真实。
只有在基于连续数字的情况下,您才能对合成数据进行细微的更改。如果是基于离散数,就没办法稍作改动。
例如,如果输出像素值为 1.0 的图像,可以在下一步将该像素值更改为 1.0001。
如果输出“企鹅”这个词,下一步就不能把那个改成“企鹅+ .001”,因为没有“企鹅+ .001”这个词。你要从“企鹅”一路走到“鸵鸟”。
因为所有的 NLP 都是基于离散值的,比如单词、字符或字节,所以还没有人真正知道如何将 GANs 应用于 NLP。"
现在,GANs 正被用于创建各种内容,包括图像、视频、音频和文本。这些输出可以作为训练其他模型的合成数据,或者只是用来催生有趣的副业,比如【thispersondoesnotexist.com】【thisairbnbdoesnotexist.com/】这种机器学习媒介岗位不存在。😎
甘背后
GAN 由两个神经网络组成,一个是从零开始合成新样本的生成器,另一个是将训练样本与生成器生成的样本进行比较的鉴别器。鉴别器的目标是区分“真实”和“虚假”输入(即分类样本是来自模型分布还是真实分布)。正如我们所描述的,这些样本可以是图像、视频、音频片段和文本。
Simple GAN overview from Kiran Sudhir
为了合成这些新样本,生成器被给予随机噪声,并试图从训练数据的学习分布中生成逼真的图像。
鉴别器网络(卷积神经网络)的输出相对于合成数据的梯度告知如何稍微改变合成数据以使其更真实。最终,生成器收敛于再现真实数据分布的参数,并且鉴别器无法检测到差异。
您可以在 GAN Lab 中看到并体验这些聚合数据分布:
GAN 实验室是由 Minsuk Kahng,Nikhil Thorat,Polo Chau,Fernanda Viégas 和 Martin Wattenberg 创建的,他们是…
poloclub.github.io](https://poloclub.github.io/ganlab/)
这里有一些关于甘斯的最佳指南:
- 斯坦福 CS231 第 13 讲——生成模型
- 基于风格的 GANs
- 理解生成性对抗网络
- 生成性对抗网络简介
- 莉莲·翁:从甘到 WGAN
- 一头扎进高级甘斯:探索自我关注和光谱标准
- Guim Perarnau:奇异的甘以及在哪里可以找到他们
了解和评估 GANs
量化 GAN 的进展可能感觉非常主观— *“这个生成的人脸看起来足够逼真吗?”、“这些生成的图像足够多样吗?”—*GANs 可能感觉像是黑匣子,不清楚模型的哪些组成部分会影响学习或结果质量。
为此,麻省理工学院计算机科学和人工智能(CSAIL)实验室的一个小组最近发布了一篇论文,“ GAN 解剖:可视化和理解生成性对抗网络”,介绍了一种可视化 GAN 的方法,以及 GAN 单元如何与图像中的对象以及对象之间的关系相关联。
Figure 1 from Bau et. al 2019 showing image modification through intervention with certain GAN units.
使用基于分段的网络剖析方法,本文的框架允许我们剖析和可视化发电机神经网络的内部工作。这是通过寻找一组 GAN 单元(称为神经元)与输出图像中的概念(如树、天空、云等)之间的一致来实现的。因此,我们能够识别负责某些物体(如建筑物或云)的神经元。
使神经元具有这种粒度级别允许通过强制激活和去激活(消融)那些对象的相应单元来编辑现有图像(例如,添加或移除图像中所示的树)。
然而,尚不清楚网络是否能够推理场景中的对象,或者它是否只是记忆这些对象。接近这个问题答案的一个方法是试图以不切实际的方式扭曲图像。也许麻省理工学院 CSAIL 的 GAN Paint 交互式网络演示最令人印象深刻的部分是该模型似乎能够将这些编辑限制在“照片级”更改。如果你试图将草添加到天空中,会发生以下情况:
尽管我们激活了相应的神经元,但 GAN 似乎抑制了后面几层的信号。
Figure 11 from Bau et. al. 2019 shows how the local context for an object impacts the likelihood of the object synthesis (in this case, the likelihood of a door being generated on a building versus on a tree or in the sky).
另一种可视化 GAN 的有趣方式是进行潜在空间插值(记住,GAN 通过从已学习的潜在空间采样来生成新的实例)。这是查看生成的样本之间的过渡有多平滑的有用方法。
这些可视化可以帮助我们理解 GAN 的内部表示,但找到量化的方法来理解 GAN 的进展和输出质量仍然是一个活跃的研究领域。
图像质量和多样性的两个常用评估指标是:初始得分和弗雷歇初始距离(FID) 。在 Shane Barratt 和 Rishi Sharma 发布了他们的论文“关于初始分数的注释”之后,大多数从业者已经从初始分数转向 FID。
初始得分
Salimans 等人于 2016 年在“训练 GANs 的改进技术”中发明了 Inception 评分,该评分基于一种启发式方法,即当现实样本通过预先训练的网络(如 ImageNet 上的 Inception)时,应该能够对其进行分类。从技术上讲,这意味着样本应该具有低熵 softmax 预测向量。
除了高预测性(低熵),初始分数还基于所生成样本的差异程度(例如,所生成样本分布的高方差或熵)来评估 GAN。这意味着不应该有任何统治阶级。
如果这两个特征都满足了,那么就应该有一个大的初始得分。结合这两个标准的方法是评估样本的条件标签分布和所有样本的边际分布之间的 Kullback-Leibler (KL)散度。
弗雷歇初始距离
由 Heusel et al. 2017 推出,FID 通过测量生成的图像分布与真实分布之间的距离来估计真实感。FID 将一组生成的样本嵌入到由初始网的特定层给出的特征空间中。该嵌入层被视为连续的多元高斯,然后对生成的数据和真实数据估计均值和协方差。然后使用这两个高斯函数之间的弗雷歇距离(也称为 Wasserstein-2 距离)来量化生成样本的质量。较低的 FID 对应于更相似的真实样本和生成样本。
一个重要的注意事项是,FID 需要一个合适的样本量来给出好的结果(建议大小= 50k 样本)。如果使用的样本太少,最终会高估实际的 FID,估计值会有很大的差异。
关于不同论文之间的 Inception 分数和 FID 分数的比较,见 Neal Jean 的帖子这里。
想看更多吗?
Aji Borji 的论文“[GAN 评估方法的利弊](http://Pros and Cons of GAN Evaluation Measures)”包括一个非常好的表格,更详尽地涵盖了 GAN 评估指标:
**有趣的是,其他研究人员正在通过使用特定领域的评估指标来采取不同的方法。**对于文本 GAN,Guy Tevet 和他的团队在他们的论文“评估文本 GAN 作为语言模型”中提出使用传统的基于概率的语言模型度量来评估 GAN 生成的文本的分布。
我的甘有多好?’,Konstantin Shmelkov 和他的团队使用了两种基于图像分类的方法,GAN-train 和 GAN-test,这两种方法分别接近于 GAN 的召回率(多样性)和精确度(图像质量)。你可以在谷歌大脑研究论文中看到这些评估指标,“GANS 创造了平等吗”中,他们使用三角形数据集来测量不同 GAN 模型的精度和召回率。
运行您自己的 GAN
为了说明 GANs,我们将改编来自 Wouter Bulten 的这篇优秀教程,它使用 Keras 和 MNIST 数据集来生成书面数字。
完整教程笔记本见这里。
We’ll be tracking our GAN’s progress by visualizing our loss and accuracy curves but also by checking test outputs using Comet.ml
该 GAN 模型将 MNIST 训练数据和随机噪声作为输入(具体地,噪声的随机向量)来生成:
- 图像(在这种情况下,是手写数字的图像)。最终,这些生成的图像将类似于 MNIST 数据集的数据分布。
- 鉴别器对生成图像的预测
生成器和鉴别器模型一起形成对抗模型——对于这个例子,如果对抗模型的输出将生成的图像分类为所有输入的真实图像,那么生成器将表现良好。
跟踪模型的进度
我们能够使用 Comet.ml 来跟踪我们的生成器和鉴别器模型的训练进度。
我们正在绘制鉴别模型和对抗模型的准确性和损失图,这里要跟踪的最重要的指标是:
- 鉴频器的损耗(见右图中的蓝线)——dis _ loss
- 对抗模型的准确性(见左图中的蓝线)——ACC _ adv
此处 见本实验 的训练进度。
您还想确认您的培训过程确实使用了 GPU,这可以在Comet 系统指标选项卡中查看。
您会注意到我们的训练 for-loop 包含了从测试向量中报告图像的代码:
if i % 500 == 0:
# Visualize the performance of the generator by producing images from the test vector
images = net_generator.predict(vis_noise)
# Map back to original range
#images = (images + 1 ) * 0.5
plt.figure(figsize=(10,10))
for im in range(images.shape[0]):
plt.subplot(4, 4, im+1)
image = images[im, :, :, :]
image = np.reshape(image, [28, 28])
plt.imshow(image, cmap='gray')
plt.axis('off')
plt.tight_layout()
# plt.savefig('/home/ubuntu/cecelia/deeplearning-resources/output/mnist-normal/{}.png'.format(i)) plt.savefig(r'output/mnist-normal/{}.png'.format(i)) experiment.log_image(r'output/mnist-normal/{}.png'.format(i)) plt.close('all')
我们希望每隔几个步骤就报告生成的输出的部分原因是,我们可以直观地分析我们的生成器和鉴别器模型在生成真实的手写数字和正确地将生成的数字分别分类为“真”或“假”方面的表现。
让我们来看看这些生成的输出!
在慧星实验中查看自己生成的输出
你可以看到生成器模型是如何从这个模糊的灰色输出开始的(见下面的 0.png ),它看起来不像我们期望的手写数字。
随着训练的进行,我们的模型损失下降,生成的数字变得越来越清晰。在以下位置查看生成的输出:
步骤 500:
步骤 1000:
步骤 1500:
最后,在步骤 10,000 — 中,您可以在下面的红色方框中看到一些 GAN 生成的数字样本
一旦我们的 GAN 模型完成训练,我们甚至可以在 Comet 的图形选项卡中以电影形式查看我们报告的输出(只需按下播放按钮!).
为了完成实验,请务必运行experiment.end()
来查看模型和 GPU 使用情况的一些汇总统计数据。
迭代你的模型
我们可以对模型进行更长时间的训练,看看这是如何影响性能的,但让我们尝试用几个不同的参数进行迭代。
我们尝试的一些参数是:
- 鉴别器的优化器
- 学习率
- 退出概率
- 批量
从 Wouter 的原始博文中,他提到了自己在测试参数方面的努力:
我测试了鉴别器的优化器的
SGD
、RMSprop
和Adam
,但是RMSprop
表现最好。RMSprop
使用了低学习率,我将值修剪在-1 和 1 之间。学习速度的小幅下降有助于稳定
我们将尝试将鉴别器的退出概率从 0.4 增加到 0.5,同时增加鉴别器的学习率(从 0.008 增加到 0.0009)和生成器的学习率(从 0.0004 增加到 0.0006)。很容易看出这些变化是如何失去控制的,并且很难跟踪…🤯
要创建一个不同的实验,只需再次运行实验定义单元,Comet 将为您的新实验发布一个新的 url!记录你的实验很好,这样你就可以比较不同之处:
See the difference between the two experiments’ hyperparameters. Can you spot the differences in learning rate and dropout probability that we made?
不幸的是,我们的调整并没有提高模型的性能!事实上,它产生了一些有趣的输出:
本教程到此为止!如果你喜欢这篇文章,请和你的朋友分享,他可能会觉得这篇文章很有用😎
👉🏼有问题或反馈吗?下面评论!
👉🏼想要更多牛逼的机器学习内容?F 在媒体上关注我们!
格兰杰因果关系和向量自回归模型预测
预测建模和统计分析
计量经济模型和时间序列数据
【F】黄金 和 石油 受到学术界、投资者和政府机构等的高度关注。这两种产品因其对全球经济的重大影响而闻名。我将在这里展示,如何利用 格兰杰因果检验 来检验时间序列中多个变量的关系,以及 向量自回归模型(VAR) 来预测未来 黄金&石油 价格从 黄金价格、白银价格、原油价格、股票指数、利率和美元汇率 的历史数据中。
黄金 价格与其他商品密切相关。 石油 价格的上涨会对 黄金 价格产生正面影响,反之亦然。从历史上看,我们已经看到,当股票上涨时,黄金价格就会下跌。
- 时间序列预测问题公式化
- 一元和多元时间序列时间序列预测
- 将 VAR 应用到这个问题上
让我们了解一个多元时间序列是如何制定的。下面是多元时间序列的简单 K 方程,其中每个方程都是另一个序列的滞后。x 是这里的外生数列。目的是看这个系列是否受到它自己的过去以及其他系列的过去的影响。
这种系列允许我们对系列本身的动态以及其他系列的相互依赖性进行建模。我们将通过 格兰杰因果分析 来探究这种相互依存关系。
探索性分析:
让我们加载数据,并通过可视化进行一些分析,以了解数据的洞察力。探索性数据分析在多元时间序列中相当广泛。我将在这里介绍一些领域,以获得对数据的见解。然而,建议进行所有的统计测试,以确保我们对数据分布有清晰的理解。
让我们确定所有系列的日期。
数据中的 NaN 值用前几天的数据填充。在做了一些必要的预处理后,数据集现在可以进行进一步的分析了。
*# Plot
fig, axes = plt.subplots(nrows=3, ncols=2, dpi=120, figsize=(10,6))
for i, ax in enumerate(axes.flatten()):
data = dataset[dataset.columns[i]]
ax.plot(data, color=’red’, linewidth=1)
ax.set_title(dataset.columns[i])
ax.xaxis.set_ticks_position(‘none’)
ax.yaxis.set_ticks_position(‘none’)
ax.spines[“top”].set_alpha(0)
ax.tick_params(labelsize=6)plt.tight_layout();*
从上面的图中,我们可以看出,所有的序列都包含单位根,具有随机趋势,表现出不可预测的系统模式。
为了从我们的数据中提取最多的信息,数据的正态或高斯分布是很重要的。为了验证这一点,我们做了一个基于零假设和交替假设直觉的正态性检验。
*stat,p = stats.normaltest(dataset.Gold)
print("Statistics = %.3f, p=%.3f" % (stat,p))
alpha = 0.05
if p> alpha:
print('Data looks Gaussian (fail to reject null hypothesis)')
else:
print('Data looks non-Gaussian (reject null hypothesis')output: Statistics = 658.293, p=0.000 Data looks Gaussian (reject null hypothesis*
这两个分布给了我们一些关于数据分布的直觉。这个数据集的峰度是-0.95。由于该值小于 0,因此它被认为是一个轻尾数据集。它在每条尾巴上的数据和在峰值上的一样多。中度偏度指的是-1 和-0.5 或 0.5 和 1 之间的值。
*plt.figure(figsize=(14,6))
plt.subplot(1,2,1)
dataset['Gold'].hist(bins=50)
plt.title('Gold')
plt.subplot(1,2,2)
stats.probplot(dataset['Gold'], plot=plt);
dataset.Gold.describe().T*
正态概率图也显示数据远非正态分布。
自相关:
如果我们不知道如何寻找自相关或序列相关性,那么在分析历史数据时,这可能是一个重大问题。
*# plots the autocorrelation plots for each stock's price at 50 lags
for i in dataset:
plt_acf(dataset[i], lags = 50)
plt.title('ACF for %s' % i)
plt.show()*
从上面的图中我们可以看到,+1 的自相关性代表了完全的正相关,这意味着一个时间序列的增加会导致另一个时间序列的相应增加。我们肯定需要应用变换并中和它,以使级数稳定。它测量线性关系;即使自相关性很小,时间序列和其滞后版本之间仍可能存在非线性关系。
培训和测试数据:
VAR 模型将在 X_train 上拟合,然后用于预测接下来的 15 个观测值。这些预测将与试验数据中的实际数据进行比较。
*n_obs=15
X_train, X_test = dataset[0:-n_obs], dataset[-n_obs:]
print(X_train.shape, X_test.shape)(5114, 6) (15, 6)*
转型:
对训练集应用一阶差分使所有序列平稳。然而,这是一个迭代过程,在第一次差分后,序列可能仍然是非平稳的。在这种情况下,我们必须应用二阶差分或对数变换来标准化数列。
稳定性检查:
*def augmented_dickey_fuller_statistics(time_series):
result = adfuller(time_series.values)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value in result[4].items():
print('\t%s: %.3f' % (key, value))print('Augmented Dickey-Fuller Test: Gold Price Time Series')
augmented_dickey_fuller_statistics(X_train_transformed['Gold'])
print('Augmented Dickey-Fuller Test: Silver Price Time Series')
augmented_dickey_fuller_statistics(X_train_transformed['Silver'])
print('Augmented Dickey-Fuller Test: Oil Price Time Series')
augmented_dickey_fuller_statistics(X_train_transformed['Oil'])
print('Augmented Dickey-Fuller Test: Interest_rate Time Series')
augmented_dickey_fuller_statistics(X_train_transformed['Interest_rate'])
print('Augmented Dickey-Fuller Test: Stock_Index Time Series')
augmented_dickey_fuller_statistics(X_train_transformed['Stock_Index'])
print('Augmented Dickey-Fuller Test: USD_Index Time Series')
augmented_dickey_fuller_statistics(X_train_transformed['USD_Index'])*
*fig, axes = plt.subplots(nrows=3, ncols=2, dpi=120, figsize=(10,6))
for i, ax in enumerate(axes.flatten()):
d = X_train_transformed[X_train_transformed.columns[i]]
ax.plot(d, color='red', linewidth=1)# Decorations
ax.set_title(dataset.columns[i])
ax.xaxis.set_ticks_position('none')
ax.yaxis.set_ticks_position('none')
ax.spines['top'].set_alpha(0)
ax.tick_params(labelsize=6)
plt.tight_layout();*
格兰杰因果关系检验:
格兰杰因果关系的正式定义可以解释为,x 的过去值是否有助于 yt 的预测,取决于已经考虑了 y 的过去值(也许还有其他变量的过去值)对 yt 的影响。如果是这样的话,x 就是 y 的格兰杰原因。因此,VAR 背后的基础是系统中的每个时间序列都相互影响。
格兰杰因果关系检验回归方程中过去值的系数为零的零假设。因此,如果从测试中获得的 p 值小于 0.05 的显著性水平,那么,您可以安全地拒绝零假设。这是在原始数据集上进行的。
下面这段代码摘自stack overflow。
*maxlag=12
test = 'ssr-chi2test'
def grangers_causality_matrix(X_train, variables, test = 'ssr_chi2test', verbose=False):
dataset = pd.DataFrame(np.zeros((len(variables), len(variables))), columns=variables, index=variables)
for c in dataset.columns:
for r in dataset.index:
test_result = grangercausalitytests(X_train[[r,c]], maxlag=maxlag, verbose=False)
p_values = [round(test_result[i+1][0][test][1],4) for i in range(maxlag)]
if verbose: print(f'Y = {r}, X = {c}, P Values = {p_values}')
min_p_value = np.min(p_values)
dataset.loc[r,c] = min_p_value
dataset.columns = [var + '_x' for var in variables]
dataset.index = [var + '_y' for var in variables]
return dataset
grangers_causality_matrix(dataset, variables = dataset.columns)*
行是响应(y ),列是预测序列(x)。
- 如果我们在(第 1 行,第 2 列)中取值 0.0000,它指的是 Silver_x 引起 Gold_y 的格兰杰因果关系检验的 p 值,(第 2 行,第 1 列)中的 0.0000 指的是 Gold_y 引起 Silver_x 的 p 值,以此类推。
- 我们可以看到,在利息和美元变量的情况下,我们不能拒绝零假设,例如美元* & 白银,美元&石油。我们感兴趣的变量是黄金和石油这里。所以,对于黄金,所有的变量都会引起,但是对于美元不会对石油产生任何影响。***
因此,查看 p 值,我们可以假设,除了美元,系统中的所有其他变量(时间序列)是可互换的,互为因果。这证明了 VAR 建模方法对这一多时间序列系统进行预测的合理性。
风险值模型:
VAR 要求序列的平稳性,这意味着序列的均值不会随时间而改变(我们可以从 Augmented Dickey-Fuller Test 旁边的图中找到这一点)。
先来了解一下 VAR 模型的数学直觉。
在这里,每个系列都是通过它自己的滞后和其他系列的滞后来建模的。y{1,t-1,y{2,t-1}…是时间序列 y1,y2,…的滞后。分别是。上述方程被称为 VAR (1)模型,因为每个方程都是一阶的,也就是说,它包含每个预测因子(y1,y2,…)的一个滞后…).因为方程中的 y 项是相互关联的,所以 y 被认为是内生变量,而不是外生预测因子。为了防止结构不稳定的问题,VAR 框架被用来根据 AIC 选择滞后长度。
因此,我将在训练集上拟合 VAR 模型,然后使用拟合的模型预测接下来的 15 次观察。这些预测将与试验数据中的实际数据进行比较。我采用最大滞后(15)来确定风险值模型所需的滞后。
*mod = smt.VAR(X_train_transformed)
res = mod.fit(maxlags=15, ic='aic')
print(res.summary())*
最大的相关性是 0.38(白银&黄金)和-0.19(石油&美元);然而,在这种情况下,有足够小的问题可以忽略。
残差图:
除了在 2009 年、2011 年、2014 年等期间有一些大的波动外,残差图看起来是正常的,始终具有恒定的平均值。
*y_fitted = res.fittedvalues
plt.figure(figsize = (15,5))
plt.plot(residuals, label='resid')
plt.plot(y_fitted, label='VAR prediction')
plt.xlabel('Date')
plt.xticks(rotation=45)
plt.ylabel('Residuals')
plt.grid(True)*
德宾-沃森统计:
德宾-沃森统计与自相关相关。
德宾-沃森统计值将总是在 0 和 4 之间。值为 2.0 意味着在样本中没有检测到自相关。从 0 到小于 2 的值表示正自相关,从 2 到 4 的值表示负自相关。根据经验,测试统计值在 1.5 到 2.5 之间是相对正常的。任何超出此范围的值都可能引起关注。
显示正自相关的股票价格将表明昨天的价格与今天的价格正相关,因此如果股票昨天下跌,它今天也可能下跌。另一方面,具有负自相关性的股票随着时间的推移会对自身产生负面影响——因此,如果它昨天下跌,今天上涨的可能性更大。
不存在自相关(2.0);因此,我们可以继续进行预测。
预测:
为了进行预测,VAR 模型期望从过去的数据中得到多达滞后阶数的观察值。这是因为,风险值模型中的项本质上是数据集中各种时间序列的滞后,因此我们需要提供模型使用的滞后顺序所指示的尽可能多的先前值。
*# Get the lag order
lag_order = res.k_ar
print(lag_order)# Input data for forecasting
input_data = X_train_transformed.values[-lag_order:]
print(input_data)# forecasting
pred = res.forecast(y=input_data, steps=n_obs)
pred = (pd.DataFrame(pred, index=X_test.index, columns=X_test.columns + '_pred'))
print(pred)*
反转变换:
预测是生成的,但它是基于模型使用的训练数据的规模。所以,为了让它回到原来的比例,我们需要去差分。
转换差异的方法是将这些差异连续地加到基数上。一个简单的方法是首先确定索引处的累积和,然后将其加到基数上。
这个过程可以通过将前一时间步的观测值加到差值上来逆转。反演(ts) =差分(ts) +观测值(ts-1)
*# inverting transformation
def invert_transformation(X_train, pred):
forecast = pred.copy()
columns = X_train.columns
for col in columns:
forecast[str(col)+'_pred'] = X_train[col].iloc[-1] + forecast[str(col)+'_pred'].cumsum()
return forecast
output = invert_transformation(X_train, pred)#combining predicted and real data set
combine = pd.concat([output['Gold_pred'], X_test['Gold']], axis=1)
combine['accuracy'] = round(combine.apply(lambda row: row.Gold_pred /row.Gold *100, axis = 1),2)
combine['accuracy'] = pd.Series(["{0:.2f}%".format(val) for val in combine['accuracy']],index = combine.index)
combine = combine.round(decimals=2)
combine = combine.reset_index()
combine = combine.sort_values(by='Date', ascending=False)*
评估:
为了评估预测,可以计算一组全面的指标,如 MAPE、ME、MAE、MPE 和 RMSE。我们计算了其中的一些,如下所示。
*#Forecast bias
forecast_errors = [combine['Gold'][i]- combine['Gold_pred'][i] for i in range(len(combine['Gold']))]
bias = sum(forecast_errors) * 1.0/len(combine['Gold'])
print('Bias: %f' % bias)print('Mean absolute error:', mean_absolute_error(combine['Gold'].values, combine['Gold_pred'].values))print('Mean squared error:', mean_squared_error(combine['Gold'].values, combine['Gold_pred'].values))print('Root mean squared error:', sqrt(mean_squared_error(combine['Gold'].values, combine['Gold_pred'].values)))*
平均绝对误差告诉我们,平均而言,预测的误差有多大。我们的错误率很低,这表明我们有合适的模型。
总结:
VAR 模型是一种基于过去观测值的线性函数来预测多个时间序列联合动态的流行工具。还可以进行更多的分析,例如脉冲响应(IRF)和预测误差方差分解(FEVD)以及 VAR,以评估一项资产对另一项资产的冲击影响。但是,为了便于理解,我在这里将保持简单。在实际业务案例中,我们应该用不同的方法做多个模型来做比较分析,然后再锁定一个或一个混合模型。
注意:这里描述的程序是实验性的,应该谨慎使用。所有此类使用风险自负。
我想要精确的电影预算数据
但我找了一段时间,还没找到多少。
我能找到的最详细的电影制作数据是在维基解密上,比如这个难忘的第三季的预算,还有这个采访 :
That there is some high-resolution budget data
我甚至不应该能够看到这两个行项目的电影预算,但我想要几千。我在哪里可以找到他们?我如何打开闸门?
数据科学训练营的学生经常做与电影相关的玩具项目,因为每个人都喜欢电影,并且因为在网络搜索结果的前几页中总是有很好的 kaggle-s 风格的表格电影数据集随时可用。有 OMdB ,在那里你可以查询一个漂亮的 REST-ful API 来获得一堆票房数据(并演示你可以调用 API 作为额外的奖励)。你甚至可以买一个升级的 OMdB 密匙,让你花一整美元就可以进行许多 API 调用。我为承担这样的项目而感到内疚,但是我感觉这个主题的变化太多了。
问题是,对于一些了解电影制作的人来说,公开的票房数据并不那么有趣。它们通常不会很深。我开始觉得真正有趣的电影制作和发行数据,尤其是关于预算的数据,在一些有围墙的花园里被保护得很好,当然这是真的。为什么要分享呢?
Some lame data from Kaggle
任何电影制作公司有什么动机去公开他们全部的、详细的项目预算呢?即使是那些在 Kickstarter 等平台上寻求众包资金的人,也不会被要求或期望提供超过“这就是我们需要的”标量值预算总额、古怪的推介视频,或许还有一些创意奖励。详细的电影预算在内部起草、批准、跟踪、上报给国税局,然后存档。
但是如果电影预算变得透明会怎么样呢?我们能学到什么?
电影制作的艺术和惊人的机械让我着迷,因为我大约十岁的时候就从我的父亲那里学习如何制作关键帧,他是一名视频编辑和电影摄影师。在过去十年的大部分时间里,我在旧金山的电影片场担任摄影助理和灯光技术员。我装上灯光车,重新备货灯光仓库。我搬到了纽约,和一家很棒的后期制作工作室签约做了几年的日常调色师。我非常高兴能参与一些很酷/很大的项目,在一些很棒的导师的指导下学习,学到了很多东西。我通常是一名技术人员,并且总是与主要角色关系密切:导演、摄影师、演员、制片人(在商业工作的情况下,还有代理人)。
我也看到了一部电影在不同的阶段,在某种程度上是如何失败的。当各级管理和创意人员犯错误或遗漏时,当预算分配不当时,当远见者被迫妥协他们的愿景时,或当信任错误地给予无能或好战或某种组合时,我看到了裂缝开始形成的地方。因此,我从该行业获得的主要收获是:
在一部电影作品中,有许多活动的部分,它比你想象的更像一次军事行动;时间变得异常珍贵;成功的程度与准备的程度正相关;专业设备往往是必要的,但不应该分散真正的创造性元素;工作人员、演员和赞助人的积极动机(如故事质量和总血糖水平等因素)赋予了电影生命;金钱是一种肮脏的邪恶,但在整个过程的许多阶段都是完全必要的。拥有特殊技能的人需要为他们的劳动获得报酬,他们需要购买和租赁特殊的材料和工具,需要贿赂特殊地点的看门人以获得访问和许可。每个人都要被喂养和穿梭。一切都必须投保,而且一切都必须按计划进行。
一般来说,新电影制作人低估了他们将承担的费用和他们需要的时间。有经验的电影制作人更擅长估算预算和时间要求,或者雇佣一个由 T2 人组成的中队来为他们做这件事。这并不能阻止令人厌恶的大量时间和金钱在隐喻的垃圾箱火灾中燃烧,其频率在整个行业都令人震惊。
我想说的是:**一部电影制作分配预算的方式对其成败至关重要,**如果能获得更精细的示例数据,那将会很有趣。每部作品的要求都是完全独特的,所以如果你深入研究,每个预算都会有所不同,但我们可以做得更好,而不仅仅是看 IMdB 上列出的总制作预算,这些预算通常是他们实际花费的几分之一或几倍,原因如下。只要制作预算保密,电影制作,总的来说,在如何花钱上不会变得更聪明。
如果我们只知道几千部电影如何在[前期/前期/后期/销售]阶段之间分配他们的预算,以及他们的结局如何,会怎么样?如果我们能看到几千部电影如何在[制作/摄像/灯光/艺术/服装/餐饮/演员]部门之间分配预算,并了解这如何影响电影的成功,会怎么样?我想要那些数据。
我最喜欢的衡量一部电影“成功”的基本标准是一个简单的比率:它在全球范围内产生的收入(是的,有时是由质的验证因素推动的,如奥斯卡奖或狮或 Prixe )与其总支出的比率——从前期制作一直到制作、后期制作、营销和发行;所有费用。这个标准有利于那些以少赚多的电影制作人,世界上的乔丹·皮尔 s,而不是詹姆斯·卡梅隆,后者必然会获得巨大的资源。我肯定卡梅隆在职业生涯的早期很好斗,但你明白我的意思。
电影制作人不需要有大数据集的学生来弄清楚恐怖类型是非常有利可图的。从 20 世纪 60 年代开始,罗杰·科尔曼就在这个事实的基础上建立了自己的事业和持久的遗产:几十年来,他一直告诉新制片人,把几个美国青少年(穿着美国运动鞋和雷朋,嚼着美国泡泡糖,开着美国车)限制在一个鬼屋的位置,把他们切碎,喷洒一些假血,在国际领土上做一些创造性的许可,赚回你预算的数倍,并活着看到另一个导演机会,这是明智而廉价的。顺便说一句,不要在你的剧本里写任何夜间外景,有很多台词的儿童角色,也不要写动物。
Indie Glimmer
达拉斯买家俱乐部是一部赢得 2013 年奥斯卡三项大奖的电影,从其 500 万美元的预算中获得了 1200%的回报*。*据称,整个电影的化妆部门获得 250 美元(原文如此),并为自己赢得了奥斯卡奖。据说,加拿大的大金融家在最后一刻退出了,所以这部电影的 800 万美元预算一夜之间化为乌有。一位强大的制片人相信这部电影,并在接下来的周末设法筹集了 500 万美元来维持这个项目。为了让缩减的预算发挥作用,生产部门削减了整个照明部门,但保留了马修·麦康纳。这很好。
但是,他们到底是怎么花掉这 500 万美元的呢?难道每个“低预算”(少于 1000 万美元)的制片人都不关心午餐花了多少钱吗?
But how much did they spend on location scouting?
数字提供了一些样本数据集,但同样,从生产的角度来看,它们并没有让我对完整的数据库抱有希望。每个人似乎都更关心为电影成品确定有效的收入来源,而不是在电影制作过程中优化支出!
我会继续寻找,但在这篇文章中,我不确定在哪里可以找到我想要的东西。
附言:一个有机会接触神秘知识的 NYU·提施毕业生发给我这个:
“如果你在寻找电影预算数据,你不会找到的。这是业内高度保密的秘密。没有人愿意承认他们在一部电影上花了多少钱,因为如果它真的失败了,他们不想让任何人知道有多糟糕——如果他们成功了,他们仍然希望能够声称他们没有盈利。”
如果我们能把这类数据收集在一个匿名的大袋子里会怎么样?难道不是每个人都可以对它进行逆向工程来找出哪部电影是哪部吗?我们有没有办法让电影公司公布预算数字?
图形算法(第二部分)
内线艾
Python 中的主要概念、属性和应用
Corsica, France
这些天来,无论你是想通过预测潜在的联系来了解社交网络的结构,检测欺诈,了解汽车租赁服务的客户行为,还是提出实时建议,raphs 都成为机器学习的核心。
在本文中,我们将讨论:
- 主要的图形算法
- 插图和使用案例
- Python 中的示例
本文原载于我的个人博客:https://maelfabien.github.io/ml/#
我在这个资源库上发布我所有的文章和相应的代码:
本报告包含练习、代码、教程和我的个人博客文章
github.com](https://github.com/maelfabien/Machine_Learning_Tutorials)
如果您还没有,请务必阅读我的第一篇文章:
Python 中的主要概念、属性和应用
towardsdatascience.com](/introduction-to-graphs-part-1-2de6cda8c5a5)
新:第 3 部出来了!
Python 的概念、应用和示例
towardsdatascience.com](/learning-in-graphs-with-python-part-3-8d5513eef62d)
接下来,打开 Jupyter 笔记本,导入以下包:
import numpy as np
import random
import networkx as nx
from IPython.display import Image
import matplotlib.pyplot as plt
以下文章将使用最新版本的networkx``2.x
。NetworkX 是一个 Python 包,用于创建、操作和研究复杂网络的结构、动态和功能。
我将尽量保持一种实用的方法,并举例说明每个概念。
在上一篇文章中,我们介绍了图的主要种类,以及描述图的基本特征。我们现在将更详细地介绍图形分析/算法以及分析图形的不同方法。
为了理解上下文,下面是一些图算法的用例:
- 实时欺诈检测
- 实时推荐
- 简化法规遵从性
- 复杂网络的管理和监控
- 身份和访问管理
- 社交应用/功能
- …
目前大多数框架都支持三种主要的图形算法(例如 Python 中的networkx
或 Neo4J):
- 寻路:根据可用性和质量等确定最佳路径。我们还将在这一类别中包括搜索算法。例如,这可用于识别最快路线或交通路线。
- 中心性:确定网络中节点的重要性。这可以用来识别社交媒体中的影响者或者识别网络中的潜在攻击目标。
- 社区检测:评估一个群体是如何聚集的。这可用于细分客户和检测欺诈等。
我们还将在下周发表的第三篇文章中开发图形中的机器学习基础和图形学习。在 Networkx 中实现的所有算法都可以在这里找到:
[## 算法- NetworkX 2.3 文档
编辑描述
networkx.github.io](https://networkx.github.io/documentation/stable/reference/algorithms/index.html)
您会注意到,我们将只讨论在 Networkx 中实现的基本和最常见的算法。
I .寻路和图搜索算法
- 寻路算法试图通过最小化跳数找到两个节点之间的最短路径。
- 搜索算法没有给出最短路径。取而代之的是,他们通过考虑图的邻居或深度来探索图。这可以用于信息检索。
1。搜索算法
有两种主要的图形搜索算法:
- 广度优先搜索(BFS) 首先搜索每个节点的邻居,然后是邻居的邻居…
- 深度优先搜索(DFS) 尝试尽可能地沿着一条路径走下去,如果可能的话,访问新邻居。
Search Algorithms
2。寻路算法
a .最短路径
最短路径计算一对节点之间最短的加权(如果图是加权的)路径。
例如,它用于识别社交网络上两个人之间的最佳驾驶方向或分离程度。
有许多方法可以计算图中的最短路径,包括 Dijkstra 的算法,Networkx 中的默认算法。
根据维基百科,该算法的伪代码如下:
- 将图中的所有节点标记为未访问。创建所有未访问节点的集合,称为未访问集合。
- 给每个节点分配一个试探性的距离值:对于初始节点,将其设置为零;对于所有其他节点,将其设置为无穷大。将初始开始节点设置为当前节点。
- 对于当前节点,考虑其所有未访问的邻居,并计算它们通过当前节点的暂定距离。将新计算的暂定距离与当前分配值进行比较,并分配较小的一个。例如,如果当前节点 A 被标记为距离 6,并且连接它和邻居 B 的边的长度为 2,那么通过 A 到 B 的距离将是 6 + 2 = 8。如果 B 之前标记的距离大于 8,则将其更改为 8。否则,保持当前值。
- 当我们考虑完当前节点的所有未访问邻居后,将当前节点标记为已访问,并将其从未访问集合中移除。被访问的节点将不再被检查。
- 如果目的地节点已经被标记为已访问(当计划两个特定节点之间的路线时)或者如果未访问集合中的节点之间的最小暂定距离是无穷大(当计划完整遍历时;当初始节点和剩余的未访问节点之间没有连接时发生),然后停止。算法已经完成。
- 否则,选择标有最小暂定距离的未访问节点,将其设置为新的“当前节点”,并返回步骤 3。
如果你想了解更多关于最短路径的问题,请看这篇文章:https://en.wikipedia.org/wiki/Shortest_path_problem
Wikipedia’s illustration of the Dijkstra’s algorithm
在 Python 中,实现非常简单:
# Returns shortest path between each node
nx.shortest_path(G_karate)
这将返回图中每个节点之间的最短路径列表:
{0: {0: [0],
1: [0, 1],
2: [0, 2],
...
b .单源最短路径
单源最短路径(SSSP)查找图中给定节点和所有其他节点之间的最短路径。
例如,它通常用于 IP 网络的路由协议。
c .所有对最短路径
“所有对最短路径”(APSP)算法寻找所有节点对之间的最短路径。
尽管提供了相似的结果,但它比针对每对节点调用单一源最短路径更快。该算法通常可用于确定交通网格不同路段的预期交通负荷。
# Returns shortest path length between each node
list(nx.all_pairs_shortest_path_length(G_karate))
它返回:
[(0,
{0: 0,
1: 1,
2: 1,
3: 1,
4: 1,
...
d .最小重量生成树
最小生成树是连接图中所有节点的边权重之和最小的图(树)的子图。
最小生成树应该应用于无向图。
from networkx.algorithms import tree
mst = tree.minimum_spanning_edges(G_karate, algorithm='prim', data=False)
edgelist = list(mst)
sorted(edgelist)
它返回:
[(0, 1),
(0, 2),
(0, 3),
(0, 4),
(0, 5),
(0, 6),
...
二。社区检测
社区检测根据给定的 质量准则 将节点划分成若干个 组 。
它通常用于识别社交社区、客户行为或网页主题。
社区是一组连接的节点。然而,尽管社区内的节点应该是紧密连接的,但是没有一个通用的定义可以用来定义社区。
Communities
寻找社区的一种常见算法是格文纽曼算法。它通过逐步移除网络中的边来识别社区。我们将把中间性称为“边中间性”。它是一个与通过这条边的节点对之间的最短路径数成比例的分数。
该算法的步骤如下:
- 计算网络中所有现有边的介数。
- 移除具有最高介数的边。
- 移除此边后,重新计算所有边的介数。
- 重复第 2 步和第 3 步,直到没有剩余的边。
要在 Python 中实现这一点,可以使用以下代码:
from networkx.algorithms import communityk = 1
comp = community.girvan_newman(G_karate)for communities in itertools.islice(comp, k):
print(tuple(sorted(c) for c in communities))
这是属于每个社区的节点列表的开头(k=1 表示我们期望 2 个社区):
([0, 1, 3, 4, 5, 6, 7, 10, 11, 12, 13, 16, 17, 19, 21], [2, 8, 9, 14, 15, 18, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33])
如上所述,这种方法没有真正的规模。由于这个原因,已经开发了诸如 Louvain 方法的方法。然而,这种方法在大型图上运行起来确实很长。
3.鲁汶模块化
在定义 Louvain 方法之前,引入模块化的概念是很重要的。模块性是对组被划分为集群的良好程度的度量:
Modularity
卢万方法的伪码如下:
- 首先为每个节点分配一个社区
- 交替接下来的 2 个步骤,直到收敛:
- 创建一个具有相邻节点的新社区,以最大化模块化
- 创建新的加权图。前一步的社区成为图的节点
现在这可能看起来有点混乱。事实上,我们所做的唯一事情就是对最近的节点进行分组,以便优化模块化标准。
Louvain Method
请注意,卢万方法没有理论上的保证,但在实践中效果很好。卢万的方法作为 NetworkX 的一个子项目出现,就在这里:https://python-louvain.readthedocs.io/en/latest/
首先,安装软件包:
pip install python-louvain
然后,计算最佳分区(基于 Louvain 方法):
import community
partition = community.best_partition(G_karate)pos = nx.spring_layout(G_karate)
plt.figure(figsize=(8, 8))
plt.axis('off')
nx.draw_networkx_nodes(G_karate, pos, node_size=600, cmap=plt.cm.RdYlBu, node_color=list(partition.values()))
nx.draw_networkx_edges(G_karate, pos, alpha=0.3)
plt.show(G_karate)
Best partition of the Karate Graph using Louvain
4.强连通分量
强连通分量(SCC)算法在有向图中找到多组 连通节点 。注意,每个节点必须是从同一组中的任何其他节点在 两个方向 上**可达 。
它通常在图表分析过程的早期使用,让我们了解我们的图表是如何构建的,例如,当我们查看谁拥有哪个公司的股份时,探索财务报表数据(例如,想想巴拿马文件)。
5.弱连通分量(联合查找)
弱连通分量或联合查找算法在有向图中查找 连通节点 的集合,其中每个节点是从同一集合中的任何其他节点可达的**。**
它只需要在一个方向的节点对之间存在一条路径,而 SCC 需要在两个方向都存在一条路径。与 SCC 一样,Union Find 通常在分析的早期用于理解图的结构。
Union-Find 是一个预处理步骤,对于理解图的结构来说,在任何算法之前都是必不可少的。
我们可以使用以下方法测试连通有向图:
*nx.is_weakly_connected(G)
nx.is_strongly_connected(G)*
或者对于无向图,使用:
*nx.is_connected(G_karate)*
它返回一个布尔值。
确保查看关于实施连接的 Networkx 文档。
6.分层聚类
在层次聚类中,我们构建一个的层次聚类。我们用一个 树状图来表示下面的聚类。**
Dendrogram
这个想法是分析不同尺度的社区结构。我们通常自底向上构建树状图。我们从每个节点的一个集群开始,合并两个“最近”的节点。
但是我们如何测量星团是否很接近呢?我们使用相似距离。设 d(i,j)是 I 和 j 之间最短路径的长度。
Similarity Distances
对于最大链接,在每一步,由最短距离分开的两个聚类被组合。相似性距离可以如下所示:
Linkage
回到我们空手道的例子。在应用层次聚类之前,我们需要定义每个节点之间的距离矩阵。
**pcc_longueurs=list(nx.all_pairs_shortest_path_length(G_karate))
distances=np.zeros((n,n))# distances[i, j] is the length of the shortest path between i and j
for i in range(n):
for j in range(n):
distances[i, j] = pcc_longueurs[i][1][j]**
现在,我们将使用sklearn
的AgglomerativeClustering
函数来识别层次聚类。
**from sklearn.cluster import AgglomerativeClusteringclustering = AgglomerativeClustering(n_clusters=2,linkage='average',affinity='precomputed').fit_predict(distances)**
最后,根据分类用不同的颜色绘制结果图:
**nx.draw(G_karate, node_color = clustering)**
Hierarchical Clustering
7.聚类系数
聚类系数衡量两个节点趋向于 聚类 在一起的程度。
局部聚类系数是以节点 I 为中心的三角形的数量与以节点 I 为中心的三元组的数量之比。在某种意义上,它衡量节点 I 及其邻居与完整图形的接近程度。
Clustering Coefficient
我尝试用下图来说明聚类系数的计算:
Clustering Coefficient
****全局系数测量图形中三角形(局部聚类)的密度:
Global Clustering Coefficient
在上图中,聚类系数等于:
对于 Erdos-Rényi 随机图,E[聚类系数]=E[Ci]=p 其中 p 为上一篇文章定义的概率。
对于 Baràbasi-Albert 随机图,全局聚类系数根据节点数遵循幂律。度为 k 的节点的平均聚类系数与 k 的倒数成正比:
具有低等级的节点连接到其社区中的其他节点。度数高的节点链接到不同社区的节点。
对于给定的图,在networkx
中,可以很容易地计算出聚类系数。首先,让我们从局部聚类系数开始:
**# List of local clustering coefficients
list(nx.clustering(G_barabasi).values())**
这应该会返回类似于以下内容的内容:
**0.13636363636363635,
0.2,
0.07602339181286549,
0.04843304843304843,
0.09,
0.055384615384615386,
0.07017543859649122,
...**
并对结果进行平均,以找到图的全局聚类系数:
**# Global clustering coefficient
np.mean(list(nx.clustering(G_barabasi).values()))**
哪些标题:
**0.0965577637155059**
三。中心算法
中心性衡量一个节点的重要性。这不是一个清晰的定义,但当我们想要识别重要的网页、交通网络中的瓶颈时,这很有用…
一条步行是一条可以多次通过同一个节点的路径。中心性度量随着所考虑的行走类型和计算它们的方式而变化。
1.PageRank 算法
*****page rank*从其链接的邻居,然后再从它们各自的邻居,估计当前节点的重要性。
虽然是由谷歌推广的,但这是一种检测任何网络中有影响力节点的方法。例如,它被用来暗示社交网络上的联系。
PageRank 是通过迭代地将一个节点的等级(最初基于度)分配给它的邻居,或者通过随机遍历图形并计算在这些遍历期间命中每个节点的频率来计算的。
Neo4J summary of the Page Rank Algorithm
PageRank 通常是在有向图上计算的。但是,它也可以通过将有向图中的每条边转换为两条边来在无向图上执行。
例如,空手道图的 PageRank 可以通过以下方式访问:
**nx.pagerank(G_karate, alpha=0.9)**
其中,alpha 是阻尼参数(默认为 0.85)。作为回报,它会给你一个排名列表:
**{0: 0.09923208031303203,
1: 0.0543403155825792,
2: 0.05919704684187155,
3: 0.036612460562853694,
...**
2.程度中心性
度中心性 统计结束于节点 I 的长度为 1 的行走次数
它衡量传入和传出的关系。它由 C(Xi)=di 给出。例如,度中心性用于识别社交网络上最有影响力的人。
**c_degree = nx.degree_centrality(G_karate)
c_degree = list(c_degree.values())**
3.特征向量中心性
特征向量中心性是在节点 I 结束的无限长的行走的数量。
这使得具有良好连接的邻居的节点更加重要。
Eigenvector Centrality
**c_eigenvector = nx.eigenvector_centrality(G_karate)
c_eigenvector = list(c_eigenvector.values())**
4.接近中心性
接近中心度 通过图形检测能够有效传播信息的节点。
它可以用来识别假新闻账户或恐怖分子的细胞,以隔离那些可以传播信息的个人。
接近中心性与到其他节点的最短路径的长度之和成反比。
**c_closeness = nx.closeness_centrality(G_karate)
c_closeness = list(c_closeness.values())**
5.中间中心性
中间中心性 检测一个节点对图中信息流的影响程度。
它通常用于查找充当从图的一部分到另一部分的桥梁的节点,例如在电信网络中的包裹递送处理器中,或者在假新闻的传播中。
其中:
- σJK j 和 k 之间的最短路径数
- σJK(I)j 和 k 之间经过 I 的最短路径数
介数中心性测量一个节点作为两个节点之间的桥梁的次数。例如:
Centrality Measure
**c_betweenness = nx.betweenness_centrality(G_karate)
c_betweenness = list(c_betweenness.values())**
在 Python 中,实现依赖于networkx
的内置函数:
**# Plot the centrality of the nodes
plt.figure(figsize=(18, 12))# Degree Centrality
f, axarr = plt.subplots(2, 2, num=1)
plt.sca(axarr[0,0])
nx.draw(G_karate, cmap = plt.get_cmap('inferno'), node_color = c_degree, node_size=300, pos=pos, with_labels=True)
axarr[0,0].set_title('Degree Centrality', size=16)# Eigenvalue Centrality
plt.sca(axarr[0,1])
nx.draw(G_karate, cmap = plt.get_cmap('inferno'), node_color = c_eigenvector, node_size=300, pos=pos, with_labels=True)
axarr[0,1].set_title('Eigenvalue Centrality', size=16)# Proximity Centrality
plt.sca(axarr[1,0])
nx.draw(G_karate, cmap = plt.get_cmap('inferno'), node_color = c_closeness, node_size=300, pos=pos, with_labels=True)
axarr[1,0].set_title('Proximity Centrality', size=16)# Betweenness Centrality
plt.sca(axarr[1,1])
nx.draw(G_karate, cmap = plt.get_cmap('inferno'), node_color = c_betweenness, node_size=300, pos=pos, with_labels=True)
axarr[1,1].set_title('Betweenness Centrality', size=16)**
The different centrality measures
我们观察到由中心性度量突出显示的不同节点是非常不同的。例如,中间中心性产生的结果与其他方法相差甚远,因为它们测量的不是同样的东西。
四。结论
我们现在已经介绍了图的介绍、图的主要类型、不同的图算法以及它们在 Python 和 Networkx 中的实现。
在下一篇文章中,我们将讨论图学习,它提供了预测图中节点和边的方法,以处理丢失的值或预测新的关系。
如果您有任何问题或意见,请随时评论。敬请期待,本系列的最后一篇文章将于下周问世:)
来源:
- Neo4j 中的图形算法综合指南
- **网络 x 文档,【https://networkx.github.io/documentation/stable/ **
如果你想从我这里读到更多,我以前的文章可以在这里找到:
Python 中的主要概念、属性和应用
towardsdatascience.com](/introduction-to-graphs-part-1-2de6cda8c5a5) [## 用 Python 学习图形(第 3 部分)
Python 的概念、应用和示例
towardsdatascience.com](/learning-in-graphs-with-python-part-3-8d5513eef62d) [## 马尔可夫链和 hmm
在本文中,我们将关注马尔可夫模型,何时何地应该使用它们,以及隐马尔可夫模型。这个…
towardsdatascience.com](/markov-chains-and-hmms-ceaf2c854788) [## Python 中的人脸检测指南
在本教程中,我们将看到如何使用 OpenCV 和 Dlib 在 Python 中创建和启动人脸检测算法。我们会…
towardsdatascience.com](/a-guide-to-face-detection-in-python-3eab0f6b9fc1) [## 升压和 AdaBoost 解释清楚
直观的解释
towardsdatascience.com](/boosting-and-adaboost-clearly-explained-856e21152d3e)**
图形分析——中心性的介绍和概念
Photo by Alina Grubnyak on Unsplash
社交网络、大数据和电子商务的出现再次强调了分析一种独特类型的数据结构的重要性,这种数据结构描述了其实体之间的关系,也称为图表。在我开始介绍图分析之前,有必要简要介绍一下“图”的概念。
让我们从下面展示的朋友图表开始。我将在下面的一些章节中使用相同的图表来进一步解释图表分析的概念。
Figure 1 ( This graph was designed in Gephi )
上图描绘了朋友的图,其中节点/实体例如 A、B 等。描述了一个特定的个体,任何两个个体之间的链接(也称为边)描述了他们之间的关系(在这种情况下为“友谊”)。
从上面的例子中总结:
图可以被定义为“实体”或“事物”之间关系的表示,其中这些“实体”是图的“节点”(也称为“顶点”),它们之间的关系由图的“链接”(也称为“边”)来表示。对图的研究也被称为“图论”
此外,通过简单地查看图表,人们可以分析出 A 和 B 有一个共同的朋友 C,而 C 并不是 d 的朋友。数据科学的分支通过对图表进行分析来处理从图表中提取信息,这被称为**“图表分析”。**
从介绍继续向前,让我们通过探索一些基本概念进入图形分析的世界。在本文中,我们将特别关注图形分析中使用的基于中心性的概念。如果你不理解前面提到的声明,请不要担心,因为随着我们的前进,我将从头开始讲述一切。
中心性
在图分析中,中心性是识别图中重要节点的一个非常重要的概念。它用于测量图中各种节点的重要性(或“中心性”,如节点在图中的“中心”程度)。现在,从某个角度来看,每个节点都可能很重要,这取决于“重要性”是如何定义的。中心性有不同的风格,每种风格或度量从不同的角度定义节点的重要性,并进一步提供关于图及其节点的相关分析信息。
度中心性
我们要讨论的中心性的第一种味道是“度中心性”。为了理解它,我们先来探讨一下图中一个节点的度的概念。
在无向图中,节点的度被定义为一个节点与其他节点的直接连接数。请看下图:
在有向图中(每条边都有一个方向),节点的度进一步分为入度和出度。入度指的是入射到其上的边/连接数,出度指的是从它到其他节点的边/连接数。让我们看看下面的 Twitter 图表示例,其中节点是个体,带箭头的边表示“关注”关系:
Figure 2
我们可以看到,节点 E、C、D 和 B 具有朝向节点 A 的输出边,因此跟随节点 A。因此,节点 A 的入度是 4,因为它有 4 条边入射到它上面。
我们还可以看到,节点 B 跟随节点 D 和节点 A,因此它的出度为 2。
现在,度中心性度量将图中节点的重要性定义为基于其度来测量,即节点的度越高,它在图中就越重要。
重新检查下面提到的朋友图表(图 1 ):
Figure 3
节点 A 的度中心性是 7,节点 G 是 5,节点 C 是 4,节点 L 是 1。
数学上,度中心性被定义为节点“I”的 D(i ),如下所示:
现在,让我们简要地讨论一下上面显示的朋友图的度中心性的一个示例应用。观察节点 A 和 G,它们具有高度的中心性(分别为 7 和 5 ),并且如果我们想要将任何信息快速传播到网络的大部分,与仅具有 1 的中心性的节点 L 相比,它们将是理想的候选者。如果必须在网络中引入新产品或想法/思想,该信息对于创建营销或影响策略非常有用。营销人员可以关注 A、G 等节点。在网络中高度集中地营销他们的产品或想法,以确保节点之间更高的可及性。
类似地,记住样本 Twitter 图(图 2),如果我们实际检查一个具有数百万节点的社交网络,如 Twitter,并计算各种节点的入度中心性,具有高入度中心性的节点(如 Kanye West、Lady Gaga 和其他名人)将是拥有大量追随者的节点,并且可能是影响公众或推广商业产品的理想候选节点。现在你知道为什么名人或受欢迎的人在 Instagram 和 Twitter 等社交网络上获得报酬,以说某些事情或推广某些产品,因为商业公司意识到这些人有非常高的参与度,有能力影响或迅速接触到大量的人。
基于度中心性分析节点重要性的应用/有用性是巨大的,并且取决于所考虑的图/网络的性质。
接近中心性
我们要讨论的第二种味道是“接近中心性”。为了理解同样的道理,首先让我们来理解图中两个节点之间的“**测地线距离”**的概念。
两个节点 a 和 b 之间的测地距离 d 被定义为这两个节点之间的最短路径(具有最少边数的路径)上的边数/链接数。
让我们看看下图:
Figure 4
让我们检查 A 和 F 之间的测地线距离,以进一步阐明这个概念。我们可以通过 B 和 E 或 D 从 A 到达 F。然而,从 F 到 A 的最短路径是通过 D(2 条边),因此测地线距离 d(A,F)将被定义为 2,因为 A 和 F 之间有 2 条边。
数学上,测地线距离可以定义如下:
d( a , b ) =从 a 到 b 的最短路径上 a 和 b 之间的边数,如果存在从 a 到 b 的路径
d( a , b ) = 0,如果 a = b
d( a , b ) = ∞(无穷大),如果从 a 到 b 没有路径
此外,接近中心性度量将图中节点的重要性定义为通过它与图中所有其他节点的接近程度来测量。对于一个节点,它被定义为该节点到网络中所有其他节点的测地距离之和。
同样,在下面的图 1 中查看之前介绍的朋友图,我们可以看到节点 A 的亲密度中心性是 17,而节点 L 的亲密度中心性是 33。
Figure 5
数学上,图中节点 i 的接近中心度 C(i)可以定义如下:
让我们通过检查上面图 5 中的朋友图来简要描述亲密度中心性的一个示例应用。现在让我们假设在朋友的图中,每条链路/边都有 1 分钟的权重(属性),即从一个节点向其相邻节点(如 A 到 B 或 B 到 c)传输信息需要 1 分钟。现在让我们假设我们想向图中的每个节点发送一条特定信息(每个节点的信息都不同),我们需要在图中选择一个节点,该节点可以将它快速传输到网络中的所有节点。
为了解决上述问题,我们可以计算网络中所有节点的接近中心度。正如我们在上面已经为节点 A 计算的那样,如果我们选择节点 A,信息可以通过遍历 17 条边到达所有节点(即从 A 开始,在假设从 A 顺序发送的最坏情况下,信息可以在 17 分钟内被发送到所有节点),相比之下,在节点 L,将信息发送到所有节点需要 33 分钟。很明显,我们可以看到节点 A 和 L 在接近中心性度量方面的重要性差异。
中间中心性
我们将要讨论的第三种中心性被称为“中间中心性”(BC)。该度量基于节点在图中所有节点对之间的最短路径中出现的次数来定义和测量节点在网络中的重要性。为了进一步阐述这一指标,我们再来看看下面的朋友图表:
Figure 6
数学上,图中节点 i 的中间中心度 B(i)定义如下:
查看节点 A,我们可以看到它位于以下节点对之间的最短路径上:(D,M),(D,E),(G,C),(G,B),(G,F),(G,I),(K,C),(D,C)等等。因此在图中的所有其他节点中具有最高的 BC。我们还可以观察到,与图中的其他节点(除了 A)相比,节点 G 和 C 也具有较高的介数中心性(BCs)
如前所述,如果我们看一下上面的朋友图(图 6),节点 A 有一个非常高的 BC。如果我们移除它,将会导致网络中的巨大中断,因为节点{J,H,G,M,K,E,D}将无法与节点{F,B,C,I,L}通信,反之亦然,并且我们将会以两个孤立的子图结束。这种理解标志着具有高 BCs 的节点的重要性。
BC 的一个示例应用是在图中查找桥节点。具有高 BC 的节点是在大量节点对之间的最短路径上的节点,并且因此对于图中的通信是至关重要的,因为它们将大量节点彼此连接。从网络中移除这些节点将导致网络的链接或通信的巨大中断。
上述应用程序的一个真实使用案例是分析全球恐怖主义网络。例如,如果我们将恐怖分子或恐怖组织以及其他相关个人的网络表示为图的节点,我们可以计算每个节点的 BC,并识别具有高 BC 的节点。这些节点(或者在这种情况下是恐怖分子)将是网络中的桥节点。这些信息对国防机构非常有用,因为他们可以非常有效地破坏整个恐怖主义网络。该指标的另一个用例是检测和监控计算机网络或流网络中可能的瓶颈或热点。
特征向量中心性
我们将探索的中心性的最后一种风格被称为特征向量中心性。该度量将图中节点的重要性作为其邻居重要性的函数来衡量。如果节点连接到非常重要的节点,则与连接到不太重要的节点的节点相比,它将具有更高的特征向量中心性得分。
让我们看看下面给出的图表来进一步解释这个概念:
Figure 7
上图的邻接矩阵 A 如下所示:
Figure 8
我们假设在上面的图中,每个节点的重要性是用它的度来衡量的,这样一个节点的度越高,它在图中的重要性就越大。各节点的度数如下所示:
Figure 9
以上也可以表示为如下所示的矩阵向量 V :
Figure 10
现在,在数学上,特征向量中心性计算如下:
Figure 11 showing Eigen Vector Centrality Calculation — 1st Iteration
上述等式中的合成 1-D 向量给出了图中每个节点的特征向量中心性(EVC)分数。乘法的第一次迭代的效果可以如下所示:
Figure 12 showing EVC scores of each node after 1st iteration of multiplication
正如您在上面看到的,节点 A 和 B 的得分都很高,为 8,因为它们都连接到多个具有高度(重要性)的节点,而节点 E 的得分为 3,因为它只连接到一个 3 度的节点。同样重要的是,观察到合成向量中每个节点的 EVC 分数值只不过是其相邻节点的度数之和。例如:节点 A 的 EVC 分数=度(B) +度© +度(D) = 8
现在,如果我们在上面的等式(图 11)中得到的合成 EVC 向量再次乘以邻接矩阵 A,我们将得到图中每个节点的 EVC 得分的更大值,如下所示:
Figure 13 showing Eigen Vector Centrality Calculation — 2nd Iteration of multiplication
将结果向量再次乘以邻接矩阵(乘法的第二次迭代)的效果可以被可视化,如下所示:
Figure 14 showing EVC scores of each node after 2nd iteration of multiplication
现在,为什么我们要用邻接矩阵再次乘以合成向量?
简而言之,答案在于,将所得向量再次与图的邻接矩阵相乘有助于 EVC 分数在图中展开,从而对于图中的每个节点,得到更全局突出的 EVC 分数,而不是局部 EVC 分数。如果我们观察到,在乘法的第一次迭代之后,每个节点的 EVC 分数仅是其直接(第一级)邻居的函数,因此是局部分数,其在图中的全局水平上可能不准确。
阐述上述内容时,如果我们将上述操作可视化,我们可以观察到以下情况:
- 在乘法的第一次迭代之后,每个节点从它的直接(第一级)邻居获得它的 EVC 分数。
- 在第二次迭代中,当我们再次将结果向量乘以邻接矩阵时,每个节点再次从它的直接邻居获得它的 EVC 分数,但是第二次迭代中的不同之处在于,这一次,直接邻居的分数已经受到它们自己的直接(第一级)邻居先前(从第一次乘法迭代)的影响,这最终帮助任何节点的 EVC 分数也成为它的第二级相邻节点的函数。
- 在随后的乘法迭代中,图节点的 EVC 分数通过受到来自更远程度的相邻节点(第三、第四等等)的 EVC 分数的影响而保持更新。
重复乘法使得每个节点的 EVC 分数最终是其相邻节点的几度的函数或依赖于其相邻节点的几度,从而为每个节点提供全局精确的 EVC 分数。通常,重复 EVC 向量与邻接矩阵相乘的过程,直到图中节点的 EVC 值达到平衡或不再显示明显变化。
对特征向量中心性的应用的讨论是广泛的,值得单独的一篇文章来讨论。EVC 的一个示例应用是计算页面排名或页面排名算法,Google 和许多其他公司使用该算法来根据相关性对互联网上的网页进行排名。页面排名是 EVC 的直接变体。万维网上的网页有指向/来自其他网页的链接。你可以把每一个网页想象成图中的一个节点,把每一个输出/输入链接想象成通向/来自网络上另一个网页的有向边,从而构成整个万维网图。万维网中网页的图经历几次 EVS 计算的迭代,以便计算每个网页的全局精确的相关性排名。然后,具有高 EVC 分数的网页可以作为营销和其他商业目的的目标。
图形分析的领域是广阔的,并且有巨大的实际应用。这篇文章的范围是覆盖中心性的基本原理,希望能让读者深入了解图形分析的迷人世界。
以下是可用于图形分析的各种图形分析库和软件列表:
- Gephi(【https://gephi.org/】T2)
- 细胞图(https://github.com/cytoscape/cytoscape.js)
- Neo4j(https://neo4j.com)
- GraphAnalyticsLib(https://github.com/jb123/GraphAnalyticsLib
用于几何深度学习的图卷积网络
图形学习和几何深度学习—第二部分
G 图卷积与上一期中介绍的图嵌入方法非常不同。卷积方法不是将图变换到更低的维度,而是在输入图本身上执行,结构和特征保持不变。
Convolutions (Courtesy of Doing Interesting Things in Life)
由于图表在更高的维度上保持最接近其原始形式,因此关系归纳偏差更强。
学习算法的归纳偏差是一组假设,学习者使用这些假设来预测其尚未遇到的给定输入的输出。
每个机器学习算法中都有一种归纳偏差。例如,在普通 CNN 中,最小特征归纳偏差声明,除非有充分的证据表明某个特征是有用的,否则它应该被删除。特征选择算法是建立在这个假设之上的。在几何深度学习中,假设是相关的:
通过以优先考虑特定模式的方式来组织数据,我们可以提高模型性能,即使数据是相同的。
香草卷
通常,传统的卷积网络包括 3 个主要操作:
内核/过滤器
将内核想象成一个扫描仪,而不是“跨越”整个图像。扫描仪一次可以扫描的像素簇由用户定义,为执行下一次扫描而移动的像素数量也是如此。内核将像素聚集成网格格式的值,为池化做准备。
联营
再次执行“扫描仪”类型的操作,但是池化不是聚合一堆像素,而是只挑选出最重要的值(最大池化)或平均所有值(平均池化),并使用它来构建用于展平的值网格。
展平
扁平化只是采用池化操作的最终网格结构,并将其截断成一个数组,然后可以通过前馈神经模型,最终输出预测。
图形卷积
然而,图上的卷积更具挑战性。由于其不规则的结构,图形的操作并不简单。图像被表示在二维欧几里得网格上,其中内核可以向左、向右等移动。图形是非欧几里得的,方向的概念如上、下等。没有任何意义。**图形更加抽象,节点度、邻近度和邻域结构等变量提供了更多的数据信息。**所以最终的问题是:
我们如何推广图形数据的卷积?
Wet spider silk sort of looks like a graph!
推广卷积的关键是核/滤波器。我们将会看到**图学习方法之间最大的不同是在内核中,**或者说内核在操作什么。
在高层次上,卷积聚合来自周围或相邻实体的信息。深度学习中的卷积利用这些聚合信息来构建特征图(网格值),这些特征图用于通过神经网络进行预测。我们想在图表上这样做。
图卷积的类型
有两种类型的图形卷积:
**空间方法:**不需要使用特征值
和
**光谱方法:**需要使用特征材料
这两种方法都建立在不同的数学原理上,很容易注意到每种方法中方法之间的相似之处。然而,为什么谱方法在图形学习中如此流行,这可能不是很直观。
这是对一些最流行的架构的高级分析。
谱图卷积网络
Michal Defferrard 等人的研究方向导致了图论和信号分析中一个新领域的普及。该子域被称为图形信号处理 (GSP)。
GSP 是一般化卷积的关键,它允许我们构建能够考虑图形的整体结构和图形组件的单独属性的函数。
GSP 使用类似于傅立叶变换的信号处理功能,这通常是为信号/频率保留的工具,并将它们应用于图形。正是图傅立叶变换允许人们将**“带宽”或“平滑度”的概念引入到图中。**在这个术语的空间意义上,平滑度只是指事物集合的每个值相对于彼此有多接近。从光谱的角度来看,这有点复杂。
类似于平滑时间信号,其具有窄的频带宽度,展示聚类属性的图在 GFT 中将具有窄的频带宽度(信号在高度互连节点的集群内变化较小)。换句话说,一个聚类图在频域中将是稀疏的,允许更有效地表示数据(频域、非欧几里德和谱域意味着相同的东西)。对于一点光谱直觉,你可以在这篇伟大的文章中找到一个伟大的总结。
A graph with its signals represented in the spatial domain.
在 GCNs 中,**节点特征和属性用“信号”来表示。**然后,我们可以使用信号处理中的概念从数据中学习。通常,信号不仅仅是节点或边缘特征,而是应用于该特征的功能。
卷积可以通过寻找拉普拉斯图的特征分解来计算。特征分解是一种将矩阵分解成一组特征向量和特征值的方法。这也被称为谱分解,因此称为谱图卷积网络。**计算拉普拉斯的特征向量,返回图形的傅立叶基。**由于计算是在拉普拉斯算子上进行的,因此将有与图节点一样多的特征向量。直接求解分解是密集的,因此许多方法选择近似频谱分解。为了深入了解谱分解,机器学习大师有一个关于这个操作的很棒的帖子。
所以总体步骤是:
- 使用特征分解将图形转换到谱域
- 对指定的内核应用特征分解
- 将光谱图和光谱核相乘(像香草卷积一样)
- 返回原始空间域中的结果(类似于逆 GFT)
关于谱图论的原始论文是这整个图形学习方法家族的灵感来源。这些是最受欢迎的一些。
切布涅茨—德费拉德等人
ChebNets 是关于谱图学习的第一篇也是最重要的论文之一。谱卷积被定义为信号(节点特征/属性)与内核的乘积。这类似于卷积对图像的操作方式,其中像素值乘以核值。
由拉普拉斯特征值的对角矩阵的**切比雪夫多项式构成的谱卷积中使用的内核。**切比雪夫多项式是一种正交多项式,其特性使其非常擅长于逼近函数等任务。内核由以下等式表示:
其中 gθ 为核( θ 表示切比雪夫系数的向量)应用于λ,拉普拉斯特征值的对角矩阵(λ】表示缩放拉普拉斯特征值的对角矩阵)。 k 代表最小阶邻域, K 代表最大阶邻域。最后, T 代表k阶的切比雪夫多项式。
用简单的英语说:
对于从到 K-1 的每一阶,核等于应用于缩放拉普拉斯特征值的对角矩阵的所有切比雪夫多项式核的总和。
最初的 ChebNet 论文还通过使用图形处理介绍了池化方法,这是完整普通卷积的另一个关键组件。这个额外的步骤提高了效率,并使图形卷积更接近它们的普通表亲。
Before and after graph coarsening (Courtesy of Andreas Loukas)
ChebNet 隐式避免计算特征值位置,而是选择近似它。在这方面,ChebNet 与 Thomas Kipf 等人的图卷积网络非常相似。gcn 本质上是一阶 cheb net(一阶和二阶+在我的上一篇文章中有所解释),并通过一些其他简化操作来降低复杂性。
一阶仅仅意味着用于确定两个节点之间相似性的度量是基于节点的紧邻。二阶(以及更高阶)意味着用于确定相似性的度量考虑了节点的直接邻域,但是也考虑了邻域结构之间的相似性(随着每一阶的增加,节点被考虑的深度增加)。在大多数论文中,卷积内被考虑的阶数由T5 KT7 表示(最小阶数为K)。****
ChebNets 没有将 K 限制为任何值,因此该模型能够学习给定节点的任意阶邻域。然而,gcn 将其 K 值限制为 1,从而将卷积的范围限制为一阶相似性。
图卷积网络(GCNs)——Kipf 和 Wellin g
在图形学习中被引用最多的作品是 Kipf 和 Welling 的一篇论文。该论文将谱卷积引入了图学习,并被简单地称为“图卷积网络”,这有点误导,因为它被归类为谱方法,而绝不是图学习中所有后续工作的起源。
在 Kipf 和 Welling 的 GCN 中,卷积被定义为:
eqn. 1
其中 gθ 是一个内核( θ 代表参数),它被应用(由星号代表)到**【x】、*** 一个图形信号。 K 代表要考虑的远离目标节点的节点数(第 K 阶邻居, k 为最近阶邻居)。 T 表示应用于 L̃ 的切比雪夫多项式,其表示如下等式:*
eqn. 2 (In the original paper, part of the simplification included assuming λ max = 2)
其中λmax表示 L 的最大特征值,归一化图拉普拉斯。可以在一个图形上执行多次卷积,输出聚合成 Z.
eqn. 3
其中 Z 是卷积信号的矩阵(来自相邻节点)是图的邻接矩阵(加上单位矩阵) D ̃是从θ是核/滤波器参数的矩阵(可以在整个图中共享),而 【T21 D 到 -1/2 的幂是重正化技巧的一部分,以避免爆炸或消失梯度。**
等式 1 和 3 是包含在激活函数(Relu、Sigmoid 等)中的分量。).合并后的结果是构成 GCN 单一图层的分层传播规则。关键的创新是傅立叶变换的使用,傅立叶变换是量子力学(在 Q 比特的研究中)和信号处理(在波的研究中)中的一种流行操作。
ChebNets 和 gcn 非常相似,但它们最大的区别在于它们对等式中的值 K 的选择。1.在 GCN 中,逐层卷积限于 K = 1 。这是为了减轻图形局部邻域过度拟合的风险。Kipf 等人的原始论文进一步解释了这如何使架构相对于拉普拉斯算子呈线性,从而简化了整体模型的复杂性。
Component sound waves coming together to make a single sound (Courtesy of Hearing health matters)
在高层次上,GCN 使用图形傅立叶变换来聚合相邻结点的特征和属性。这些特征和属性被表示为信号,这些信号是潜在图的组件分解。这类似于成分频率是声波的分解;分量频率是节点特征(作为信号),声波信号是潜在图形。
gcn 在节点分类任务和其他图形应用中表现良好,但主要缺点是特征值往往在很小的范围内聚集在一起*,每个聚类之间有很大的间隙。对 ChebNets 来说,这一点可以强调到较低的程度。这个问题后来被 CayleyNets 解决了。***
快速/简化图形卷积(FastGCNs/SGCs)
谱卷积的最大缺点是计算量非常大。内核是在傅立叶空间中定义的,而图形傅立叶变换的计算成本是出了名的高。它需要将节点特征与图拉普拉斯的特征向量矩阵相乘,这是对一个有 N 个节点的图的一个 O(N ) 运算。
因此,IBM 研究人员着手解决的问题是,如何在保持最佳结果的同时提高计算效率。fastcn因此诞生于对可伸缩谱图卷积的需求。该项目基本上修改了原始的 GCN 架构,以便能够使用蒙特卡罗*(有偏随机抽样方法)方法一致地估计积分,这允许*批量训练,减少了总的训练时间。
另一方面,简化图卷积(SGC)以不同的方式处理这个问题;与其提高计算效率,也许降低计算复杂度才是自然的解决方案。他们的实验结果显示在左边的图表上。他们假设背后的前提是:
“我们假设 GCN 层之间的非线性并不重要,但大部分好处来自局部平均。”
项目去除了每个卷积层之间的非线性转换函数。最终的 softmax 激活允许概率输出,可通过随机梯度下降进行优化。
凯莱网
CayleyNets 使用一种秘密成分改进了 ChebNet 的高计算开销问题。顾名思义,这种方法使用 Cayley 变换(用单位半圆表示)来解决问题。
Reminds me of fractal visualizations (Courtesy of the globberingmattress blog)
在高层次上,转换有助于“放大”倾斜的数据点,如这张古怪的 GIF 所示。
Cayley 多项式与 ChebNets 中的 Chebshev 多项式具有相似的性质,包括定位的有用概念(注意,在这两种方法中,“多项式”指的是充当内核/滤波器的函数)。**
Cayley 已被证明在广泛的图形学习任务中表现更好,因为他们能够在训练期间检测重要的窄频带,并在图形上很好地定位的同时专注于它们。****
由于 Cayley 内核/滤波器中的一个参数( h ),频谱上较小的特征值可以分散开来,从而允许内核专注于不同的频率。这在原始论文的 3 张图中可以看到,证明了参数(h)的归一化能力,其中标记表示特征值(红色表示保存重要信息)。
Cheb vs Cayley (Courtesy of ResearchGate)
并列而言,CayleyNets(橙色)大多优于 ChebNets(蓝色),同时需要的参数更少。
电影
MotifNets 是一种不同的方法,它通过引入“主题”的概念建立在原始 GCN 模型的基础上。本质上,该模式将输入图划分为个主题,这些主题是 x 长度的唯一子结构,因此数据集中的任何图都可以通过主题的某种组合来构建。**
The motifs used in the original paper (Courtesy of the MotifNet team)
这些图案的尺寸为 x = 3。 注意,主题考虑到了边的方向性*,这是图论中的一个细节,在以前的图形学习方法中被忽略了。这对于具有内在方向概念的应用程序尤其有用,例如社交网络、交通网络和能源网格。***
ChebNet 是具有无向图的单个拉普拉斯算子的 MotifNet 的一个实例,其中使用了 Chebyshev 多项式的矩阵。MotifNet 的每个卷积层都有一个多元矩阵多项式*(一个奇特的内核,其中每个元素都是一个多变量的多项式),它被应用到 motif 的拉普拉斯矩阵并从中学习。***
尽管切布内特和 GCN 的效率很高,但这两种方法在处理包含簇特征值的图时都有困难,这种现象在社区图中很常见。在这方面,MotifNet 力求修复与 CayleyNet 相同的弱点。**
总体光谱方法
稳健、可靠和经过研究的谱卷积从整体上激发了人们对图形学习和几何深度学习的兴趣。甚至 Yann Lecun 和其他研究人员也在这个领域的前沿做出了贡献。
然而,谱方法有很多缺点和不足,但那是另一篇文章的主题。
空间图形卷积网络
GraphSage —汉密尔顿等人
GraphSage 的美在于它的简单性。该型号是顶级的,在性能方面保持竞争力,即使是更新或更强大的型号。它特别强大,因为它可以很好地适应大型、密集、同质的动态网络。Graph sage 部分是由 Jure Leskovec 的贡献创建的,他也为本文中的其他各种算法做出了贡献(包括 node2vec),它是来自斯坦福大学网络分析项目 SNAP 的许多图形学习算法之一。
在高层次上,GraphSage 有 3 个步骤:
邻域采样:
***首先在图中找到目标节点的近邻。*深度 k 由用户定义,并确定将采样多少个“邻居的邻居”。这是递归执行的操作,执行设定的步骤数。
聚合:
在图中的每个节点都采样了其各自的邻域后,我们必须将邻域节点的所有特征汇集到目标节点。原论文提出 3 个聚合函数
- 平均聚合 —对所有邻域节点特征进行平均(可以是加权平均)
- LSTM 聚合-使用 LSTM 单元选择性聚合邻域结点要素(随机排序)
- 池化聚合 —最大池化仅考虑“最高”特性(在实验中表现最佳)
预测:
目标节点使用聚集的邻域节点特征通过神经网络进行预测,这可以是像节点分类或结构/上下文确定这样的任务。这是学习发生的地方。以监督的方式对图中的每个节点重复这 3 步过程。该方法的直观表示如下所示:**
GraphSage (Courtesy of the GraphSage research team)
实验表明,池化聚合的性能最好,计算效率也最高。GraphSage 的有效性是为什么它是目前在现实世界应用程序中实现的少数图形学习模型之一。照片分享网站 Pintrest 目前使用 GraphSage(尽管经过修改并更名为 PinSage)根据用户的兴趣和搜索查询来预测相关照片。
混合模型网络(MoNet)——蒙蒂等人
MoNet 在进一步的研究和开发中取得了很大成功,原始论文成为许多方法和架构的灵感和源泉,包括测地线 CNN(gcnn)、各向异性 CNN(acnn)、样条 CNN 和扩散 CNN。
最初的莫奈论文有三重贡献
- 各种图形学习方法的概括,统一了空间和光谱方法
- 使用参数核、伪坐标的新方法,与现有模型(各向异性 CNN、测地线 CNN 等)集成
- 在不同的基准流形、图形和网络上进行的一系列实验
莫奈的概括首先根据应用、任务和输入,将变量 x 视为流形中的点或图中的节点。变量 y 被认为是相邻的节点或点,其与 d 维空间中的伪坐标的向量相关联,使得**【x,y】是伪坐标,其对于的每个邻居都有唯一的集合。**
每个伪坐标通过一个加权函数,该函数复制了传统图像卷积核的效果,由此核的每个值乘以当前考虑的值。在 MoNet 的情况下,加权函数是具有可学习参数的内核,它在伪坐标上操作:
其中σj是一个可学习的 d 乘 d 协方差矩阵, μj 是一个 d 乘 1 核的均值向量。 d 是伪坐标向量的尺寸(【x,y】)。这些矢量/伪坐标卷积核映射出一些非常有趣的可视化效果:**
The normalized kernels applied to a manifold (Courtesy of the MoNet research team)
在 3D 模型上是以它们的流形上的一点为中心的局部极坐标。圆图(代表模型的多色部分)是在流形上的不同卷积运算中使用的补丁算子加权函数*(内核的奇特说法)。***
这个内核只在 MoNet 中学习,而不是在 GCNNs 和 ACNNs 中硬编码。人们可能注意到的第一件事是莫奈的权重(红色曲线)比其他方法更明显(GCNN)和更完整(ACNN)的权重“平滑”了多少。****
这些内核可视化将随着 GCNNs 和 ACNNs 的每个独特配置而改变。但是莫奈和 GraphSage 一样,可以学习参数。这种灵活性是两者都允许跨数据集共享参数的部分原因。这为像迁移学习这样的想法应用到几何领域开辟了空间。图形学习的未来看起来非常棒!**
整体空间方法
空间方法更容易掌握,特别是对于大多数人来说,他们对线性代数相关的运算没有很强的直觉,如特征分解、傅立叶变换和其他复杂的数学概念。
最近,空间方法获得了越来越多的动力,其潜在原因是另一篇文章的主题。
本质上
在 2010 年至 2012 年期间,由于深度学习领域最优秀的研究人员的共同努力,包括 Yann Lecun(图像卷积)和 Geoff Hinton(反向传播),卷积神经网络点燃了只有他们看到的深度学习的回归。有效和高效的图卷积有可能产生这种效果,将几何深度学习领域推向聚光灯下。
谱卷积和空间卷积之间的差异有望得到阐明,最终,这两种方法的特征在于具有如下差异:
频谱卷积在数学上和理论上与普通卷积相似,而空间卷积在概念上和普通卷积相似。
一种方法遵循教科书定义和数学来概括卷积,另一种方法从图论的角度出发。
我肯定错过了一堆算法和模型,尤其是最近对几何深度学习和图形学习的兴趣激增,导致几乎每天都有新的贡献出现在出版物上。一些有趣的方法包括像 Graph U-Net 和 Graph Markov 神经网络这样的项目。还有一些我还没有完全理解的现有模型;但当我做到了,我会更新这篇文章。
关键要点
- 图形卷积的目的是将图像卷积运算推广到图形,以便我们可以达到相似的性能和精度水平。**
- 图形卷积不同于图像卷积,因为图形作为一种具有非欧几里德属性的数据结构与欧几里德图像的集合结构非常不同*。***
- 图形学习方法分为两个派别;光谱方法和空间方法。通过检查特征分解和相关操作的使用来确定分类。
- 谱方法试图使用信号等概念来表示节点特征,并使用傅里叶变换等操作来聚集节点信息并进行预测。**
- 空间方法使用操作(如消息传递)和表示方法(如伪坐标)来聚合节点之间的信息并做出预测。**
接下来,我们将深入探讨循环图和基于注意力的方法🔥
需要看到更多这样的内容?
跟我上LinkedIn脸书insta gram,当然还有* 中*****
我总是希望结识新朋友、合作或学习新东西,所以请随时联系flawnsontong1@gmail.com
向上和向前,永远和唯一🚀
图形数据库。有什么大不了的?
继续关于语义和数据科学的分析,是时候讨论图形数据库以及它们能为我们提供什么了。
介绍
我们应该把宝贵的时间投入到学习一种吸收、存储和分析数据的新方法上吗?在图表上接触数学?
对我来说,当我开始调查时,答案是不确定的,但过了一会儿,我的答案是:
I’m using a surprising amount of Kenan Thompson’s gifs. Wow.
在本文中,我将讨论图数据库的一些想法和概念,它们是什么,它们的优势是什么,以及它们如何在我们的日常任务中帮助我们。
顺便说一句,我真的厌倦了编写大量的连接和查询来计算 2017 年 1 月至 2018 年 10 月期间在 Y 州购买商品 X 的客户数量(以及他们的平均工资),并且该客户已经超过 Z 个月了。所以,一切对我有帮助的事情,我想很多人都是这样,在缩短时间,让它变得更简单、更直观方面,我都参与了。
什么是图?
This is not the type of graph I’ll be talking about 😃
当我们谈论图表时,在英语中有一个问题(在西班牙语中我们没有这个问题)。如果您在线搜索图形图像,您可能会看到以下内容:
google.com
但这不是我想谈论的那种图表。当我在这里谈论一个图表时,这是你应该在脑海中描绘的:
我将给出图的两种定义。首先是数学问题,然后是更简单的问题。
根据贝扎德和沙特兰的说法:
图 G 是一个有限的非空集 V 和一个(可能是空集)集合 E(与 V 不相交),集合 E 是 V 的(不同的)元素的二元子集。V 的每个元素称为一个顶点,V 本身称为 G 的顶点集;边集合 E 的成员称为边。我们所说的图的一个元素是指一个顶点或一条边。
图论最吸引人的特征之一在于该学科的几何或图像方面。给定一个图,用图解法表示它通常是有用的,其中集合的每个元素用平面上的一个点表示,每个边用一条线段表示。
把 G 的这种图称为 G 本身是很方便的,因为集合 V 和 E 是容易辨别的。在下图中,图 G 显示了顶点集 V = {V1,V2,V3,V4}和边集 E = {V1V2,V1V3,V2V4,V3V4}
Copyright Favio Vázquez (you can use it of course)
正如你所看到的,集合 V 包含了图中顶点或点的数量,E 包含了它们之间的关系(读作 V1V2,就像 V1 连接到 V2)。
所以简单来说,图是对象(或实体或节点)及其关系(或边)的数学表示。这些点中的每一个都可以代表不同的东西,这取决于你想要什么。顺便说一下,这里节点和顶点的意思是一样的,我们可以互换使用。
当我们使用图形数据库时,我们将回顾一个如何使用它们的例子。
什么是数据库?
https://www.bmc.com/blogs/dbms-database-management-systems/
来自 techopedia:
从最一般的意义上来说,数据库是一个有组织的数据集合。更具体地说,数据库是一个电子系统,它允许数据被容易地访问、操作和更新。
换句话说,一个组织使用数据库作为存储、管理和检索信息的方法。使用数据库管理系统(DBMS)来管理现代数据库。
你想知道真相吗?根据我的经验,大多数数据库都是:
- 没有组织
- 不易接近
- 不易操纵
- 不容易更新
当我们谈论做数据科学的时候。在更早的年代(比如 20 lol ),维护一个数据库更容易,因为数据简单、更小、更慢。
如今,我们几乎可以在“数据库”中保存我们想要的任何东西,我认为这个定义与另一个概念有关,即关系数据库。
在关系数据库中,我们有一组“正式”描述的表,可以从这些表中以许多不同的方式访问或重组数据,而不必重新组织数据库表。基本上,我们有模式,可以在其中存储不同的表,在这些表中,我们有一组列和行,在特定位置(行和列)中,我们有一个观察。
我们在这些表之间也有关系。但它们不是最重要的,它们包含的数据才是最重要的。通常情况下,它们会被画成这样:
https://towardsdatascience.com/what-if-i-told-you-database-indexes-could-be-learned-6cf8f59bff94
什么是图形数据库?
基于数学图的概念,图数据库包含节点和边的集合。节点代表一个对象,边代表两个对象之间的连接或关系。图形数据库中的每个节点都由表示键值对的唯一标识符来标识。此外,每条边都由一个唯一的标识符定义,该标识符详细描述了起始或结束节点以及一组属性。
我将用一个来自 Cambidge Semantics 的例子来说明图形数据库是如何工作的。
假设我们有一些存储在本地连锁餐厅的数据。通常,在关系数据库中,您会将客户信息存储在一个数据库表中,将您提供的商品存储在另一个表中,将您的销售额存储在第三个表中。
当我想了解我卖了什么、订购了多少库存以及谁是我的最佳客户时,这很好。但是缺少的是连接组织,项目之间的连接,以及数据库中可以让我充分利用它的函数。
图形数据库存储相同类型的数据,但也能够存储事物之间的联系。约翰买了很多百事可乐,杰克和瓦莱丽结婚了,买了不同的饮料。我不需要运行 JOINs 来了解我应该如何向每个客户进行营销。我可以看到数据中的关系,而不必做出假设并进行测试。
neo4j 的人提到:
访问原生图数据库中的节点和关系是一种高效的、恒定时间的操作,允许您在每个内核上每秒钟快速遍历数百万个连接。
关系数据库将高度结构化的数据存储在具有预先确定的列和行的表中,而图形数据库可以映射多种类型的关系数据和复杂数据。因此,图形数据库的组织和结构不像关系数据库那样严格。所有关系都存储在边的顶点中,这意味着顶点和边都可以有与之关联的属性。这种结构允许数据库能够描述不相关的数据集之间的复杂关系。
图形数据库的使用
https://blog.cambridgesemantics.com/why-knowledge-graph-for-financial-services-real-world-use-cases
您知道吗,2018 年被吹捧为“图形年”,因为越来越多的大型和小型组织最近开始投资图形数据库技术。所以我们并没有走上一条疯狂的道路。
我并不是说我们从关系数据库和 SQL 中了解到的一切都不再适用。我是说,在某些情况下(令人惊讶的是,很多情况下),使用图形数据库比使用关系数据库更好。
我现在就给你一个建议,告诉你什么时候应该使用图形数据库,而不是其他东西:
- 你有高度相关的数据。
- 你需要一个灵活的模式。
- 您希望有一个结构并构建更接近人们思维方式的查询。
相反,如果您有一个高度结构化的数据,您希望进行大量的分组计算,并且您的表之间没有太多的关系,那么您可能更适合使用关系数据库。
图形数据库还有另一个不明显的优势。它允许你建立一个知识图表。因为它们是图表,知识图表更直观。人们不会用表格来思考,但他们会立刻理解图表。当你在白板上画出一个知识图表的结构时,它对大多数人的意义是显而易见的。
然后你可以开始考虑建立一个数据结构,这可以让你重新思考你做机器学习和数据科学的方式。但是这是下一篇文章的素材。
在您的公司中实现图形数据库
像传统的 RDBMS 一样,图数据库可以是事务型的,也可以是分析型的。
当你选择你的图形数据库时,选择你的焦点。例如,流行的 Neo4J、 Neptune 或 JanusGraph 都专注于事务(OLTP)图数据库。
而类似的 AnzoGraph 是一个分析(OLAP)图形数据库。但是,要小心,您可能需要不同的引擎来运行涉及单个实体的快速查询(例如,Sean 买了什么汽水?)和轮询整个数据库的分析查询。(例如,像肖恩这样的人买一瓶汽水的平均价格是多少?).随着机器学习和人工智能的发展,图 OLAP 数据库变得非常重要,因为许多机器学习算法都是固有的图算法,在图 OLAP 数据库上运行比在 RDBMS 上运行更有效。
在这里,您可以找到不同类型的图形数据库和计算工具的丰富资源:
图形数据库和图形计算工具的精选资源列表
github.com](https://github.com/jbmusso/awesome-graph)
图形 OLAP 数据库的用例非常多。例如,可以使用 PageRank 算法找到关键的意见领袖和书籍推荐者。此外,进行流失分析以提高客户保留率,甚至进行机器学习分析以确定推动图书销售的五大因素。
如果你想了解为什么以及如何实现一个 OLAP 图表,请看这篇文章:
[## 如果您没有使用 OLAP 图表,以下是您应该使用的原因
越来越多的企业和政府机构已经开始使用 GOLTP 系统来存储和挖掘他们的…
blog.cambridgesemantics.com](https://blog.cambridgesemantics.com/if-youre-not-using-graph-olap-heres-why-you-should)
下一步是什么?
下面的图表(摘自https://db-engines.com/)展示了这些类别受欢迎程度的历史趋势。在每个月的排名中,选择每个类别中最好的三个系统,并计算其排名得分的平均值。为了便于比较,初始值被归一化为 100。
Graph databases are getting a lot of attention
Together with Time Series databases, graph databases are on the top.
随着数据源持续快速扩张(非结构化数据增长最快),寻找基于机器的见解变得越来越重要。
图形数据库为链接不同的数据提供了一个极好的基础设施。图形数据库易于表达数据之间的实体和关系,使程序员、用户和机器更容易理解数据并找到见解。这种更深层次的理解对于成功的机器学习计划至关重要,其中基于上下文的机器学习对于特征工程、基于机器的推理和推断变得越来越重要。
在未来,我将讨论图形数据库如何帮助我们进行机器学习和数据科学。
相关文章:
对现有数据的研究如何帮助我们成为更好的数据科学家。
towardsdatascience.com](/ontology-and-data-science-45e916288cc5) [## 机器学习的数据结构。第一部分。
语义学的新进展如何帮助我们更好地进行机器学习。
towardsdatascience.com](/the-data-fabric-for-machine-learning-part-1-2c558b7035d7) [## 面向大众的深度学习(…和语义层)
深度学习现在无处不在,在你的手表里,在你的电视里,在你的电话里,在某种程度上,在你的平台上…
towardsdatascience.com](/deep-learning-for-the-masses-and-the-semantic-layer-f1db5e3ab94b)
冠军推荐的图形网络(英雄联盟)
让我们想象你为暴乱游戏公司工作。你的第一个任务是设计一种在他们的游戏《英雄联盟》中产生冠军(可玩角色)推荐的方法。你会如何处理这个问题?
标准的方法是给每个冠军贴上关键属性的标签,然后根据这些共同属性将他们联系起来。我们可以用这个来假设享有冠军 A 的参与人 1 也会享有相似的冠军 b。
例子:泽德是一名中路刺客,使用近战攻击,并拥有高机动性装备。塔龙也有这些属性,因此如果一号玩家喜欢泽德,我们可以假设他们也会喜欢塔龙。
然而,通过使用图网络,我们可以反过来解决这个问题:如果我们已经知道平均来说享受冠军 A 的玩家享受冠军 B,那么那些目前只玩冠军 A 的玩家将可能享受冠军 B——不管他们共享什么属性。
例子:经常玩 Zed 的玩家也经常玩 Talon。如果一号玩家只玩泽德,他们可能也会喜欢塔龙。我们可以假设这两个冠军有相似之处——我们只是不需要定义他们是什么。
你可以在这里找到最终产品:【www.lolnets.com
语境
你可以在这里观看游戏介绍。
你可以在这里阅读更多关于图表的信息。
“节点”=图中的特定点,在此上下文中,“节点”是冠军
“边”=两个节点(冠军)之间的连接。如果没有边缘,两个冠军是不相连的。有时与权重(也称为节点间距离)一起使用。
数据采集
对于任何数据科学问题,第一步都是收集数据。首先,我们需要随机选择一个召唤师的名字。幸运的是,这些都可以通过 Riot API 工具轻松实现。
我们首先创建一个区域和部门列表。为此,我使用了 3 个地区(EUW、北美和韩国)和以下分类:钻石、铂金、黄金、白银和青铜(比例为 1:2:4:4:2)。然后可以使用下面的循环随机创建一个大约 8000 个召唤师 id 的列表。
Loop code used to create a randomised list of Summoner IDs
一旦我们有了这些 id,我们可以再次使用 Riot API 来循环每个召唤师,找到他们的前 5 名冠军。代码下方的表格显示了 5 名随机玩家,他们最常玩的 5 个冠军(显示为冠军 ID)。
Each players Top 5 Champions (using Champion ID)
通过聚集这个数据集,我们可以回答每个冠军的以下问题:当他们出现在玩家的前 5 名名单中时,哪些冠军也最常出现在同一名单中?
这将创建下表:
我们可以看到,对于冠军 1(安妮),最常见的连接是冠军 103 (Ahri)。用最简单的话来说:对于所有 8000 名选手来说,那些经常打安妮的选手也将比其他任何冠军更经常打 Ahri。
通过另一个简单的循环,我们可以将这个表转换为一个矩阵,其中冠军 ID 1(在 Y 轴上)将连接到 X 轴上的冠军 103、142 和 55。然后再一次,以同样的方式从 X 转置到 y。这将在所有冠军中重复。代码下方是最终矩阵的说明性示例(非真实数据)。冠军 id 出现在 X 和 Y 轴上,其中 1 表示两个冠军之间有联系,0 表示没有联系。
数据收集现已完成。
图形网络
下一步是创建图形网络,为此,我将使用 NetworkX 根据我们之前保存的矩阵创建图形。然后我们用散景来更详细地观察它。完整代码如下:
这将创建下图:
你可以在这里看到这张图的互动版本。
节点按泳道着色(黄色:支持,橙色:ADC,蓝色:中间,绿色:丛林,红色:顶部)。由此我们可以得出一些有趣的发现,例如 Thresh/Blitzcrank 往往是由非支援玩家扮演的支援(因为它最接近其他车道组),而 Soraka 往往是支援主线的首选冠军(因为它最深入支援组)。这个逻辑可以贯穿始终,查看交互图,得出自己的结论!
但是对推荐有帮助吗?答案是依赖。是的,如果你正在寻找你最喜欢的泳道的冠军,不,否则。这是为什么呢?
假设你是一名 ADC main,你可以假设你的前 3 名冠军将围绕以黑色突出显示的橙色部分分组。如果我们使用此图来推荐冠军,可以肯定的是,它只会推荐一小部分最接近 ADC 分组的中间 laners(用蓝色标记)。这不是一个量身定制的建议。它不会从您独特的 ADC 冠军那里获取您的特定玩法,而是简单地将您默认为一个通用 ADC 播放器,并假设您与所有其他 ADC 完全一样。
为了改善这一点,我们需要回到数据收集上来。
数据收集 2
这一次,我们正在以不同的方式完成任务。我们不会给每个玩家找前 5 名冠军,我们会给每个玩家找前 3 名冠军*。这意味着,对于每一个冠军,我们也将有共同的连接到每一个车道。*
循环代码相当长,所以我不会在这里包括它。最后,我们留下了一个矩阵,它包含每个冠军,并将其连接到每个通道中的前 3 名冠军(总共 15 个连接)。除此之外,这些优势现在也将根据他们的平均冠军掌握程度作为该车道的百分比进行加权。
举例:如果你是一个打 Thresh (80k 精通)、Blitzcrank (10k 精通)、Pyke (10k 精通)做支援的 ADC 主。然后 Thresh 会给 80%,Blitz 给 10%,Pyke 给 10%。
这是反过来计算的:边 A 到 B 权重= 1 —(冠军 B 精通点数/总冠军精通点数)。这样,越高的玩家在一条道上掌握的百分比就在冠军身上,越低的边权重(也称为节点间距离)。
图形网络 2
现在我们有了一个新的方法来处理图网络,我们可以使用相同的代码重新创建图。
这比之前的要复杂得多。节点之间有大量的连接,权重决定了它们之间的距离。虽然看起来不太舒服,但它现在应该会提供更强的推荐。
推荐引擎
最后一部分是制造引擎。为此,我们回到 Riot API。通过插入我们自己的召唤师名字和地区,我们可以调用我们最常玩的冠军列表。我们用我们的干线,用 Dijkstra 的算法来确定从我们的冠军到其他冠军的距离。我们删除任何我们已经经常玩的冠军,按球道分组,瞧——我们会找到最接近我们已经玩过的冠军。
举例:我是 AP Mid main,大部分时间玩战斗法师,比如 Vel’Koz 和 Lux。我的首选是 Teemo,我的中间是仙后座,我的支持者是莫甘娜。这是有道理的,我们可能会使用本文开头概述的简单方法到达这里。然而,对于 ADC,我被推荐为 Jhin——这一点我无法解释。我没玩过 Jhin,但是和我一样热爱战斗法师的人玩 ADC 的时候似乎也很享受 Jhin。引用大师自己的话,我的观众在等待!
结论
谢谢你读到文章最后。我希望这为如何在推荐引擎中使用图网络提供了一些启示。我可能最终会将完整的代码发布到 GitHub 上,但直到我对它的编写方式感到更加自豪。我计划很快将此贴在 Reddit 上,当我这样做时,我会包含链接,请随时在这里或那里留下您的反馈和评论。
你已经看到文章的结尾了!我叫 Jack J,是一名将人工智能应用于竞技游戏和电子竞技的专业数据科学家。我是 iTero 的创始人。GGT3和jung . GG。你可以在 Twitter 上关注我,加入 iTero Discord 或者给我发邮件 jack@itero.gg 。下一场见。
**最初发表于:【https://itero.gg/blog】T21
图形神经网络与置换不变性
用不变性理论学习图形和关系数据
Photo by Alina Grubnyak on Unsplash
在之前的一篇帖子中,我们讨论了一种学习聚合函数的方法。当分析关系数据时,需要根据未知数量的记录得出结论,这种特殊的需求就出现了。例如,根据交易历史对客户进行分类。更一般的情况是在图上学习,其中我们必须基于连接到当前顶点的顶点的属性以及终止于给定顶点的边的任何属性来预测节点的属性。
举例来说,考虑一个基于交易历史预测客户流失的问题。下面是著名的 Northwind 数据库的 ER 图。
这里的挑战是,每个客户有零到多个交易行,因此您不能轻松地为每个客户创建一个只有一行的表格数据集。最常见的方法是生成以某种方式聚合交易的特征,例如,订单计数、所有订单的总金额、上个月的订单数量等。但本着深度学习的精神,我们希望探索的算法能够自己学习这些功能,而不是依赖手工制作的功能。
很容易看出,实体关系可以用图来表示。例如,Northwind 数据库具有以下图形结构:
事实上,图可以很容易地表示实体关系,同时也能够表示更复杂的结构,这些结构不容易用关系数据库来表示。图形表示也使问题更加清晰。给定这个图,我们如何卷起所有相邻顶点的属性,并预测给定其连接的顶点的重要属性。
这个领域的研究已经进行了很长时间。参见[1]中关于神经网络方法的一篇很好的综述,或者如果你更喜欢内核方法,你可以查看[2]。这里我们将集中于神经网络方法,更具体地说,集中于卷积图神经网络。这些网络的灵感来自卷积神经网络(CNN),它彻底改变了计算机视觉领域。你可以在下面看到 CNN 的基本构件——卷积滤波器:
应用滤波器,我们可以学习图像的基本特征,堆叠多个卷积层,连同池和其他层,我们可以使用反向传播的能力来学习卷积滤波器的所有参数。这是图形神经网络的目标,其中标签可以分配给顶点、边或子图。
然而有一点不同。CNN 允许来自不同方向的不同贡献,而卷积图神经网络将相同的贡献层分配给所有相邻节点。就好像卷积滤波器只允许卷积矩阵的所有元素具有相同的值。以上面的客户流失为例。典型的图形神经网络将激活函数(或几层神经网络)应用于每个相邻节点,然后取输出的总和,并将其添加到节点的特征,可选地应用另一个变换函数。
这实际上对大多数图表都有意义。如果您再次查看客户订单节点图,您会注意到,如果我们切换任意两个订单节点,客户节点没有任何变化。这个性质被称为不变性,从[3]开始,人们对这个话题有了一定的兴趣。
置换对称对多元函数 f()施加了一个约束。通常,它可以用对称群的不可约表示来分解(因为置换群在形式上是已知的)。然而,有一种更简单的方法来表示这个函数,使用Kolmogorov–Arnold 表示定理。它陈述了如果 f 是多元连续函数,那么 f 可以写成单变量连续函数的有限合成和加法的二元运算。更具体地说,
从某种意义上说,他们证明了唯一真正的多元函数是和,因为其他所有函数都可以用一元函数和求和来编写。如果函数 f 是置换不变的,那么公式可以进一步简化:
这与卷积图神经网络中使用的公式完全相同。请注意, φ 是 x 的多维函数。本质上,上面的公式将一维 x 映射到多维向量,然后对每个相邻节点的向量求和,并使用函数 **ρ再次映射到一维值。**在【4】中已经证明,对于标量 x, φ 的维数必须至少为 N,以便能够逼近任何函数。这是通用逼近定理的图形版本。对我们来说,这意味着我们必须使用 φ 的维数至少作为每个客户的最大订单数。然而,可以使用更低的维数,但是在这种情况下,不能保证收敛。
我们将运行一个实验,并尝试获得不同维度值 φ 的模型性能。我们将近似max
函数,众所周知,使用连续函数很难近似。我们将遵循与之前的 Jupyter 笔记本相同的方法:
我们将在这个实验中使用合成数据。我们假设有 100 个客户,他们的订单数量各不相同。我们将看看是否能成功地了解每个客户的最大订单金额。
首先我们会做一些探索性的数据分析。我们将看到最大订单金额在客户中的分布。
我们将遵循与前一篇文章几乎相同的代码,但是使用更多的隐藏层,因为 max()函数不容易学习,因为它的层很少
现在让我们尝试探索潜在空间维度的不同值的模型性能
总的来说,我们得到了相当低的 MSE。似乎神经网络很好地拟合了数据。我们还可以观察到,对于 100 维潜在空间,我们得到了 MSE 的意外尖峰。但是对于高于 125 的维度,该模型给出了极好的结果,但是即使对于更低的维度,该结果也是可接受的。它证实了[4]的论点,即尽管存在理论上的限制,但实际上潜在空间的维度可以显著低于,并且在实践中仍然给出良好的结果。有可能模型过拟合,因为由于几个隐藏层,我们有这个模型的许多参数。需要进一步的研究来调整它,选择最佳的激活函数和模型结构。
结论和下一步措施
奇怪的是,对图形或关系结构的学习并没有引起应有的关注。这很奇怪,因为大多数业务数据库都是关系型的,而大多数大数据系统都是在图形和关系型方法中获得优势的。然而,大多数机器学习算法都采用严格的表格格式,即使是可选数据也会给大多数算法带来问题。的确,您可以将图形嵌入作为一种策略,从图形数据中生成一个表格数据集。但是在这种情况下,我们失去了反向传播的能力。基于 CNN 的图模型是一个活跃的研究领域,最近关于置换不变性的理论研究证明了这些模型的坚实的理论基础。
我对这个话题感兴趣的原因之一是,大约一周后我将去 NIPS,我希望有机会在那里见到图形和关系学习以及置换理论的研究人员。如果你也打算参加 NIPS,请随时与我联系。与此同时,像往常一样,你可以在我的 github 库中找到这款笔记本的所有代码。
参考资料:
- 韩综等人。艾尔。,关于图神经网络的综合综述,arXiv:1901.00596v3 [cs。LG]2019 年 8 月 8 日
- 克里格等人。艾尔。,关于图核的综述,arXiv:1903.11835v1 [cs。2019 年 3 月 28 日
- Zaheer 等人。艾尔。,深套,arXiv:1703.06114v3 [cs。2018 年 4 月 14 日
4.瓦格斯塔夫等人。艾尔。,论集合上表示函数的局限性,arXiv:1901.09006v2 [cs。2019 年 10 月 7 日
图形神经网络是如何工作的?
图形神经网络(GNNs)作为一种有趣的应用出现在许多问题中。最显著的是在化学和分子生物学领域。在这个领域产生影响的一个例子是 DeepChem ,一个使用 GNNs 的 pythonic 库。但是它们到底是如何工作的呢?
gnn 是什么?
典型的机器学习应用将把图形表示预处理成实值向量,这又丢失了关于图形结构的信息。GNNs 是信息扩散机制和神经网络的组合,代表一组转移函数和一组输出函数。信息扩散机制定义为节点更新它们的状态,并通过向它们的邻居节点传递“消息”来交换信息,直到它们达到稳定的平衡。该过程首先涉及一个转移函数,该函数将每个节点的特征、每个节点的边特征、相邻节点的状态和相邻节点的特征作为输入,并输出节点的新状态。斯卡塞利等人 2009 年[1]提出的原始 GNN 使用了离散特征,并将边和节点特征称为“标签”。然后,该过程涉及一个输出函数,该函数将节点的更新状态和节点的特征作为输入,为每个节点产生一个输出。
The localized functions for GNNs. Equation 1 from [1]
定域跃迁和输出函数都是被学习的参数微分函数。为了找到唯一的解,文献[1]的作者使用了 Banach 不动点定理和 Jacobi 迭代方法来以指数速度计算节点的状态。
Banach 不动点定理和 Jacobi 方法
这个 Banach 不动点定理 (BFP)陈述了一个方程组存在唯一的解,并提供了一种计算这些不动点的方法。如果假设一个度量空间 X ,那么*T:X→XT7 的 mpping 称为 X 上的收缩映射,其中*在 X 中承认一个唯一的不动点 x (例如 T GNN 中的转移函数被假设为相对于节点状态的压缩映射。因为 BFP 保证了唯一的解,所以作者使用雅可比迭代法来计算不动点解,即节点的状态。雅可比方法迭代求解算法,首先将近似值代入,然后迭代直至收敛。***
Equation 5 from [1]
From Kacamarga, M. F., Pardamean, B., & Baurley, J. (2014)
这种计算由一个网络来表示,该网络由计算转换和输出函数的单元组成。下图显示了编码网络及其展开的表示。当转移函数和输出函数由前馈神经网络(NN)实现时,编码网络成为递归神经网络,一种 NN,其中节点之间的连接沿着时间序列形成有向图。这些类型的网络最常用于处理输入序列。所得网络中的每一层对应于一个时刻,并且包含编码网络的所有单元的副本,而层之间的连接取决于原始的编码网络连通性。
Figure 3 From [1].
如上所述,每个反向传播步骤都需要存储单元的每个实例的状态,对于大型图形,所需的内存可能相当大。 Almeida-Pineda 算法【3,4】用于帮助减少这种情况,通过假设等式 5(如上所示)在梯度计算之前已经达到稳定点,可以通过仅存储 x 来执行随时间的反向传播,因为它不期望随着 t 的改变而改变。关于这方面的更多细节,我推荐看他们提供证明和数学公式的原始论文。
消息传递神经网络(MPNN)
由于人们对 GNNs 在化学和分子研究中的应用越来越感兴趣,[5]为 GNNs 制定了一个框架,并将以前的研究转换成这种格式作为说明。主要区别是:
- 不假设边特征是离散的
- 两个阶段:消息阶段和读出阶段,其中读出阶段是新的
Message Phase: Message and Update function from [5]
消息阶段与组合的转换函数和输出函数同义,其中 M 是转换函数,而是输出函数。读出阶段是所有节点状态的函数,并输出整个图形的标签。
Readout Phase: Readout function from [5]
作者展示了以前的 GNN 方法是如何在 MPNN 框架中形成的,显示了它的多功能性。
Formulating previous GNN approaches into the MPNN framework [5].
谁在使用 MPNNs?
MPNN 正被用于进一步的研究,如图像分割、位置图、化学/分子图、自然语言处理等。这些方法中的许多已经解决了 gnn 固有的平坦性、不学习图的分层表示以及如果不正确处理的话计算量大的问题。在一篇将 MPNN 应用到他们工作中的论文的文献综述中,对最初的 MPNN 框架最常见的改变是子图的使用。这有助于研究人员在某些情况下减少计算,以及在整个图形中表示分层图形关系。
希望这一领域的研究将继续下去,并能够扩展到更大的具有更动态交互的图形。这将允许对可区分的大型社交网络的进一步建模方法。
参考
[1]g .蒙法迪尼,Ah Chung Tsoi,m .哈根布奇纳,f .斯卡塞利和 m .戈里(2008 年)。图形神经网络模型。神经网络汇刊,20(1),61–80。https://doi.org/10.1109/tnn.2008.2005605
[2] Kacamarga,M. F .,Pardamean,b .,和 Baurley,J. (2014 年)。mapreduce 框架下共轭梯度法和雅可比法算法的比较。应用数学科学, 8 (17),837–849。
[3]皮内达,法官,1987 年。反向传播推广到递归神经网络。物理评论快报,59(19),第 2229 页
[4]阿尔梅达法律出版社,1987 年。组合神经网络中带反馈的异步感知器的学习规则
[5] Gilmer,j .,Schoenholz,S. S .,Riley,P. F .,Vinyals,o .,& Dahl,G. E. (2017 年)。量子化学的神经信息传递。从 http://arxiv.org/abs/1704.01212取回
[6] D. Duvenaud,D. Maclaurin,j . Aguilera-iparaguirre,R. GmezBombarelli,T. Hirzel,A. Aspuru-Guzik 和 R. P. Adams,“用于学习分子指纹的图形卷积网络”,2015 年
[7] Y. Li,D. Tarlow,M. Brockschmidt,R. Zemel,“门控图序列神经网络”,2015 年。
[8] P. W .巴塔格利亚和 m .赖,“学习物体、关系和物理学的互动网络 arXiv : 1612。00222v1 [ cs。2016 年 12 月 1 日。”
[9] K. T. Schutt,F. Arbabzadah,S. Chmiela,K. R. M uller 和 A. Tkatchenko,“来自深度张量神经网络的量子化学见解”,《自然通讯》,第 8 卷,第 13890 页,2017 年。
图形神经常微分方程
将图形神经网络扩展到连续深度域
Rayleigh–Bénard convection. Finite element methods discretize spatially continuous problems into sets of entities that display complex inductive relational biases. Source: original author.
多智能体系统普遍存在于各种科学领域:从物理学到机器人学,博弈论,金融和分子生物学,等等。通常,封闭形式的分析公式是不可用的,并且预测或决策任务不得不依赖于有噪声的、不规则采样的观察。
这类系统提供了一个清晰的归纳关系偏差的例子。在统计学或机器学习中引入归纳偏差是一种众所周知的提高样本效率和泛化性能的方法。从目标函数的选择,到适合手头具体问题的特定深度学习架构的设计,偏见是普遍而有效的。
关系归纳偏差[1]代表一类特殊的偏差,涉及实体之间的关系。概率或其他图形模型是一类传统的模型,专门以先验结构的形式对实体施加关系偏差。这些图结构在不同的方面是有用的;即通过引入条件独立性假设来降低计算复杂度,以及通过以图形形式编码先验知识来提高样本效率。
图形神经网络(GNNs)是图形模型的深度学习对应物。当目标问题结构可以被编码为图时,或者在关于输入实体之间的关系的先验知识本身可以被描述为图的设置中,通常使用它们。GNNs 已经在各种应用领域显示出显著的结果,例如节点分类[2],图分类和预测[3][4]以及生成任务[5]。
深度学习中的常微分方程
另一类不同但同样重要的归纳偏差与收集数据的系统类别有关。尽管深度学习传统上是由离散模型主导的领域,但最近的进展提出了将神经网络视为配备有连续层的模型[6]。该视图允许将正向传递重新表述为常微分方程(ODE)的初始值问题的解决方案。这种假设允许对微分方程直接建模,并提高神经网络在涉及连续时间过程的任务中的性能。
我们的工作旨在弥合几何深度学习和连续模型之间的差距。图形神经常微分方程 (GDEs)将图形结构数据上的常见任务投射到系统理论框架中:
GDEs model vector fields defined on graphs, both when the structure is fixed or evolves in time. This is achieved by equipping the model with a continuum of GNN layers.
GDEs 提供了灵活性,因为它们的结构是由连续的 GNN 层定义的,因此可以适应不规则采样的顺序数据。
GDEs 的主要目的是为结构化系统的建模提供一种数据驱动的方法,特别是当动态特性是非线性的,因而难以用经典或分析方法处理时。
下面是对 GDEs 的介绍。我们参考完整的论文以获得更多的细节和推导。一个 github 知识库目前正在开发中,它以注释 Jupyter 笔记本的形式提供了一些介绍性的例子。我们鼓励请求/建议 GDEs 的额外应用:我们计划最终包括所有主要图形神经网络 (GNN)架构的 GDE 变体的工作示例,部署在各种设置(预测、控制……)
准备工作和背景
GDEs 和 GNNs 一样,对 图 *进行操作。*我们参考了 GNNs 的优秀调查以及我们论文中的背景部分,以获得关于符号和基本定义的更详细介绍。接下来的 GDE 介绍是经过提炼的,只有两个关于图的基本事实是必须的:
- 图是由边连接的节点(实体)的集合。深度学习模型通常在属性图、上工作,属性图是其节点由一组特征描述的图(通常以嵌入向量或张量的形式)。对于具有 n 个节点的图,每个节点由 d 个特征描述,我们将nxd个节点的嵌入矩阵表示为 H 。
- 图的结构通过其邻接矩阵 A. 节点之间的连接结构代表了标准深度学习模型和 GNNs [1]之间的主要区别,因为后者以各种方式直接利用它来执行节点嵌入操作。
图形神经常微分方程
A G raph 神经普通 D 微分Equation【GDE】定义如下:
General GDE formulation
其中 H 是节点特征矩阵。以上为 H 定义了一个向量场,由函数 F 参数化,该函数可以是任何已知的图形神经网络 (GNN)层。换句话说, F 利用图 G 的连通性信息,以及它的节点特征,来指定***【S】中 H 的演化,这里S** 是模型的深度域; S 是连续的,不同于深度域由自然数子集指定的 GNNs,代表由 F 定义的常微分方程的积分域。GDEs 可以用多种方式训练,很像标准的神经微分方程[6]。系统的适定性在论文中有完整的讨论。*
一般的 GDE 公式带有几个含义。在一般神经微分方程的情况下,已经观察到离散化方案的选择可以描述先前已知的 ResNets 的离散多步变量[7]。因此,深度学习的连续、动态系统观点不限于微分方程的建模,并且可以通过利用丰富的数值方法文献来指导新的通用模型的发现。
与 ResNets 相比,gnn 作为一个模型类相对年轻。因此,具有复杂的、类似分形的剩余连接的多级或变体的文献并不发达;新 GNNs 变体的发现可以通过将各种离散化方案应用于 GDEs 来引导,而不是从零开始。
静态图的结果:节点分类
通过在 Cora、Pubmed 和 Citeseer 上进行的一系列半监督节点分类实验,我们证明了 GDEs 可以作为高性能的通用模型。这些数据集包含静态图*,其中邻接矩阵 A 保持固定,因此远离 GDEs 大放异彩的动态系统设置。我们评估图卷积常微分方程 (GCDEs)的性能,定义为:*
GCDE model. A more detailed version is included in our paper, along with GDE versions of popular GNN variants
以及它们完全离散化的对等物 图卷积网络【GCN】【8】。我们包括著名的图形注意网络*(GAT)【9】以供参考:*
Accuracy on node classification tasks. Mean and standard deviation of 100 runs.
GCDEs 与最先进的模型相比具有竞争力,并且优于它们的离散对应物。我们评估了两个版本的 GCDEs:采用固定步长方案离散化的龙格-库塔4(GCDE-rk4),以及自适应步长方案Dormand-Prince(GDDE-DP r5)。固定步长离散化不能确保 ODE 近似保持接近解析解;在这种情况下,解决一个适当的 ODE 是没有必要的,GCDE-rk4 只是为 GCNs 提供了一个计算有效的 fractal net-like 结构,以提高准确性。
Training loss and accuracy on Cora. Shaded area is the 95% confidence interval
另一方面,使用自适应分步求解器训练 GCDEs 自然会比使用普通 GCNs 得到更深的模型,后者的层深度会大大降低性能。在我们的实验中,我们成功地用多达 200 个 ODE 函数评估 (NFE)训练了 GCDE-DP r5,这是一个比普通 gcn 可能的图形计算量高得多的计算量,其层深度大大降低了性能。应该注意的是,gde 不需要比它们的离散对应物更多的参数,因为事实上它们在函数计算中重用它们的参数。有趣的是,自适应步长几何微分方程似乎不受节点特征过度平滑的影响。过度平滑问题[10]阻碍了深度 gnn 在各种领域的有效使用,特别是多智能体强化学习*(MARL);我们目前正在探索 GDEs 的这一特性,并将很快包括更详细的分析。*
时空 GDEs
GDEs 的一个关键设置涉及时空图形数据。当处理图序列时,GNNs 的递归版本是必要的[11][12]。然而,与常规递归神经网络(RNNs)及其变体非常相似,固定离散化不允许对不规则采样数据进行操作。这一事实推动了 RNNs 形式的进一步发展,RNNs 具有到达时间之间的动力学的先验假设[13]以及 RNN 的 ODE 版本[14]。
在涉及时间分量的场景中,GDEsT3S的深度域与时间域一致,并且可以根据需要进行调整。例如,给定时间窗δt,由 GDE 执行的预测采用以下形式:
*不考虑具体的 GDE 架构。GDEs 代表了用于图序列的自回归建模的自然模型类,并且自然地导致以 混合动态系统 *,形式的经典时空体系结构的扩展,即以相互作用的连续和离散时间动态为特征的系统。核心思想是让 GDE 平滑地操纵两个时刻之间的潜在节点特征,然后应用一些离散算子,导致节点特征的跳跃 H ,然后由输出层处理。
给定一组时刻 {(t ₖ)} )和一个状态图数据流 {(X ₜ,G ₜ)} )自回归 GDEs 的一般公式为:
Autoregressive GDE. Continuous variants of known spatio — temporal GNN models can be obtained from this system by choosing appropriate F, G, K
其中 F 、 G 、 K 为类 GNN 算子或一般神经网络层, H ⁺ 代表离散转换后 H 的值。系统的演化可以通过混合自动机来可视化:
Hybrid automata schematic of autoregressive GDEs.
与仅配备离散跳跃的标准递归模型相比,自回归 GDEs 在跳跃之间结合了潜在节点特征的连续流 H 。自回归 GDEs 的这一特性允许它们从不规则的观测中跟踪动力系统。 F 、 G 、 K 的不同组合可以产生最常见的时空 GNN 模型的连续变量。
为了评估自回归 GDE 模型在预测任务中的有效性,我们在已建立的 PeMS 流量数据集上进行了一系列实验。我们按照[15]的实验设置进行额外的预处理步骤:对时间序列进行欠采样,每个条目的移除概率为 0.7,以模拟具有不规则时间戳和缺失值的挑战性环境。
为了测量 GDEs 在使用连续时间系统生成的数据的设置中获得的性能增益,我们采用了 GCGRU 及其离散副本 GCGRU [12],并且我们将结果与香草 GRU 度量联系起来。对于考虑中的每个模型,我们收集 归一化的 RMSE (NRMSE)和 平均绝对百分比误差 (MAPE)。在我们的论文中可以找到关于所选指标和数据的更多细节。
时间戳之间的非恒定差异导致对单个模型的预测任务具有挑战性,因为平均预测范围在训练和测试过程中会发生剧烈变化。为了在模型之间进行公平的比较,我们将增量时间戳信息作为 GCGNs 和 GRUs 的附加节点功能。
Results of irregular data forecasting task. Mean and standard deviation across 5 training runs.
由于 GCDE-GRUs 和 GCGRUs 被设计为在结构和参数数量上相匹配,我们可以测量出 NRSME 的性能提升 3% 和 MAPE 的性能提升**7%。具有连续动态和不规则数据集的各种其他应用领域可以类似地受益于采用 GDEs 作为建模工具:医学、金融或分布式控制系统,仅举几例。我们正在这些领域进行更多的实验,欢迎提出请求、想法或合作。
结论
如前所述,我们目前正在开发一个 github 库,里面有一系列不同类型 gde 的例子和应用。
我们鼓励请求/建议 GDEs 的其他应用:我们计划最终包括所有主要图形神经网络 (GNN)架构的 GDE 变体的工作示例,部署在各种设置(预测、控制……)。我们的论文在 arXiv 上有预印本:如果你觉得我们的工作有用,可以考虑引用我们。**
参考文献:
[1] P. W .巴塔格利亚等人,关系归纳偏差、深度学习和图形网络。arXiv 预印本 arXiv:1806.01261,2018。
[2] J .阿特伍德和 d .陶斯利扩散卷积神经网络。神经信息处理系统进展,1993–2001 页,2016 年。
[3]崔志勇、亨瑞克森、柯和王。交通图卷积递归神经网络:网络规模交通学习和预测的深度学习框架。arXiv 预印本 arXiv:1802.07007,2018
[4] J .帕克和 j .帕克。物理诱导图形神经网络:风电场功率估算的应用。能源,187:115883,2019。
[5]李、o .维尼亚尔斯、c .戴尔、r .帕斯卡努和 p .巴塔格利亚。学习图的深度生成模型。arXiv 预印本 arXiv:1803.03324,2018。
[6] T. Q. Chen、Y. Rubanova、J. Bettencourt 和 D. K. Duvenaud。神经常微分方程。《神经信息处理系统进展》,6571–6583 页,2018 年。
[7]陆,钟,李,董。超越有限层神经网络:桥接深层结构和数值微分方程。arXiv 预印本 arXiv:1710.10121,2017。
[8]基普夫和韦林。基于图卷积网络的半监督分类。arXiv 预印本 arXiv:1609.02907,2016。
[9]佩利科维奇、库库鲁勒、卡萨诺瓦、罗梅罗、莉雅和本吉奥。图形注意力网络。arXiv 预印本 arXiv:1710.10903,2017。
[10]陈,德利等.“从拓扑角度度量和缓解图神经网络的过光滑问题” arXiv 预印本 arXiv:1909.03211 (2019)。
[11]李,,沙哈比和刘。扩散卷积递归神经网络:数据驱动的交通预测。arXiv 预印本 arXiv:1707.01926,2017
[12]赵晓东、陈芳芳和赵俊辉。预测网络数据中动态不确定观点的深度学习。2018 年 IEEE 大数据国际会议(Big Data),1150–1155 页。IEEE,2018。
[13] Z. Che、S. Purushotham、K. Cho、D. Sontag 和 Y. Liu。具有缺失值的多变量时间序列的递归神经网络。科学报告,8(1):6085,2018。
[14] Rubanova,R. T. Chen 和 D. Duvenaud。不规则采样时间序列的潜在常微分方程。arXiv 预印本 arXiv:1907.03907,2019。
[15]俞、尹和朱。时空图卷积网络:交通预测的深度学习框架。在 2018 年第 27 届国际人工智能联合会议(IJCAI)的议事录中。