TowardsDataScience 博客中文翻译 2020(四百一十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

梯度下降、学习率和特征缩放的重要性

原文:https://towardsdatascience.com/gradient-descent-the-learning-rate-and-the-importance-of-feature-scaling-6c0b416596e1?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

史蒂夫·阿灵顿在 Unsplash 上拍摄的照片

这篇帖子的内容是书中一章的部分复制:**用 PyTorch 进行深度学习循序渐进:初学者指南 **

介绍

梯度下降学习率特征缩放有什么共同点?让我想想…

每次我们训练深度学习模型或任何神经网络时,我们都在使用梯度下降**(带反向传播)。我们用它来通过更新模型的参数/权重最小化损失。**

参数更新取决于两个值:梯度和学习率**。学习率让你可以控制更新的大小。一个更大的学习率意味着更大的更新,并且有希望是一个学习更快的模型。**

但是有一个圈套,一如既往…如果学习率太大**,模型什么都学不到。这让我们想到了两个基本问题:**

  • 多大才算“太大”?
  • 有什么办法可以用更大的学习率吗?

不幸的是,第一个问题没有明确的答案。它总是取决于许多因素。

但是有一个第二个第一个的答案:特征缩放!这是怎么回事?这就是我写这篇文章的原因:向你详细展示梯度下降、学习率和特征缩放之间的联系。

在本帖中,我们将:

  • 定义一个模型并生成一个合成数据集****
  • 随机地初始化参数
  • 探索损失面可视化梯度****
  • 了解使用不同学习率效果****
  • 了解特征缩放效果****

模型

模型必须是简单的熟悉的**,这样你就可以专注于梯度下降的内部运作。因此,我将坚持使用一个尽可能简单的模型:一个具有单一特征的线性回归 x !**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简单线性回归

在这个模型中,我们使用一个特征** ( x )来尝试预测一个标签 ( y )的值。我们的模型中有三个元素:**

  • 参数 b
  • 参数 w
  • 还有那个上学期**(为什么总是必须是希腊字母?),ε,这是为了说明固有的噪声,即我们无法消除的**误差****

数据生成

我们已经知道我们的模型了。为了给它生成合成数据**,我们需要为它的参数取值。我选了b= 1**w = 2**。**

先来生成我们的特征** ( x ):我们使用 Numpy 的 rand 方法,在 0 到 1 之间随机生成 100 ( N )个点。**

然后,我们将我们的特征** ( x )和我们的参数 bw 代入我们的方程来计算我们的标签 ( y )。但是我们需要添加一些 高斯噪声(ε)为好;否则,我们的合成数据集将是一条完美的直线。**

我们可以使用 Numpyrandn 方法生成噪声,该方法从正态分布(均值为 0,方差为 1)中抽取样本,然后将其乘以因子以调整噪声的水平**。由于我不想添加这么多噪声,所以我选择了 0.1 作为我的因子。**

合成数据集

训练-验证-测试分割

解释训练-
验证-测试分割背后的原因已经超出了本文的范围,但是我想提出两点:

  1. 分割应该总是是你做的第一件事——没有预处理,没有转换;在分割之前什么也没有发生——这就是为什么我们在合成数据生成之后立即进行分割
  2. 在这篇文章中,我们将只使用训练集——所以我没有费心创建一个测试集,但是我还是对高亮点#1 :-)进行了分割

训练-验证分割

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

综合数据

随机初始化

在我们的例子中,我们已经知道参数的真实值,但是这在现实生活中显然永远不会发生:如果我们知道真实值,为什么还要费心训练一个模型来找到它们呢?!**

好的,鉴于我们永远不会知道参数的真值,我们需要为它们设置初始值。我们如何选择他们?事实证明。一个随机猜测和其他的一样好。

所以,我们可以随机初始化 参数/权重(我们只有两个, bw )。

随机起点

我们随机初始化的参数是: b = 0.49w = -0.13 。这些参数有用吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然不是…但是,他们到底有多坏?这就是损失的原因。我们的目标将是最小化它。

损失面

在为我们的参数选择了一个随机起点后,我们用它们来预测计算相应的误差将这些误差汇总成一个损失。由于这是一个线性回归,我们使用均方差(MSE) 作为我们的损失。下面的代码执行这些步骤:**

进行预测并计算损失

我们刚刚计算了对应于我们的随机初始化参数 ( b = 0.49 和 w = -0.13)的损失 (2.74)。现在,如果我们对 bw 的所有可能值做同样的处理会怎么样?嗯,不是所有可能的值,而是给定范围内的所有等间距值的组合?****

我们可以在 -24 之间改变 b ,同时在 -15 之间改变,例如,每个范围包含 101 个均匀间隔的点。如果我们在这些范围内计算对应于的参数 bw 的每个不同组合的损耗,结果将是损耗网格,形状(101,101)的矩阵。******

这些损耗就是我们的损耗面*,它可以在 3D 图中可视化,其中纵轴( z )代表损耗值。如果我们连接产生相同损失值bw 的组合,我们将得到一个椭圆。然后,我们可以在原来的 b x w 平面上画出这个椭圆(蓝色,损耗值为 3)。简而言之,这就是等高线图的作用。从现在开始,我们将总是使用等高线图,而不是相应的 3D 版本。***

下图显示了建议的参数范围的损失面,使用我们的训练集来计算 bw 的每个组合的损失。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

损失面

在图的中心,参数( b,w )的值接近(1,2),损耗处于其最小值。这就是我们试图用梯度下降达到的点。****

在底部,稍微偏左的地方,是随机开始点,对应我们随机初始化的参数( b = 0.49、 w = -0.13)。****

这是处理简单问题的一个好处,比如用单一特征进行线性
回归:我们只有
两个参数
,因此
我们可以计算并可视化损失面*。*****

横截面

另一件好事是,我们可以在损失表面切割一个横截面来检查如果其他参数保持不变时损失看起来是什么样的。****

让我们从使 b =0.52 (来自我们的均匀间隔范围的值,最接近我们的初始随机值 b ,0.4967)开始——我们在我们的损失表面(左图)上垂直地(红色虚线)切割一个横截面,我们得到右边的结果图:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

垂直横截面—参数 b 固定

这个横截面告诉我们什么?它告诉我们,如果我们保持 b 不变(在 0.52),从参数 w角度看,如果 w 增加(达到 2 和 3 之间的某个值),则损失*可以最小化。*******

当然,**不同的b值会产生不同的w截面损失曲线。这些曲线将取决于损失面的*形状(稍后将在“学习率”部分详细介绍)。*******

好的,到目前为止,一切顺利…那么其他截面呢?现在让我们水平切割它,使 w = -0.16 (来自我们的均匀间隔范围的值,最接近我们的初始随机值 b,-0.1382)。结果图在右边:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

水平横截面—参数 w 固定

现在,如果我们保持 w 恒定 (at -0.16),从参数 b角度看,如果 b 增加(达到接近 2 的某个值),则损耗可以最小化*。***

总的来说,该横截面的目的是获得改变单个参数对损失的影响,同时保持其他一切不变。简单地说,这是一个渐变 😃

可视化渐变

从上一节我们已经知道,为了使损失最小化, bw 都需要增加**。所以,保持使用渐变的精神,让我们**增加每个参数一个小* ** (总是保持另一个固定!).顺便说一下,在这个例子中,一个小点等于 0.12(为了方便起见,所以它产生了一个更好的图)。***

这些增加对损失有什么影响?让我们来看看:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

几何计算(近似)梯度

在左图中,w 增加 0.12 会导致损失减少 0.21* 。几何计算和粗略近似的梯度由两个值之间的比率给出: -1.79 。该结果与梯度的实际值(-1.83)相比如何?对于粗略的近似来说,这实际上还不错……还能更好吗?当然,如果我们使 w 的增量越来越小(比如 0.01,而不是 0.12),我们将得到越来越好的近似值……在极限中,随着增量接近零**,我们将达到精确值。嗯,这就是导数的定义!*****

同样的推理也适用于右边的图:b 增加相同的 0.12 会使损失减少 0.35* 。更大的损耗减少、更大的比率、更大的梯度——以及更大的误差,因为几何近似值(-2.90)离实际值(-3.04)更远。***

更新参数

最后,我们使用渐变来更新参数。因为我们试图最小化我们的损失*,我们反转梯度的符号用于更新。***

还有另一个(超)参数需要考虑:学习率,用希腊字母* eta (看起来像字母 n )表示,这是我们需要应用于梯度的乘法因子,用于参数更新。*****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更新参数 bw

我们也可以稍微不同地解释这一点:每个参数将使其
被一个常数值 eta
(学习速率)更新,但是这个常数将通过该参数对最小化损失(其梯度)的贡献大小来
*加权。*******

老实说,我相信这种思考参数更新的方式更有意义:首先,你决定一个学习率,它指定了你的步长,而梯度告诉你每走一步对每个参数的相对影响*(对损失)。然后你采取一个给定的步数这是比例到那个相对影响:更多的影响,更多的步数。*****

"如何选择一个学习率?"****

不幸的是,这是一个独立的话题,超出了本文的范围。

学习率

****学习率是最重要的超参数——关于如何选择学习率、如何在训练期间修改学习率以及错误的学习率如何完全破坏模型训练,有大量的
资料。

也许你已经看到了下面这张著名的图表(来自斯坦福大学的 CS231n 课程),它显示了在训练过程中太大太小的学习率如何影响损失*。*****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源

大部分人都会在某个时间点看到(或者已经看到)。这基本上是常识,但我认为需要彻底解释和直观演示才能让真正理解。所以,我们开始吧!****

我给你讲个小故事(这里试图打个比方,请多包涵!):想象你正在从山里徒步旅行回来,你想尽快回家。在你前进的道路上,你可以选择继续前进或者右转

前方的道路几乎是平坦的,而通往你右边的*的道路有些陡峭。
陡度就是
坡度
。如果你以这样或那样的方式迈出一步,就会导致不同的结果(如果你向右迈一步,而不是向前,你会下降得更多)。
*****

但是,事情是这样的:你知道通往你右边的路会让你更快地回到的家,所以你不会只走一步,而是在那个方向走多步*:路越陡,你走的步就越多!记住,“多点冲击,多点脚步”!你就是无法抗拒走那么多步的冲动;你的行为似乎完全由风景决定。我知道这个类比越来越奇怪了…*****

但是,你还有一个选择:你可以调整你的步长*。你可以选择任何大小的步伐,从小步到大步。那就是你的学习率。*****

好了,让我们看看这个小故事把我们带到了什么地方……简而言之,这就是你的行动方式:

更新位置=先前位置+步长步数*

现在,将它与我们对参数所做的比较:

更新值=先前值-学习率梯度*

你明白了,对吧?我希望如此,因为这个类比现在完全站不住脚了……在这一点上,在向一个方向移动之后(比如说,我们谈到的右转,你必须停下来向另一个方向移动(仅仅一小步,因为路径几乎是平的,记得吗?).诸如此类……嗯,我想没有人从这样一条正交的之字形路径徒步旅行回来过…

无论如何,让我们进一步探索你唯一的选择:你的步幅,我的意思是学习速度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

小学习率

婴儿步开始是有道理的吧?这意味着使用小学习率。小学率 safe® ,不出所料。如果你在徒步旅行回家的路上迈着小步,你更有可能安全到达目的地——但是这需要很长时间。这同样适用于训练模型:小的学习率可能会让你达到(某个)最低点,最终。不幸的是,时间就是金钱,尤其是当你在云中支付 GPU 时间的时候……所以,有一个激励去尝试更大的学习率*。*****

这个推理如何应用于我们的模型?通过计算我们的(几何)梯度,我们知道我们需要采取给定的步数 : 1.79 (参数 w )和 2.90 (参数 b )。让我们将步长设置为 0.2* (小一点)。意思是我们w移动 0.36,为b移动 0.58。*****

重要提示:在现实生活中,0.2 的学习率通常被认为是很大的——但是在我们非常简单的线性回归例子中,它仍然是很小的。

这场运动将我们引向何方?正如你在下面的图中所看到的(如原始点右侧的新点所示),在这两种情况下,移动使我们更接近最小值——在右侧更是如此,因为曲线更加陡峭。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用一个小的学习率

大学习率

如果我们使用一个大的学习率,比如说步长为 0.8 的学习率,会发生什么呢?正如我们在下面的图中看到的,我们开始真正地遇到麻烦* …***

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用大的学习率

即使左边的图一切正常,右边的图给我们展示了一个完全不同的画面:我们最终在曲线的另一边。那是 而不是 好…你会来回,交替地击打曲线的两边。****

“嗯,即便如此,我可能还是达到最低,为什么会这么差?”****

在我们这个简单的例子中,是的,你最终会达到最小值,因为曲线是漂亮和圆的****

但是,在实际问题中,“曲线”有一些真正奇怪的形状,允许
奇怪的结果,例如来回
而从未接近最小值*。*****

我们打个比方,你移动得太快以至于你摔倒撞到山谷另一边*,然后像一个 乒乓 一样一直往下。很难相信,我知道,但你肯定不想那样…*****

非常大的学习率

等等,可能会比那更糟…让我们用一个真正大的学习率,比如说,1.1 的步长!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用一个非常大的学习率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,那个 坏了……在右边的剧情中,我们不仅再次在的*另一边结束了,而且我们居然爬上了。这意味着我们的损失增加了*,而不是减少了!这怎么可能呢?你下山的速度如此之快,以至于最后你不得不爬回来?!不幸的是,这个类比再也帮不了我们了。我们需要以不同的方式考虑这个特殊的案例…******

首先,请注意左边图中的一切都很好。巨大的学习率并没有引起任何问题,因为左边的曲线没有右边的曲线那么陡。换句话说,左边的曲线比右边的曲线能够获得更大的学习率。******

我们能从中学到什么?

太大,对于一个学习率来说,是一个相对的概念:它取决于曲线有多陡**,或者换句话说,它取决于坡度有多大。******

我们有许多曲线,许多梯度:每个参数一个。但是我们只有一个单学率可以选择(不好意思,就是这么回事!).****

这意味着学习率的大小受到最陡曲线的限制。所有其他曲线必须跟随,这意味着,鉴于它们的形状,它们将使用次优的学习率。****

合理的结论是:如果所有的曲线都同样陡峭,那么学习率对它们来说都更接近最优最好**!******

“坏”特征

我们如何实现同样的陡峭的曲线?我来了。首先,让我们看一个稍微修改过的例子,我称之为“坏”数据集:******

  • 把我们的特征( x )乘以 10 ,所以现在在范围【0,10】内,改名为 bad_x****
  • 但是由于我不希望标签( y )改变,所以我将原来的 true_w 参数除以 10** 并将其重命名为bad _ w——这样,bad_w * bad_x 和******

生成“坏”数据集

然后,我对两个数据集原始的坏的执行了与之前相同的分割,并并排绘制了训练集,如下所示:****

“坏”数据集的训练验证分割

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相同的数据,不同比例的特征 x

两个图之间唯一的差异是特征的比例 x 。它的范围是[0,1],现在是[0,10]。标签 y 没变,我也没碰 true_b 。********

这个简单的缩放对我们的梯度下降有任何有意义的影响吗?如果没有,我就不会问了,对吧?让我们计算一个新的损失面,并与之前的损失面进行比较:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

损失表面—缩放特征之前和之后 x

再看上图的等高线值:原来深蓝色线是 3.0 ,现在是 50.0 !对于相同范围的参数值,的损失值要大得多**

让我们看看将特征 x 乘以 10 前后的横截面:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比较横截面:之前和之后

这里发生了什么?红色曲线变得更加陡峭(更大的坡度),因此我们必须使用较小的学习率才能安全地沿着它下降。

更重要的是,红色和黑色曲线之间的差异陡度上增加

这正是我们需要避免的

你记得为什么吗?

因为学习率的大小受到最陡曲线的限制!

怎么才能修好?嗯,我们放大了 10 倍 …也许我们可以让它变得更好,如果我们以不同的方式放大**

缩放/标准化/规范化

怎么不同?有个漂亮的东西叫做 标准定标器 ,它把一个特征转换成最后的零均值单位标准差**

它是如何实现的?首先,它使用训练集( N 点)计算给定**特征的均值标准差😗*****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平均值和标准偏差,在标准定标器中计算

然后,它使用这两个值来缩放特征:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标准化

如果我们要重新计算缩放要素的平均值和标准差,我们将分别得到 0 和 1。这个预处理步骤通常被称为标准化,尽管从技术上来说,它应该总是被称为标准化。****

零均值和单位标准差

让我们从单位标准差开始,即缩放特征值,使其标准差等于一个。这是最重要的预处理步骤之一,不仅是为了提高梯度下降的性能,也是为了其他技术,如主成分分析(PCA)的目标是将所有的数字特征放在一个相似的刻度中,因此结果不受每个特征的原始范围的影响。

想到一个模特身上的两个共同特征:年龄薪资。虽然年龄通常在 0 到 110 之间变化,但薪水可以从几百(比如说 500)到几千(比如说 9000)。如果我们计算相应的标准
偏差,我们可能会分别得到 25 和 2000 这样的值。因此,我们需要
标准化两个特性,使它们处于的平等地位

然后零点表示,即零点处对中特征。更深层次的神经网络可能会遭受一种叫做消失梯度的非常严重的情况。由于梯度用于更新参数,越来越小(即消失)的梯度意味着越来越小的更新,直到停滞点:网络简单地停止学习。帮助网络对抗这种情况的一种方法是将它的输入即特征集中在零。关于渐变消失问题的更多细节,请查看我的“超参数在起作用!第二部分—权重初始值设定项。

重要:类似标准定标器 的预处理步骤必须在列车验证测试分割后进行;否则,您将从验证和/或测试集向您的模型泄露信息!****

在使用训练集仅来适应标准缩放器之后,您应该使用其转换方法来将预处理步骤应用于所有数据集:训练、验证和测试。

下面的代码将很好地说明这一点:

标准化特征 x

请注意,我们不是重新生成数据,而是使用原始特征 x 作为标准缩放器的输入,并将其转换为缩放的 x 。标签( y )保持不变。****

让我们把它们三个、缩小并列起来,来说明区别:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相同的数据,特征 x 的三种不同比例

同样,图与图之间唯一的差异是特征的比例 x 。它的范围本来是[0,1],后来我们把它做成[0,10],现在标准缩放器把它做成[-1.5,1.5]。****

好了,检查损失面的时间到了:为了说明差异,我将它们三个并排绘制:缩放……看起来是这样的:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征 x 不同比例的损失面

漂亮的,不是吗?教科书上对碗的定义 😃****

在实践中,这是人们可能希望的最佳表面:截面将会是同样陡峭的,并且其中一个的好的学习率对另一个也是好的。****

当然,在现实世界中,你永远也不会得到那样一个漂亮的碗。但是我们的结论仍然成立:

  1. 总是标准化(缩放)你的特征。
  2. 永远不要忘记第一条:-)

最后的想法

我希望这篇文章能帮助你发展直觉关于特征缩放如何影响学习率的选择,以及这两个元素如何在 梯度下降性能中发挥基本作用。

如果你有什么想法、意见或问题,欢迎在下方留言评论或联系我 推特

梯度下降被解开

原文:https://towardsdatascience.com/gradient-descent-unraveled-3274c895d12d?source=collection_archive---------19-----------------------

从基础开始理解梯度下降优化的工作原理

在当前的深度学习时代,你可能以前听说过梯度下降这个术语。如果你不明白它是什么和它是如何工作的,这篇文章是给你的。在这篇文章中,我将解释它是什么以及它是如何工作的。

最大值对最小值和全局对局部

首先,让我们从最大值、最小值、全局和局部的概念开始。

我将为单变量函数解释这些概念,因为它们易于可视化。然而,他们延伸到多变量的情况。

让我们从几个定义开始。[1]

  • 全局最大值:定义在域 X 上的实值函数 fX∫iff(X∫)≥f(X)对于X中的所有 x
  • 全局最小值:一个定义在定义域 X 上的实值函数 fX∫处有一个全局(或绝对)最大值点,如果f(X∫)≤f(X)对于 X. 中的所有 x
  • 局部最大值:如果域 X 是一个度量空间,那么就说 f 在点X∫处有一个局部(或相对)最大值点,如果存在一些 ε > 0 使得f(X∫)≥f(X
  • **局部最小值:**如果域 X 是一个度量空间,那么就说 f 在点X∫处有一个局部(或相对)最大值点,如果存在一些 ε > 0 使得f(X∫)≤【t8t

图形会使概念更容易理解。我在下图中总结了这四种类型的点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

顾名思义,最小值是集合中的最小值,最大值是最大值。全局意味着它对整个集合是正确的,而局部意味着它对某些邻近区域是正确的。一个函数可以有多个局部最大值和最小值。然而,只能有一个全局最大值和最小值。请注意,对于图(a)和(b ),功能域仅限于您看到的值。如果它是无穷大,那么图(a)中的图就没有全局最小值。

现在我们理解了这些概念,下一步就是如何找到这些极值点。

事实证明微积分中的导数对于寻找这些点是有用的。我不会深入衍生品的细节。不过,我会解释得足够明白下面的讨论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

导数给出了某物相对于某物的变化率。例如,一种药物被你的系统吸收的速度可以用微积分来建模和分析。

现在,让我们明白什么是临界点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

所以我们知道,在这些临界点,会有一个局部或全局的最大值或最小值。下一步是确定它属于哪一类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

您可以使用两种测试中的任何一种,即一阶和二阶导数测试来对最大值和最小值进行分类。当我在高中的时候,我发现二阶导数测试更快,因为我只计算一个值(不用计算器)。我将向你展示一个实际上是如何做的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

为了发现这个点是否是全局的,你必须评估所有临界点的函数,看看哪个点是最低点。在我们的例子中,我们看到了一个多项式函数。它是光滑的,可微的。测试的点是有限的,如果你有方程,计算函数就很容易。

然而,现在让我们转向现实世界。我们永远不知道我们处理的现实生活过程的实际等式。此外,等式中还涉及到几个变量。这些测试在那些情况下不会有用。为了训练一个神经网络,你需要最小化网络参数的损失。这是一个多维面,多种因素在起作用。而且我上面讨论的测试也不会有效。因此,我们转向优化这项任务。

寻找函数最小值/最大值的优化

什么是优化?

相对于某个集合最大化或最小化某个函数,通常表示在某种情况下可用的选择范围。该函数允许比较不同的选择,以确定哪一个可能是“最好的”

常见应用:最小成本、最大利润、最小误差、最佳设计、最佳管理、变分原理。

在数学、计算机科学和运筹学中,数学优化或数学规划是从一组可用的备选方案中选择最佳元素(就某些标准而言)。

优化本身就是一片汪洋,极其有趣。在深度学习的背景下,优化目标是最小化关于模型参数的成本函数,即权重矩阵。

什么是渐变?

梯度:在向量微积分中,梯度是导数的多变量推广。标量函数的梯度 f(x₁,x₂,x₃,…,xₙ)【以下简称 f 用∇ f 表示,其中∇(纳布拉符号)被称为德尔算符。它把所有的偏导数信息打包成一个向量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

f 是一个向量值函数,指向最陡上升的方向。想象一下,如果你站在 f 的输入空间中的某个点,梯度向量会告诉你应该向哪个方向移动,以快速增加 f 的值。

如果你有兴趣了解更多。可汗学院是一个学习渐变和数学的好地方。
https://www . khanacademy . org/math/multivariable-calculus/multivariable-derivatives/gradient-and-direction-derivatives/v/gradient

梯度下降

这是一种优化技术,以迭代的方式向最小值移动。

涉及的步骤如下:

  1. 猜一个点(随机或通过某种技巧)。
  2. 选择步长,在深度学习中称为学习速率ρ,也是深度学习中最重要的超参数之一。
  3. 计算函数的梯度
  4. 从最初的猜测中减去这个,向相反的方向移动。这是因为我们想下降,梯度给你最陡的上升方向。
  5. 重复步骤 3 和 4n 次,或者直到达到停止标准

在深度学习应用的方程形式中,它可以写成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ρ是学习速率,它决定了在迈步时衰减梯度值的程度。

β是网络参数。

这里还要提到的一点是,除非函数是凸的,否则算法会陷入局部最小值,而不是收敛到全局最小值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在数学中,定义在一个 n 维区间上的实值函数,如果该函数的图上任意两点之间的线段位于图的上方或图上,则称为凸的(或向下凸的或向上凹的)。这意味着函数本身在严格凸的情况下有一个最小值。

总之,梯度下降是一种优化方法,通过在函数梯度的负方向(最陡下降的方向)上递增地更新其参数来找到目标函数的最小值。

梯度下降 1D 示例

让我们看几个例子。我们将从 1D 案例开始,因为它最容易想象。所用的等式与我之前在最大值和最小值部分使用的等式相同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我将展示如何使用 numpy 和 matplotlib 在 python 中手动实现代码。

下图显示了起点和学习率的各种组合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

少数观察结果

考虑中的方程有两个最小值。我们想用梯度下降算法找到全局最小值。我将解释按行填充的数字。对于所有示例,迭代次数保持为 10。我改变了学习速率和初始起点,向你们展示它是如何影响算法的。前五幅图表明,如果起始点和迭代次数保持不变,学习速率越大,算法下降越快。但在这些情况下,算法会陷入局部最小值。在图 7 中,我们看到,由于大的学习速率加上起始点的陡峭斜率,该算法大幅度跳转到全局最小值。

尽管大的学习速率可以导致更快的收敛,但是由于大的有效步长,你的算法有可能偏离最小值。看一下最后一个图,起点使算法能够达到全局最小值,但是大的学习率导致算法发散。倒数第二张图显示了另一种情况。该点在临界点处初始化,该点的导数为零。无论你的学习速率有多大,或者你走了多少步,算法都不会从那个点移动。

从上面的例子中,我们看到必须选择学习速率,使得它不太低以至于梯度过阻尼,或者对于梯度太高以至于扩大步长。起始点的初始化是至关重要的,它能使你得到全局最小值或局部最小值。要采取的步骤数量也很重要。

梯度下降 2D 示例

现在让我们看几个 2D 的例子。

第一个例子是抛物面,它的方程式如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在本教程中,我将使用症状。这允许你对方程进行符号计算。即使你不知道微积分,你也可以使用代码来尝试不同的方程和实验。

以下代码使用 sympy 的符号表示创建函数 f1,并计算 w.r.t. x 和 y 的偏导数来计算梯度。然后通过使用适当的分量更新 x 和 y 值来使用它执行梯度下降。

下图显示了 3D 绘图的两个视图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

从图中可以立即看出,当算法接近最小值时,梯度值减小,因此步长减小。正如我在文章开头提到的,这种技术对于 n 维的情况是一样的。我们在较低维度中得出的观察结果几乎总是可以在很少或没有修改的情况下扩展到更高维度的情况。

为了给你一个不同表面的味道,下面是两个 2D 梯度下降的例子。如前所述,初始化很重要,并将最终决定您的最终结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

Python 实用程序以交互方式尝试不同的梯度下降参数

我制作了一个 python 工具,可以让你调整学习率、迭代次数和初始起点,看看这些如何影响 1D 例子的算法性能。关于这一点的代码,以及 2D 函数图,可以在下面的库中找到。
https://github.com/msminhas93/GradientDescentTutorial

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

到目前为止,我们已经看到了算法,并以 1D 和 2D 为例,分析他们的选择如何影响收敛。

深度学习中的梯度下降[2]

在深度学习的背景下,梯度下降可以分为以下几类。

  • 随机梯度下降
  • 小批量梯度下降
  • 批量梯度下降

**随机梯度下降:**假设你想要最小化一个目标函数,这个目标函数被写成可微函数的和。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个术语 Qᵢ通常与 iᵗʰ数据点相关联。

标准梯度下降(批量梯度下降)如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中η是学习率(步长)。

随机梯度下降(SGD) 每次迭代只考虑被加数函数的子集。这对于大规模的问题可能是有效的。Q(w)的梯度由单个例子中的梯度近似:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个训练示例都需要进行这种更新。在算法收敛之前,可能需要对训练集进行多次遍历。

SGD 的伪代码:

  • 选择 w 和η的初始值。
  • 重复直到收敛。
  • 随机打乱训练集中的数据点。
  • 对于 i = 1,2,3,…,n,做:
  • w =∇qᵢ(w)

让我们考虑下面的等式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目标函数是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SGD 的更新规则如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

小批量梯度下降:

  • 批量梯度下降在每次迭代中使用所有的 n 个数据点
  • 随机梯度下降在每次迭代中使用 1 个数据点
  • 小批量梯度下降在每次迭代中使用 b 数据点b 是一个称为小批量的参数。

小批量梯度下降的伪代码:

  • 选择 w 和η的初始值。
  • 例如,选择 b = 10
  • 重复直到收敛。
  • 随机打乱训练集中的数据点。
  • 对于 i = 1,11,21,…,n-9,做:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于梯度下降的三种类型的讨论

关于三种变体的几点看法。

  • SGD 比其他两个变体更嘈杂,因为它是按示例更新的。
  • SGD 通常被称为在线机器学习算法,因为它为每个训练示例更新模型。
  • SGD 在计算上比其他变体更昂贵,因为它每个例子。
  • SGD 是抖动的,导致收敛到最小困难。
  • 小批量梯度下降允许您利用 GPU 的优势,一次处理多个示例,从而减少训练时间。
  • 批量梯度下降实际上是不可行的,除非你有一个小的数据集,可以放入可用的内存。

小批量参数 b 的选择取决于您的 GPU、数据集和型号。一个经验法则是选择 8 的倍数大小。一般来说,32 是一个好的开始数字。如果你选择的数字太高或太低,那么算法会变得更慢。在前一种情况下,计算可能会变得更慢,因为你给 GPU 增加了很多负载。而在后一种情况下,较小的小批量不能充分利用您的 GPU。为你的情况找到合适的平衡点是很重要的。

调整学习率η:

如果η太高,算法就会发散。如果η太低,会使算法收敛缓慢。

通常的做法是使ηₙ成为迭代次数 n 的减函数。下面是两个例子。

  • ηₙ = k/(n+c),其中 k 和 c 是常数。
  • ηₙ = η₀ e⁻ᵏⁿ,其中η₀是初始学习率,k 决定指数衰减的陡度。

你也可以使用基于时间间隔的学习进度计划。例如:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 n 是迭代次数。

第一次迭代引起 w 的较大变化,而后面的迭代只做微调。

有一种叫做周期学习率的东西,你可以用一个周期函数来安排时间。你可以在这里了解更多信息。

这就结束了对梯度下降的讨论。

总结一下:

  • 梯度下降是一种优化算法,用于深度学习中,以最小化关于模型参数的成本函数。
  • 它不能保证收敛到全局最小值。
  • 收敛性取决于起始点、学习速率和迭代次数。
  • 在实践中,小批量梯度下降与批量大小值 32 一起使用(这可能因您的应用而异)。

希望这有用。欢迎您的建议、反馈和评论。

参考资料:

[1]https://en.wikipedia.org/wiki/Maxima_and_minima

[2]滑铁卢大学 STAT 946 深度学习课程【https://www.youtube.com/playlist? list = pleayksg 4 usq 0 madcjyskfeo 3 guptuuh 66

动量梯度下降

原文:https://towardsdatascience.com/gradient-descent-with-momentum-59420f626c8f?source=collection_archive---------5-----------------------

梯度下降的问题在于,在时刻(t)的权重更新仅由该时刻的学习速率和梯度控制。它没有考虑遍历成本空间时所采取的过去步骤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

会导致以下问题。

  1. 成本函数在鞍点(平台)的梯度可以忽略或为零,这又导致很小的或没有权重更新。因此,网络变得停滞,学习停止
  2. 即使在小批量模式下运行,梯度下降所遵循的路径也非常不稳定

考虑低于成本的表面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

让我们假设所考虑的网络的初始权重对应于点 a。在梯度下降的情况下,损失函数沿着斜率 AB 迅速减小,因为沿着该斜率的梯度很高。但是一旦到达 B 点,梯度就变得非常低。B 附近的权重更新很小。即使在多次迭代之后,成本在停留在梯度最终变为零的点之前移动得非常慢。

在这种情况下,理想情况下,成本应该移动到全局最小值点 C,但是因为梯度在点 B 处消失,所以我们陷入了次优解。

动量如何解决这个问题?

现在,想象你有一个球从 a 点滚下。球开始慢慢滚下,并聚集了一些动量越过斜坡 AB。当球到达点 B 时,它已经积累了足够的动量来推动自己穿过平台区域 B,并最终沿着斜率 BC 降落在全局最小值 c 处。

如何将此应用于梯度下降?

为了说明动量,我们可以使用过去梯度的移动平均值。在像 AB 这样梯度高的区域中,权重更新将会很大。因此,在某种程度上,我们通过对这些梯度进行移动平均来收集动量。但是这种方法有一个问题,它以相等的权重考虑迭代中的所有梯度。t=0 处的梯度与当前迭代 t 处的梯度具有相等的权重。我们需要使用过去梯度的某种加权平均值,以便给予最近的梯度更多的权重。

这可以通过使用指数移动平均线(EMA)来实现。指数移动平均线是一种移动平均线,它对最近的值赋予更大的权重。

序列 Y 的均线可以递归计算

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在哪里

  • 系数β表示权重增加的程度,是介于 0 和 1 之间的常数平滑因子。较低的β值会更快地忽略旧的观察值。
  • Y(t) 是周期 t 的值。
  • S(t) 是任意时段 t 的均线值。

在我们的梯度序列的情况下,迭代 t 处的新权重更新方程变成

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们来分解一下。

𝓥 (t) :新的权重更新是在迭代 t 完成的吗

β: 动量常数

𝛿(t): 是迭代时的梯度 t

假设在第 0 次迭代 t=0 时的权重更新为零

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

想想常数β,忽略上式中的(1-β)项。

:在许多文本中,你可能会发现(1-β)被替换为学习率η。

如果β是 0.1 呢?

在 n=3 时;t =3 处的梯度将贡献其值的 100%,t=2 处的梯度将贡献其值的 10%,而 t=1 处的梯度仅贡献其值的 1%。

在这里,来自早期梯度的贡献迅速减少。

如果β是 0.9 呢?

在 n=3 时;t =3 处的梯度将贡献其值的 100%,t=2 处的梯度将贡献其值的 90%,t=1 处的梯度将贡献其值的 81%。

从上面我们可以推断,更高的β将容纳更多来自过去的梯度。因此,一般来说,在大多数情况下,β保持在 0.9 左右。

:权重更新中每个梯度的实际贡献将进一步受制于学习率。

这解决了我们的第一点,当当前时刻的梯度可以忽略或为零时,学习变为零。使用具有梯度下降的动量,来自过去的梯度将推动成本进一步围绕鞍点移动。

在之前显示的成本面中,让我们放大 c 点。

对于梯度下降,如果学习率太小,权重将更新得非常慢,因此即使梯度很高,收敛也需要很多时间。如下图左侧所示。如果学习率太高,成本会在最小值附近波动,如下图右侧所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

动量是如何解决这个问题的?

我们再来看看动量的最后一个求和方程。

情况 1 :当所有过去的梯度具有相同的符号时

求和项将变大,我们将在更新权重时采取大的步骤。沿着曲线 BC,即使学习率低,沿着曲线的所有梯度将具有相同的方向(符号),从而增加动量并加速下降。

情况 2 :当一些梯度具有+ve 符号,而其他梯度具有-ve 符号时

求和项将变小,权重更新将变小。如果学习率很高,围绕谷 C 的每次迭代的梯度将在+ve 和-ve 之间改变其符号,并且在几次振荡之后,过去梯度的总和将变小。因此,从那里开始对权重进行小的更新,并抑制振荡。

这在一定程度上解决了我们的第二个问题。梯度下降带动量在梯度振荡的方向上迈小步,在过去的梯度具有相同方向(相同符号)的方向上迈大步。

结论

通过在梯度下降中添加一个动量项,即使当前梯度可以忽略或为零,从过去迭代中积累的梯度也将推动成本进一步围绕鞍点移动。

即使梯度下降的动量收敛得更好更快,它仍然不能解决所有的问题。首先,超参数η(学习率)必须手动调整。第二,在某些情况下,即使学习率很低,动量项和电流梯度也能单独驱动并引起振荡。

首先,学习率问题可以通过使用梯度下降的其他变化来进一步解决,如自适应梯度RMSprop。其次,大动量问题可以通过使用基于动量的梯度下降的变体内斯特罗夫加速梯度下降来进一步解决。

无梯度强化学习:使用 Numpy 的神经进化!

原文:https://towardsdatascience.com/gradient-free-reinforcement-learning-neuroevolution-using-numpy-7377d6f6c3ea?source=collection_archive---------26-----------------------

我们能解决简单的没有后向通道的 RL 环境吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们能训练只有向前传球的网络吗?图像来源

介绍

如果我告诉你,你可以训练神经网络,而不必计算梯度,只使用前向传递,会怎么样?这就是**神经进化的魔力!**此外,我将展示仅使用 Numpy 就可以轻松完成所有这些工作!学习统计学你会学到很多基于梯度的方法,但不久前我读到了一篇非常有趣的文章,作者是优步人工智能的人,他表明在解决 Atari 游戏的挂钟时间方面,一个简单的遗传算法与最复杂的基于梯度的 RL 方法具有竞争力。我在下面链接了源代码,如果你对强化学习感兴趣,我强烈推荐你读一读。

什么是神经进化?

首先,对于那些还不知道的人来说,神经进化描述了进化和/或遗传算法的应用,以训练神经网络的结构和/或权重,作为一种无梯度的替代方案!我们将在这里使用一个极其简单的神经进化案例,只使用一个固定的拓扑网络,并且只关注优化权重和偏差。神经进化过程可以定义为四个基本步骤,从随机生成的网络池开始,重复这些步骤直到达到收敛。

1.评估人群的适应性
2。选择最合适的个体来繁殖
3。使用最合适网络的副本重新填充
4。将正态分布突变引入网络权重

哇,这似乎很简单!让我们稍微分解一些术语:

  • 适应度:这简单地描述了网络在某项任务中的表现,并允许我们决定繁殖哪些网络。注意,因为进化算法是非凸优化的一种形式,因此可以与任何损失函数一起使用,而不管其可微性(或缺乏可微性)

  • 突变:这个可能是最简单的!为了改进我们的子网络,我们必须对网络权重引入随机变化,这些变化通常来自均匀或正态分布。可能有许多不同形式的突变:移位突变(将参数乘以一个随机数)、交换突变(用一个随机数替换参数)、符号突变(改变参数的符号)等。我们将只使用简单的附加突变,但这里有很大的创造性空间!

神经进化的优势

我们还应该考虑神经进化模型的理论优势。首先,我们只需要使用网络的前向传递,因为我们只需要计算损失,以确定要繁殖哪些网络。这一点的含义是显而易见的,向后传球通常是最昂贵的!其次,给定足够的迭代次数,进化算法保证找到损失曲面的全局最小值,而基于凸梯度的方法可能陷入局部最小值。最后,更复杂的神经进化形式使我们不仅可以优化网络的权重,还可以优化结构本身!

为什么不总是使用神经进化呢?

嗯,这是一个复杂的问题,但它确实可以归结为当有足够的梯度信息时,精确的梯度下降方法更有效。这意味着损失面越凸,你就越想使用像 SGD 这样的分析方法,而不是遗传算法。因此,很少会在有监督的情况下使用遗传算法,因为通常有足够的梯度信息可用,传统的梯度下降方法将工作得很好。然而,如果你在 RL 环境中工作,或者在具有不规则损失表面或低凸性的情况下工作(像顺序 GAN),那么神经进化提供了一个可行的替代方案!事实上,最近有很多研究发现,参数对参数的神经进化模型在这种情况下可以做得更好。

现在让我们开始吧!

加载库

正如介绍中所述,我们将尝试在这个项目中只使用numpy,只定义我们需要的助手函数!是的,我知道,gym 也在被加载,但只是为了环境;)

import numpy as np
import gym

关于数据

我们将使用 gym 中的经典 CartPole 环境来测试我们的网络。目标是观察网络通过左右移动能保持杆子直立多长时间。作为一个 RL 任务,神经进化的方法应该是很适合的!我们的网络将接受 4 个观察值作为输入,并将输出左或右作为动作。

助手功能

我们首先要定义几个助手函数来设置我们的网络。首先是 relu 激活函数,我们将使用它作为隐藏层的激活函数,并使用 softmax 函数作为网络输出,以获得网络输出的概率估计!最后,当我们需要计算分类交叉熵时,我们需要定义一个函数来生成我们的响应向量的一次性编码。

def relu(x):
    return np.where(x>0,x,0)def softmax(x):
    x = np.exp(x — np.max(x))
    x[x==0] = 1e-15
    return np.array(x / x.sum())

定义我们的网络类

现在有趣的事情来了!首先,我们将为群体中的个人网络定义一个类别。我们需要定义一个随机分配权重和偏差并将网络结构作为输入的初始化方法,一个在给定输入的情况下获得概率的预测方法,以及一个在给定输入和响应的情况下返回网络分类交叉熵的评估方法!同样,我们将只使用我们定义的函数或 numpy 中的函数。请注意,初始化方法也可以将另一个网络作为输入,这就是我们将如何执行世代之间的突变!

# Lets define a new neural network class that can interact with gym
class NeuralNet():

    def __init__(self, n_units=None, copy_network=None, var=0.02, episodes=50, max_episode_length=200): # Testing if we need to copy a network
        if copy_network is None:
            # Saving attributes
            self.n_units = n_units
            # Initializing empty lists to hold matrices
            weights = []
            biases = [] # Populating the lists
            for i in range(len(n_units)-1):
                weights.append(np.random.normal(loc=0,scale=1,size=(n_units[i],n_units[i+1])))
                biases.append(np.zeros(n_units[i+1]))
            # Creating dictionary of parameters
            self.params = {'weights':weights,'biases':biases} else:
            # Copying over elements
            self.n_units = copy_network.n_units
            self.params = {'weights':np.copy(copy_network.params['weights']),
                          'biases':np.copy(copy_network.params['biases'])}
            # Mutating the weights
            self.params['weights'] = [x+np.random.normal(loc=0,scale=var,size=x.shape) for x in self.params['weights']]
            self.params['biases'] = [x+np.random.normal(loc=0,scale=var,size=x.shape) for x in self.params['biases']]    def act(self, X):
        # Grabbing weights and biases
        weights = self.params['weights']
        biases = self.params['biases']
        # First propgating inputs
        a = relu((X@weights[0])+biases[0])
        # Now propogating through every other layer
        for i in range(1,len(weights)):
            a = relu((a@weights[i])+biases[i])
        # Getting probabilities by using the softmax function
        probs = softmax(a)
        return np.argmax(probs)

    # Defining the evaluation method
    def evaluate(self, episodes, max_episode_length, render_env, record):
        # Creating empty list for rewards
        rewards = [] # First we need to set up our gym environment
        env=gym.make('CartPole-v0') # Recording video if we need to 
        if record is True:
            env = gym.wrappers.Monitor(env, "recording") # Increasing max steps
        env._max_episode_steps=1e20
        for i_episode in range(episodes):
            observation = env.reset()
            for t in range(max_episode_length):
                if render_env is True:
                    env.render()
                observation, _, done, _ = env.step(self.act(np.array(observation)))
                if done:
                    rewards.append(t)
                    break
        # Closing our enviroment
        env.close()
        # Getting our final reward
        if len(rewards) == 0:
            return 0
        else:
            return np.array(rewards).mean()

定义我们的遗传算法类

最后,我们需要定义一个类来管理我们的种群,执行神经进化中的四个关键步骤!这里我们需要三种方法。首先,创建随机网络池并设置属性的初始化方法。接下来,我们需要一个 fit 方法,给定一个输入,重复执行上述步骤:首先评估网络,然后选择最适合的,创建子网络,最后变异子网络!最后,我们需要一种预测方法,以便我们可以使用由该类训练的最佳网络。让我们开始测试吧!

# Defining our class that handles populations of networks
class GeneticNetworks():

    # Defining our initialization method
    def __init__(self, architecture=(4,16,2),population_size=50, generations=500,render_env=True, record=False,
                 mutation_variance=0.02,verbose=False,print_every=1,episodes=10,max_episode_length=200):
        # Creating our list of networks
        self.networks = [NeuralNet(architecture) for _ in range(population_size)]
        self.population_size = population_size
        self.generations = generations
        self.mutation_variance = mutation_variance
        self.verbose = verbose
        self.print_every = print_every
        self.fitness = []
        self.episodes = episodes
        self.max_episode_length = max_episode_length
        self.render_env = render_env
        self.record = record

    # Defining our fiting method
    def fit(self):
        # Iterating over all generations
        for i in range(self.generations):
            # Doing our evaluations
            rewards = np.array([x.evaluate(self.episodes, self.max_episode_length, self.render_env, self.record) for x in self.networks])
            # Tracking best score per generation
            self.fitness.append(np.max(rewards))
            # Selecting the best network
            best_network = np.argmax(rewards)
            # Creating our child networks
            new_networks = [NeuralNet(copy_network=self.networks[best_network], var=self.mutation_variance, max_episode_length=self.max_episode_length) for _ in range(self.population_size-1)]
            # Setting our new networks
            self.networks = [self.networks[best_network]]+new_networks
            # Printing output if necessary
            if self.verbose is True and (i%self.print_every==0 or i==0):
                print('Generation:',i+1,'| Highest Reward:',rewards.max().round(1),'| Average Reward:',rewards.mean().round(1))

        # Returning the best network
        self.best_network = self.networks[best_network]

测试我们的算法!

如上所述,我们将在 CartPole 问题上测试我们的网络,仅使用 1 个具有 16 个节点的隐藏层,以及两个表示向左或向右运动的输出节点。我们还需要对许多集进行平均,这样我们就不会意外地为下一代选择一个糟糕的网络!我在反复试验后选择了这些参数,所以你的里程可能会有所不同!此外,我们将只引入方差为 0.05 的突变,以便不破坏网络的功能。

# Lets train a population of networks
from time import time
start_time = time()
genetic_pop = GeneticNetworks(architecture=(4,16,2),
                                population_size=64, 
                                generations=5,
                                episodes=15, 
                                mutation_variance=0.1,
                                max_episode_length=10000,
                                render_env=False,
                                verbose=True)
genetic_pop.fit()
print('Finished in',round(time()-start_time,3),'seconds')Generation: 1 | Highest Reward: 309.5 | Average Reward: 29.2
Generation: 2 | Highest Reward: 360.9 | Average Reward: 133.6
Generation: 3 | Highest Reward: 648.2 | Average Reward: 148.0
Generation: 4 | Highest Reward: 616.6 | Average Reward: 149.9
Generation: 5 | Highest Reward: 2060.1 | Average Reward: 368.3
Finished in 35.569 seconds

初始随机网络

首先,让我们看看一个随机初始化的网络如何执行任务。显然,这里没有策略,杆子几乎立刻就倒了。请忽略下面 gif 中的光标,在健身房录音在 Windows 上播放不太好!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:一个随机的代理人试图解决 CartPole

random_network = NeuralNet(n_units=(4,16,2))
random_network.evaluate(episodes=1, max_episode_length=int(1e10), render_env=True, record=False)

五代之后…

仅仅 5 代之后,我们可以看到我们的网络几乎完全掌握了翻筋斗的艺术!而且只花了大约三十秒的火车时间!请注意,随着进一步的训练,网络学会在几乎 100%的时间里保持完全直立,但目前我们只对速度感兴趣,5 代相当短!我们应该认为这是神经进化力量的一个很好的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:一个训练有素的代理人正在解决横竿任务

# Lets observe our best network
genetic_pop.best_network.evaluate(episodes=3, max_episode_length=int(1e10), render_env=True, record=False)

下一步是什么?

显然,未来我们还可以增加很多东西来进一步检验神经进化的有效性。首先,研究不同变异算子(如交叉)的效果是很有趣的。

转移到 TensorFlow 或 PyTorch 等现代深度学习平台也是一个明智的想法。请注意,遗传算法是高度并行化的,因为我们所要做的就是在单个设备上运行每个网络,并向前传递一次。无需镜像权重或复杂的分配策略!因此,每增加一个处理单元,运行时间几乎呈线性减少。

最后,我们应该探索不同强化学习任务的神经进化,或者甚至是梯度难以评估的其他情况,例如在生成敌对网络或长序列 LSTM 网络中。

进一步阅读

如果你对神经进化及其应用感兴趣,优步有几篇论文展示了神经进化在强化学习中的现代优势:

[## 优步工程博客

推动世界发展的软件工程和技术

eng.uber.com](https://eng.uber.com/tag/deep-neuroevolution/)

这个项目的源代码可以在我的公共 GitHub 资源库中找到:

[## gur sky 1/Numpy-神经进化

如果我告诉你,你可以训练神经网络,而不需要计算梯度,只需要…

github.com](https://github.com/gursky1/Numpy-Neuroevolution)

如果你对这个项目有任何问题,或者只是想讨论深度学习,请随时发送电子邮件到gurskyjacob@gmail.com给我!

对咖啡分数的 Q 分数的有用性进行分级

原文:https://towardsdatascience.com/grading-the-usefulness-of-q-scores-for-coffee-grading-8ff2e8439572?source=collection_archive---------30-----------------------

各年级之间有趣的相关性

在我寻求更好地理解咖啡分级的 Q 分数的过程中,我开始好奇构成 Q 分数的 10 个指标是如何相互关联的。我最终找到了一个跨越多年、国家和 Q 分数过程的数据库。有些人已经研究了一些初始数据,但我没有找到对基本问题的分析:Q 分数的子指标是独立变量吗?咖啡分级员有多擅长客观分级?

咖啡杯的 Q 分数或 Q 等级

Q 分数是在咖啡杯过程中记录的 10 个因素的顶点。我根据自己对 SCA 杯状协议的理解,总结了每个指标。他们定义了如何准备咖啡样品,如何品尝,以及如何评分。我相信网上有很多资源可以帮助你通过快速搜索了解如何拔罐。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图片与本文中的所有图片一样

由于补丁中的缺陷豆,最终分数也可能会丢分,因为允许有多少缺陷是有标准的。

根据这些描述,我制作了一个矩阵,说明我将如何假设不同的指标相互关联,因为它们中的许多指标在评分方式上有相似之处。它们是独立的指标,但根据定义,它们不是完全独立的变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据

2018 年,一个善良的灵魂做了一个脚本,从咖啡品质院 (CQI)网站拉了一堆 Q 分,建立了一个超过 1300 个咖啡等级的数据库。我拉了这个数据,我只做了一个补充:全球区域。对于每个国家,我加上该国的大洲或整个地区。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

q 分数分析

我用几种方法查看数据:箱线图、相关性和主成分分析(PCA)。每个人都从不同的角度来理解这个数据库。

箱线图

箱线图可以帮助人们理解分数分布通常是如何排列的,有时,趋势可以从那里出来。我看到了一些变化,但分布本身并没有引起我的注意。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

放大相同的箱线图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,我查看了各个指标,很快,我发现甜度、干净的杯子和均匀性大部分得分为 10(完美)。我不知道分数是怎么回事。这似乎很奇怪,这三个类别超过 90%的分数都在 10 分。这可能是一个数据导入问题(值得怀疑,因为我在 CQI 网站上查看了一些更新的数据),或者可能这些指标没有被普遍使用。这三个指标是十个指标中唯一量化的指标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我没有其他关于 Q 分数的数据集,也没有一个解释。不过,我会继续分析,但我们不应该太看重这些。如果这些指标与最终分数紧密相关,那只是因为它们提高了分数。

相互关系

相关性是衡量两个变量彼此相似程度的指标。高相关性并不意味着一个变量会引起另一个变量,而是当情况发生变化时,两个变量的涨跌幅度相同。我从一开始就假设一些分级变量会有很高的相关性,因为它们是从不同的时间点来看味道的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重新排序有助于显示七个指标之间的相互关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面我举了两个散点图的例子。第一个结果显示味道和总分之间有很强的相关性。如果味道很好,并且与其他 6 个变量高度相关,那么总分应该是趋势。回味和风味也是如此。我认为好吃的东西会有很好的回味。这个关系更接近 y=x 线,但我不知道那是否有意义。总分趋势更高很可能是因为之前讨论的 3 个参数大部分等于 10,因为在大多数情况下总分和风味之间的偏差似乎约为 6(以 10 为标度)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们更深入地了解 10 个变量,因为它们与总分相关,但在地区、年度和流程之间有所不同:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们可以开始看到一些有趣的趋势,比如为什么北美咖啡豆的所有分数都有如此高的相关性?2015 年的豆子也一样?这里只有 8 个等级来自 2018 年的豆子,所以那些高相关性没有用。为什么 2011 年口味和期末成绩的相关性这么低?

让我们深入了解一些年份:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

北美有奇怪的分数。每样东西都有很高的相关性,这在我看来没有一个指标是特别有趣的。这就引出了 Q-等级或分数对该地区的评分者或国家是否有用的问题。在这种情况下,北美只是墨西哥,因为中美洲分裂成了自己的一部分。

让我们在咖啡的味道中进行时间旅行:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2015 年类似于北美,那里的一切都有非常高的相关性。这是一个奇怪的问题,需要在这项研究之外进一步调查。2015 年对咖啡来说是反常的一年吗?箱线图表明这很正常。

让我们比较处理,这是有趣的,因为它缺乏异常。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

加工类型确实对味道的感觉有影响,虽然最终得分有相似的分布,但湿法加工的味道与最终得分有更高的相关性。

主成分分析

PCA 意在将一组变量转换到一个新的空间,其中新的维度按照它们组成原始维度的可变性排序。一个简单的数据集可以在不损失保真度的情况下减少维数;在这种情况下,每个 Q 分用 10 个维度来表示,但也许你不需要那么多来表示总分。

根据我们对均匀性、净杯和甜度的了解,让我们将它们从 PCA 分析中排除,因为它们没有有意义的信息。

让我们从查看所有数据开始。似乎这两个主成分(PC)代表了数据中所有变化的 80%。虽然前 6 个指标对每个指标的贡献似乎是相等的,但我们已经知道所有变量彼此高度相关。最大的影响是铜点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以跨地区、跨年度、跨过程地观察,看看即使是个人电脑如何解释数据的可变性,也会有多大的差异。北美和 2015 年特别奇怪,因为我们已经从其他数据中看到,所有变异的 90%可以在第一台 PC 中得到解释。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

放大来看,2014 年和 2016 年也是奇数年。对于处理来说,湿法似乎是第一台 PC 的天下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以查看这些区域,以帮助理解哪些变量在使用 PC 时更突出。非洲咖啡豆的味道似乎比酸度或口感更有优势。他们有一个相似的趋势,就像南美豆一样。北美豆类在第一台个人电脑中有它们所有的可变性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就年份而言,唯一奇怪的是所有 7 项指标在第一台电脑中的权重相似。考虑到 2015 年这些指标之间的高度相关性,这并不奇怪。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于加工,湿加工由第一个 PC 控制,但是对于干加工,第一个 PC 包含较少的变化。对于这两者,第二台电脑主要是由铜点,这是一个整体指标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三个常数

当寻找有用的指标时,数据显示均匀性、干净的杯子和甜度并不那么有用。它们确实是更可量化的指标,因为它们超过 5 杯相同的咖啡,但显然,变量缺乏使它们成为有用指标所需的可变性。我只能希望在数据集中有一些问题,他们不是真的这么没用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在查看 Cupper Points 时,它与总分的关系如此密切,以至于我不确定作为一个指标它是否非常有用,或者说它意味着总分可能不是非常有用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

q-分级最初是为了帮助区分专业咖啡和其他咖啡,虽然我肯定它已经完成了这项工作,但我不认为这种方法可以很好地区分专业咖啡。我把这个建立在上述数据集的基础上,我承认也许有一个更好的数据集是我无法获得的。

我建议为特色咖啡制定一个新的等级,从 0 到 100。目前的标准实际上是典型值在 80 到 95 之间。一个 92 真的比一个 91 好很多吗?我不知道。我的经验是 92 分比 85 分好,但我希望改进后的量表可以消除这种模糊性。

附录

在发表这篇文章后,Keith Klein 总结了干净的杯子,均匀性和甜度,我认为这对于理解为什么它们大部分是 10 的和大部分是恒定的是有价值的。我觉得他们区分特色咖啡和非特色咖啡还是有价值的,而不是区分特色咖啡彼此。在他的许可下,以下是他对这三项指标以及得分的评论:

“这些分数与缺陷直接相关,并不像许多人认为的那样是对咖啡固有风味的评级。只有当其中一个杯子有污点或完全缺陷时,你才应该从这些杯子中扣分。

“甜味是其中最宽容的,因为偶尔一个受污染的杯子仍会显示一些甜味,不必进一步处罚。如果一杯咖啡真的没有甜味,那么它应该只有一点甜味。

“这个数据集来自合格的 Q 评分者,他们按照预期使用这些类别。这向你展示了 Q 系统对无缺陷咖啡的重视程度,因为对缺陷的处罚会迅速增加。一个完整的缺陷会降低 10 分。

“cupper points 和总分之间的高相关性是有意的。当你的评价接近尾声时,你的点数会奖励你特别喜欢的咖啡,惩罚你不喜欢的咖啡。”

如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。

我的进一步阅读:

咖啡豆脱气

解构咖啡:分割烘焙、研磨和分层以获得更好的浓缩咖啡

浓缩咖啡的预浸:更好的浓缩咖啡的视觉提示

咖啡的形状

搅拌还是旋转:更好的浓缩咖啡体验

香辣浓缩咖啡:热磨,冷捣以获得更好的咖啡

断续浓缩咖啡:提升浓缩咖啡

用纸质过滤器改进浓缩咖啡

浓缩咖啡中咖啡的溶解度:初步研究

断奏捣固:不用筛子改进浓缩咖啡

浓缩咖啡模拟:计算机模型的第一步

压力脉动带来更好的浓缩咖啡

咖啡数据表

被盗咖啡机的故事

浓缩咖啡过滤器分析

便携式浓缩咖啡:指南

Gradio:机器学习模型的图形界面

原文:https://towardsdatascience.com/gradio-graphical-interfaces-for-machine-learning-models-fd4880964f8f?source=collection_archive---------27-----------------------

介绍 Gradio,一个用于创建机器学习模型用户界面的开源 Python 包。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

介绍

由于许多开源和基于专利的服务(例如 Python、R、SAS),现在创建机器学习模型变得越来越容易。尽管,实践者可能总是发现很难有效地创建接口来测试并与同事或涉众共享他们完成的模型。

这个问题的一个可能的解决方案是 Gradio ,这是一个免费的开源 Python 包,可以帮助你创建模型用户界面,你可以毫不费力地通过链接分享给同事和朋友。

使用以下命令可以轻松安装 Gradio:

!pip install gradio

Gradio 与许多机器学习框架(例如 TensorFlow、PyTorch 等)完美兼容,甚至可以用于任意的通用 Python 脚本。

现在,我将向您介绍 Gradio 如何集成到您的机器学习工作流程中的不同示例。本文使用的所有代码都在这个 Google Colab 笔记本和我的 GitHub 账户中。

民众

图像分类

在本例中,我们将创建一个加载图像的界面来测试计算机视觉模型。在这种情况下,我们将使用 PyTorch 和 Alexnet 预训练模型,但这个实验可以为任何其他模型和框架重新创建。

为了创建 Gradio 接口,我们只需调用 接口函数 并传递三个参数:

  • fn: 通过与用户界面交互来自动调用的函数,以便为我们的模型创建预测,提供某种形式的输入。
  • **输入:**告知 Gradio 我们期望从用户界面获得何种类型的输入(例如,图像、文本、音频数据、数字数据)。
  • **输出:**通知 Gradio 我们的预测函数将返回什么类型的输出。通过这种方式,Gradio 可以了解如何在用户界面上最好地呈现输出。

一旦创建了我们的界面,我们只需要启动它(图 1)。当启动接口时,我们可以决定是否传递额外的参数,如共享调试为真。事实上,这些参数不仅可以用于将 Gradio 界面嵌入我们的笔记本电脑,还可以作为一个可共享的网页,使我们在测试期间更容易调试系统。可共享的链接,虽然只有 6 个小时是活跃的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1: Gradio 图像分类器

文本生成

为了预测句子的结论或生成叙述而生成文本是当前非常感兴趣的话题,尤其是由于自然语言处理(NLP)转换器的出现。在这个例子中,我将为我在上一篇关于 NLP 的文章中介绍的 GTP2 HuggingFace 预训练模型创建一个用户界面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2: Gradio 文本分析

实时通用 ML 模型预测

最后,在这个例子中,我将展示 Gradio 如何用于涉及多种类型输入数据的经典机器学习问题。在这个例子中, Kaggle 心脏病 UCI 数据集将被用作我们的数据集。所有的数据预处理步骤都在这个 Google Colab 笔记本和我的 GitHub 账号上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3: Gradio Live 通用 ML 模型预测

结论

在创建和测试模型时,Gradio 无疑是为机器学习项目创建界面的绝佳工具,尽管为了将您的模型整合到生产和稳定的环境中,可能需要替代解决方案,例如:

Gradio 提供的不同设施和 GUI 界面的完整列表可在Gradio 官方文档页面上找到。如果您有任何问题,欢迎在下面的评论区留下您的评论。

我希望你喜欢这篇文章,谢谢你的阅读!

联系人

如果你想了解我最新的文章和项目,请通过媒体关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:

计算机视觉的图形分类

原文:https://towardsdatascience.com/graph-classification-by-computer-vision-286572aaa750?source=collection_archive---------37-----------------------

如今,图形分析变得越来越流行,但是与计算机视觉方法相比,它的表现如何?我们将展示,虽然计算机视觉模型的训练速度慢得多,但与图论相比,它们的表现相当好。

  • Github 回购与所有代码,链接

图形分析

一般来说,图论表示对象之间的成对关系。我们不会在这里留下太多的细节,但你可以考虑它的某种网络如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

网络。照片由阿丽娜·格鲁布尼亚Unsplash 上拍摄

这里我们需要知道的要点是,通过用边连接对象,我们可以可视化图形。然后我们将能够使用经典的计算机视觉模型。不幸的是,我们可能会丢失一些初始信息。例如,图表可能包含不同类型的对象、连接,在 2D 也许不可能把它可视化。

图书馆

如果您愿意开始使用它们,您可以查看大量的库:

都是针对自己的特定角色。这就是为什么它取决于你的任务使用哪一个。

理论

这篇文章更多的是针对实际应用,这就是为什么对于理论我将只留下一些链接:

  • [用 PyTorch 的手动图形神经网络& PyTorch 几何](http://Hands-on Graph Neural Networks with PyTorch & PyTorch Geometric)
  • CS224W:带图的机器学习
  • 图分类将基于图卷积网络(GCN), arxiv 链接

模型架构

我们将使用以下架构作为基线:

* GCNConv - 6 blocks
* JumpingKnowledge for aggregation sconvolutions
* global_add_pool with relu
* Final layer is softmax

代码链接就是基于这个教程

计算机视觉

通过阅读本文,您将获得所有必需的理论和技术技能:

此外,您应该熟悉以下主题:

模型架构

我们将使用以下没有任何超参数调整的模型:

* efficientnet_b2b as encoder
* FocalLoss and average precision as early stopping criteria
* TTA with flip left right and up down
* Augmentation with albumentation
* Pytorch-lightning as training model framework
* 4 Folds Assembling
* mixup

代码链接

实验

数据

我们将预测活动(针对 COVID?)的不同分子。

数据集示例:

smiles, activity
OC=1C=CC=CC1CNC2=NC=3C=CC=CC3N2, 1
CC(=O)NCCC1=CNC=2C=CC(F)=CC12, 1
O=C([C@@H]1[C@H](C2=CSC=C2)CCC1)N, 1

为了生成用于计算机视觉方法的图像,我们首先将图形转换为 networkx 格式,然后通过调用 draw_kamada_kawai 函数获得所需的图像:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同的分子可视化将用于计算机视觉方法。图片由 Insaf Ashrapov 提供

链接到数据集

实验结果

TESTComputer vision

**Test**
* ROC AUC 0.697
* MAP 0.183

Graph method

**Test**
* ROC AUC 0.702
* MAP 0.199

因为你可以得到几乎相似的结果。图表法得到的结果稍高一些。此外,训练 GNN 只需 1 分钟,CNN 只需 30 分钟。我不得不说:这只是一个概念验证项目,有许多简化。

换句话说,你可以可视化图形,训练著名的计算机视觉模型,而不是新奇的 GNN。

参考

  1. Github repo 与 Insaf Ashrapov 的所有代码链接
  2. GNN 教程http://pages . di . unipi . it/citraro/files/slides/Lando lfi _ tutorial . pdf

用于状态新冠肺炎关联分类的图卷积网

原文:https://towardsdatascience.com/graph-convolutional-nets-for-classifying-covid-19-incidence-on-states-3a8c20ebac2b?source=collection_archive---------30-----------------------

如何将地图映射到图卷积网络。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

墨西哥州图的简单图卷积神经网络示意图。

编者注: 走向数据科学 是一份以研究数据科学和机器学习为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

首先,我想说,在我看来,在线媒体提供了一个向世界展示科技界在我们当前所处的紧迫时代所做努力的机会,这一点非常重要。有必要以可以与由 SARS COV2 病毒引起的疫情的传播速度竞争的速度传播正在产生的信息,SARS cov 2 病毒引起了被称为新冠肺炎的疾病。病毒已经成为科学家的个人敌人,在许多情况下,它是一个未知的敌人,你必须发明一种方法来对抗它,因为我们真的不知道如何对抗(如果你不是流行病学家或相关人员)。当然,最好的工具是保持物理距离和卫生措施已经说了这么多,重复这么多。但是,作为科学家,我们有各种各样的工具可以用来抗击这种流行病,我们必须努力做出我们的贡献,不管这些贡献有多小。这就是我所相信的,也是为什么我提出这个小作品,更多的是邀请大家回顾所谓的图形卷积神经网络(GCNN 的)在新冠肺炎行为研究中的有用性。但我必须澄清,我提出的结果不应被视为预测,因为这是一个非常初步的计划,当然,除了这里使用的因素以外,还必须考虑其他因素。也就是说,让我们开始工作吧!!

  1. 安装补充库。

进入 GCNN 世界的一个相对简单的方法是使用 DGL 图书馆,它除了有不同的实现之外,还有很好的文档(我鼓励你回顾一下关于“Zachary 的空手道俱乐部”[1]问题的教程,我在我们的例子中提到了它。),所以我将在接下来的文章中构建这个库。我非常喜欢 Google Colaboratory 或“Colab ”,因为它允许快速测试 Python 中的原型项目,这是非常便携的,所以我提供的代码适用于 Colab 笔记本(参见本文末尾的笔记本链接)。

首先我们需要安装带有 pip 的 dgl,我们将使用 pandas 和 numpy,所以我们继续导入它们,

可选地,我们也可以安装 chart_studio 并调用 Plotly 来制作交互式图表,正如我在上一篇文章[2]中展示的那样。

2.建立图表。

图是由一组节点和定义连通性的边组成的。例如,如果它是一个分子,节点将是组成它的原子,而它们之间的键将是边[3]。但是,如果我们想把这个想法转移到地理地图上,我们必须决定什么是节点,什么是边。一种方法是将节点作为一个国家的州,但边可以是几个东西。这里,我决定将边定义为两个给定状态之间的公共边界。为了做到这一点,我已经采取了墨西哥共和国的 31 个州+墨西哥城的地图,我列出了他们之间的联系。下图显示了墨西哥的地图,并在此项工作中进行了编号:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

带有用于图形定义的编号的墨西哥地图。

在这一点上,我希望有一个邻接矩阵与每个国家相关联,这将使我刚才描述的过程更容易。总之,我确定的连接最终形成了编码为源点(src)和目的点(dst)的邻接矩阵。通过提供源点和目的地点,确保信息是双向的,就可以将信息传递到 DGL。
这是通过以下函数实现的:

具有此定义的图 G 由 32 个节点和 264 条边组成,我们可以使用 networkx:

给出这个图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

墨西哥各州之间的边界连通性图。

生成的图可以在视觉上识别出来,并且(用一点想象力)与墨西哥地图一起识别,注意节点 1 和 2 形成了下加利福尼亚半岛,而节点 30、22 和 3 形成了尤卡坦半岛。因此,目前看来一切进展顺利。

3.特征化。

要使用 GCNN,我们必须特征化节点。为此,我将使用一次性编码方案。

一个热点向量乘以[4]中的人口密度,下图显示了 2015 年每个州的人口密度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了形成半监督方法,我根据[5]中的官方信息为三个级别(低、中、高)中的每一个级别取两个节点(状态)。这些信息存储在两个张量中,标签 _ 节点用于标识状态,标签用于指示三个事件等级(根据今天的情况定义,2020 年 4 月 17 日),等级低的状态为“0”,等级中等的为“1”,等级高的为“2”:

以下是州名、州号和相关级别之间的对应关系:

3 →坎佩切(0)

17 →纳亚里特(0)

13 →哈利斯科(1)

18 →新莱昂州(1)

4 →墨西哥城(2)

1 →加州 BAJA(2)

这些节点是 GCNN 了解的节点,并将尝试预测与其余未标记节点对应的级别。

4.图卷积神经网络。

根据 Kipf [6],多层 GCNN 从图𝒢=(𝒱,ℰ中学习)取输入 1)输入 N× D 特征矩阵 *X,*其中 N 是节点的数量, D 是每个节点的特征数量;以及 2)类似邻接矩阵 A 的图结构的矩阵表示。对于给定的神经网络层,GCNN 的一般形式具有以下传播规则:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 f 是非线性函数, *H⁰=X,*经过若干层 l=L 后,我们得到一个输出 ZN×F 维特征矩阵,其中 F 是每个节点的特征数。关于 GCNN 的更多细节可以在[3,6]中找到。在我们的例子中,只需要记住我们想要输入一个特征向量 N = 32 并获得三个类别:低、中、高,因此 F=3 。以下是 GCNN 结构的代码:

5.训练。

最后一段代码是训练循环,其中我们使用了在 Pytorch 中实现的 Adam optimizer,学习率为 0.01。用六个标记节点的输入标签训练 GCNN,并且在每次迭代中应用 log_softmax 和 loss 函数以及反向传播,就像在任何神经网络中一样:

6.可视化。

我们可以用最后一个时期的 all_logits 数组制作一个数据帧。然后对于每个节点,我们得到三个标签中最大值的索引。这将指示每个节点的预测。

我发现使用 https://flourish.studio/可以用一种非常简单的方式绘制地图,而且效果非常好,所以这次我选择了使用这个工具。蓝色表示低水平(0),红色表示中等水平(1),黄色表示高水平(2):

这不应被视为预测,它只是第一种方法。

下一步是什么?
1)为新冠肺炎的传播找出更有代表性的描述词。例如,使用每 100,000 名居民的发病率作为疾病传播效率的指标可能是有意义的,也可能是每个州的市内交通站的流动性。不要为州与州之间的边界定义图表,而是为连接城市的道路定义图表,并为人口流入赋予一定的权重。
3)回顾对已经超过最大传染点的其他国家的预测,如中国或意大利。

**结论:**以州与州之间的边界为纽带,假设节点之间有通信,这可能代表不同州之间的人流没有被取消的事实。很明显,通过停止人口迁移,这种联系就被打破了,这将不得不修改像这里展示的神经网络的预测。由于一个州对它的邻居征收很高的税率,结果可能是一个小的影响。

**鸣谢:**要感谢 PhD。来自奇瓦瓦自治大学的 Jaime Raúl Adame Gallegos,感谢他在撰写本文件过程中的善意评论和建议。

上面显示的代码可以在这个链接中使用 Google Colaboratory 打开:https://github . com/napoles-uach/covid 19 MX/blob/master/dgl _ map . ipynb

参考资料:

  1. https://docs.dgl.ai/en/0.4.x/tutorials/basics/1_first.html
  2. https://medium . com/@ jna poles/tracking-covid 19-with-pandas-and-plotly-open-source-graphing-library-maps-d 24 BAF 31 AAC 4
  3. https://towards data science . com/practical-graph-neural-networks-for-molecular-machine-learning-5e 6 dee 7 DC 003
  4. https://www.inegi.org.mx/app/tabulados/interactivos/?px = Poblacion _ 07&BD = Poblacion
  5. https://covid19.sinave.gob.mx/
  6. 【http://tkipf.github.io/graph-convolutional-networks/

基于节点分类任务的训练图卷积网络

原文:https://towardsdatascience.com/graph-convolutional-networks-on-node-classification-2b6bbec1d042?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用图卷积网络的引用网络节点分类图解(图片由作者提供)

本文通过使用spek tralAPI 实现图卷积网络(GCN),这是一个基于 Tensorflow 2 的用于图深度学习的 Python 库。我们将使用 CORA 数据集执行半监督节点分类,类似于 GCN 原始论文中由 Thomas Kipf 和 Max Welling (2017) 提出的工作。

如果你想对图卷积网络有基本的了解,建议先阅读本系列的 第一篇 第二篇 部分。

数据集概述

CORA 引文网络数据集由 **2708 个节点组成,**其中每个节点代表一个文档或一篇技术论文。节点特征是指示文档中单词存在的单词包表示。词汇表——因此也是节点特性——包含了 1433 个单词。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过来源将单词袋图解为节点特征

我们将数据集视为无向图,其中边表示一个文档是否引用另一个文档,反之亦然。该数据集中没有边要素。这项任务的目标是将节点(或文档)分为 7 个不同的类别,这些类别与论文的研究领域相对应。这是一个单模 数据表示设置的单标签多类分类问题。

这种实现也是直推式学习的一个例子,其中神经网络在训练期间看到所有数据,包括测试数据集。这与归纳学习形成对比,归纳学习是典型的监督学习,在训练过程中测试数据保持独立。

文本分类问题

由于我们要根据文档的文本特征对文档进行分类,所以看待这个问题的一种常见的机器学习方法是将其视为有监督的文本分类问题。使用这种方法,机器学习模型将仅基于每个文档自身的特征来学习每个文档的隐藏表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对文档分类问题的文本分类方法的说明(图片由作者提供)

如果每个类都有足够多的标记示例,这种方法可能会很有效。不幸的是,在现实世界中,标注数据可能非常昂贵。

解决这个问题的另一种方法是什么?

除了自己的文本内容,通常,一篇技术论文还会引用其他相关论文。直觉上,被引用的论文很可能属于相似的研究领域。

在这个引用网络数据集中,除了它自己的文本内容之外,我们想要利用来自每篇论文的引用信息。因此,数据集现在已经变成了一个论文网络。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

带有部分标注数据的引用网络数据集插图(图片由作者提供)

使用这种配置,我们可以利用图形神经网络,例如图形卷积网络(GCNs ),来建立一个模型,该模型除了学习文档自身的文本特征之外,还学习文档的互连。GCN 模型将不仅基于其自身的特征,而且基于其相邻节点的特征来学习节点(或文档)的隐藏表示。因此,我们可以减少必要的标记示例的数量,并利用【A】邻接矩阵或图中的节点连通性来实现半监督学习。

图形神经网络可能有用的另一种情况是当每个例子本身没有不同的特征,但是例子之间的关系可以丰富特征表示。

图形卷积网络的实现

加载和解析数据集

在这个实验中,我们将使用基于 Tensorflow 2 构建的 Spektral API 来构建和训练一个 GCN 模型。虽然 Spektral 提供了内置函数来加载和预处理 CORA 数据集,但在本文中,我们将从这里下载原始数据集,以便更深入地了解数据预处理和配置。本文整个练习的完整代码可以在 GitHub 上找到。

我们在各自的数据目录中使用 cora.contentcora.cites 文件。加载文件后,我们将随机打乱数据。

cora.content 文件中,每一行都由几个元素组成:
第一个元素表示文档(或节点)ID,
第二个
到最后一个元素表示节点特征,
最后一个
元素表示该特定节点的标签。

cora.cites 文件中,每行包含一个文档元组(或节点)id。元组的第一个元素表示被引用论文的 ID**,而第二个元素表示包含引用的论文。虽然这种配置代表一个有向图,但在这种方法中,我们将数据集视为一个无向图。**

加载数据后,我们构建节点特征矩阵( X )和包含相邻节点元组的列表。这个边列表将被用来构建一个图,从这里我们可以获得邻接矩阵( A )。

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置训练、验证和测试掩码

我们将节点特征矩阵( X )和邻接矩阵( A )输入神经网络。我们还将为每个训练、验证和测试数据集设置长度为 N布尔掩码**。当这些掩码的元素属于相应的训练、验证或测试数据集时,它们为。例如,属于训练数据的训练掩码元素为。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练、验证和测试布尔掩码的示例

在论文中,他们为每个班级挑选了 20 个有标签的例子。因此,通过 7 个类,我们将总共有 140 个带标签的训练示例。我们还将使用 500 个标记的验证示例1000 个标记的测试示例。

获取邻接矩阵

下一步是获得图的邻接矩阵( A )。我们使用 NetworkX 帮助我们做到这一点。我们将初始化一个图,然后将节点和边列表添加到图中。

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将标签转换为一键编码

构建我们的 GCN 之前的最后一步是,就像任何其他机器学习模型一样,对标签进行编码,然后将其转换为一次性编码。

我们现在已经完成了数据预处理,准备好构建我们的 GCN 了!

构建图形卷积网络

GCN 模型架构和超参数遵循 GCN 原始论文中的设计。GCN 模型将采用 2 个输入,节点特征矩阵( X )和邻接矩阵( A )。我们将实施两层 GCN** 辍学层和 L2 正规化。我们还将设置最大训练周期为 200 并实施提前停止,耐心为 10 。这意味着一旦确认损失连续 10 个时期没有减少,训练将停止。为了监控训练和验证的准确性和损失,我们还将在回调中调用 TensorBoard 。**

在将邻接矩阵( A )输入到 GCN 之前,我们需要根据原文执行重正化技巧来做额外的预处理。你也可以在这里阅读重正化技巧如何影响 GCN 正向传播计算

下面训练 GCN 的代码最初是从 Spektral GitHub 页面获得的。

训练图卷积网络

我们正在实施直推式学习,这意味着我们将把整个图表用于训练和测试。我们使用之前构建的布尔掩码来分离训练、验证和测试数据。这些掩码将被传递给 sample_weight 参数。我们将 batch_size 设置为整个图形的大小,否则图形会被打乱。

为了更好地评估每个类的模型性能,我们使用 F1 分数而不是准确性和损失度量。

训练完成!

从分类报告中,我们获得了 74%的宏观平均 F1 值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 t-SNE 的隐藏层激活可视化

现在让我们使用 t-SNE 来可视化隐藏的图层表现。我们使用 t-SNE 将隐藏表示的维度降低到 2-D。图中的每个点代表每个节点(或文档),而每个颜色代表每个类。

输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GCN 隐层的 T-SNE 表示。GCN 能够很好地学习由不同数据聚类显示的特征表示。

与全连接神经网络的比较

作为基准,我还训练了一个 2 层完全连接的神经网络(FCNN ),并绘制了隐藏层表示的 t-SNE 可视化。结果如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两层全连接神经网络的分类结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FCNN 隐层表示的 T-SNE 表示。FCNN 对文件的分类不如 GCN。

从上面的结果可以清楚地看出,GCN 明显优于 FCNN,宏观平均 F1 得分仅为 55%。FCNN 隐藏层表示的 t-SNE 可视化图是分散的,这意味着 FCNN 不能像 GCN 那样学习要素表示。

结论

执行文档分类(例如 CORA 数据集)的传统机器学习方法是使用监督文本分类方法。图卷积网络(GCNs)是一种替代的半监督方法,通过将文档视为相关论文的网络来解决这个问题。每类仅使用 20 个标记的例子,GCNs 在这项任务上比全连接神经网络高出约 20%。

感谢阅读!我希望这篇文章能帮助你在自己的问题上实现图卷积网络(GCNs)。

有什么意见、反馈或想讨论的吗?请给我留言。你可以在LinkedIn上联系到我。

你可以在 GitHub 上找到完整的代码。

参考

[1] T. Kipf 和 M. Welling,使用图卷积网络的半监督分类 (2017)。arXiv 预印本 arXiv:1609.02907。ICLR 2017

[2]https://github . com/danielegrattarola/spek tral/blob/master/examples/node _ prediction/citation _ gcn . py

https://linqs.soe.ucsc.edu/data

[4] D. GrattarolaC. Alippitensor flow 和 Keras 中的图形神经网络与 Spektral (2020)。arXiv:2006.12138。ICML 2020——GRL+研讨会

编码面试的图表数据结构备忘单。

原文:https://towardsdatascience.com/graph-data-structure-cheat-sheet-for-coding-interviews-a38aadf8aa87?source=collection_archive---------3-----------------------

这篇博客是我的“大型科技公司黑客技术面试 15 天备忘单”的一部分。在这篇博客中,我不会详细介绍图形数据结构,但我会总结一些解决编码面试问题的必备图形算法。

图形数据结构

图是由顶点(V)和边(E)组成的非线性数据结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最常用的图的表示是邻接矩阵(大小为 V x V 的 2D 数组,其中 V 是图中顶点的数量)和邻接表(列表数组表示与每个顶点相邻的顶点的列表)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在接下来的几节中,让我们来看看与图形数据结构相关的一些必须知道的算法。为简单起见,所有实现中都使用邻接表表示。

1.广度优先搜索(BFS)

Input (graph 1): graph = [[1,2], [0,2,4], [0,1,3], [2], [1]], s = 0
Output: **0 1 2 4 3**

图的广度优先搜索类似于树的广度优先遍历。但是,图可能包含圈,所以我们可能会一次又一次地访问同一个顶点。为了避免这种情况,我们可以使用布尔访问数组来标记访问过的顶点。

上面的代码只遍历从给定的源顶点可以到达的顶点。为了完成不连通图的 BFS 遍历,我们需要为每个顶点调用 BFS。

时间复杂度是 O(V+E ),其中 V 是图中顶点的数量,E 是图中边的数量。

2.深度优先搜索

Input (graph 1): graph = [[1,2], [0,2,4], [0,1,3], [2], [1]], s = 0
Output: **0 1 2 3 4 (or 0 2 3 1 4)**

类似于 BFS,我们也需要使用一个布尔数组来标记 DFS 的访问过的顶点。

递归实现:

使用堆栈的迭代实现。请注意,堆栈可能包含同一个顶点两次,,所以我们需要在打印前检查访问过的集合。

对于这两种实现方式,从给定的顶点可能无法到达所有的顶点(示例断开图)。为了完成 DFS 遍历,我们需要为每个顶点调用 DFS。

时间复杂度是 O(V+E ),其中 V 是图中顶点的数量,E 是图中边的数量。

3.检测有向图中的圈

Given a **directed** graph, return true if the given graph contains at least one cycle, else return false.Input (graph 2): graph = [[1,2], [2], [0,3], [], [1]]
Output: **True**

DFS 可用于检测图中的循环。只有当从一个顶点到它自己(自循环)或者到它在 DFS 栈树中的一个祖先有一个后沿时,图中才有一个循环。

时间复杂度和正常的 DFS 一样,都是 O(V+E)。

4.检测无向图中的圈

Given an **undirected** graph, return true if the given graph contains at least one cycle, else return false.Input (graph 1): graph = [[1,2], [0,2,4], [0,1,3], [2], [1]]
Output: **True**

对于无向图,我们不需要跟踪整个堆栈树(与有向图的情况相比)。对于每个顶点“v”,如果有一个相邻的“u”使得 u 已经被访问过,并且 u 不是 v 的父节点,那么图中有一个圈。

时间复杂度和正常的 DFS 一样,都是 O(V+E)。

5.多源 BFS

在某些问题中,您需要为多个顶点启动 BFS,并计算行进深度。我们来看一个典型问题。

Rotting Oranges: [https://leetcode.com/problems/rotting-oranges/](https://leetcode.com/problems/rotting-oranges/)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个问题中,我们使用 BFS 来模拟这个过程。网格被认为是一个图形(一个橙色的单元是一个顶点,有边到单元的邻居)。从“深度”为 0 的所有腐烂的橙子开始 BFS,然后旅行到其深度为 1 的邻居。最后,如果我们仍然有未访问的橙子,返回-1,因为这不可能腐烂所有的橙子。

时间复杂度为 O(V+E) = O(网格中的单元数)。

6.拓扑排序

拓扑排序是顶点的线性排序,使得对于每个有向边 uv,顶点 u 在排序中位于 v 之前。拓扑排序只可能用于有向无环图(DAG)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Given a **DAG**, return the topological sortingInput: graph = [[1,2], [2], [3], [], [1]]
Output: **4 0 1 2 3**

在普通的 DFS 中,我们在递归函数的开始打印顶点。为了找到拓扑排序,我们修改 DFS,使其首先递归调用所有相邻顶点,然后将其值推入堆栈。最后,我们打印出堆栈。

时间复杂度和正常的 DFS 一样,都是 O(V+E)。

7.未加权图中的最短路径

Given a unweighted graph, a source and a destination, we need to find shortest path from source to destination.Input (graph 1): graph = [[1,2], [0,2,4], [0,1,3], [2], [1]], s=4, d=0
Output: **4 1 0**Input (graph 2): graph = [[1,2], [2], [0, 3], [], [1]], s=1, d=0
Output: **1 2 0**

对于这个问题,我们使用 BFS,并在进行广度优先搜索时保存给定顶点的前任。最后,我们使用 predecessor 数组打印路径。

时间复杂度和普通 BFS 一样,都是 O(V+E)。

7.加权图中的最短路径

Given a graph and a source vertex in graph, find shortest distances from source to all vertices in the given graph.Input: graph = [[[1, 2], [2, 6]], [[2, 1]], [[0, 1], [3, 3]], [], [[1, 1]]], s=0
Output: **[0, 2, 3, 6, inf]**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个问题中,我们处理加权图(一个实数与图的每条边相关联)。该图被表示为一个邻接表,其项目是一对目标顶点&权重。Dijkstra 算法用于查找从一个起始顶点到其他顶点的最短路径。该算法适用于有向或无向图,只要它的在一条边上没有负权重。

你可以在这里阅读更多关于 Dijkstra 算法的内容。下面是我使用优先级队列的实现。

上面的实现只返回距离。您可以添加一个前置数组(类似于未加权图中的最短路径)来打印出路径。时间复杂度是 O(V + VlogE),其中 V 是图中顶点的数量,E 是图中边的数量。

推荐问题

您可以通过以下问题练习图形数据结构:

  1. 图是二分的吗?
  2. 克隆图形
  3. 课程表
  4. 课程表二
  5. 岛屿数量
  6. 无向图中连通分量的数量
  7. 图形有效树
  8. 重建旅程
  9. K 站内最便宜的航班(提示:Dijkstra 算法)
  10. 外星人字典(提示:拓扑排序)

公共部门的图形数据库

原文:https://towardsdatascience.com/graph-databases-for-the-public-sector-1a50d0563fff?source=collection_archive---------47-----------------------

利用图表技术进行公共部门数据管理和数据分析的使用案例和示例。

图形数据库是你的技术堆栈中(不那么)新的必备工具。在过去的几十年里,越来越多的科技巨头(脸书,Twitter 和谷歌引领潮流)已经开始将数据迁移到图形数据库中,不仅以高度可扩展的方式存储和检索数据,还将模型整合到图形结构中,以产生高效的推荐。

是什么让图形数据库对这些拥有庞大数据的公司如此有吸引力?公共部门能以类似的方式从这项技术中受益吗?

知识图和 RDBMS 的区别是什么?

RDBMS 基础知识

关系数据库管理系统(RDBMS)是指以具有行和列的结构化格式存储数据的数据库,并且具有展示数据库内不同表之间的链接的模式。RDBMS 通常用 SQL(结构化查询语言)或类似的语言进行查询,对于相当静态(不变)和规范化的数据结构非常有用。

为了给出 RDBMS 的一个基本用例,让我们假设我们正在创办一家名为 GovBook 的公司,它相当于政府的脸书,允许用户注册一个帐户,提交政府文件,并在社交场合与政府官员互动。每个人都有数千个数据属性被捕获,每个属性都必须放入数据库中的特定表中。我们可以构建我们的数据库模式,使之具有一个用户 注册表,其中包含注册期间给出的用户的所有信息,以及一个文档表,其中包含用户上传到系统的每个文档的 pdf 链接。将会有某种唯一的标识符,称为主键来区分用户注册表中的用户,这个键也将作为外键来将两个表相互链接。

这似乎是处理数据管理的一种非常好的逻辑方式,但是当然这种类型的结构化系统有优点也有缺点。在这个例子中,最大的缺点是所有输入的数据都能够适合预先指定的表列。但是,如果在业务开展一年后,GovBook 决定在注册期间获取额外的数据,该怎么办呢?开始时,他们获取姓名、用户名、密码、电子邮件和性别,但现在他们想添加一个出生日期字段。

NoSQL 图形数据库

这个问题引出了 NoSQL(不仅仅是 SQL)数据库的概念,它允许这样的数据存储:

  • 非结构化
  • 高度可扩展
  • 无模式

在过去的十年中,一种特殊类型的 NoSQL 数据库,即图形数据库,变得非常受欢迎。图形数据库使用主谓宾三元组,而不是将数据解释为行和列。因此,在上面的例子中,不是将一行数据詹妮塔·乔治,詹妮塔·乔治 1990,密码 01,jennettageorge1990@email.com,女插入注册表,而是将以下三元组添加到图中:

  • 珍妮塔·乔治->哈斯用户名→珍妮塔·乔治 1990
  • jennetta George-> has password-> password 01
  • 詹妮塔·乔治->哈斯梅尔->jennettageorge1990@email.com
  • 珍妮塔·乔治->哈斯性别->女性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三元组的主语和宾语是图的节点,谓语是

不要让 RDBMS 中的术语关系欺骗了你——在图数据库中,边(或节点之间的关系)被视为一等公民,这就是图数据库真正的魔力所在。边充当图中所有数据之间的连接,并且本身充当丰富的数据源。根据您选择的图表数据库,您可以选择标注、给出方向以及向边添加其他信息属性。例如,如果我们考虑三重 用户—:联系人—>代理人 ,我们可以在关系 联系人 *中构建许多属性和标签。*我们可以订阅一个逆关系, 接收联系人,还可以分配标签,比如日期、主题、交流方式等。如果您停下来考虑如何在关系数据库中实现这一点,您会发现创建这种结构会变得多么困难。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标记边的示例

使用图形数据库的好处

让我们深入了解这种不同的数据管理方式如何影响数据的生命周期。

查询速度更快

就像关系数据库依赖 SQL 语言来检索数据一样,图数据库也有自己专门的查询语言。 Neo4J ,领先的图形数据库工具之一,使用一种叫做 Cypher 的语言。

使用图形数据库查询数据的一个好处可以在下面的例子中很容易地看到。考虑这样一个分析师,他想找到与居住在纽约市的政府代理有联系的所有用户。在关系数据库中,这个简单的查询可能会变得非常复杂,无论是在时间上还是在查询复杂度上。该查询将包括跨多个连接执行多个 select 语句,这取决于与该搜索相关的数据存储在多少个表中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另一方面,在图形数据库中,这将涉及搜索居住在纽约地区的分析师,然后沿着用户和政府代理之间的路径反向遍历图形,以收集用户的信息。两次搜索的时间复杂度相差很大,当您处理数 Pb 的数据时,这一点不可轻视。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其他图形数据库优势:

让我们考虑一下使用图形数据库比关系数据库更大的优势:

  • 同时更新和查询数据— 图形数据库提供了实时更新数据的独特能力,同时允许同时对数据进行查询(即使是 Hadoop HDFS 等大数据流领域的大公司也很难提供这样的服务)。
  • 动态模式— 与关系数据库不同,关系数据库要求数据符合在表开始时分配的一组模式,图形数据库允许您在数据生命周期的任何时间点添加或删除节点和边。
  • 整合 AI / ML 模型 —图形数据库从数据中提供丰富且可访问的信息,这些信息为 AI 模型增加了深度和意义,而这些从关系数据库中根本无法获得。⁴

图形数据库的缺点

当然,没有一种技术是没有缺陷的,所以让我们来探讨一下使用图形数据库的一些潜在缺点。

  • 教育的好时机— 尽管图形数据库自 21 世纪初以来越来越受欢迎,但仍然只有一小部分技术人员能够熟练使用这一工具,更不用说是这方面的专家了。当一个公司决定迁移到图形数据库时,他们也决定在培训成本上投入大量的资源。
  • 数据的丰富程度取决于您自己— 简单地将 RDBMS 数据迁移到图形数据库不会神奇地使其成为更丰富的数据集。数据工程师需要构建一个新的模式,通常是从头开始,并对数据进行逆向处理以适应这种新模式。这同样需要大量的时间和资源。我曾在几家公司工作过,我所在的团队致力于将数据从关系数据库迁移到图形数据库,每家公司都分配了至少 1 年的时间来完成这个项目。

对公共部门数据的影响

公共部门与私营部门的数据管理和分析有许多重叠的需求,两者都旨在降低成本,同时提高运营效率,并从其数据讲述的故事中增加业务价值。虽然政府没有将利润商业化的迫切要求,但他们面临着使其数据和信息流程私有、透明和可信的巨大要求。政府组织使用数据分析来实现两个崇高的目标,一是保护和维护政府对公民安全和福祉的监管,二是为政府雇员和公民提供提高生活质量和优化流程的服务。由于有大量的数据需要筛选,这两个问题的答案都存在于数据中的某个地方,在数据中找到现有的关系将加快这些结果的产生。

图形数据库的另一个巨大优势是删除冗余数据,仅这一项就可以在存储和数据标准化方面为组织节省无数的时间和金钱。图数据库不需要将 PK/FK 列存储在整个数据库的多个不同的表中,而是通过利用无索引邻接来消除这种需要,这听起来就像是这样:图不依靠索引键来链接数据片段,而是依靠边来建立连接。这使得数据管理员可以创建非常直观、视觉上非常简单的复杂图形模式。

政府用例

Neo4J 汇编了一个来自不同组织的用例列表,这些用例说明了如何使用他们的技术来增强科学家的工作流程。以下是一些特定于公共部门的组织:

美国陆军——供应链、物料清单和维护成本管理

美国陆军是我们武装力量中最大的分支,拥有超过 100 万名士兵和 20 万名文职人员,每个人都依赖于需要持续维护和更换的各种设备。传统上,陆军使用基于主机的系统来监控所有供应链管理,但很容易理解为什么这个过时的系统不太适合这个动态、庞大的数据集。

转换到图形数据库允许军队实现模型和查询:

  • 根据环境因素预测更换、维护和平均无故障时间
  • 执行多维成本比较和趋势分析
  • 对陆军的后勤和预算需求过程进行分析
  • 对围绕新战区部队部署的重要问题进行探索性数据分析

MITRE —打击和追踪网络安全威胁

Mitre 是一家由联邦政府资助的非营利性公司,利用图形技术来打击美国的网络攻击。有了如此多的可用数据,找到这些数据之间的联系最终会导致发现和阻止网络攻击所需的模式识别。MITRE 已经通过创建一个名为 CyGraph 的工具做到了这一点,该工具将绝望的数据融合到一个统一的画面中,暴露出漏洞和威胁。⁵

我如何利用图形技术达到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我的团队在 Attain 设计的持续智能平台

作为一家政府咨询公司的首席数据科学家,我一直在寻找改进数据管理的方法,以便在预测分析方面获得长期收益。我们与公司的其他技术领导者一起,致力于开发一个持续的智能平台,该平台整合了图形数据库,将主题专业知识和数据洞察融合为智慧。它最初的想法是帮助现场和桌面分析师自动化他们的数据分析,并建立复杂的模式识别和数据检索系统,以帮助打击对美国的威胁。通过利用尖端的 CICD 和 ML 微服务与我们的图形数据库,我们可以为政府节省无数的工时和美元,同时提供超出分析师自身能力的服务。

参考文献

图形深度学习—第 1 部分

原文:https://towardsdatascience.com/graph-deep-learning-part-1-e9652e5c4681?source=collection_archive---------49-----------------------

FAU 讲座笔记关于深度学习

光谱卷积

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座

这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!

航行

上一讲 / 观看本视频 / 顶级 / 下一讲

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图形深度学习正在成为学习模拟中的一项关键技术。使用 gifify 创建的图像。来源: YouTube

欢迎回到深度学习!所以今天,我们想研究一下如何处理图形,我们将讨论一下图形卷积。让我们看看我为你准备了什么。今天的主题是图形深度学习的介绍。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在说什么格拉夫? CC 下的图片来自深度学习讲座的 4.0 。

那么,什么是图形深度学习呢?你可以说这是一个图表,对吗?我们从数学中知道,我们可以绘制图表。但这不是我们今天要讨论的话题。你也可以说图表就像这样的图。但这些也不是我们今天要讲的情节。那是施特菲·格拉芙吗?不,我们也不是在谈论施特菲·格拉芙。所以我们实际上想看的是更多像这样的东西,比如可以用不同的节点和边连接起来的图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图的定义。来自深度学习讲座CC BY 4.0 下的图片。

一个计算机科学家认为一个图是一组节点,它们通过边连接在一起。这就是我们今天要讨论的图表。对数学家来说,图是流形,但却是离散的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

欧几里得空间上的卷积。 CC 下的图片来自深度学习讲座的 4.0 。

现在,你如何定义卷积?在欧几里得空间,对计算机科学家和数学家来说,这太容易了。这是离散卷积,本质上是一个和。我们记得,当我们为卷积深度模型设置内核时,我们有许多这样的离散卷积。在连续形式中,它实际上有如下形式:它本质上是一个在整个空间上计算的积分,我在这里举了一个例子。因此,如果你想卷积两条高斯曲线,那么你实际上是把它们移动到彼此之上,在每一点上相乘,然后求和。当然,两个高斯函数的卷积也是高斯函数,所以这也很容易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图形卷积怎么样?来自深度学习讲座的 4.0CC 下的图片。

你如何定义图上的卷积?现在,计算机科学家非常努力地思考,但是…管它呢!数学家知道,我们可以用拉普拉斯变换来描述卷积,因此我们研究拉普拉斯算子,这里给出的是梯度的散度。所以在数学上,我们可以更轻松地处理这些事情。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

走向图形卷积的步骤。 CC 下的图片来自深度学习讲座的 4.0 。

这就把我们带到了这个多方面的观点。我们知道如何卷积流形,我们可以离散卷积,这意味着我们知道如何卷积图形。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图形卷积的一个例子是热扩散。来自深度学习讲座CC BY 4.0 下的图片。

所以,还是散点热吧!我们知道,我们可以将牛顿冷却定律描述为以下方程。我们还知道,随时间的发展可以用拉普拉斯来描述。所以,f(x,t)是时间 t 点 x 的热量,然后,你需要有一个初始的热量分布。所以,你需要知道热在初始状态下是怎样的。然后,您可以使用拉普拉斯算子来表示系统如何随时间变化。这里可以看到,这本质上是 f(x)和 f 在 x 周围的无限小数小球上的平均值之差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

怎样才能得到一个离散的拉普拉斯? CC 下的图片来自深度学习讲座的 4.0 。

现在,我们如何以离散形式表达拉普拉斯算子?这就是 f(x)和 f 在 x 周围无穷小的球上的平均值的差,所以,我们能做的最小的一步就是把当前节点和它的邻居连接起来。因此,我们可以将拉普拉斯表示为边权重 a 下标 I 和 j 的加权和,这是我们的中心节点 f 下标 I 减去 f 下标 j 的差,我们用实际传入 f 下标 I 的连接数来除,这将作为 d 下标 I 给出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算图的拉普拉斯算子的简单步骤。 CC 下的图片来自深度学习讲座的 4.0 。

现在有没有另一种表达方式?嗯,是的。我们可以这样做,如果我们在这里看一个例子图。因此,我们有节点 1、2、3、4、5 和 6。我们现在可以使用矩阵 D 计算拉普拉斯矩阵。 D 现在仅仅是各个节点的输入连接数。我们可以看到,节点 1 有两个传入连接,节点 2 有三个,节点 3 有两个,节点 4 有三个,节点 5 也有三个,节点 6 只有一个传入连接。我们还需要矩阵 A 。那是邻接矩阵。这里,每个节点都有一个 1,它与不同的节点相连,你可以看到它可以用上面的矩阵来表示。我们可以取这两个并计算拉普拉斯算子为 D 减去 A 。我们简单地按元素减去这两个来得到我们的拉普拉斯矩阵。这很好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即使对于有向图,也可以得到对称的拉普拉斯算子。来自深度学习讲座的 4.0CC 下的图片。

我们可以看到拉普拉斯是一个 N 乘 N 的矩阵,它描述了一个由 N 个节点组成的图或子图。 D 也是一个 N 乘 N 矩阵,它被称为度矩阵,描述了连接到每个节点的边的数量。 A 也是一个 N 乘 N 矩阵,它是描述图的连通性的邻接矩阵。所以对于一个有向图,我们的图拉普拉斯矩阵不是对称正定的。所以,为了得到对称的版本,我们需要把它标准化。这可以通过以下方式来实现:我们从原始的拉普拉斯矩阵开始。我们知道 D 只是一个对角矩阵。因此,我们可以计算平方根倒数,并从左侧和右侧将其相乘。然后,我们可以插入原来的定义,你会发现我们可以稍微重新排列一下。然后我们可以把对称化的版本写成单位矩阵减去 D 。这里,我们再一次在元素上应用相同矩阵的逆矩阵和平方根乘以。这很有趣,对吧?即使对于有向图,我们也总能得到这个矩阵的对称化版本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

拉普拉斯算子的特征向量和特征值决定了它的傅立叶变换。 CC 下的图片来自深度学习讲座的 4.0 。

现在,我们感兴趣的是如何实际使用它。我们可以做一些魔术,现在的魔术是,如果我们的矩阵是对称正定的,那么矩阵可以分解为特征向量和特征值。这里我们看到所有的特征向量都集合在 U 中,特征值在这个对角矩阵λ上。现在,这些特征向量被称为图形傅立叶模式。特征值被称为频谱频率。这意味着我们可以使用 UU 转置来对图形进行傅里叶变换,我们的λ是光谱滤波器系数。因此,我们可以将一个图形转换成一个光谱表示,并观察它的光谱特性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们去傅立叶空间。 CC 下的图片来自深度学习讲座的 4.0 。

让我们继续我们的矩阵。现在,让 x 是某个信号,每个节点的标量。然后,我们可以使用拉普拉斯的特征向量来定义其傅立叶变换。这便是简单的 x hat 和 x hat 可以表示为 U 转置次数 x 。当然,你也可以把这个倒过来。这可以简单地通过应用 U 来完成。因此,我们也可以为描述节点属性的任何系数集找到各自的谱表示。现在,我们也可以在谱域中用滤波器来描述卷积。因此,我们使用傅里叶表示来表示卷积,因此我们将 g 和 x 带入傅里叶域,将两者相乘并计算傅里叶逆变换。从信号处理中我们知道,我们也可以在传统信号中做到这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以使用多项式进行过滤。来自深度学习讲座的 4.0CC 下的图片。

现在,让我们构建一个过滤器。该滤波器由系数为 θ 下标 I 的拉普拉斯 k 阶多项式组成,它们只是实数。所以,我们现在可以找到这种多项式,它是关于谱系数的多项式,并且在系数 θ 中是线性的。这本质上只是多项式的和。现在,我们可以利用这个滤波器来执行卷积。我们必须像以前一样繁殖。我们有了信号,应用傅里叶变换,然后用多项式进行卷积,最后进行傅里叶逆变换。这就是我们将该滤波器应用于新信号的方式。现在呢?现在,我们可以使用拉普拉斯算子对 x 进行卷积,因为我们调整了滤波器系数 θ 。但是 U 其实真的很重。请记住,我们不能在这里使用快速傅立叶变换的技巧。所以,它总是一个完整的矩阵乘法,如果你想用这种格式来表达你的卷积,计算量可能会很大。但是如果我告诉你一个巧妙的多项式选择可以完全抵消掉 U 呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。

嗯,这就是我们下节课要讨论的关于深度学习的内容。非常感谢您的收听,下期视频再见。拜拜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更多模拟例子。使用 gifify 创建的图像。来源: YouTube

如果你喜欢这篇文章,你可以在这里找到更多的文章,更多关于机器学习的教育材料,或者看看我们的深度学习讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTubeTwitter脸书LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中生成文字记录,试试自动博客

谢谢

非常感谢 Michael Bronstein 对 2018 年小姐的精彩介绍,特别感谢 Florian Thamm 准备了这组幻灯片。

参考

[1]基普夫,托马斯和马克斯韦林。"图卷积网络的半监督分类."arXiv 预印本 arXiv:1609.02907 (2016)。
[2]汉密尔顿、威尔、之桃·英和朱尔·莱斯科维奇。"大型图上的归纳表示学习."神经信息处理系统进展。2017.
[3]沃尔泰林克、杰尔默·m、蒂姆·莱纳和伊万娜·伊什古姆。"用于心脏 CT 血管造影中冠状动脉分割的图形卷积网络."医学成像图形学习国际研讨会。施普林格,查姆,2019。
[4]吴,,等.图神经网络综述 arXiv 预印本 arXiv:1901.00596 (2019)。
【5】布朗斯坦、迈克尔等在 SIAM Tutorial Portland (2018)举办的讲座《图形和流形上的几何深度学习》

图像参考

[a]https://de . serlo . org/mathe/functionen/funktionsbegriff/funktionen-graphen/graph-function【b】【https://www.nwrfc.noaa.gov/snow/plot_SWE.php?id=AFSW1
【c】https://tennis Bei Olympia . WordPress . com/meilensteine/Steffi-graf/
【d】https://www.pinterest.de/pin/624381935818627852/
【e】https://www . ui heregif
【I】https://www . researchgate . net/publication/306293638/figure/fig 1/AS:396934507450372 @ 1471647969381/Example-of-centline-extracted-left-and-coronal-artery-tree-mesh-construction . png
【j】https://www . eurorad . org/sites/default/files/styles/stylesitok=hwX1sbCO

图形深度学习—第二部分

原文:https://towardsdatascience.com/graph-deep-learning-part-2-c6110d49e63c?source=collection_archive---------51-----------------------

FAU 讲座笔记关于深度学习

从光谱域到空间域

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座

这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!

航行

上一讲 / 观看本视频 / 顶级 / 下一讲

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图形深度学习和物理模拟很好地结合在一起。使用 gifify 创建的图像。来源: YouTube

欢迎回到深度学习。所以今天,我们想继续讨论图的卷积。我们将研究第二部分,现在我们看看我们是否必须停留在这个谱域,或者我们是否也可以回到空间域。让我们看看我为你准备了什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过正确选择多项式矩阵,U 消失。 CC 下的图片来自深度学习讲座的 4.0 。

记住,我们用这个多项式来定义谱域中的卷积。我们已经看到,通过计算拉普拉斯矩阵的特征向量,我们能够找到适当的傅立叶变换,然后给出图形配置的频谱表示。然后,我们可以在谱域中进行卷积,并将其转换回来。这有点昂贵,因为我们必须计算 U 。对于 **U,**我们必须对整个对称矩阵进行特征值分解。此外,我们已经看到,我们不能使用快速傅立叶变换的技巧,因为这不一定适用于我们的 U

那么,我们现在该如何选择我们的 k 和θ,才能摆脱 U ?那么,如果我们选择 k 等于 1,θ下标 0 到 2θ,θ下标 1 到-θ,我们得到下面的多项式。因此,我们仍然有这样的配置,我们有在傅立叶空间变换的 x ,乘以我们的多项式,表示为矩阵乘以这里的傅立叶逆变换。现在,让我们来看看 G 帽子的配置。 G hat 其实可以表示为 2 乘以θ乘以λ的 0 次方。记住λ是对角矩阵。所以,我们把每个元素的 0 次方化。这实际上是一个单位矩阵,我们减去θ乘以λ的 1 次方。嗯,这其实只是λ。然后,我们可以这样表示我们的完全矩阵 G hat。当然,我们可以从左侧和右侧拉我们的 U ,这给出了下面的表达式。现在,我们利用θ实际上是一个标量的性质。所以,我们可以把它拉到前面。0 次方的λ被抵消,因为这本质上是一个单位矩阵。右边项的λ依然存在,但我们也可以把θ拉出来。嗯,UU 转置正好抵消了。这又是一个单位矩阵,我们可以用我们定义的拉普拉斯对称图形。你可以看到我们刚刚找到了它,在我们的方程里。所以,我们也可以用这个来代替。你看现在 U 突然没了。因此,我们可以再次取出θ,剩下的就是,我们有两倍的单位矩阵减去图的拉普拉斯对称形式。如果我们现在插入与原始邻接矩阵和度矩阵相关的对称版本的定义,我们可以看到我们仍然可以插入这个定义。然后,其中一个单位矩阵抵消,我们最终得到单位加 D 的-0.5 次方乘以 A 乘以 D 的-0.5 次方。所以,记住 D 是对角矩阵。我们可以很容易地反转对角线上的元素,我们也可以对元素求平方根。所以,这完全没问题。这样我们就不会有 U 出现在这里。我们可以用图形拉普拉斯矩阵以这种非常好的方式来表达整个图形卷积。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

走向空间域卷积的步骤。 CC 下的图片来自深度学习讲座的 4.0 。

现在让我们再分析一下这个术语。因此,我们可以在左侧看到这个等式,我们看到我们可以在谱域中进行卷积,我们可以将 G hat 构造为拉普拉斯滤波器的多项式。然后,我们可以看到,对于特定的选择,k 等于 1,θ下标 0 等于 2θ,θ下标 1 等于-θ。然后,这一项突然只依赖于标量值θ。通过所有这些技巧,我们摆脱了傅立叶变换 U 转置。因此,我们突然可以用这种简化的方式来表示图的卷积。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用 GCN 实现图的卷积。 CC 下的图片来自深度学习讲座的 4.0 。

这是基本的图形卷积运算,你可以在参考文献[1]中找到。你可以对标量值这样做,你使用你的度矩阵,并把它插入这里。你用你的邻接矩阵,把它插入这里。然后,你可以针对θ进行优化,以便找到卷积的权重。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有直接的空间变体。来自深度学习讲座的 4.0CC 下的图片。

好吧,现在的问题是“真的有必要从谱域激发图形卷积吗?”答案是“不”。所以,我们也可以在空间上激发它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

绘制卷积图的简单方法。来自深度学习讲座的 4.0CC 下的图片。

好吧,我们来看下面这个概念。对数学家来说,图是流形,但却是离散的。我们可以离散流形,并使用拉普拉斯矩阵进行频谱卷积。这让我们想到了谱图卷积。但是作为一个计算机科学家,你可以把一个图解释为一组通过边连接的节点和顶点。我们现在需要定义如何通过它的邻居聚集一个顶点的信息。如果我们这样做,我们得到了空间图形卷积。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

聚合器是空间图形卷积的关键。 CC 下的图片来自深度学习讲座的 4.0 。

这是怎么做到的呢?[2]中显示的一种方法是 GraphSAGE。在这里,我们本质上定义了一个感兴趣的顶点,并定义了邻居如何对感兴趣的顶点做出贡献。所以从技术上讲,我们在节点 v 和第 k 层使用特征向量来实现这一点。这可以描述为 h k 下标 v。因此,对于第零层,这包含输入。这只是您的图表的原始配置。然后,我们需要能够聚合,以便计算下一层。这是通过在前一层上的空间聚合函数来完成的。因此,您使用所有的邻居,并且通常您定义这个邻域,使得连接到所考虑的节点的每个节点都包括在这个邻域中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GraphSAGE 算法。来自深度学习讲座的 4.0CC 下的图片。

这一行把我们带到了 GraphSAGE 算法。在这里,您从图表和输入特征开始。然后,您执行以下算法:您在 h 0 处初始化,只需输入图形配置。然后,迭代这些层。你迭代节点。对于每个节点,运行聚合函数,以某种方式计算所有邻居的汇总。然后,结果是一个特定维度的向量,然后你得到聚合向量和向量的当前配置,你把它们连接起来,然后乘以一个权重矩阵。这然后通过非线性运行。最后,你通过激活的数量来缩放。然后在所有层上迭代,最后,您得到输出 z ,这是您的图形卷积的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GraphSAGE 的不同聚合器。 CC 下的图片来自深度学习讲座的 4.0 。

聚合器的概念是开发这种算法的关键,因为在每个节点中,你可能有不同数量的邻居。一个非常简单的聚合器会简单地计算平均值。当然,你也可以使用 GCN 聚集器,这样我们又回到了光谱表示。这样,可以建立空间域和光谱域之间的联系。此外,您可以使用一个池聚合器,然后使用,例如,最大池,或者您使用循环网络,如 LSTM 聚合器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

欢迎来到图形深度学习的世界。来自深度学习讲座CC BY 4.0 下的图片。

你已经看到有各种各样的聚合器。这也是为什么有这么多不同的图形深度学习方法的原因。你可以把它们细分成某些种类,因为有光谱的,有空间的,还有循环的。所以,这本质上是如何处理图形卷积神经网络的关键。那么,我们到底想做什么呢?你可以用这些算法中的一个,应用到一些网格上。当然,这也可以在非常复杂的网格上完成,我会在下面放几个参考文献,你可以看到什么样的应用可以完成。例如,您可以使用这些方法来处理关于冠状动脉的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。

下次在深度学习中,只剩下几个话题了。我想向你们展示的一件事是,你如何将先前的知识嵌入到深层网络中。这也是一个非常好的想法,因为它允许我们将我们从理论和信号处理中了解的许多东西与我们的深度学习方法相融合。当然,我也有一些参考资料,如果你有时间,请通读一下。他们更详细地阐述了我们在这里提出的想法。我还会在这段视频的描述中加入一些图片参考。非常感谢大家的聆听,下节课再见。拜拜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

许多更重要的概念在这里被省略了。因此,请继续阅读下面的图形深度学习。使用 gifify 创建的图像。来源: YouTube

如果你喜欢这篇文章,你可以在这里找到更多的文章,在这里找到更多关于机器学习的教育材料,或者看看我们的深度 学习 讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube、Twitter、脸书、LinkedIn 或 T21。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中生成文字记录,试试自动博客

谢谢

非常感谢迈克尔·布朗斯坦对 2018 小姐的精彩介绍!特别感谢 Florian Thamm 准备了这组幻灯片。

参考

[1]基普夫,托马斯和马克斯韦林。"图卷积网络的半监督分类."arXiv 预印本 arXiv:1609.02907 (2016)。
[2]汉密尔顿、威尔、之桃·英和朱尔·莱斯科维奇。"大型图上的归纳表示学习."神经信息处理系统进展。2017.
[3]沃尔泰林克、杰尔默·m、蒂姆·莱纳和伊万娜·伊什古姆。"用于心脏 CT 血管造影中冠状动脉分割的图形卷积网络."医学成像图形学习国际研讨会。施普林格,查姆,2019。
[4]吴,,等.图神经网络综述 arXiv 预印本 arXiv:1901.00596 (2019)。
【5】布朗斯坦、迈克尔等在 SIAM Tutorial Portland (2018)举办的讲座《图形和流形上的几何深度学习》

图像参考

[a]https://de . serlo . org/mathe/functionen/funktionsbegriff/funktionen-graphen/graph-function【b】【https://www.nwrfc.noaa.gov/snow/plot_SWE.php?id=AFSW1
【c】https://tennis Bei Olympia . WordPress . com/meilensteine/Steffi-graf/
【d】https://www.pinterest.de/pin/624381935818627852/
【e】https://www . ui heregif
【I】https://www . researchgate . net/publication/306293638/figure/fig 1/AS:396934507450372 @ 1471647969381/Example-of-centline-extracted-left-and-coronal-artery-tree-mesh-construction . png
【j】https://www . eurorad . org/sites/default/files/styles/stylesitok=hwX1sbCO

社交媒体的图形嵌入:如何描述和聚类数百万用户

原文:https://towardsdatascience.com/graph-embeddings-for-social-media-how-to-profile-and-cluster-millions-of-users-a34be8c216c3?source=collection_archive---------30-----------------------

实践教程,营销

还记得寻找合适的影响者所花费的时间吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这篇文章中,我想介绍一下在社交媒体挖掘领域的一些发现,描述一个 Word2Vec 模型的实现,该模型用于索引整个用户群,提供一个工具来查找社区中的相似用户。

简介:

尽管许多不同的社交媒体平台已经提供了发现相似用户的方法,但这组功能主要是为最终用户构建的,这意味着目标是向他们展示他们想要看到的内容,而不是从商业角度来看实际上与他们相似的用户。

能够瞄准相似用户的算法被用于脸书广告等工具的背后,这使得广告商有可能瞄准与特定条件(如品牌、口味或其他人口统计数据)相似的用户。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

让我们从一个例子开始:我们有一组n用户关注一个特定的品牌/档案。这些用户中的每一个都可以像n用户一样关注。通常,在追随特定品牌的一组用户中,这些用户之间存在关系。一些用户跟随彼此是因为他们只是彼此认识,一些其他用户跟随特定用户是因为后者是“影响者”,相同用户群中的一些其他用户可能跟随非常知名的品牌。

拥有用户群的“映射”表示可以帮助企业回答不同的问题,其中包括:

  • 怎样才能找到类似xyz的影响者?
  • 用户xyz和用户zyx有多相似?
  • 我可以在没有任何关于用户的附加数据的情况下将我的用户群分组到特定的组中吗?
  • 我的社区中最有影响力的人是谁?

战略:

本研究的主要目标是创建一个品牌社区中每个用户的数字表示,可用数据包括用户名列表和每个用户关注的个人资料列表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据的图形表示。(图片由作者提供)

如果有可能用数字表示空间内的用户,也有可能计算用户之间的操作,例如计算相似性,发现社区中的聚类和趋势。

在思考如何应对这一挑战的阶段,我想到的主要想法是将每个用户视为不同的项目集,类似于何时在商店购物:我们有自己的购物篮(社交媒体档案),我们将这个篮子装满我们想要的东西;不同的购物者对他们的购物篮做同样的事情,因此分析这些数据可以帮助了解顾客之间的模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

只需用社交媒体档案代替物品,神奇的事情就发生了……(图片由作者提供)

这类任务可以通过实现 apriori 这样的算法来完成。这类算法通常用于频繁项集挖掘,它不是一种机器学习方法,而是来自一组称为关联规则学习的算法。

这种方法的问题是,它不能度量实例之间的相似性,因为数据集中的每个实例都没有被转换成数学表示,而只是使用两个奇特的度量来表示:置信度和

然而,apriori 的酷之处在于它提供了用图表表示关联规则的可能性,这对于评估和报告非常有用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源: KDNuggets

在那一刻,有必要后退一步,专注于最终目标:我需要找到一种方法,让我以数学的方式编码用户,保留他们之间的关系。

当回过头来从宏观层面分析这种情况时,我意识到这其中的主要问题是将用户名“转换”成“数字”,因此问题很清楚:哪种算法、模型或任何东西可以将文本转换成数字?

同时,我意识到已经有一个非常强大的工具叫做 Tensorflow 嵌入式投影仪。它允许将高维数据投影到三维空间中,并自动执行 PCA(减少维数)等操作,并计算向量之间的距离,因此它可以显示一个词与另一个词的相似程度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Tensorflow 嵌入式投影仪的一个例子。(图片由作者提供)

实施:

主要想法是试图根据用户追随者数据训练一个 Word2Vec 模型,以测试该模型是否能够学习用户之间的关系。

Word2Vec 是一个神经网络,能够生成单词的密集表示。这种算法,更具体地说是一种无监督学习算法,试图基于单词的邻居来预测单词,因此,在这种情况下,该算法将基于用户来预测追随者。

Word2Vec 可以主要使用两种不同的策略进行训练:Skip-gram 和 CBOW。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CBOW 与 Skip-gram 的图形表示。(图片由作者提供)

在 CBOW 中,组合一组周围的单词(用户)来预测中间的单词(用户)。相反,Skip-gram 将单词(用户)放在中间来预测周围的上下文。

为了实际实现这一点,我选择使用 Amazon SageMaker 及其 Word2Vec 实现,名为 BlazingText

输入数据:

输入数据由一个简单的.txt文件组成,该文件为每个用户包含一个逗号分隔的特定用户正在关注的配置文件列表。输入数据的总大小包括大约 520 万个条目。

培训阶段:

训练在ml.c4.xlarge机器上进行,使用接近默认的超参数,此外,由于预算原因,没有进行超参数优化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

由于选择了训练策略 skip-gram,所以训练进行了五个时期,使用 100 个用户的min_count来预测下一个时期(这是理解用户遵循哪种简档的合理数量。),对于每个输出向量,我选择了 100 维的大小。其余的超参数保持默认。有关可用超参数的完整列表,请参考官方文档

培训阶段持续了大约 9 个小时。

评估:

理解评估该模型的正确方法超出了本文的范围,但是,出现了几个有趣的点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个用二维空间表示的单词向量的例子。(图片由作者提供)

  • 由于任务包括映射一个社区内的所有用户,没有这个应用程序的训练和测试集,矛盾的是,我在寻找一个完美的数据溢出。
  • 从推荐系统中借用一些知识,是否有可能以类似于测试推荐者的方式来测试这个系统:隐藏实例之间的一些关系,并检查推荐者是否仍然能够找到模糊的关系。
  • Word2Vec 模型确实考虑了单词出现的顺序。这在该任务中是无用的,这就是为什么指定了 100 的window_size,以便给模型一个预上下文来帮助预测下一个追随者。

一旦训练完成,我最终得到了一个巨大的.tar.gz模型,解压缩后有两个文件:vectors.txtvectorz.bin,它们完全兼容gensim提供的[keyedvectors](https://radimrehurek.com/gensim/models/keyedvectors.html) 格式

使用gensim读取向量和 followers 一样容易,此外,我们可以使用most_similar方法对模型进行一些手动测试:

from gensim.models import KeyedVectorsword_vectors = KeyedVectors.load_word2vec_format(‘vectors.txt’, binary=False)

为了了解模型对实体间差异的理解有多精确,有多好,特别是当差异非常细微时,我决定选择 Zara 和 Louis Vuitton 这两个知名品牌。

Zara 是一家快时尚零售商,而路易威登(仍然)被认为是一家法国时装和奢侈品公司。

这里是它们中最常见的实体:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

从上面的结果来看,该模型似乎能够区分一些奢侈品和 Fas 时尚品牌,返回实际上有意义的结果。

让我们尝试一些不同的东西,这一次,两位音乐家属于两个完全不同的流派,Lady Gaga 和 Solomun:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

令人惊讶的是,该模型还学习了不同音乐家的向量,能够为 Lady Gaga 返回不同的流行/商业艺术家,为 Solomun 返回更多的技术艺术家。

回到之前提到的有趣的图形可视化,现在也有可能做到这一点:模型为每个实体生成 100 维向量,为了在 2-D 空间上绘制它,有必要降低维度,实现这一点的一种方法是使用scikit-learn [TSNE](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html)类,该类将数据点之间的相似性转换为连接概率。另一种方式可以是计算一个 PCA

下图由使用TSNEmatplotlib可视化的 300 个最常见向量组成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

很明显,存在一些数据聚类,这意味着该模型成功地学习了跨实体的相似性。例如,在左上角,我们可以看到一些零售品牌,而在右下角的名人和一些音乐人。

最后,我们还可以将计算出的向量和元数据导出为.tsv格式,使其对于前面提到的另一个工具来说是可读的:Tensroflow Embedding Projector

这里的优点是,嵌入式投影仪可以计算不同类型的维度缩减,使用户有可能尝试一些算法。此外,将整个矢量和元数据从 Word2Vec 模型导出到嵌入的投影仪并加载这些文件也很简单。关于如何做的简单教程可以在这里找到。

下图显示了通过嵌入投影仪计算的三维 PCA,突出显示的单词表示与标有“chanelofficial”的点最近的点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

另一个例子,使用“宝马”作为搜索查询和神话般的黑暗模式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

可以看出在这两个例子中,搜索查询如何返回在上下文中有意义的值,此外,比较来自二维降维和由嵌入投影仪生成的三维的值,后者似乎不太“分类”和更具包容性,返回严格来说不属于同一类别的实体(例如 Zara 和 h&m)但对相似性的不同观点更开放(例如奔驰和劳力士)。

结论:

在本研究结束时,可以进行一些考虑:提供一个能够识别实体之间相似性的系统的最初目标似乎已经实现,但是,一个事物与另一个事物有多少相似性的想法仅仅是主观的或面向领域的,例如,同一领域中两个品牌之间的相似性可能会被在完全不同的领域中运营的其他品牌的存在所扭曲。类似于算术平均值如何误导样本中的许多异常值。

另一个需要考虑的问题是 Word2Vec 模型在这种情况下的使用方式:像本研究中这样对整个数据集进行矢量化有助于索引数据集中的实例,这意味着新实体(也称为词汇外标记)可以进行矢量化定位,并且只有在重复整个训练过程的情况下才能进行定位。

出于这些原因,我认为这个工具更像一个索引器,有助于品牌在用户群中发现相似的实例。一个例子是,当在社区中寻找有影响的人时,品牌经理可能有一个想法或认识一些用户,这可能是好的,但是,像这样的工具可以帮助经理在他们的社区中找到其他类似的用户,由于这种算法,这些用户已经被索引。

**I have a newsletter 📩.** Every week I’ll send you a brief findings of articles, links, tutorials, and cool things that caught my attention. If tis sounds cool to you subscribe. *That means* ***a lot*** *for me.*

[## 5-bullet 数据科学与技术📡

编辑描述

无情-创造者-2481.ck.page](https://relentless-creator-2481.ck.page/68d9def351)

图拉普拉斯算子及其在机器学习中的应用

原文:https://towardsdatascience.com/graph-laplacian-and-its-application-in-machine-learning-7d9aab021d16?source=collection_archive---------18-----------------------

图拉普拉斯在谱聚类中的应用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上的 Pietro Jeng 拍摄

本文重点介绍了图形、其表示的属性及其在机器学习中执行谱聚类的应用。

介绍

图是一种数据结构,其中的节点通过有向或无向的边相互连接。例如,对于以城市为节点表示城市道路网络的图,边可以具有表示两个城市之间距离的权重。

内容

  • 加载数据
  • 根据特征构建图形
  • 导出它的拉普拉斯表示
  • 探索图拉普拉斯的性质
  • 机器学习中的应用—谱聚类

加载数据

我们将从 python 库 scikit-learn 中的玩具 make_moons 数据集开始。

import numpy as np
from scipy import sparsefrom sklearn.datasets import make_moons
from sklearn.neighbors import kneighbors_graph
from sklearn.cluster import KMeans
from sklearn.metrics import homogeneity_score, completeness_score,v_measure_scoreimport networkx as nx
import matplotlib.pyplot as pltrandom_state = 213
np.random.seed(random_state)data_size = 150features,y = make_moons(n_samples=data_size, noise=0.07, random_state=213)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有两个聚类的数据集

构建 K-最近邻图

k-最近邻图可以以两种模式构建——“距离”或“连通性”。

在“距离”模式下,边代表两个节点之间的距离,而在“连通性”模式下,图的边权重为 1 或 0,表示两个节点之间是否存在边。我们将选择欧几里德距离度量来计算距离。

n_neighbors = 10
knn_dist_graph = kneighbors_graph(X=features,
                                 n_neighbors=n_neighbors,
                                 mode='distance',
                                 metric='euclidean',
                                 n_jobs=6)

它返回一个稀疏图,图中的边表示数据点之间的距离。第一个数据点与其最近的 10 个邻居之间的距离如下所示。注意图的稀疏性,并且它将仅在矩阵中对应于其 k 个最近邻居的那些位置/索引处具有代表距离的连续值,其余的将为零。

knn_dist_graph.todense()[0]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该数据通常用于在数据点中寻找组,其中相似的数据点位于相同的类或簇中。

类似地,在其他这种情况下,当您想要捕捉数据点内的相似性而不是距离时,我们可以使用宽度为(sigma = 1)的高斯核将该图转换为基于相似性,距离 d(x1,x2)是上面稀疏图中非零位置的欧几里德距离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意,在上面的数组中,距离= 0 的位置意味着该距离超出了 k 个最近邻的最大距离。当输入高斯核时,该值可以解释为最高相似度。因此,我们将只把这个内核应用于包含距离的索引。

sigma = 1
similarity_graph = sparse.csr_matrix(knn_dist_graph.shape)
nonzeroindices = knn_dist_graph.nonzero()similarity_graph[nonzeroindices] = np.exp( -np.asarray(knn_dist_graph[nonzeroindices])**2 / 2.0 * sigma**2)similarity_graph = 0.5 * (similarity_graph + similarity_graph.T)
similarity_graph.todense()[0]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该图可能是不对称的,因为它是基于 k-最近邻的。我们需要使这个图对称,原因我们将在拉普拉斯的性质中了解。我们将它的图的转置加到它自身上,并将所有的值除以 2。

让我们看看这个图形可视化后的样子

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 networkx 实现可视化

导出图的拉普拉斯表示法

L = D-W

度矩阵

w:相似图(用加权邻接矩阵表示)

我们将创建一个图的度矩阵,它是一个对角线矩阵,对角线上有节点度 d

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

degree_matrix = similarity_graph.sum(axis=1)
diagonal_matrix =         
np.diag(np.asarray(degree_matrix).reshape(data_size,))L =  diagonal_matrix - similarity_graph

注: 通过从度矩阵中减去相似度矩阵,图中的圈的影响被消除。最后,拉普拉斯算子包含对角线上的次数和矩阵其余部分中边权重的负值。

图的拉普拉斯性质

  1. 实对称

因为它是实的和对称的,所以它的特征值是实的,它的特征向量是正交的。

  1. 正半定

拉普拉斯算子具有至少一个等于 0 的特征值。我们可以通过它的二次型来检验这一点。l 是实对称的,并且如果 x 是 n×1 列向量,则它的二次型 Q 由下式给出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二次型是正半定的,如果-

  • Q≥0 为全部 x 而 Q = 0 为部分 x≠0

我们将 x 设为 1 的列向量。

x = np.ones(shape=(data_size,1))
Q = np.dot(np.dot(x.T, L.todense()), x)
Q.round(10)

任何包含相同值的列向量 x 将导致等于 0 的二次型。

  1. 拉普拉斯零特征值的个数等于图中连通分量的个数
# Finding eigen values and eigen vectors
e, evecs = np.linalg.eig(L.todense())
e.shape, evecs.shape# No. of eigen values equal to 0
e_rounded_off = e.round(5)
e_rounded_off[e_rounded_off == 0].shape# No. of connected components
nx.number_connected_components(nx_graph)

4。具有高边缘权重的两个相似数据点在所得特征向量** 中的相应索引处具有相似的值

这些特征向量之一是菲德勒向量——对应于最小非零特征值的特征向量。在下图中,数据点被符号很好地分开。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对应于最小非零特征值的特征向量图

图拉普拉斯算子的应用

通过扩展上述所有属性,以及本征向量将数据点分组的事实,本征向量被用于聚类。这种方法叫做谱聚类

这是通过选择阈值将数据点从第一个最小的特征向量分成 2 个集群来执行的。对于 2 个以上的聚类,我们可以使用 Kmeans 算法直接从第一个最小的 K 个特征向量中获得 K 个聚类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征值对数据指数作图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征值(排序)相对于数据指数绘制

使用菲德勒矢量来划分数据点

图形分割 —在这种情况下,顶点被分割成分离的集合。该图被划分,使得组内的边具有高权重(聚类内的点是相似的),而组间的边具有小权重(不同聚类中的点彼此不相似)。

费德勒向量是对应于最小非零特征值的特征向量。低于 0 的值的索引被分配给聚类 1,其余值的索引被分配给聚类 2。

我们能够以这种方式使用这个向量,因为这个特征向量是指示向量的缩放版本。指示向量与矩阵的每个非零特征值相关联。每个指示符向量也是彼此正交的,并且理想地包含二进制值 0 或 1 来指示集群成员资格。

在这种情况下,我们使用带符号的连续值,而不是包含 0 和 1 的指示向量。

# Get smallest non-zero eigen value's index for obtaining partition to cluster
fiedler_index = sorted_indices[1] # The eigen vector for smallest non-zero eigen value i.e plotting the Fiedler vector plt.figure(figsize=(8,6))
plt.scatter(np.arange(data_size), evecs[:,fiedler_index].tolist())
plt.title("Eigen (Fiedler) vector plot")
plt.show()fiedler_vector = evecs[:,fiedler_index].copy() # Thresholding the values in this eigen vector at 0
fiedler_vector[fiedler_vector < 0.0] = 0
fiedler_vector[fiedler_vector > 0.0] = 1
new_labels = np.asarray(fiedler_vector)[:,0]# Plot cluster result
plt.scatter(features[:,0], features[:,1],         
                          c=new_labels.astype(float))
plt.title("Clusters plot")
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从谱聚类中获得的聚类

基于熵的外部聚类评价方法评价

同质性&完整性评分和 v-measure 根据基本事实评估聚类结果,并考虑类和聚类标签的分布,以测量所获得的聚类的一致性。每项措施的最高分为 1.0。对于上述过程,我们每个指标的得分为 1.0。

# Evaluation of clustering result of the above procedure
homogeneity_score(y, new_labels), completeness_score(y, new_labels), v_measure_score(y, new_labels)

与 Kmeans 的比较

num_clusters = 2
kmean_labels = KMeans(n_clusters=num_clusters, random_state=random_state, n_jobs=6).fit_predict(features)plt.scatter(features[:,0], features[:,1],                                                                           c=kmean_labels.astype(float))
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 KMeans 聚类中获得的聚类

# Evaluation of clustering result of KMeans
homogeneity_score(y, kmean_labels), completeness_score(y, kmean_labels), v_measure_score(y, kmean_labels)# Scores
# (0.1836464702880451, 0.1837407327840609, 0.18369358944333708)

假设存在球状星团,Kmeans 不能很好地区分这两个星团。

回顾拉普拉斯表示和求解特征值系统以获得聚类,一个问题是— 为什么是特征值系统?

这是因为特征值系统近似于图割。

对于 割(V1, ) 获得 2 个分区的 V1 & V2 表示为——

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上述方法中,特征值近似一个归一化图割NCut(V1,V2)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

怎么会这样?

NCut 的上述方程可以重新表示为瑞利商,其最小值由一个广义特征值问题的最小特征值得到。设 x 为 N 维指示向量其中 xi =1,若图节点 i 在 V1,否则为 0,则 Ncut 的最小化表示为如下瑞利商

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在满足其中一个条件的情况下,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 y 也像我们的指示向量 x 一样受到约束。

这样,图划分问题就转化成了聚类问题。

结论

我们从数据的特征开始,构建它的图和拉普拉斯算子,并使用它的谱嵌入(本征向量),我们找到最佳分割以获得聚类。谱理论是处理图表示的特征值和特征向量的概念的来源,也用于机器学习的其他领域,如图像分割、谱图卷积神经网络以及工业和研究社区中的许多其他领域。

本文旨在总结机器学习和线性代数中的概念和应用,并希望它也能引发探索和了解更多的好奇心。

希望有帮助。

请分享您的反馈,或者如果您在其他领域遇到这些概念的应用。

你可以在 GitHub 上找到代码。

[## taaniya/图形分析

permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…

github.com](https://github.com/Taaniya/graph-analytics/blob/master/Graph_Laplacian_and_Spectral_Clustering.ipynb)

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值