TowardsDataScience 博客中文翻译 2020(五百三十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

奖励可变的无限步旋转木马问题

原文:https://towardsdatascience.com/infinite-steps-cartpole-problem-with-variable-reward-7ad9a0dcf6d0?source=collection_archive---------44-----------------------

利用继承修改撑杆跳开放式健身环境的步骤方法

上一篇博文中,我们写了我们的第一个强化学习应用——cart pole 问题。我们使用深度 Q 网络来训练算法。正如我们在博客中看到的,固定奖励 +1 用于所有稳定状态,当翻筋斗失去平衡时,奖励 0 。我们最后看到:当侧翻接近 200 步时,往往会失去平衡。我们在博客结尾建议了一句话:最大步数(我们定义为 200)和固定奖励可能导致了这样的行为。今天,我们不限制步数和修改奖励,看看侧翻如何表现。

电线杆问题定义

当在 100 次连续试验中平均奖励大于或等于 195.0 时,认为横竿问题解决。这是考虑到 1.0 的固定奖励。由于它的定义,对每个平衡状态保持固定的奖励 1.0 并限制最大步数为 200 是有意义的。很高兴知道这个问题在之前的博客中已经解决。

横竿问题有以下终止发作的条件:

  1. 磁极角度超过 12 度。
  2. 推车位置超过 2.4 —推车中心到达显示屏边缘。

可变奖励

我们的目标是取消步数限制,给每个州一个可变的奖励。

如果 xθ 分别代表小车位置和杆角度,我们将奖励定义为:

*reward = (1 - (x ** 2) / 11.52 - (θ ** 2) / 288)*

这里,小车位置和极角分量都被归一化到[0,1]区间,以给予它们相等的权重。让我们来看看 3D 图的 2D 视图的截图。

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

我们在图中看到,当横竿完全平衡时(即 x = 0θ = 0 ),奖励最大(即 1 )。随着 xθ 绝对值的增加,奖励减少,当 |x| = 2.4|θ| = 12 时,奖励达到 0

让我们将 CartPole 环境 gym 类( CartPoleEnv) 继承到我们的自定义类, CustomCartPoleEnv,并覆盖步骤方法。在阶梯法中,我们写的是可变报酬,而不是固定报酬。

通过使用上面的代码块,制造了 TF-agent 的组件,并训练了深度 Q-网络。我们看到横翻在许多步后更加平衡和稳定。

示范

让我们看看使用可变奖励后我们的横竿表现的视频。

一集平均持续 35.4 秒。令人印象深刻,不是吗?

可能的改进

这里,只有当两个表达式(杆角度和推车位置)都达到极值时,奖励才变为零。我们可以采用不同的回报函数,当达到一个极端条件时,回报为零。我期望这样的奖励函数做得更好。因此,鼓励读者尝试这样一个奖励功能,并评论一下横竿的表现。快乐的春天!

无限可分分布

原文:https://towardsdatascience.com/infinitely-divisible-distribution-586b18c63670?source=collection_archive---------65-----------------------

迈向稳定的分销之旅#2

什么是无限可分分布?

嗨,我是卢武铉( ρ )!欢迎来到“稳定分销之旅”系列

  • 第 0 部分:为什么缓和稳定分布?【点击
  • 第一部分:什么是厚尾分布?【点击
  • Part2:无限可分分布?

这是“稳定分布之旅”系列的第 2 部分。如果你错过了#1 " 厚尾分布",请查看这里的!

警告:不要被这个术语吓坏了

“无限可分分布”

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

资料来源:Pixabay

无限可分?

人们可以谈论物质、空间、时间、金钱或抽象数学对象(如连续统)的无限可分性或缺乏无限可分性。(维基)

1.【物质】直到量子力学的发现,物质是否无限可分的问题和物质是否可以无限切割成更小的部分(量子)的问题才得以区分。

2.金钱是无限可分的,因为它是以实数系统为基础的。每笔交易都有一个没用的精确点,因为这么小的金额对人类来说微不足道。它也适用于时间。虽然时间可能是无限可分的,但金融价格数据是在离散时间报告的。

3.【概率分布】我们这里要讲的!

定义

是时候看看“无限可分分布”的实际定义了。我将向您展示两种不同的定义,从最简单的开始。

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

来源:统计 Howto

想想我们熟悉的两个发行版

常态

我们知道对于正态分布,正态分布的和也是正态的。试着猜测如何构建满足上述定义的“n”独立同分布正态分布。答案如下图 2 所示。

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

两个正态分布的和

制服

与我们的直觉不同,均匀分布不是无限可分的。想看证明的,查这个。作为旁注,我们常犯的错误是两个均匀分布(如 U[-1,0]和 U[0,1])之和是一个均匀分布(如 U[-1,1])

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

资料来源:M.Grabchak 讲座

以上定义都是等价的。

无限可分分布的这种定义是有意义的,因为对于任何‘n’个我们可以分成‘n’个独立同分布的随机变量。

使用特征函数

判断一个函数是否能被无限整除的最简单的方法之一是看它的特征函数。这是因为如果分布的特征函数是每个独立同分布变量的特征函数,那么

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

所以我们可以从我们的原始概率函数,通过看它的逆,来推导出我们的被加数随机变量的特征函数

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

让我们用下面的 3 个例子来验证一下吧!!

“x=a”处的点质量(狄拉克δ分布)

我们从最简单明显的例子开始。这是点质量分布,没有任何随机性。显然这将是无限可分的。

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

图一。点式群体

虽然这可能不是一个有趣的问题,但很容易看出它是如何工作的。

正态分布

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

图二。正态分布

泊松分布

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

图 3。泊松分布

这三个是无限可分分布的例子。

对于更一般的无限可分分布,注意两个无限可分分布之和是无限可分的,即在卷积下闭合。[更多细节请查看这个惊人的 youtube 视频从 20:00 开始]

等等…

问:为什么我们需要知道无限稳定分布?
答:这只是因为调和稳定分布是无限稳定分布的一种。

还有一件事要谈,如果对你来说太沉重的话,可以跳过最后一件。

对于每一个单一的无限可分分布,它都有相应的特征函数。我将介绍一种表示,我们可以用它来指定每个无限可分分布的特征函数。

利维-钦钦代表权

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

请参见下面的蓝色大圆圈。

我们可以看到无限可分分布的类非常大。根据 Levy-Khintchine 表示,我们可以再次指定每个无限可分分布的特征函数。这个挺厉害的!想象一下,我们可以指定这样一大类分布的特征函数。

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

图 4。图表//改编自 Mantegna 和 Stanley (2000 年)

从上图中你注意到了什么?

虽然我们还没有讨论“稳定分布”(马上就要讲到),但是从上图可以看出

  • 每个稳定分布都是无限可分的
  • 不是每个无限可分的分布都是稳定分布

第二点的一个例子是“泊松分布”。从上面的图 3 中,我们看到泊松分布是无限可分的。然而,它并不稳定我会在后面谈到稳定分布时解释原因。

摘要

我们从高级理解到低级理解复习了“无限可分”这个概念。为了理解“缓和稳定(TS)分布”,有必要对无限可分性有一个基本的了解,因为 TS 属于它。希望这份文件有助于提高你的理解。如果你有任何问题,请在下面评论。我希望你对接下来会发生什么感到好奇。下一次,我将带着“稳定分布之旅[部分。3:幂律分布]”

参考:

  1. 【http://shannon.cm.nctu.edu.tw/prob/c28s08.pdf 号
  2. 斯蒂芬妮格伦【StatisticsHowTo.com】【概率中的无限整除:定义】对我们其他人来说是基础统计!https://www.statisticshowto.com/infinite-divisibility/
  3. https://en.wikipedia.org/wiki/Infinite_divisibility
  4. https://www.youtube.com/watch?time_continue=10&v = SJ 70 ie biy 1u&feature = emb _ logo
  5. https://www.youtube.com/watch?v=Sj70IEBIy1U
  6. 金融中的调和稳定分布和过程:数值分析,2008 年
  7. http://www.stats.ox.ac.uk/~winkel/ms3b10_s1.pdf

我还为上面所有的参考资料添加了超链接。请查阅参考资料了解详情。如果我错过了什么,我会在以后更新参考资料。

感谢您阅读本文档。如果您认为这份文件有用,请不要忘记与您的朋友分享。

  • 第 0 部分:为什么是回火稳定分布?[ 点击 ]
  • 第一部分:什么是胖尾分布?[ 点击 ]
  • 第二部分:无限可分分布?

无限不会变得相等

原文:https://towardsdatascience.com/infinities-are-not-made-equal-7f707e055efa?source=collection_archive---------14-----------------------

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

姚文东Unsplash 上拍照

它们有不同的尺寸

学数学的时候,迟早会碰到无限大小的集合。没什么可怕的。我们熟悉的是ℕ的一组自然数,我们对它的理解已经足够了。

一旦我们理解了ℕ,感觉我们已经很好地掌握了无限这个概念,不是吗?

事实证明,无穷大比这更奇怪:它有不同的大小。

无限的大小

从绝对意义上来说,无限集合的大小是无限的。相对而言,看看集合 A 和 B,我们可以比较它们在大小上是相同还是不同。但是如果在两种情况下都是无穷大,你怎么做呢?

好吧,我们不会去数他们的元素,所以这不是一个选项。我们还能做什么?

现在,让我们假设 A 和 B 是有限的。如果不能对元素进行计数,我们如何检查它们的大小是否相同?一种选择是尝试在元素之间建立 1:1 的关系——也称为双射

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

两个集合之间的 1:1 关系

如果可以证明存在 1:1 的关系,我们就有效地证明了 A 和 B 有相同数量的元素。它们大小一样。

假设同样的想法也适用于无限集合。如果我们可以在两个无限集合之间建立 1:1 的关系,我们就知道它们的大小相同。一组不可能比另一组更大或更小。

让我们用一些实验来验证我们的想法。

向无限集合中添加一些项

如果我们取ℕ,并在其中加入一个额外的项目,会发生什么?让我们将新项目标记为-1。

我们可以通过映射 n ↔ n+1 与ℕ建立 1:1 的关系。

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

将项目添加到无限集中

我们将所有的输入映射到不同的输出,在输出端我们覆盖了整个ℕ。这意味着我们有 1:1 的关系,所以总的来说,集合的大小是相同的。

事实证明,向无限集合中添加一个项目并不会使它变大。

如果我们添加了 10 个项目,我们可以将它们标记为-10…-1,我们可以使用 n ↔ n+10 作为我们的映射。

事实证明,向无限集合中添加任何有限数量的项目也不会使其变大。

希尔伯特酒店思维实验的总体思路是:在一个拥有无限房间的订满的酒店里,你总是可以转移现有的客人来容纳新的客人。

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

在无限酒店,你可以随时把客人转移到下一个房间,以便腾出 1 号房间——图片由 Unsplash 上的 Alfons Morales 拍摄

将无限集合的大小加倍

让我们给ℕ加上无穷多项,即所有的负整数。我们基本上是在比较ℤ,所有正整数和负整数的集合,和ℕ.从直觉上看,它的面积是ℕ的两倍,但是它会对我们建立一对一关系的能力产生影响吗?

一点也不。我们可以按顺序交替分配正数和负数,在它们之间来回跳跃,覆盖整个ℤ

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

一对一的关系ℕ ↔ ℤ

请注意,建立一个集合与自然数的 1:1 关系等同于对其元素进行枚举。枚举位置 n 和该位置的项目 x 成 1:1 的关系。

对于上面的映射,枚举是:

0↔0
1↔-1
2↔1
3↔-2
4↔2
5↔-3

事实证明,将一个无限集合的大小加倍并不会使它变得更大。

添加另一个维度

我们不看自然数,而是看自然数的。就像平面上的坐标。让我们比较一下ℕ和ℕ。添加一个完整的独立维度很有可能在某种意义上比原始集合“更大”。

我们有效地增加了我们的集合,每个数字有无限多的项:我们为 0 增加了无限多的项,即(0,1),(0,2),(0,…),为 1 增加了无限多的项,即(1,1),(1,2),(1,…),等等。

毫无疑问,要完全列举出我们在ℕ的所有要素是困难的。

事实证明,如果我们遵循这个方案,我们仍然可以做到这一点:

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

ℕ的一个例子

我们绘制了下面的序列,填满了ℕ的整个目标空间

0 ↔ (0,0)
1 ↔ (1,0)
2 ↔ (0,1)
3 ↔ (0,2)
4 ↔ (1,1)
5 ↔ (2,0)
6 ↔ (3,0)

因为我们可以给出所有项目的无所不包的枚举,我们知道我们仍然在处理一个和ℕ.一样大的无限

事实证明,对无限集合中的项目数求平方并不会使其变大。

分解:分数

好吧,那ℚ呢,有理数集?

先搞清楚正有理数。

任何正有理数都可以用一对整数来表示,比如 1/2 或 5/9。所以实际上,ℚ的正面部分可以通过类似于我们用来绘制ℕ ↔ ℕ地图的对角化方案来绘制。

我们将不得不改变方案,以避免分母中的 0,并且我们将不得不跳过一些有理数,以说明并非所有的整数对都形成不同的有理数。这是因为我们必须处理 1/2 = 2/4 = 3/6 等可约分数。

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

所有正有理数的枚举,可约分数被跳过

有点繁琐,但还是。我们可以列举ℚ.所有的正数让我们称我们的映射函数为 m: ℕ → ℚ.

我们看到ℚ的阳性部分肯定不比ℕ大。如果有什么不同的话,由可约分数引起的重复使它潜在地“变小”。

ℚ消极的一面呢?为了涵盖ℚ积极和消极的两个方面,我们可以先将ℕ与ℤ对应起来。我们知道它们一样大。然后我们使用 m(z) 将任何正的 z 映射到ℚ,并将任何负的 z 映射到 -m(-z)以覆盖的负部分。

使用这种方法,我们可以链接 1:1 的关系,保证ℕ与ℚ:的大小相同

ℕ ↔ ℤ ↔ ℚ

那么一个无穷大的大小是如何增长的呢?

我知道你在想什么。你在等待一个无限大的集合,它显然比ℕ.大到目前为止,我们一直一无所获。

好吧,好吧。

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

让我们试着将ℕ提升到一个新的高度——图片来自pix abay的 Ralf Kunze

让我们看看我们已经尝试了什么:

  1. 我们尝试将固定数量的 k 项添加到ℕ中,试图形成一组不会移动的|ℕ|+k.大小,这也许并不奇怪。
  2. 我们看着ℤ,尝试一个两倍于ℕ.大小的布景我们基本上形成了一组大小为 k 的|ℕ|⋅,其中 k 为 2。如果我们用更大的 k 值去尝试,我们仍然不会有任何进展。我们来回跳跃的映射思想可以重复,因此我们可以容纳 2、4、8、16、32……倍于ℕ大小的集合,最终超过我们可能选择的任何 k。我们仍然和ℕ.保持着 1:1 的关系
  3. 我们看了看ℕ,基本上是想和|ℕ|⋅|ℕ|.的一套尺码进行比较我们再次得出了 1:1 的关系。一旦我们知道了ℕ和ℕ的面积一样大,我们就可以把我们的制图方法联系起来,确定ℕ和ℕ、ℕ⁴、ℕ⁵等的面积一样大。一次增加一个维度,我们最终可以证明ℕ和ℕ的大小是一样的。所以扩展到一个有限的维度集不会让一个集合变大。

我们唯一没有尝试的是大小的幂运算。让我们试着组成一套大小 2^|ℕ|.

动力装置

让我们回到有限集合上来。给定任意一个大小为 n 的集合 A ,构造一个大小为 2^n 的集合的经典方法是形成幂集 P(A) 。那是包含 A 的所有子集的集合。

所以例如集合 A={x,y,z} 有幂集合 P(A) = {{},{x},{y},{z},{x,y},{x,z},{y,z},{x,y,z},{ 。

你会注意到 A 的大小是 3,而 P(A) 的大小是 8=2。你可能想知道是否总是如此,事实也的确如此。这是最容易从结构上看出来的。

假设我们选择一些 A 并构造 P(A) 。如果我们给 A 增加一个额外的元素 e 形成A’P(A’)P(A) 大一倍。这是因为P(A’)整齐地分割成两个大小相等的部分。第一部分包含 P(A) 的所有元素——这些正是A’中不包含新元素 e. 的子集。第二部分包含第一部分中每一项的孪生元素,形成A’包含e 的所有子集。

让我们从空集 A⁰开始,不断添加元素,从而形成 a,a 等。每一个连续的幂集都包含了前一个幂集的元素,以及这些幂集的副本,每个幂集都添加了新元素。

A⁰ = {},P(A⁰) = {{}},|P(A⁰)| = 2⁰
A ={ x },P(A )={{}, {x} },|P(A )| = 2
a = {x, y },p(a)= { { { },{x}, {y},{ x,y} },| p(a)| = 2

回到ℕ.让我们形成 P(ℕ)看看它是否仍然和ℕ.一样大我们需要尝试找到一种方法来列举 P(ℕ).的所有元素我们走吧。

枚举ℕ的子集

我不知道你怎么想,但我发现很难找到一种简单、系统的方法来列举自然数的所有可能序列。我们必须想出一些索引方案。

让我们画一个表,其中列代表自然数,每行代表一个子集。我们在每一列中放置一个 0 或 1,表示我们是否希望在该行的子集中包含相应的数字。行的顺序给出了我们的枚举顺序。

假设我们想通过编码空集开始我们的序列,然后是整个ℕ,然后形成各种模式,它可能看起来像这样。

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

枚举ℕ的子集

完美!看起来有一种方法来表示我们的枚举。我们现在可以考虑某种枚举所有子集的方案。

现在,假设我们已经找到了一个好的规则,并且确信我们的枚举编码了某一行中所有可能的子集。

幽默一下,看看我们桌子对角线上的数字组成的序列,然后翻转其中的每个元素。每个 1 都变成 0,每个 0 都变成 1。得到的序列显然编码了ℕ的某个子集,所以它应该是我们枚举中的某个行。

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

枚举ℕ子集的对话框

但与此同时,该序列保证不会出现在我们的枚举中。如果我们想声明“不,不,那个序列被 g 号覆盖了”,我们知道这不是真的。g 行不同于我们翻转的对角线序列,至少在位置 g,那是我们取原始值翻转的位置,所以不可能是相同的。由翻转对角线编码的ℕ子集不在我们的枚举中。这不可能。

最后,我们遇到了一个明显大于ℕ的集合,即ℕ.所有子集的集合它是如此的庞大,甚至没有办法去列举它的成员。

ℝ比ℕ大

好,我们已经找到了至少两种无穷集合。可枚举的集合,也称为可数无穷。甚至更大的集合,大到成员无法被枚举,像ℕ.幂集这些被称为不可数不定式。

事实证明,ℝis 的那组实数也比ℕ.大

想象一下,你试着枚举 0 到 1 之间的实数。您最终会做一些与我们的子集索引练习非常相似的事情,只是使用数字 0-9,而不是只有 0 和 1。

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

尝试枚举所有 0.xyz…

但是我们知道,即使你限制自己去列举那些只有 0 和 1 的数字,你已经有了一个不可数的集合。从 0 到 1 之间的实数已经比整个ℕ.还多

事实上,ℝ和 P(ℕ).一样大我们来讨论一下为什么会这样。

ℝ的大小

让我们假设 P(ℕ和ℝ.的面积一样大我们知道|P(ℕ)|相当于所有 0 和 1 序列的数目。

让我们看看ℝ的开放区间(0,1 ),让我们像以前一样用一个表格,用我们常用的数字 0-9 来列举其中的数字。我们用了比 0 和 1 更多的数字。显然,这使得这个集合至少和 P(ℕ).一样大但是大小可能一样吗?

可以在数字序列 0-1 和 0-9 之间建立 1:1 的关系。这是一个创建等效编码的问题。

做那件事有几种方法。想象一下计算机用来表示数字的二进制编码,或者连续的 1 和 0 的数量编码连续的数字。例如,考虑下面的想法,其中连续的 1 序列编码一个序列数字。

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

0–1 序列和 0–9 序列之间 1:1 关系的基本思想

从最初的想法进展到实际的绘图是一个乏味的过程。构造 1:1 可逆编码的细节可能是棘手的,因为严格的定义需要考虑各种边缘情况,例如 0.09999…等于 0.1 等。因此,在每个方向上找到一个内射映射,并使用施罗德-伯恩斯坦定理得出双射映射存在的结论通常更容易。

不用花时间在这种编码的细节上,让我们相信这种编码是存在的。因为它确实存在,我们已经确定 P(ℕ和区间(0,1) ∈ ℝ大小相同。

接下来,我们通过映射建立大小相同的区间(0,1)和(-1,1)

x2x-1

我们通过将 0 映射到-1、0.5 映射到 0 和 1 映射到 1 来扩展和移动我们的区间,其中所有值都是线性插值的。

这是非常可逆的。回过头来我们可以计算 (x+1)/2 ,所以是 1:1 的关系。我们扩展了区间,并证明了两个区间的无穷大相同。

接下来,我们通过映射将区间(-1,1)缩放到(-π/2,π/2)

十.↔ (x⋅π/2)

通过除以π/2,这是可逆的,因此我们有 1:1 的关系,因此区间(-1,1)和(-π/2,π/2)的大小相同。

链接我们的映射,我们已经建立了区间(0,1)和(-π/2,π/2)的大小相同。当然,两个区间都包含无穷多个点,但是我们知道它们之间有 1:1 的对应关系。所以就无限的大小而言,它们是相等的。

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

(0,1)和(-π/2,π/2)通过 1:1 关系包含相同数量的点

注意,我们不能像以前一样,通过乘以一个常数来延伸到无穷大。

但是我们可以使用 切线功能来实现。

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

正切函数绘制了整个ℝ的时间间隔

我们可以通过映射将区间(-π/2,π/2)延伸到整个ℝ

x ↔ 谭(x)

在我们的区间上,使用【arctan(x),tan函数是完全可逆的,因此我们有 1:1 的关系,确定(-π/2,π/2)与整个ℝ.的大小相同

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

arctan 函数通过 tan 将我们的映射反转回我们的原始区间,因此我们的区间和ℝ之间有 1:1 的关系

通过一系列一对一的关系,我们已经建立了:

P(ℕ) ↔ (0,1) ↔ (-1,1) ↔ (-π/2,π/2) ↔ ℝ

因此 P(ℕ)和ℝ.一样大

我有问题!

是啊,我知道。现在我们发现了一个比ℕ大的无穷大,我们想知道是否有更大的,或者更小的,以及介于两者之间的大小呢?

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

无限确实有不同的大小——图片来自 Pixabay 的马里奥·霍弗

有比ℝ大的无限集合吗?

是的,任何集合的幂集都比原来的大。

例如,P(ℝ的面积比ℝ.的面积大

原因在康托定理中被优雅地概括为,你不能在任何集合 A 和它的幂集 P(A)之间形成 1:1 的关系。任何映射都不可能覆盖 P(A)中的所有值。

用专业术语来说:没有满射函数 f: A →P(A),所以也不可能有任何双射函数。电源组总是太大而无法覆盖。

有比ℕ更小的无限集合吗?

不,可数无穷集的任何子集不是有限就是可数无穷集。

这个想法是,如果你有一个可能比ℕ“小”的无限集合 a,你就能把它映射到ℕ.的某个子集然后,您可以根据该映射对 a 进行排序,从而枚举 a 的内容。成功枚举 a 的项目表明与ℕ存在 1:1 的关系,因此证明 a 与ℕ.的大小相同

请参阅 Kevin 的精彩文章,了解更多详细信息:

[## 最小的无穷大

我身上有一个纹身。自然对我来说很有意义。它每天都让我想起这个世界的奇妙…

medium.com](https://medium.com/@kev.ullmann/the-smallest-infinity-7b27b1ecd639)

有没有大小在ℕ和ℝ之间的无限集合?

非常好的问题。还有一个开放式的。连续统假说认为不存在。但到目前为止没人知道。

我们所知道的是,这个问题的答案与集合论本身无关。换句话说,在我们目前的知识框架内,它可以以任何一种方式被假设,而不会导致与我们目前的知识体系不一致。

可怕吧。

InfluxDB 分析教程

原文:https://towardsdatascience.com/influxdb-analytics-tutorial-7bf938317cd5?source=collection_archive---------50-----------------------

使用 Knowi 连接到 InfluxDB 数据源,查询它,可视化您的数据,并通过基于搜索的分析提出更多问题。

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

戴维·舒尔茨在 Unsplash 上的照片

目录

介绍

维基百科将物联网定义为“一个由相互关联的计算设备、机械和数字机器组成的系统,这些设备具有唯一的标识符,能够在网络上传输数据,而无需人与人或人与计算机的交互。”举个例子,想象一个家庭安全系统和一个智能手表都可以自动向你的手机发送数据。

虽然物联网消除了数据传输过程中对人机交互的需求,但人机交互仍然是分析物联网数据的必要部分。为了与他们的物联网数据进行交互,人类需要一个可以安全存储数据的数据库和一个可以高效分析、可视化并最终从中获得洞察力的可视化平台。

这就是 InfluxDBKnowi 的用武之地。InfluxDB 是一个开源数据库,由 InfluxData 的团队专门构建,用于存储时序物联网数据,Knowi 是一个分析和可视化平台,提供了与 InfluxDB 的广泛原生集成。Knowi 广泛的原生集成使其有别于许多其他分析平台,这些平台难以应对 InfluxDB 数据的非结构化性质,并确保您使用 Knowi 从 InfluxDB 实时查询物联网数据不会有任何问题。在本教程中,您将学习如何使用 Knowi 来分析和可视化来自 InfluxDB 的数据。

连接到 InfluxDB

一旦您登录到您的 Knowi 帐户,第一步是连接到 InfluxDB 数据源。为此,请按照下列步骤操作:

1)移动到屏幕左侧的面板,选择“数据源”

2)从“NoSQL 数据源”中找到并选择“InfluxDB”

3)这里会自动填写您的数据源、主机和数据库名称;您需要做的就是保存您的数据源。

祝贺您连接到 InfluxDB!

查询您的数据

当您保存您的数据源时,您应该会收到一个提示“Datasource added”。配置查询。为了设置您的第一个查询,请按照下列步骤操作:

1)点击“查询”

2)在执行任何其他操作之前,请在“报告名称*”中将您的报告命名为“InfluxDB Query ”,然后直接查看您的报告名称上方。您应该会在屏幕顶部看到一个新的警告,内容是“检索到的表”。使用查询生成器部分来发现和构建报告/查询。这意味着 Knowi 自动为存储在您连接的 InfluxDB 数据库中的每个表建立索引,现在您可以从这个索引中选择表。

3)向下滚动到“表格”,单击向下箭头,并选择“h2o _ 温度”这将使 Knowi 自动创建一个 InfluxDB 查询,调用 InfluxDB 数据库中水温表的前 1,000 行中的所有列。这个 1,000 的限制只是一个默认的限制,但是我可以毫无问题地处理更大的负载,所以继续删除 InfluxDB 中写着“限制 1000”的部分该水温表包含每六分钟在两个不同位置进行的水温测量,并以华氏度记录。

4)移至屏幕左下角,点击“加入”这将设置第二个查询构建器,您将在其中生成第二个查询,并最终将其与第一个查询连接起来。在第二个查询构建器中,我们将重复与第一个查询非常相似的过程。使用“Tables”下的向下箭头,选择“h2o_quality”,并从 Knowi 自动生成的 InfluxDB 查询中删除“limit 1000”。就像水温表一样,这个水质表也包含每六分钟进行一次的测量。

在我们进入第 5 步之前,我认为最好解释一下为什么需要采取这一步。水质是通过一种称为水质指数的度量标准来衡量的,在我们的水质表中简称为“指数”。与水温保持相当一致不同,水质指数非常不稳定,在一个小时的过程中,可以在 0 的最小测量值和 100 的最大测量值之间变化。为了让您了解这种波动性有多大,下面是我们将一天中的水温和水质指数可视化后的情况:

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

作者图片

我曾认真考虑过不在本教程中包含这张图片,因为它丑陋得足以将观众拒之门外,也愚蠢得足以让观众质疑它怎么可能出现在关于正确数据分析的教程中。不过,我最终还是加入了,因为我觉得有必要在每小时 6 次测量的基础上展示水质指数的波动性,我们希望避免以这种方式将其可视化。

这里的好消息是,与每小时 6 次测量的水质不同,一整天的平均水质指数实际上相当一致,我们完全可以在此基础上通过分析获得有价值的见解。这就是 Cloud9QL 的用武之地。Cloud9QL 是 Knowi 强大的 SQL 风格的语法,允许您在设置查询后对查询进行后处理,在这种情况下,Cloud9QL 将用于将水质指数转换为每日平均值,使您的查询更加简洁。现在,您已经确切地知道了我们为什么需要将测量值转换为日平均水质指数,以及我们将如何进行,您已经准备好进入第 5 步:

5)在刚刚设置的用于查询水质表的 InfluxDB 查询下面,将以下语法输入到 Cloud9QL 查询中:

select *, day_of_month(time) as Day;
select avg(index) as Index, time as Date, location
group by Day, location;

6)接下来,使用查询构建器左上角的眼睛图标预览这个特定查询的结果。正如你所看到的,你有两个不同地点每天的平均水指数。现在,在我们将水质表与水温表连接起来之前,我们需要将同样的过程应用于水温表。为此,向上滚动到您设置的第一个查询,查询水温表,并在 Cloud9QL 查询中输入以下语法:

select *, day_of_month(time) as Day;
select avg(degrees) as Temperature, time as Date, location
group by Day, location;

7)现在,在两个查询之间稍微向下移动一点到连接生成器。单击“加入构建器”将联接类型设置为内部联接,并将位置设置为位置,日期设置为日期。然后选择“保存”以保存您的加入。

8)这里的工作差不多完成了,但是您需要再次返回到 Cloud9QL,以我们想要的格式完成我们的查询。这一次,使用屏幕底部的“Cloud9QL Post Query”并输入以下语法:

Select Temperature, Index, Date, location as Location
order by Date, location

9)现在,点击屏幕左下角的“预览”。你应该看看圣莫尼卡和郊狼溪的每日水温和水质指数。如果您这样做了,这意味着您已经正确地做了所有的事情,这意味着您是时候单击“保存并立即运行”来运行您的查询了。

您的查询现已正式完成。干得好!

分析和可视化您的数据

现在您已经完成了查询,是时候利用 Knowi 的可视化功能来享受您的劳动成果了。保存并运行查询后,结果将作为数据集存储在 Knowi 的弹性数据仓库中。此外,您在保存查询之前查看的引用数据网格现在存储为一个小部件。为了可视化您的小部件并创建更多可视化效果,请按照以下步骤操作:

  1. 移动到屏幕左侧面板的顶部,选择“仪表板”然后,选择加号图标,将新仪表板命名为“InfluxDB 仪表板”,并单击“确定”
  2. 这个控制面板将作为您的小部件和您创建的所有其他小部件的主页。回到屏幕左侧的面板,这次选择“Widgets”。将您创建的新“InfluxDB Query”小部件拖到您的仪表板上。
  3. 将鼠标悬停在新部件的右上角,以显示省略号图标。选择它,然后向下滚动并选择“分析”将新屏幕左上角的“位置”栏拖到“过滤器”上在“值”下,键入带下划线的“coyote_creek”,然后单击“确定”
  4. 在屏幕顶部,选择“可视化”这将向您显示您的数据网格,它与您正在分析的数据没有太大的不同。要改变这一点,点击屏幕左上角“可视化类型”下的“数据网格”,将您的可视化更改为“区域”可视化。如果你做对了,你应该会看到一个面积图,它传达了平均水温保持非常一致,而水质有一个体面的数量每天的变化。
  5. 走到屏幕的右上角,选择“克隆”图标——它看起来像两张叠在一起的纸。将这个新部件命名为“Coyote Creek Daily”并选择“Clone”然后选择“添加到仪表板”

利用基于搜索的分析进行深入研究

虽然点击并拖动指标到过滤器区域并手动设置过滤器并不太难,但有时您只想用简单的英语提问并实时收到结果。这就是 Knowi 基于自然语言处理的搜索分析功能的用武之地。假设您希望只显示另一个位置(Santa Monica)的数据,而不是查看仍有波动的日平均值,您希望查看周平均值。下面是如何做到这一点:

  1. 回到第一个小部件的右上角,选择省略号图标,然后选择“分析”键入“显示圣莫尼卡每周的温度、指数和日期”并输入。这将自动计算水温和水质指数的周平均值。
  2. 前往屏幕顶部的“可视化”,将“可视化类型”更改为“区域”
  3. 选择“克隆”图标,并将这个新部件命名为“圣莫尼卡周刊”,然后选择“克隆”然后选择“添加到仪表板”

摘要

回顾一下,您通过连接到 InfluxDB 数据库开始了本教程。然后,您设置了一个查询,从两个单独的表中提取水温和水质指数的日平均值,并使用 Knowi 的连接构建器将它们连接起来;该查询的结果作为数据集存储在 Knowi 的弹性数据仓库中。接下来,您构建了一个仪表板,以可视化作为查询结果获得的原始数据,并创建了一个区域可视化,以一种更容易看到的方式传达一些结果。最后,您使用基于搜索的分析,以不同的方式分析数据的不同部分。

信息图算法

原文:https://towardsdatascience.com/infomap-algorithm-9b68b7e8b86?source=collection_archive---------15-----------------------

一种社区发现算法

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

在格文-纽曼(混合参数= 0.2,平均节点度= 16)合成网络(mscthesis.herokuapp.com)中运行 Infomap 算法后检测到的社区。

描述

信息图算法试图最小化成本函数。划分是基于给定网络中连接模式引起的流量[1]。

考虑到发送者假装将网络内的随机路径传递给接收者,假设如下:该消息的大小旨在被最小化。一个直接的策略是给每个节点分配一个不同的名称(代码)并将相应的序列发送给接收者。后者将能够基于适当的码本对消息进行解码。考虑到路径是由相同大小的𝑁码以二进制语言描述的,每个码字的最小长度𝐿为:

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

用更简洁的方式描述同一条路径的另一种方法是使用霍夫曼编码。该方法在于根据随机路径的遍历节点访问频率(无限长随机行走的平均节点访问频率),将不同长度的代码与每个节点相关联。哈夫曼编码本身已经是一种有效的方式来传输零星或不连续的独立节点,这些节点构成了我们假装要编码的随机路径。实际上,香农的信源编码定理指出,当我们使用𝑛码字来描述随机变量𝑋的𝑛态时,最小描述长度(MDL)由随机变量本身的熵给出:

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

如果目标是传输完整路径或所属节点的重要序列,则可以使描述更有效。为了实现这一点,网络被划分成模块,并且为每个模块定义不同的代码簿。这允许不同的节点被给予相同的标识。这不仅意味着为每个模块定义了模块码本(包括退出码),而且还定义了索引码本,以在随机漫步机进入不同模块时进行标记。在这些分层描述的情况下,MDL 由每个模块和索引码本使用频率的加权平均值给出:

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

𝑞 = ∑(m)(j=1) 𝑞j 每个小区的退出概率之和,𝐻(𝑄)小区间移动的平均码长, 𝑝(i)(⊙) = 𝑞i + ∑(m)(β∈i) 𝑝β 在一个小区内随机行走的停留概率𝑐和𝐻(𝑃)模码本的平均码长。

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

在(3)中插入(4)和(5):

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

考虑一个未加权且无向的网络,𝑞𝑚是模块𝑚的退出概率,𝑝𝛼是相对权重𝑤𝛼,其计算方法是将连接到𝛼的边的总权重除以图中所有链接的总权重的两倍。

这样,通过压缩网络的描述长度,它被划分成反映网络动态的模块。当节点之间的连接表示给定数量的流而不仅仅是这些节点之间的相似性时,这特别有用。算法 1 中 Infomap 算法的伪代码。

Infomap 方法表明,社区发现算法也可以用来解决压缩问题。

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

参考

[1] M. Rosvall,D. Axelsson 和 C. T .博格斯特伦,“地图方程”,*《欧洲物理杂志专题》,*第 178 卷,第 1 期,第 13–23 页,2009 年。

信息驱动的金融标杆

原文:https://towardsdatascience.com/information-driven-bars-for-finance-c2b1992da04d?source=collection_archive---------17-----------------------

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

照片由来自 PexelsLorenzo 拍摄

对分笔成交点不平衡棒线的非正式审查

介绍

您可能知道,原始财务数据由分笔成交点组成,代表市场交易。每一笔市场交易的特征是日期、时间、价格和交易的合约或股票数量。

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

取自证券数据库的原始分笔成交点数据示例

为了表示金融时间序列,通常使用棒线,棒线是分笔成交点的集合。但是有几种方法可以聚集信息;由于这个原因,许多种类的酒吧存在(时间酒吧是最常见的)。

观察市场 5 分钟,记下第一个观察到的价格(开盘价),最低价(最低价),最高价(最高价)和属于所选时间间隔的最后一个价格点(收盘价),你就建立了一个 5 分钟棒线!

然而,与人类不同,市场并不遵循时间表。它们不以固定的时间间隔处理信息。他们宁愿一件一件地做,一笔一笔地做。那么,如果我们放弃时钟,开始用不同的逻辑对市场价格进行采样,会怎么样呢?例如,我们可以使用音量时钟来构建音量条;或者,我们可以在每次观察到一定数量的新交易时,构建分笔成交点和样本价格。成交量和分笔成交点是已知的抽样方法,我不认为它们值得一整篇文章,因为你可以在网上找到大量的信息。

但是,如果我们使用一个信息时钟会发生什么呢?如果我们在每次市场上出现意想不到的数量的信息时对价格进行采样,会怎么样?这正是信息驱动酒吧背后的理念。很有趣,不是吗?我们将介绍最简单的信息驱动棒线:分笔成交点不平衡棒线。马科斯·洛佩兹·德·普拉多在他的书《金融机器学习的进步》中提出了这些观点(AFML)。

什么是分笔成交点不平衡棒线?

简而言之,为了建立这种棒线,我们假设分笔成交点不平衡代表知情交易(分笔成交点不平衡将很快被定义)。因此,每当我们观察到一个意想不到的不平衡量时,我们就对市场价格进行采样,并创建一个新的棒线。用德·普拉多的话说:

信息驱动棒线的目的是当新信息到达市场时更频繁地取样。在这种情况下,“信息”一词在市场微观结构的意义上使用。[……]通过使取样与消息灵通的交易者的到来同步,我们也许能够在价格达到新的均衡水平之前作出决定。

AFML 给出的定义

考虑 t=1,…,T 的一系列分笔成交点{(p_t,v_t)},其中 p_t 和 v_t 表示时间 T 的价格和成交量。分笔成交点规则为 t=1,…,T 定义了一系列分笔成交点符号{b_t},其中 b_t 可以是 1 也可以是-1。

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

AFML 给出的刻度线的定义

接下来,分笔成交点不平衡可以定义为 T 个分笔成交点上分笔成交点符号的部分总和。

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

AFML 对蜱不平衡的定义

现在,只要分笔成交点的不平衡超过我们的预期,我们就应该对棒线取样。这意味着我们必须计算每个棒线的运行 不平衡,并将其与我们的预期进行比较。当当前不平衡的绝对值大于绝对预期不平衡时,我们将关闭该棒线。

书中将每根棒线开始时的期望不平衡定义为每根棒线的期望分笔数(T)与分笔符号的无条件期望(b_t)的乘积。此外,该书指出,我们可以使用指数加权移动平均(EWMAs)来估计这些时刻。

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

AFML 给出的每个条形开始时预期不平衡的定义

特别是:

  • 我们可以使用先前棒线的实际分笔成交点数量 T 的 EWMA 来估计每根棒线的预期分笔成交点数量
  • 我们可以使用前一个滴答的滴答符号的 EWMA 来估计滴答符号的无条件期望值

回顾

马科斯·洛佩斯·德·普拉多指出,我们应该利用信息时钟来对市场价格进行采样。分笔成交点不平衡棒线只是这个概念最简单的应用,我们应该在此基础上发现有趣的见解。我们应该对信息和预期信息提出新的定义。毕竟,马科斯·洛佩斯·德·普拉多刚刚为我们指明了方向,或许我们不应该把他的实施细节看得太重。为什么?

首先,建议的棒线生成机制受到您如何初始化其参数的严重影响—要生成不平衡棒线,您必须初始化每个棒线的预期分笔成交点数量(下面的 init_T)、分笔成交点符号的无条件预期(E[b_t])以及定义用于更新我们预期的两个指数平均值的 alphas。

下图显示了通过一千多次模拟获得的结果。它表明,随着定义 EWMA(T)的α的增加,相同时间间隔产生的棒线数量减少。此外,当我们增加用于初始化该机制的 T 值时,杆的数量减少。

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

每个模拟中生成的条形数与初始化参数的散点图。x 轴表示用于更新预期刻度数的 alpha。init_T 是我们用来初始化 EWMA(T)的值。EWMA(b_t)的α一直保持在 0.005 不变。刻度线的无条件期望值总是用 0.5 初始化。例如:如果你用 EWMA(T)的 alpha 值稍大于 0.2,init_T 接近 2000 来初始化这个机制,你得到的一个月的数据少于 10 根棒线。

很自然地,结果条的数量越多,我们在每个条中包含的信息量就越少。

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

每个模拟中棒线关闭时的中值不平衡散点图。例如:如果您的不平衡中值为 2000,则在给定模拟中创建的 50%的棒线已经关闭,不平衡≤ 2000,50%的棒线已经关闭,不平衡≥ 2000。在 x 轴上,您可以找到已创建的条的数量。条形的数量越多,每个条形的中值信息含量越低。

这意味着当我们选择如何初始化棒线生成机制时,我们粗略地选择了我们将用来关闭棒线的不平衡阈值。

上面的图只显示了该机制产生至少 3 个条的情况。重要的是要认识到,如果初始化的预期不平衡太高,该机制将只产生几个条,或者甚至很难产生单个条;如果太低,我们反而会产生太多的条纹。当你选择的初始参数完全错误时,我们的机制不会自动调整。

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

在本例中,第一个预期不平衡阈值设置得太高,并且没有为整个月的数据生成柱线。

其次,虽然我喜欢我们的期望是动态的这个想法,但是我并不真正理解所建议的实现。如果我们跟随 AFML 对市场进行采样,我们会得到不同的棒线:每个棒线都有不同的信息内容。这可能很棒,但关键是我们在每个条形中包含的信息量及其动态几乎不受我们的控制。****

再看一下上面预期失衡的定义。b_t 的无条件期望值的绝对值可以假定为[0,1]中的值,因此真正定义期望不平衡的是期望的分笔成交点数量。这意味着,如果最后一根棒线需要更多(更少)的分笔成交点,则下一根棒线的预期不平衡可能会更高(更低)。但是你怎么能证明这个想法呢?如果在关闭最后一根棒线之前,只花了很多分笔成交点就达到了你预期的不平衡水平,为什么你的不平衡预期会增加呢?

关闭酒吧的门槛应该由其他因素决定。理想情况下,当当前的不平衡达到一个重要的阈值时,我会关闭一个棒线,这个阈值告诉我价格将在接下来的 X 个成交量棒线中受到影响。这一显著阈值是否应该保持不变是一个研究问题。

结论

鉴于上面提到的几点,我决定(目前)坚持使用一个以持续的不平衡期望为特征的实现。这意味着,每次我想要构建 TiB 时,我都必须指定将用于关闭每个棒线的不平衡阈值。

正如 Gerald Martinez 在他的有趣的文章中写的关于不平衡棒线的文章“不平衡棒线的目标是在达到新的平衡之前及早发现市场方向性的转变”。带着这个目标,我将继续学习,以了解如何提高我对这个概念的理解。特别是,我想了解是否存在重要的阈值,以及是否可以动态地指定它们。

写这篇文章,分享我的想法,展开讨论。因此,如果您有任何问题或疑问,欢迎您的评论。

奖金部分

达到不平衡水平的概率取决于分笔成交点水平(计算不平衡的分笔成交点数量)。下图显示了不同分笔成交点的滚动失衡的经验分布。

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

不同分笔成交点范围内的滚动绝对不平衡分布。在 5000 个分笔成交点的范围内,可能会观察到 50–100 的绝对不平衡。在 100 个分笔成交点上不可能观察到同样的不平衡。

下面您会看到一个用恒定预期不平衡范例创建的 TiB 图。蓝点是用音量时钟采样的价格。

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

使用恒定预期范例创建的分笔成交点不平衡条(图中的烛台状)示例。DAX 期货合约。蓝点是音量条的结束点。

附录和代码

每个图都基于 2019 年 12 月到期的 DAX 期货合约的分笔成交点数据。从 2019 年 1 月 11 日到 2019 年 11 月 30 日,我使用了一个月的 ticks。不同的数据可能会得到不同的结果。

下面你可以找到一些意大利面条代码来复制我的分析,甚至用你的分笔成交点数据创建不平衡棒线。如果稍微修改一下 spaghetti 脚本,您将能够使用一个恒定的期望不平衡范例来创建 bar ids。

意大利面条代码创建不平衡 _ 酒吧 _ 身份证,再现和改善我所做的

使用机器学习的信息图信息组织——综述

原文:https://towardsdatascience.com/information-organization-with-infographics-using-machine-learning-a-survey-54b2169c1f21?source=collection_archive---------36-----------------------

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

Unsplash 上的 Gris Olmedo 拍摄的照片

利用机器学习自动化信息图生成过程。讨论信息可视化领域的最新研究。

信息图对于以更易理解的方式向观众展示信息至关重要。随着它们的使用扩展到许多(如果不是全部的话)专业领域,如新闻、科学、研究、广告、商业,关于自动生成漂亮的和以用户为中心的信息图的过程的研究已经成为数据可视化社区的最新特征。

在这一系列的文章中,我们将讨论 5 篇开创性的研究论文,它们集中在为不同类型的数据自动生成漂亮的信息图的过程上。

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

信息图表示例。[1]

目前,有许多非常强大的设计软件和代码库支持从数据生成信息图。下面的列表提到了一些您可能想看看的工具和库。然而,当设计信息图时,过程并不简单。要创作一件非常吸引人的艺术品,需要昂贵的劳动力,而且通常非常耗时。每一条小信息,从选择要突出的主题,到选择颜色组合,创建信息图所需的技能也是多种多样的。

支持信息图生成的软件

  • Microsoft Powerpoint(设计理念)
  • Microsoft PowerBI —用于开发数据可视化仪表板
  • Adobe Illustrator
  • (舞台上由人扮的)静态画面

帮助创建信息图表的 Javascript 包

  • D3.js
  • Highcharts.js

自动化信息图表设计

最近在信息可视化方面的研究显示,人们对自动化/半自动化复杂的信息图生成过程越来越感兴趣。然而,这项研究的主要目的并不是完全摆脱人类的控制,而是专注于开发技术,以支持设计师的决策过程。为了研究这项研究,我们将论文大致分为 5 类:

  • 时间线信息图设计自动化
  • 图标设计自动化
  • 基于信息流的自动化
  • 基于文本的自动化
  • 图像图表融合自动化

时间线信息图生成[1,2]

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

从时间序列信息图中提取模板组件并拟合新数据。[1]

顾名思义,这些方法试图为基于时间的数据自动设计信息图。其中一种方法直接在已经存在的时间线信息图的位图图像上工作,以提取全局和局部信息。全局信息可以是以下类型:方向、布局(统一、分面、分段等。)和表示类型(径向、线性等。).类似地,本地信息是关于包含信息图中一条信息的边界框,例如,文本框、图标等。这些方法使用现有的卷积神经网络来绘制边界框或分割局部信息的信息图,并通过分类来预测全局信息的值。提取模板信息后,我们可以用新的信息替换旧的信息,自动得到新的信息图。

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

时间线说书人。[2]

另一方面,有一个名为 Timeline Storyteller [2]的可视化仪表板,它直接获取时间线数据的原始 CSV/Excel 表,并生成信息图,用户可以根据自己的设计选择定制这些信息图。用户可以用非常大的时间序列数据集设计信息图和动画,并将他们选择的图片导入这些信息图,如示例所示。试试时间线说书人这里

图标设计自动化[3]

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

复合图标生成。[3]

我们列表中的下一个类别是关于设计复杂图标的技术。因此,给定一个输入文本,例如,房屋清洁,任务就是给出一个语义上有意义的图标。现在,通过查询中的每个单词搜索图标的问题可能看起来很简单,例如,一个图标代表“房子”,另一个图标代表“清洁”。现在把这两个图标结合起来,我们就有了一个复合图标。尽管这对于简单的查询来说是正确的,但是语义标记图标的数据却很少。因此,我们需要想办法将现有的标记图标的语义知识扩展到其他没有被很好探索的领域。为此,使用来自自然语言处理的经过充分研究的单词嵌入可能是有用的。

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

从文本查询开发复合图标管道。[3]

给定一个查询文本,我们为每个被注释并与现有数据集中的图标相关联的单字计算最近的单词。然后,基于样式兼容性对从查询词提取的图标进行排序。为了测量样式兼容性,为每个描述其样式的图标生成一个嵌入向量。所以两个图标的风格向量越接近,它们的风格就越相似。为此,我们可以训练 CNN 来生成这些风格嵌入。该模型是在现有的 1000 个人管理的复合图标数据集上训练的,其中复合图标内的各个图标被认为在风格上更相似,而不是在另一个输入复合图标中出现的该图标的不同风格。

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

对于拼图的最后一部分,当基于语义和样式兼容性过滤图标时,它们基于空间兼容性放置。为了计算空间兼容性,研究了来自 1k 人工管理的复合图标的图标,以基于每个图标生成模板(如上图所示)。这样做是为了产生另一个图标相对于当前图标可以放置在哪里的想法。使用该信息,图标被放置在模板中以生成复合图标。

基于信息流的自动化[4]

转到文本类别,这项工作的重点是提取信息图中的信息流。

给定一个信息图图像,信息流基本上是一种显示图像中视觉组位置方向的方式。视觉组是包含信息图表中的片段的信息,这些片段被重复以呈现完整的画面。这些视觉群体的流动被称为叙事流

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

信息图表中的信息流方向。[4]

本文根据所研究的视觉群体及其在 13k 信息图表图像数据集中的位置,将这些叙事流模式分为 12 类。对象检测 CNN 最初用于检测信息图中包含图标和文本的视觉组,然后研究位置以生成信息流图。

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

从由 YOLO 网络检测的包围盒中生成信息流路径。[4]

本文讨论了一种流提取算法,将 CNN(【YOLO】)检测到的包围盒根据接近度和大小分组为视觉组,然后检测这些视觉组的流,预测最终的视觉信息流。除此之外,该系统还能够执行反向选择和分类,其中用户绘制信息流的方向,并且系统获取具有相似流向的相关信息图。此外,如上所述,下图显示了信息流的 12 个分类类别。

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

信息图表中的 12 类信息流。[4]

本文还研究了基于这 12 个类别的信息图中不同元素的空间分布,如下所示。

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

每个叙事流类别中元素的空间分布。[4]

基于文本的自动化[5]

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

为报表自动生成的信息图: 超过 20%的智能手机用户是社交网络用户 。[5]

这个系列中的另一个系统被称为*文本到即时消息系统。*给定一个统计报表,这个系统试图直接提出完整的信息图设计。与其他信息图管理工具不同,在其他工具中,用户需要/可以编辑信息图的最终设计,Text-to-Viz 生成这些定义良好、美观的信息图,不需要编辑。如果用户不需要创建设计丰富的信息图,但需要简单快捷的东西以更好的方式呈现一条统计信息,那么这个系统的最佳用例就是这种情况。根据这篇文章,最常见的信息图表有 4 种类型:

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

每个类别的信息图及其出现百分比。[5]

  • 基于统计的:包含图表、象形图等的信息图。用于呈现统计信息。
  • 基于时间轴:显示时间轴信息。
  • 基于过程的:一步一步的行动演示。
  • 基于位置:在地图上显示信息。

根据这项研究,由于大约 50%的信息图是基于统计的,其中大约 45%是基于比例的,所以他们只尝试为这组信息图创建一个自动信息图生成系统。之后,下一步是研究基于比例的信息文本的不同部分。下面显示了一个例子,他们试图分类和提取要单独设计的信息。

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

对基于比例的信息的不同部分进行分类。[5]

接下来,设计空间需要根据不同元素的放置位置进行划分。研究人员提出了 20 种模板设计,可以根据论文中提到的规则放置不同的元素。

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

根据模板设计信息图。[5]

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

设计模板时考虑的规则。[5]

图像图表融合自动化[6]

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

嵌入图表的图像。[6]

自动信息图表生成列表中的最后一项技术是设计包含聊天内容的图像的技术,如上图所示。一项关于摄影信息图表的调查显示了常用于呈现嵌入图像中的数据的图表类型[6]。分别是条形图【41.2% 】,饼图【21.4% 】,折线图【9.4% 】,散点图【2.2%】。除了图表之外,嵌入该信息的其他方式是单个分割对象:其中图形沿着水平/垂直轴被分割成更小的部分,并且这些分割的面积可以基于我们试图比较的不同量的比率。接下来是多个调整大小的对象,其中图像内的对象根据它们试图描绘的数据来调整大小。使用关于如何和在哪里表示信息的信息,研究人员通常遵循下面显示的管道来生成最终的信息图。

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

将图表嵌入图像的工作流程。[6]

因此,从给定的数据集中,选择相关的变量,并收集对应于这些变量的图像。当用户选择这些图像中的一个时,就会为所选择的变量生成图表。这些将被嵌入在选定的图像。在这一阶段,用户可以拖动图像上的一个区域来嵌入图表,或者他们可以从该图像中选择特征(例如霍夫线)来用作在这些图像上覆盖图表的锚点。

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

利用掩蔽技术嵌入图表。[6]

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

基于图像特征(本例中为霍夫线)的图表嵌入。[6]

总的来说,用休线和“饼图/条形图等”来表示“趋势/时间线数据(折线图)”是合理的用掩蔽技术。为了微调这些嵌入,可以为每种类型的图表计算不同类型的失真。例如,比较高线和折线图的斜率可以给出折线图嵌入图像的程度的估计失真。这些值用于优化图表在图像上的拟合,以生成美学信息图像。最后,所有这些都在一个界面中实现,用户可以使用他们的领域知识或设计技能来微调这些自动生成的结果。

结论

我们讨论了在不同类型的数据集上生成信息图的方法:时间线、图标、文本和图表。所有这些方法都侧重于信息图的某个方面,侧重于它们试图表示的数据类型。这些线索通常是对已经存在的信息图表进行调查的结果,然后使用该信息来自动化该过程。这仍然是一个很有前途的新的研究领域。未来的研究方向可以是探索更多种类的信息图,然后将现有技术与新技术相结合,创建一种更全面、更通用的技术,以自动化/半自动化这一繁琐的信息图生成过程。

参考

[1]走向自动化信息图设计:基于深度学习的可扩展时间线自动提取,Zhutian Chen 等。阿尔,2019

[2]时间线说书人,马修·布雷默等。阿尔,2019

[3] ICONATE:复合图标的自动生成与构思,赵南轩等.阿尔,2020

[4]探索信息图表中的视觉信息流,最小。鲁。et。阿尔,2020

[5] Text-to-Viz:从与比例相关的自然语言语句中自动生成信息图。崔薇薇等人。艾尔。, 2019

[6]信息图像:将数据嵌入专题图像,Darius Coelho 等人。艾尔。, 2020

基础设施即代码—优点与缺点

原文:https://towardsdatascience.com/infrastructure-as-code-pros-vs-pros-5dbe9a245f47?source=collection_archive---------66-----------------------

行业笔记

构建高质量软件的基本方法

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

Unsplash科学高清拍摄的照片

如今,大多数软件公司必须频繁发布产品,以消除缺陷或引入新功能。此外,如果他们有基于云的产品,他们需要定期调配和管理云服务。这些任务可以手动执行,但效率非常低。

您可以通过编写代码来供应和管理云服务。这种方法被称为代码基础设施或 IaC。在本文中,我首先描述了使用 IaC 解决方案的好处。然后,我分享我使用这种方法的经验。

IaC 方法使我们能够:

  • 再造云服务无数,
  • 监控云配置轻松、
  • 在开发管道中自动执行云供应,以及
  • 选择更灵活的云服务提供商。

我再解释一下。

为什么基础设施是代码?

—重复

由于多种原因,您必须在开发过程中多次配置云基础架构(例如网络、安全和存储)。例如,如果一个实例在集群中关闭,您的服务将停止工作。在这种情况下,您必须重新进行云配置,并且希望与之前的配置完全一致。

—监控

在 IaC 解决方案中,一切都是用人类和机器可读的语言编写的,比如 YAML 或 JSON。因此,配置文件可以在版本控制系统中存档和标记,以备将来使用。因此,团队领导或 CTO 可以轻松地监控或检查这种配置。请注意,您只需要监视配置文件,而不需要 IaC 解决方案创建额外的文件。

举例。让我们假设工程团队选择了 AWS 基础设施,并分配了几个带有 16 个 CPU 的 EC2 实例来交付产品。使用 IaC 解决方案,领导可以轻松观察 EC2 实例的类型,并防止公司花费不必要的金额。这是一个在复杂产品中非常需要的透明度

—自动化

您可能希望在持续集成和部署或 CI/CD 管道中巧妙地嵌入云供应步骤。不建议每次想要部署解决方案时都执行云供应步骤,尤其是在开发环境中。但是,您可能希望在产品发布渠道中包含云供应步骤,尤其是在云配置发生变化的早期。

**举例。**你想搭建舞台,发布配置完全相同的环境。但是,配置会不断变化,因为您仍然不确定许多细节。您可以使用 IaC 解决方案来确保拥有相同的环境。另外,你对 YAML 文件做了一些修改,服务停止工作。您有一个截止日期,没有时间调试。您只需要将它回滚到过去的某个功能点。借助 IaC 解决方案,您可以访问以前的云配置。

—灵活性

如果你通过使用所有的本地技术栈将自己锁定在一个云服务提供商身上,这将是非常昂贵的。云服务提供商的本地技术堆栈可能与其对手不兼容。因此,您可能无法轻松地迁移到其他服务,这可能会导致无法负担每月的账单。

二。我使用 IaC 的体验如何?

在我最近的经历中,我负责构建和管理 CI/CD 管道。我与产品经理密切合作发布产品。没有 IaC 解决方案,我无法交付任务。在这里,我想分享一下我的经历。

将开发局限于某个特定的供应商是很昂贵的。

在早期,我们获得了价值几千美元的信用额度来使用 AWS。我们可以开始使用所有 AWS 技术栈来开发我们的解决方案。然而,与许多同行相反,我认为应该是供应商不可知的,即使该供应商是亚马逊。

如果我们将自己锁定在一个供应商身上,我们将无法控制每月的账单,并且我们不能轻易将其最小化。例如,如果我们收到使用其他云服务的信用,我们将服务迁移到新主机就不容易了。所以,我选择了 Terraform 而不是 CloudFormation 来配置更灵活的云基础设施。

请注意,我无意在本文中详细描述 CloudFormation vs Terraform 的优缺点。

甚至 AWS EC2 实例也可能永久关闭。

在我们在 AWS 上设置云服务几周后,我们收到了一封来自 Amazon 的电子邮件,称集群中的一个 EC2 实例由于硬件问题将被永久关闭。我们在一张 JIRA 卡片上注意到了这个问题,并把它放在了我们的待办事项中,但它很容易被我们忽略。

在一个美丽的星期一,我们的云服务突然遇到了一个不寻常的错误。知道我们有一个交付的最后期限,它就不再那么漂亮了!经过调查,我们发现该错误是由于 EC2 实例关闭引起的。多亏了 Terraform,我们能够快速可靠地重建 EC2 集群。

阶段和发布环境必须完全相同。

当一些客户开始定期使用我们的解决方案时,我们将 stage 环境添加到我们的开发工作流中。阶段环境降低了在发布中失败或遇到意外行为的风险。

我们必须确信阶段和发布环境总是相同的。即使是很小的差异也可能导致失败。使用 IaC 方法是构建相同开发环境的最佳实践。所以,我们也用了它。

我们不得不多次配置云基础设施。

在早期,我们只有一个单一的开发环境。因此,我们没有想到 IaC 解决方案的必要性。然而,我们到达了一个点,我们有三个开发环境:开发、阶段和发布。因此,我们必须配置比以前多三倍的云基础架构。

另外,我们不知道每个环境需要什么样的云配置。因此,我们必须进行实验来找到最佳配置。显然,如果没有 IaC 解决方案,我们不可能进行这些实验。

我们每次都需要将一个文件复制到 EC2 实例中。

在开发过程中的某个时候,我们决定将 DockerHub 帐户设为私有。为了确保 CI/CD 管道顺利工作,我们必须存储帐户凭证,并在需要时检索它们。

为了遵循最佳实践,我们应该在 AWS secret manager 之类的密码库中存储凭证。由于我们有一个确定的截止日期,并且我们想对公众关闭我们的 DockerHub 帐户,我们选择了一个更简单的方法。我们设法在 EC2 实例的云供应阶段存储凭证文件。这不是最好的方法,但至少相对提高了安全性。

公司对一切都有行业标准。

我们必须尽可能快地发展。我们有竞争对手,我们希望远远领先于他们。因此,我们总是使用能为我们提供更好用户体验的解决方案。例如,我们发现 Terraform 与它的替代品相比,为我们提供了:

  • 一种对人类友好的开发语言,
  • 写得非常好和更新的文件,和
  • 易于理解的开发管道。

像亚马逊这样的公司对所有的云服务都有自己的解决方案;然而,他们不一定是最好的或最受欢迎的。例如,AWS 的 IaC 解决方案有 CloudFormation ,但 Terraform 正在成为这种背景下的领先解决方案。

临终遗言

我所有的经历只是让我对基础设施如代码或 IaC 解决方案更感兴趣;尤其是 Terraform。您可能不需要以高级方式使用 IaC 解决方案。但是,开始使用这种方法来逐步解决您的挑战和需求是非常重要的。如果你开始使用这种方法,你一定会喜欢它。

感谢阅读!

如果你喜欢这个帖子,想支持我…

[## 通过我的推荐链接加入 Medium—Pedram Ataee 博士

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

pedram-ataee.medium.com](https://pedram-ataee.medium.com/membership)

Python 中的继承:数据科学家的基础

原文:https://towardsdatascience.com/inheritance-in-python-fundamentals-for-data-scientists-99455f176f76?source=collection_archive---------71-----------------------

用一个具体的例子来理解基础!

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

克里斯托夫·高尔在 Unsplash 上拍摄的照片

类继承是面向对象编程中的一个重要概念。它使我们能够扩展现有类的能力。为了创建一个新的类,我们使用一个可用的类作为基础,并根据我们的需要扩展它的功能。因为我们通过使用基类中可用的方法和数据定义来构建新类,所以开发和维护时间减少了,代码可重用性增加了。

这篇文章将向你介绍 Python 中类继承的基础知识。

让我们编写一个 Python3 代码,其中包含一个简单的类继承示例;

import pandas as pd
import random**# BASE CLASS
*class* CSVGetInfo:**
 **""" This class displays the summary of the tabular data contained  
 in a CSV file """** instance_count = 0 **# Initializer / Instance Attributes** *def* __init__(*self*, *path*, *file_name*):
  CSVGetInfo.increase_instance_count()
  self.path = path
  self.file_name = file_name
  print("CSVGetInfo class object has been instantiated")  **# Instance Method**
 *def* display_summary(*self*):
  data = pd.read_csv(self.path + self.file_name)
  print(self.file_name)
  print(data.head(self.generate_random_number(10)))
  print(data.info())
  return data **# Class Methods
 @*classmethod*** *def* increase_instance_count(*cls*):
  cls.instance_count += 1
  print(cls.instance_count)  **@*classmethod*** *def* read_file_1(*cls*):
  return cls("/Users/erdemisbilen/Lessons/", "data_by_artists.csv") **@*classmethod*** *def* read_file_2(*cls*):
  return cls("/Users/erdemisbilen/Lessons/", "data_by_genres.csv") **# Static Methods
 @*staticmethod*** *def* generate_random_number(*limit*):
  return random.randint(1, limit)**# SUB CLASS *class* CSVGetColumnDetails(*CSVGetInfo*):**
 **""" This class displays the summary of a column in a tabular data 
 contained in a CSV file """**  **# Initializer / Instance Attributes** *def* __init__(*self*, *path*, *file_name*, *column_name*):
  CSVGetInfo.__init__(self, path, file_name)
  self.column_name = column_name
  print("CSVGetDetail class object has been instantiated")  **# Instance Method**
 *def* display_column_summary(*self*):
  data = self.display_summary()
  print(data[self.column_name].describe())  **@*classmethod*** *def* read_file_1(*cls*, *column_name*):
  return cls("/Users/erdemisbilen/Lessons/", "data_by_artists.csv", 
  column_name)if __name__ == '__main__':
 data = CSVGetColumnDetails.read_file_1("danceability")
 data.display_column_summary()

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

照片由萨布里·图兹库Unsplash 拍摄

Python 中的继承

在上面的 Python 代码中,我们有 CSVGetInfo 基类,它包含几个方法和数据定义。

***display _ summary(self)***实例方法使用 pathfile_name 中提供的值打印 CVS 文件中包含的表格数据的摘要。

还有几个类方法,****read _ file _ 2(cls)**increase _ instance _ count(cls),缓解基类的对象实例化。

假设我们想要创建一个新类csvgetcolumndedetails**,以获取表格数据中特定列的汇总信息。我们可以从头开始编写一个新的类,但是更好的方法是继承和扩展 CSVGetInfo 类中已经可用的一些方法和数据定义。**

****# BASE CLASS
*class* CSVGetInfo:
 ....
 ....****# SUB CLASS *class* CSVGetColumnDetails(*CSVGetInfo*):
 ....
 ....****

【class name】是 Python 用来创建子类的继承语法。在我们的例子中,我们的基类是CSVGetInfo,我们的扩展子类是****csvgetcolumndedetails。****

子类中的属性初始化

我们调用我们基类的 init 方法来实例化 路径文件名 属性。我们将这些属性从基类派生到子类。

仅在我们的子类级别可用的 column_name 属性用表示 CSVGetColumnDetails 的实例self 符号进行实例化。****

****# Initializer / Instance Attributes
** *def* __init__(*self*, *path*, *file_name*, *column_name*):
  CSVGetInfo.__init__(self, path, file_name)
  self.column_name = column_name
  print("CSVGetDetail class object has been instantiated")**

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

Raul Varzar 在 Unsplash 上拍摄的照片

扩展基类中可用的方法

然后我们在基类派生的*display _ summary()方法的帮助下,在我们的子类中创建新方法。我们在子类中使用并扩展了display _ summary()*的功能来定义一个新方法。

****# Instance Method**
 *def* display_column_summary(*self*):
  data = self.display_summary()
  print(data[self.column_name].describe())**

这个新方法在我们的子类中,【display _ column _ summary】(self),** 显示特定列的摘要,通过使用数据 ***【显示 _ 摘要】*方法返回。这个子类方法还有一个子类属性 column_name。

重写基类中可用的方法

请注意,我们有 read_file_1 类方法,它们都在我们的基类和子类中定义了不同的实现。

基类中的read _ file _ 1class 方法只是传递了 pathfile_name 值来实例化基类对象,而子类中的方法用一个附加参数 column_name 来实例化子类对象。

这意味着子类中的 read_file_1 方法覆盖了基类中可用的相同方法。当这些方法被调用时,它们执行它们独特的实现。

****# BASE CLASS
*class* CSVGetInfo:
 ....
 ....
** **@*classmethod*** *def* read_file_1(*cls*):
  return cls("/Users/erdemisbilen/Lessons/", "data_by_artists.csv")**# SUB CLASS *class* CSVGetColumnDetails(*CSVGetInfo*):
 ....
 ....** **@*classmethod*** *def* read_file_1(*cls*, *column_name*):
  return cls("/Users/erdemisbilen/Lessons/", "data_by_artists.csv", 
  column_name)**

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

乔希·考奇在 Unsplash 上拍摄的照片

类继承中的命名约定

基类中可能有一些方法或属性(实例变量)只在基类中使用。它们被称为私有方法**,并以双下划线约定***_ _ private method name*命名。这些方法不应该在基类之外调用,包括子类。

基类中还可能有一些其他的方法或属性,它们只在基类或子类定义中使用。它们被称为受保护的方法**,并以单条下划线约定***_ protected method name*命名。这些方法应该只在基类和子类结构中调用。

关键要点

  • 继承增加了代码的可重用性,减少了开发和维护时间。
  • 继承允许我们定义一个类,它接受并扩展基类中所有可用的方法和数据定义。

结论

在这篇文章中,我解释了 Python 中类继承的基础。

这篇文章中的代码和使用的 CSV 文件可以在我的 GitHub 资源库中找到。

我希望这篇文章对你有用。

感谢您的阅读!

数据和人工智能领域的创新和专利思维

原文:https://towardsdatascience.com/innovation-and-patent-mindset-in-data-ai-62a4be5cd85a?source=collection_archive---------60-----------------------

我们如何专注于推动数据和人工智能创新,以及在专利建设过程中需要考虑哪些因素才能产生更大影响

当我写下这些想法时,我希望所有人在这个前所未有的时代都平安无事。当我们被逼到绝境或受到挑战时,我们通常会尽力做到最好。如果你参考下面埃德蒙·姆比安卡的话,这反映了一些事情。

“当你不害怕无情地推动自己推倒所有限制之墙时,伟大就会发生”——埃德蒙·姆比亚卡

创新和数据科学之间存在明显的界限。成功的端到端数据科学项目的框架需要结构化的思维、迭代方法和多种方法或实验来产生成功的影响。创新思维是非常重要的,也是相互关联的。

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

照片由朱尼尔·费雷拉Unsplash 拍摄

当我们寻求创新、撰写披露或专利时,我们需要注意以下关键方面。这在数据科学的背景下非常重要。

  • 这个想法是新的吗?即什么是“新颖性”
  • 它不明显吗?
  • 有用吗?
  • 是否启用,能否以适当的细节实现?
  • 它有重大的商业价值和影响吗?

在处理数据科学设置时,以上几点完全相同。我们思考业务问题,了解目标,进行设计思考以推测问题和解决方法,更重要的是了解每个角色的想法和期望,将业务问题与数据问题相关联,进行探索性的数据分析,进行数据管理、数据争论、针对“需求”的数据转换,定义或制定功能,使用功能选择算法,试验各种不同的算法组合,评估结果,再次迭代并继续,直到我们获得最佳结果,呈现结果以衡量影响和价值创造,结束反馈循环等等。这些方法中的大多数都是迭代的,在过程的大部分时间里需要“跳出框框”的思维,不同的方法可以是新颖的,在分析的基础上选择“最佳方法”。

创新文化,它的审查过程,思考多种方法来定义一个新的方法是非常关键的核心创新。当我们处理数据科学过程来解决任何业务问题时,这反映了很多。同时,我们需要很好地理解这个过程。我们需要在数据科学的披露创造过程中引导自己。

以下是关于可视为检查表项目的关键维度的想法:

清单 1:检查想法是否“新颖”/“新颖”

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

杰斯·贝利Unsplash 上拍摄

a)它与我开发或使用的任何产品、方法相似吗?据我所知,还有类似的吗?

b)它与我所学的任何技术相似吗?与我的相关学习技巧有关联吗?

c)在一些网站上进行搜索,例如谷歌专利、谷歌学术、ResearchGate、CiteSeer、IEEE 电子图书馆、ACM 数字图书馆等,看看是否有更接近这个想法的网站已经存在。

d)您可能以前没有使用过这些产品,但是它们可能以某种形式适用。我们能检查那个方面吗?

e)让我们参考专利数据库,在那里我们将得到一些描述的类似方法。他们离这个发明近吗?

f)在任何一家公司,都会有当地的知识产权律师或相关机构在这个过程中提供帮助。最好带着这些发现和信息去找他们,解决他们可能有的任何疑问。

现有技术搜索:

在进行披露工作时,先有技术搜索极其重要。我们需要确保搜索与我们的方法相关和接近的现有技术,以及我们的方法或想法如何区别于其他现有技术。现有技术可以是许多不同的形式,如出版物或现有产品,或服务,或一些带有公式方法的博客文章等。出版物(可能是最容易获得的现有技术类型)的例子可以是专利本身、用户手册、网页、产品手册、教科书、公开的专利申请、杂志、期刊、会议论文、博士论文和类似的人工制品。对于我们来说,将出版物视为现有技术,其参考日期必须早于我们申请的申请日。

清单 2:检查想法是否“不明显”

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

Sharon McCutcheon 在 Unsplash 上拍摄的照片

非显而易见往往会绊倒新的评估者,因为显而易见的法律概念比显而易见的直觉概念更精确。充分理解和内化法律概念需要一些实践。

对于普通技术人员来说,一些有用的操作模型可以使用不同的点,例如大专文凭持有者、受过相关产品培训的工程或计算机科学课程的特定级别、了解 SQL、存储过程及其用法的从业者等等。

清单 3:检查想法是否“有用”?

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

Kaung Myat MinUnsplash 上拍摄的照片

我们可以着眼于在我们的创新中看到“有用性”方面,并尝试基于以下一些问题进行探索。

  • 它解决什么问题?(从数据科学的角度来看,这看起来很合适,因为我们从项目开始就已经着手于基于业务需求的问题解决方法)
  • 它是否支持任何功能来执行某项功能?
  • 如果实现的话,发明会像描述的那样工作吗?在评估过程中,描述不需要完整,只要合理就行。(从数据科学的角度来看,我们需要确保我们有一个可重现的方法,并有清晰的重现步骤。这一点非常重要,因为再现性是数据科学解决方案的关键方面,以证明基于特定输入的结果,从而建立管道中使用的通用方法)

清单 4:检查想法是否处于“启用实施”模式?

易于实施:

  • 这个想法是否足够详细,可以帮助 XYZ 轻松实现和使用它?(从数据科学的角度来看,概述整个方法的详细步骤是必须的)
  • XYZ 解释过数据如何转化为结果吗?(如下图所示)

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

缺乏对清单要点的支持:

检查想法中的以下短语:

  • “本发明可以随时间分析系统”
  • “建议使用可以解决业务问题的预测分析算法”
  • “系统能够解释参数来解决问题”
  • “系统中的智能代理可用于做出决策”
  • “数据被传送到智能系统”

清单 5:检查创意是否有“商业价值”?

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

詹姆斯·图斯在 Unsplash 上的照片

  • 它能被检测到吗?(例如,如果是:发明是否在用户界面上,或在文档或其他描述中表现出来,等等?这有助于熟悉特定领域的任何人创建可实施的解决方案或产品)
  • 它有战略价值吗?(例如,如果是:现有产品确实使用它,或者战略产品将来可能会使用它;基于这一点,这一想法可能有助于某一特定公司阻止竞争对手在同一领域创造价值)
  • 有许可价值吗?(例如,它可能很棒:即可能被广泛实践或被主要竞争对手实践;也很难解决)

如果我们在预期商业价值和审查过程中有争议的发明现有技术的相关性之间绘制图表,我们可以将四个更广泛的领域分类如下:

第 1 类或第 1 类—哪个具有最高的商业价值

第 2 类或第 2 类——大多数发明可能属于这一类,具有商业价值,但低于第 1 类

第 3 类或第 3 类—商业价值稍低

第 4 类或第 4 类—完全没有商业价值,可以放弃

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

因此,总而言之,创新和数据科学是相互关联的。迭代方法有助于定义多种方法,并鼓励基于实验的结果,在结果中进行细化,以获得更好的成功,并对数据和人工智能产生影响。整个框架有助于建立创新思维,同时推动端到端数据科学计划取得成功。需要考虑诸如新颖性、有用性、非显而易见性、可实施性、可检测性、商业价值等关键方面。我们还必须考虑如何以这样一种方式创造创新,这种方式可能属于上述示意图中的类别 1 和类别 2,这意味着商业价值较高,而现有技术的相关性相对较低。

免责声明 :这里的帖子是来自我的经验、想法和各种来源的阅读的个人观点,不一定代表任何公司的立场、策略或观点。

使用一维卷积层的创新聊天机器人

原文:https://towardsdatascience.com/innovative-chatbot-using-1-dimensional-convolutional-layers-2cab4090b0fc?source=collection_archive---------27-----------------------

虚拟助理项目

从头开始使用深度学习和 Conv-1D 层构建聊天机器人

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

【freepik.com】来源:免费图片来自

自过去十年以来,聊天机器人的受欢迎程度一直在上升。聊天机器人通常用于快速回答特定网站上最常见的问题。聊天机器人节省了时间,也减少了人力和开支。聊天机器人有很多种,每一种都专门针对一个或几个领域。了解你想构建哪种聊天机器人的最佳方法如下

如果你想建立聊天机器人,最好的方法是寻找你的目标受众、公司或企业。制作特定的聊天机器人是理想的,因为你可以大大提高不同任务的性能。

在本文中,我们将介绍如何使用一维卷积层构建一个很酷的聊天机器人。这个聊天机器人的目的是作为虚拟助理项目的智能聊天机器人。我将使用 witty.txt 数据集。预处理数据集的链接将在文章末尾与代码一起提供。您可以选择其他数据集,如专业数据集或护理数据集。我更喜欢机智的数据集,因为我更喜欢从我的聊天机器人那里收到讽刺的有趣评论,而不是严肃的东西。另一组数据的链接可以从这里查阅。这是微软官方的 bot builder 个性聊天。都是问答的形式。英语中的其他个性聊天数据集是关心、热情、友好和专业的。你可以根据自己的方便随意选择其中的任何一个。

注: 这是虚拟助手系列的 part-3。同一主题将有更多即将到来的部分,我们将介绍如何使用深度学习技术和 python 构建自己的虚拟助手。

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

来源:来自 freepik.com 的免费图片

简介:

我们将使用一维卷积层构建一个创新的聊天机器人。这种方法允许我们最大化或最小化一组特定值的强度。这最适合文本数据,因为我们将对一组选择性文本数据进行优先级排序。我们将使用基于“文本分类”的方法来构建我们的聊天机器人。为了更好地了解 1-D 卷积层,我们可以将它们称为创建卷积核的层,卷积核在单个空间(或时间)维度上与层输入进行卷积,以产生输出张量。如果 use_bias 为真,则创建一个偏置向量并添加到输出中。最后,如果激活不是“无”,它也应用于输出。要了解更多关于一维卷积层的信息,请参考这里的。现在有很多独特的聊天机器人正在开发,对它们的需求比以往任何时候都高。聊天机器人将在我们的虚拟助理项目中发挥重要作用,因为我们将使用它与我们交流。当我们不在的时候,聊天机器人也可以代替我们与其他用户交流。

方法:

我们将为我们的聊天机器人使用基于“文本分类”的方法。我们的第一步是将 witty.txt 数据集加载到一个变量中。我将在文章的最后在 GitHub 库中提供预处理过的数据集。这意味着我们不需要太担心清洁部分。然而,重要的是将我们的问题和回答分开,并将它们存储在单独的变量中。然后,我们将继续将数据分为训练数据集和验证数据集。

我们的下一步是将数据标记化,并将文本转换成序列。然后,在将我们的测试和训练响应转换为分类数据后,我们将对数据应用填充。最后,我们将确保扩展训练和测试问题的维度,以便以合适的格式通过一维卷积层。如果需要,我们也可以使用手套向量,因为它包含预先训练的单词向量。

然后,我们将继续构建我们的模型架构,该架构将使用大量一维卷积层完全定制。然后,我们将查看模型图并训练我们的模型,即拟合模型。最后,我们将使用图表可视化模型在训练和验证数据上的性能。我们还将研究如何使用我们保存的权重建立一个预测网络。

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

来源:照片由 Cookie 在 unsplash 上的 Pom

数据预处理:

如前所述,我将使用 witty.txt 数据集。我们将对数据集执行的第一步是将它们分成两个独立的列表。这些列表将是问题列表和响应列表。问题列表将存储所有问题,响应列表将存储所有相应的答案。一堆问题有很多重复的答案。总共有 89 个独特的答案,但重复是有意义的。这是因为许多问题可能有几乎相同的答案。

隔离前的数据集如下所示:

[‘你能问我一些关于我的事情吗?’,“不用了,我很好。"]

将数据集分开后,数据集的第一个问题和答案如下所示:

问题 1:你能问我一些关于我的事情吗?回答 1:不,我很好。

完成分离步骤后,我们将当前的问题和响应数据集以 80:20 的比例分成训练和验证数据集。

在下一步中,我们将使用 Keras Tokenizer 函数对数据进行标记。

标记化: 标记化是指将较大的文本数据、短文或语料库拆分成较小的片段。这些较小的片段可以是较小的文档或文本数据行的形式。它们也可以是一本单词词典。

Keras Tokenizer 允许我们向量化文本语料库,方法是将每个文本转换为整数序列(每个整数是字典中某个标记的索引)或向量,其中每个标记的系数可以是二进制的,基于单词计数,基于 tf-idf。要了解更多关于使用 Keras 的 Tokenizer 类和文本数据预处理的信息,请访问这里

在训练和测试问题的标记化之后,我们将把数据集的标记化器转储到 pickle 文件中。这可以在以后通过模型执行预测时加载 pickle 文件来访问。我们还将把训练和测试响应转换成分类格式,即把单词转换成二进制整数的向量类。

然后,我们将填充相应的问题训练和测试序列。这是为了确保我们的培训和验证输入具有固定的形状。最后一步是将测试和训练输出扩展成一个三维数组。这是将输入传递到 1-D 卷积层所需的形状。预处理的代码片段如下所示。完整的代码将在文章的最后提供,并带有一个到 GitHub 库的链接。

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

来源:克里斯托弗·高尔在 unsplash 上拍摄的照片

构建模型:

我们将以函数式 API 的方式构建模型。我们将有一个输入层,它将接受(max_len,)形状的输入。这是因为我们所有的文本数据都是按照最大长度的顺序填充的。因此,最大尺寸将被限制为最大长度。然后,我们将把这个输入传递到一个嵌入层。这样做的主要原因是为更高维度的输入数据创建嵌入,即将正整数转化为固定大小的密集向量。

然后我们将这个嵌入层传递到 3 个独立的一维卷积层。每个 conv-1D 层都有一个大小递增 4 的过滤器。我们从第一个 conv-1D 层的 4 个初始滤波器开始,然后我们有 8 个用于下一个卷积层,12 个用于最后的 conv-1D 层。它们都具有 relu 的激活功能。这通常是大多数任务的首选激活功能。我们将内核大小设为 3,并将初始化器设为 he_normal。我们将连接为 3 个卷积层接收的整个输出,并通过最大池层传递它们。maxpool 层用于对从 concatenate 层接收的输出进行下采样。然后,我们将通过一个辍学层。这是为了避免在文本数据的验证过程中过度拟合。

我们的下一步是将整个数据从漏失层传递到另外 3 个 conv-1D 层。这 3 个卷积层的表现和我们之前的完全一样。我们不需要修改任何东西。计算完这三个卷积层后,我们将再次连接它们,并通过 maxpool 1-D 层进行下采样。然后,我们将通过下一个丢弃层来丢弃一些额外的数据,以防止过度拟合。

下一个代码块将由最终的 1-D 卷积层、展平层和最终的下降层组成。我们的下一步是将数据从之前的 dropout 层传递到最终的 conv1D 层。我们将使接收到的输出变平,这样我们就可以让它通过密集层。在通过密集层之前,我们将再次使用最终下降来防止验证过程中的过拟合。

我们代码的最后一块将包含完全连接的层。我们将有一个带有 relu 激活功能的隐藏层,有 50 个隐藏节点。然后,我们将得到具有 softmax 激活函数的最终输出层,节点的数量将等于可能的唯一输出的数量。softmax 层将为我们提供每个预测的概率列表。最后,我们将使用输入层和输出层来定义我们的模型。读者可以随意添加或删除某些层。探索和试验各种激活函数、初始化器和单元数量是很好的。

让我们看看构建模型的全部代码。然后,我们将继续查看模型概要和模型图。

模型摘要:

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

模型图:

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

回访:

我们将使用的回调类似于我们在虚拟助手项目系列中以前的回调。让我们先看看它们——

我们将导入培训我们的模型所需的 3 个回调。3 个重要的回调是 ModelCheckpoint、ReduceLROnPlateau 和 Tensorboard。让我们看看每个回调函数执行什么任务。

  1. ModelCheckpoint —这个回调用于存储我们的模型在训练后的权重。通过指定 save_best_only=True,我们只保存模型的最佳权重。我们将使用 val_loss 指标来监控我们的培训。
  2. ReduceLROnPlateau —该回调用于在指定数量的时期后降低优化器的学习率。这里,我们将耐心指定为 3。如果损失在 3 个时期后没有改善,那么我们的学习率相应地降低 0.2 倍。这里用于监控的度量是损失函数。
  3. tensor board—tensor board 回调用于绘制图形的可视化,即精度和损耗的图形绘制。这里,我们将只查看训练和验证数据的图。

我们将把基于度量损失的最佳模型保存到文件 chatbot.h5 中。在访问预测功能和尝试预测每个问题的回答时,该文件将是至关重要的。我们将等待 3 个时期来改善损失。如果没有改善,那么我们将降低学习率。最后,如果需要,我们将使用 tensorboard 函数来可视化图形和直方图。

编译并拟合模型:

下面是编译和拟合模型的代码块。

我们正在最后一步编译和装配我们的模型。在这里,我们正在训练模型并将最佳权重保存到 chatbot.h5,这样我们就不必重复地重新训练模型,并且可以在需要时使用我们保存的模型。在这里,我对训练和验证数据都进行了训练。但是,如果您愿意,可以选择仅使用训练数据进行训练。我们使用的损失是 categorical _ crossentropy,它计算标签和预测之间的交叉熵损失。我们将使用的优化器是 Adam,学习率为 0.001,我们也将使用度量准确性来编译我们的模型。经过 50 个时期的训练,我们的结果如下所示:

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

图表:

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

预测:

我们将对用户输入的文本进行预测。为此,加载我们存储在 pickle 文件中的记号赋予器是很重要的。然后,我们将加载我们保存的模型的权重。我们将对输入的文本序列进行标记和填充。在标记化和填充之后,我们将预测用户对输入问题的响应。预测将通过保存的模型权重来完成。我们加载的模型将做出每一个预测。我们将在预测阶段使用 try 和 except 语句块。如果在预测过程中出现错误,我们不希望程序被终止。只有当用户明确传递“停止脚本”命令时,程序才会结束。让我们看一些使用这个脚本的预测—

进入你的台词:怎么了
有时候我喜欢从令人敬畏的状态中休息一下。
输入你的台词:你还好吗?
不,我很好。

进入你的行列:你觉得什么有吸引力?我不是公认的美容专家。
输入你的台词:停止脚本
结束节目……

该模型能够对大多数问题做出合理的预测。由于我们的模型在大约 70%的验证准确率后开始过度拟合,因此还有改进的空间。更多的事情,如正规化和寻找最佳辍学率是一些可以改善。可以通过更好的预处理步骤对该模型稍加改进。也可以使用其他方法,如注意顺序到顺序的实现。这篇文章的完整代码将在文章的下一部分提供。

**注意:**有时当你输入一个文本时,它可能不会返回任何输出。这可能是因为它做出了越界预测。然而,重新输入相同的文本,它会给你一个输出。

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

来源:卡洛斯·穆扎在 unsplash 上的照片

观察:

我们能够实现总体高准确度和验证准确度以及总体低损耗和验证损耗。该模型能够对用户输入的文本数据做出合理的预测。如前所述,还有改进的余地。总而言之,这是一个基于“文本分类”的聊天机器人的好模型。

就这样,我们到了文章的结尾。我们能够使用一维卷积层开发一个创新的聊天机器人。该项目的完整代码可以在这里找到。请随意探索和创新供参考的笔记本电脑。 GitHub 库包含了这个项目所需的所有文件和笔记本。我希望你们都像我写这篇文章一样喜欢阅读这篇文章。大呼应用 AI 牛逼。如果你们发现任何改进,请随时告诉我。非常感谢你的时间,我希望你们都有一个美好的一天!

用人工智能修复——找回你的图像![PyTorch]

原文:https://towardsdatascience.com/inpainting-with-ai-get-back-your-images-pytorch-a68f689128e5?source=collection_archive---------10-----------------------

Python-PyTorch

用 PyTorch 和 Python 解决图像修复问题

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

照片由詹姆斯·庞德Unsplash 拍摄

你知道你那本布满灰尘的相册里的童年旧照片可以修复吗?是啊,那种每个人都牵着手享受生活的感觉!不相信我?看看这个—

修复是一个保护过程,在这个过程中,艺术品受损、退化或缺失的部分被填充,以呈现完整的图像。【1】此工艺可应用于实物和数字艺术媒介,如油画丙烯画、化学摄影版画三维雕塑,或数字图像视频。——https://en.wikipedia.org/wiki/Inpainting

图像修复是人工智能研究的一个活跃领域,人工智能已经能够提出比大多数艺术家更好的修复结果。在本文中,我们将讨论使用神经网络的图像修复,特别是上下文编码器。本文解释并实现了在 2016 年 CVPR 上展示的关于上下文编码器的研究工作。

上下文编码器

要开始使用上下文编码器,我们必须了解什么是自动编码器。自动编码器在结构上由编码器、解码器和瓶颈组成。通用自动编码器旨在通过忽略图像中的噪声来减小图像尺寸。然而,自动编码器并不专用于图像,也可以扩展到其他数据。自动编码器有特定的变体来完成特定的任务。

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

自动编码器架构

现在我们知道了自动编码器,我们可以将上下文编码器描述为自动编码器的一个类比。上下文编码器是一个卷积神经网络,它被训练成根据图像区域的周围环境生成任意图像区域的内容——即上下文编码器接收图像区域的周围数据,并试图生成适合图像区域的内容。就像我们小时候玩拼图游戏一样——只是我们不需要生成拼图块;)

我们这里的上下文编码器由一个将图像的上下文捕获为紧凑的潜在特征表示的编码器和一个使用该表示产生缺失图像内容的解码器组成。缺少图像内容?—因为我们需要一个庞大的数据集来训练神经网络,所以我们不能只处理修复问题图像。因此,我们从正常的图像数据集中分割出部分图像,以产生修补问题,并将图像馈送到神经网络,从而在我们分割的区域产生缺失的图像内容。

[重要的是要注意,输入到神经网络的图像有太多的缺失部分,经典的修复方法根本无法工作。]

氮化镓的使用

GANs 或生成对抗网络已被证明对图像生成极其有用。生成性对抗网络运行的基本原理是,一个生成器试图“愚弄”一个鉴别器,而一个确定的鉴别器试图得到该生成器。换句话说,两个网络分别试图最小化和最大化一个损失函数。

更多关于甘氏的信息在这里—https://medium . com/@ hmrishavbandyopadhyay/generative-adversarial-networks-hard-not-EEA 78 C1 d3c 95

区域遮罩

区域遮罩是我们遮挡的图像部分,以便我们可以将生成的修复问题反馈给模型。通过遮挡,我们只是将该图像区域的像素值设置为零。现在,我们有三种方法可以做到这一点—

  1. 中心区域:将图像数据分块的最简单方法是将中心正方形小块设置为零。虽然网络学习修复,但是我们面临泛化的问题。网络不能很好地概括,只能学习低级特征。
  2. 随机块:为了解决网络像在中心区域掩码中那样“锁定”在被掩码区域边界上的问题,掩码过程被随机化。不是选择单个正方形小块作为遮罩,而是设置多个重叠的正方形遮罩,这些遮罩占据图像的 1/4。
  3. 随机区域:然而,随机块屏蔽仍然具有网络锁定的清晰边界。为了解决这个问题,必须从图像中去除任意形状。可以从 PASCAL VOC 2012 数据集获得任意形状,将其变形并作为遮罩放置在随机图像位置。

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

从左起— a)中心区域遮罩,b)随机块遮罩,c)随机区域遮罩[来源:https://arxiv.org/abs/1604.07379】

在这里,我只实现了中心区域的蒙版方法,因为这只是让你开始用人工智能修复的一个指南。请随意尝试其他遮罩方法,并在评论中告诉我结果!

结构

现在,您应该对该模型有所了解了。让我们看看你是否正确;)

该模型由编码器和解码器部分组成,构建了该模型的上下文编码器部分。这部分也作为发生器产生数据,并试图欺骗鉴别器。鉴别器由卷积网络和 Sigmoid 函数组成,最终输出一个标量。

失败

模型的损失函数分为两部分:

  1. 重建损失-重建损失是 L2 损失函数。它有助于捕捉缺失区域的整体结构及其上下文的一致性。数学上,它被表达为—

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

L2 损失

这里需要注意的是,只使用 L2 损失会给我们一个模糊的图像。因为模糊的图像减少了平均像素误差,从而使 L2 损失最小化——但不是以我们希望的方式。

2.对抗性损失——这试图使预测“看起来”真实(记住生成器必须欺骗鉴别器!)这有助于我们克服失去 L2 会给我们带来的模糊印象。数学上,我们可以表达为—

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

对抗性损失

这里一个有趣的观察是,对抗性损失促使整个输出看起来真实,而不仅仅是丢失的部分。换句话说,对抗性网络使整个图像看起来更真实。

总损失函数:

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

模型的总损失

让我们建造它!

现在,既然我们已经清楚了网络的要点,让我们开始建立模型。我将首先建立模型结构,然后进入训练和损失函数部分。该模型将在 python 上 PyTorch 库的帮助下构建。

让我们从发电机网络开始:

网络的生成器模型-作为 python 模块实现

现在,鉴别器网络:

鉴频器网络——实现为一个模块

现在开始训练网络吧。我们将把批量大小设置为 64,将时期数设置为 100。学习率设置为 0.0002。

用于训练发生器和鉴别器的训练模块

结果

让我们看一看我们的模型已经能够构建什么!

第零时段的图像(噪声)

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

零历元图像

第 100 个纪元的图像—

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

第 100 个纪元的图像

让我们看看模型中包含了什么—

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

中央区域掩蔽图像

那个来自这个?耶!很酷吧。

实现您的模型版本。观看它重现你童年的照片——如果你足够优秀,你可能会重现人工智能修复的未来。那么,你还在等什么?

如果你的实现有任何问题,请在评论中告诉我。来帮忙了:)

查看我的博客以获得更快的更新,并订阅优质内容:D

[## 卷积博客

克罗伊斯,吕底亚(小亚细亚)的国王,曾经问特尔斐的神谕,他是否应该对波斯开战…

www.theconvolvedblog.vision](https://www.theconvolvedblog.vision)

Hmrishav Bandyopadhyay 是印度 Jadavpur 大学电子与电信系的二年级学生。他的兴趣在于深度学习、计算机视觉和图像处理。可以通过以下方式联系到他:hmrishavbandyopadhyay@gmail.com | |https://hmrishavbandy . github . io

使用 Keras 和 TensorFlow 的图像输入管道

原文:https://towardsdatascience.com/input-pipeline-for-images-using-keras-and-tensorflow-c5e107b6d7b9?source=collection_archive---------16-----------------------

使用 Keras 和 TensorFlow 为深度学习模型的自定义图像数据集创建输入管道的指南

其次,在本系列的 中,学习如何使用 Kera 预处理、Tensorflow 和 tf.data 从自定义数据 创建输入管道来加载和创建图像序列和测试数据集。

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

照片由迈克·本纳Unsplash 上拍摄

这里使用的数据集是来自 Kaggle 的 Intel 图像分类,文章中的所有代码都在 Tensorflow 2.0 中工作。

英特尔图像分类数据集分为训练数据集、测试数据集和验证数据集。我们将仅使用训练数据集来学习如何使用不同的库加载数据集。

使用 Keras 预处理创建深度学习的输入管道

imagedata generator类为图像数据生成批量张量,并将像素值从 0 到 255 缩小到 0 到 1 之间的值。

我们可以对训练图像数据集应用不同的实时数据增强,如旋转图像、缩放图像、水平翻转或垂直翻转等。数据扩充不适用于验证或测试数据集

**import pandas as pd
import numpy as np
import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img, array_to_img
import tensorflow as tf****IMG_WIDTH=200
IMG_HEIGHT=200
batch_size=4****train_dir = r'\CV\Intel_Images\seg_train\seg_train'
test_dir  = r'\CV\Intel_Images\seg_pred\seg_pred'
val_dir   = r'\CV\Intel_Images\seg_test\seg_test'****image_gen_train = ImageDataGenerator(rescale=1./255, 
                                     zoom_range=0.2, 
                                     rotation_range=65,
                                     shear_range=0.09,
                                     horizontal_flip=True,
                                     vertical_flip=True)****image_gen_val = ImageDataGenerator(rescale=1./255)**

一旦imagedata generator的实例被创建,使用***flow _ from _ directory()***从目录 中读取图像文件。

***【flow _ from _ directory()***期望图像数据具有如下所示的特定结构,其中每个类具有一个文件夹,并且该类的图像包含在该类文件夹中。

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

文件夹结构为flow _ from _ directory()imagedata generator方法

**train_data_gen = image_gen_train.flow_from_directory(batch_size=batch_size,directory=train_dir,
shuffle=True,                                                     target_size=(IMG_HEIGHT, IMG_WIDTH,3),                                                     class_mode='sparse')****val_data_gen = image_gen_val.flow_from_directory(batch_size=batch_size,
directory=val_dir,                                                 target_size=(IMG_HEIGHT, IMG_WIDTH,3),                                                 class_mode='sparse')**

***class _ indexes . keys()***将从字典中的数据集中提取类名

**train_data_gen.class_indices.keys()**

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

创建一个简单的深度学习模型,编译它,并使用 Keras 预处理生成的数据集训练模型

**model=tf.keras.Sequential(
        [
            tf.keras.layers.InputLayer(input_shape=(200, 200, 3)),
            tf.keras.layers.Conv2D(filters=32, kernel_size=3, strides=(2, 2), activation='relu'),
            tf.keras.layers.Conv2D(filters=64, kernel_size=3, strides=(2, 2), activation='relu'),
            tf.keras.layers.Flatten(),
            tf.keras.layers.Dense(6)
         ])**#Compile the model
**model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy',
metrics=['accuracy'])**#Fitting the model
**history = model.fit(train_data_gen,steps_per_epoch=len(train_data_gen)//batch_size, validation_data=val_data_gen, epochs=2)**

使用 TensorFlow 为深度学习创建输入管道

使用 Tensorflow 的输入管道将创建张量作为模型的输入。

  1. 使用打开图像文件tensor flow . io . read _ file()
  2. 解码文件的格式。这里我们有一个 JPEG 文件,所以我们用三个颜色通道的 decode_jpeg()
  3. 调整图像尺寸以匹配深度学习模型的输入层的输入尺寸。
  4. 使用 TensorFlow 将图像转换为 float 数据类型,然后将 0 到 1 之间的值归一化为 0 到 255。
  5. tf.stack() 创建一个堆叠的张量作为行数据
**def create_dataset_tf(img_folder):
    class_name=[]
    tf_img_data_array=[]   

    for dir1 in os.listdir(img_folder):
        for file in os.listdir(os.path.join(img_folder, dir1)):
            image= os.path.join(img_folder,dir1, file)
            image = tf.io.read_file(image)
            image = tf.io.decode_jpeg(image, channels=3)
            image = tf.image.resize(image, (200,200))
            image = tf.cast(image / 255., tf.float32)
            tf_img_data_array.append(image)
            class_name.append(dir1)                   
    return tf.stack(tf_img_data_array, axis=0),class_name*****img_folder=r'CV\Intel_Images\seg_train\seg_train'******tf_img_data, class_name=create_dataset_tf(img_folder)***

将文本标签转换成数字代码

为类的所有唯一值创建一个字典

**target_dict={k: v for v, k in enumerate(np.unique(class_name))}
target_dict**

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

根据字典将 class_names 转换成它们各自的数值

**target_val=  [target_dict[class_name[i]] for i in range(len(class_name))]**

创建一个简单的深度学习模型,编译它,训练模型。

它与我们之前在起诉 Keras.preprocessing()时创建的模型相同。 这里唯一的变化是输入图像数据和类名,这是一个张量值的列表来拟合模型。

**model=tf.keras.Sequential(
        [
            tf.keras.layers.InputLayer(input_shape=(200, 200, 3)),
            tf.keras.layers.Conv2D(filters=32, kernel_size=3, strides=(2, 2), activation='relu'),
            tf.keras.layers.Conv2D(filters=64, kernel_size=3, strides=(2, 2), activation='relu'),
            tf.keras.layers.Flatten(),
            tf.keras.layers.Dense(6)
         ])**#Compile the model
**model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy',
metrics=['accuracy'])**#Fitting the model**history = model.fit(x=tf_img_data, y=tf.cast(list(map(int,target_val)),tf.int32), epochs=2)**

使用 tf.data 创建深度学习的输入管道

tf.data API 允许我们构建复杂的输入管道,同时读取不同格式的大量数据,然后应用转换。

在 TF . data for image processing pipeline 中,元素是单个训练示例,具有一对张量来表示图像及其对应的标签。

导入库和设置基本参数

**import numpy as np
import os
import tensorflow as tf****data_dir=r'\CV\Intel_Images\seg_train\seg_train'
batch_size = 32
img_height = 200
img_width = 200**

***TF . data . dataset . list _ files()***使用匹配模式从文件的目录列表创建数据集。

**list_ds = tf.data.Dataset.list_files(str(data_dir + '\\*\\*'), shuffle=False)**# get the count of image files in the train directory
**image_count=0
for dir1 in os.listdir(data_dir):
    for files in os.listdir(os.path.join(data_dir, dir1)):
        image_count+=1****list_ds = list_ds.shuffle(image_count, reshuffle_each_iteration=False)**

从目录名创建类别标签

**class_names = np.array(sorted([dir1 for dir1 in os.listdir(data_dir)]))**

将数据集拆分为 train 和 Val。

验证数据集占总数据集的 20%,训练数据集占整个数据集的 80%。

**val_size = int(image_count * 0.2)
train_ds = list_ds.skip(val_size)
val_ds = list_ds.take(val_size)**

为表示一对张量的单个训练/确认示例创建输入管道组件,以表示图像及其对应的标签。

#To process the label **def get_label(file_path):** # convert the path to a list of path components separated by sep **parts = tf.strings.split(file_path, os.path.sep)** # The second to last is the class-directory **one_hot = parts[-2] == class_names**# Integer encode the label **return tf.argmax(tf.cast(one_hot, tf.int32))**# To process the image
**def decode_img(img):** # convert the compressed string to a 3D uint8 tensor **img = tf.image.decode_jpeg(img, channels=3)** # resize the image to the desired size **return tf.image.resize(img, [img_height, img_width])**# To create the single training of validation example with image and its corresponding label **def process_path(file_path):
  label = get_label(file_path)**# load the raw data from the file as a string **img = tf.io.read_file(file_path)
  img = decode_img(img)
  return img, label**

设置自动调谐;这将有助于在运行时将并行性级别的决策委托给 tf.data ,以优化 CPU/GPU 利用率。

**AUTOTUNE = tf.data.experimental.AUTOTUNE**
# Set `num_parallel_calls` so multiple images are loaded/processed in parallel.
**train_ds = train_ds.map(process_path, num_parallel_calls=AUTOTUNE)
val_ds = val_ds.map(process_path, num_parallel_calls=AUTOTUNE)**

为性能配置数据源

为了配置数据源的性能,使用预取

TF . data 中的预取允许数据的预处理和训练步骤的模型执行重叠

当模型正在执行训练步骤 100 时,输入管道正在读取步骤 101 的数据。

**def configure_for_performance(ds):
  ds = ds.cache()
  ds = ds.shuffle(buffer_size=1000)
  ds = ds.batch(batch_size)
  ds = ds.prefetch(buffer_size=AUTOTUNE)
  return ds****train_ds = configure_for_performance(train_ds)
val_ds = configure_for_performance(val_ds)**

创建一个简单的深度学习模型

模型的输入是 tf.data.Dataset

**model=tf.keras.Sequential(
        [
            tf.keras.layers.InputLayer(input_shape=(200, 200, 3)),
            tf.keras.layers.Conv2D(filters=32, kernel_size=3, strides=(2, 2), activation='relu'),
            tf.keras.layers.Conv2D(filters=64, kernel_size=3, strides=(2, 2), activation='relu'),
            tf.keras.layers.Flatten(),
            tf.keras.layers.Dense(6)
         ])**#Compile the model
**model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy',
metrics=['accuracy'])**#Fitting the model
**history = model.fit(train_ds,validation_data=val_ds,epochs=3)**

结论:

我得到的最好的训练时间是使用 tf.data,因为有预取,这是使用 AUTOTUNE 在并行级别上委托决策。

参考资料:

[## Keras 文档:图像数据预处理

从目录中的图像文件生成 tf.data.Dataset。如果您的目录结构是:然后调用…

keras.io](https://keras.io/api/preprocessing/image/)

https://www . tensor flow . org/tutorials/load _ data/images # using _ TF data _ for _ finer _ control

卷积神经网络内部

原文:https://towardsdatascience.com/inside-convolutional-neural-network-e1c4c1d44fa2?source=collection_archive---------69-----------------------

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

作者图片

简介

卷积神经网络(CNN) 是用于识别、分类等的深度学习算法之一。最常用于分析视觉图像,这是做、设计或实现它的困难任务之一。在这里,网络的每一层都与下一层的所有神经元相连。从 20 世纪 50 年代的一项生物学实验开始,这个领域已经有了很大的进步和发展。通常,几十年前,计算机很难识别猫和狗,但现在它已经变得像一个“你好世界项目”。

在过去的几十年里,图像识别计算机视觉已经成为一个在研究、分析和预测方面越来越有兴趣、持续和进步的伟大课题。我们人类识别图像及其类型的方式,电子机器已经训练自己更深入地识别和看待事物。计算机视觉比人类视觉认知系统更擅长从图像中识别模式。

计算机视觉或 i 图像识别由深度学习算法驱动,该算法使用 CNN 来获得图像的感觉。它不仅能识别模式,还能记忆应该为每个输入图像提供的理想输出(在监督学习的情况下),或者通过扫描轮廓和颜色等特征对图像的组成部分进行分类。然后在扫描这些图像时使用这些内存。

当第一次进入 CNN 模型时,真的很难更深入地理解它。所以,我试着用基本而简短的回答来弄清楚 CNN 的内幕。

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

作者图片

人工神经网络中的多隐层前馈神经网络通常被称为**(DNN)**深度神经网络。卷积神经网络也是一种前馈神经网络。到目前为止,可以说 CNN 是一种广泛应用于识别和图像处理的识别算法,它具有结构简单、训练参数少、适应性强等特点。

因为神经网络接收输入(张量)并通过一系列隐藏层对其进行转换。每个隐藏层由一组神经元组成,其中每个神经元都与前一层中的所有神经元完全连接。

在每一层,单元被组织成称为特征地图的二维网格。这些特征图中的每一个都是卷积的结果,即相同的卷积层(权重集)被应用于该层中的每个位置。因此,在 2-D 网格上特定位置的单元只能从该层上类似位置的单元接收输入。并且对于特征图中的每个单元,附加到输入的权重是相同的。

当卷积层完成后,其他一些计算也完成了。其中之一是交叉特征归一化。这里,单元在特征地图中的特定空间位置的活动除以单元在其他特征地图中的相同位置的活动。另一个常见的操作是合用。池缩小了要素地图的大小。这一整套操作合起来称为**【层】**。网络的架构是由层数和与其相关的各种参数的选择来定义的,例如卷积滤波器的大小。

在卷积层内部,我们需要指定滤波器的数量、滤波器大小、填充、激活函数/非线性。

让我们和其他人讨论其中的一些。

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

图:CNN 架构 Img Ref:neur idines

简而言之,CNN 包含以下不同层:

a .致密层

b .卷积层

c .最大池层

d .辍学

所以,了解了它的基本架构之后,问题来了我们如何用代码设计卷积神经网络?

这个问题看起来很难,但实际上并不难。Python 有很好的库和框架来设计神经网络,不管它是 CNN,RNN T21 还是其他什么。我们唯一需要了解的是层、池和它们内部的其他参数。

让我们用一种简单的方法来设计它,并以抽象的方式选择最佳参数和超参数。

卷积层是卷积网络的核心构建模块,承担大部分繁重的计算工作。选择层数时,最好从最小的开始,然后逐渐增加层的尺寸,或者从大的模型层开始,然后逐渐减小。当使用较大的模型时,选择我们最初构建的模型有多大变得非常困难。

当更深的网络能够开始收敛时,退化问题就暴露出来了:随着网络深度的增加,精度达到饱和(这可能不足为奇),然后迅速退化。出乎意料的是,这种退化不是由过拟合引起的,并且向适当深度的模型添加更多层导致更高的训练误差。

训练精度的下降表明,并不是所有的系统都同样容易优化。

虽然给出了相同数量的可训练参数,但可能出现在使用更多层或每层更多单元之间做出决定的情况。从这个意义上来说,通常更深比更宽更好。另一种使深度模型更容易的方法是添加连接非连续层的跳过连接。像我们可以使用 ResNet 架构类型的连接。

跳跃连接还为梯度更容易地回流创建了额外的路径。这使得更容易优化早期的层。在神经网络设计中,使用跳过连接是一种常见的模式。

汇集层

池层使表示更小、更易管理,并独立地在每个激活图上操作。汇集层接受三维体积,需要三个超参数,它们的空间范围为****F**,步距为 S ,并产生三维体积,其中 W=(W1-F)/S+1H=(H1-F)/S+1D2=D1 。池层引入了零参数,因为它计算输入的固定函数。我们不使用零填充来合并层。**

使用内核或过滤器模型时,通常最好使用 3X31X1 内核,因为大多数时候它工作得最好。我们可以将 3X3 内核相互堆叠,以获得更大的感受野。使用 1X1 滤镜的一个好处就是可以用于降维。

摘要

简而言之,我们可以说卷积层是接受体积为W1 * H1 * D1**(Weights、 H eights 和 D epth)的层,这需要四个超参数,其中滤波器的数量被定义为 K,它们的空间范围 F, 步距 用数量为的零填充 P. 利用上述输入,卷积层产生大小为 W2H2D2 的体积,其中 W2 =(W1-F+2P)/S+1,H2 =(H1-F+2P)/S+1 (即宽度高度通过对称相等地计算)和**D2 = k . K 重量和 K 偏差。在输出体积中, d- th 深度切片(大小为 W2*H2 )是在输入体积上以 S、步距执行 d- th 滤波器的有效卷积的结果,然后偏移 d- th 偏置。

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

图:带过滤器的 CNN

感谢阅读。

参考文献:

1。https://arxiv.org/pdf/1506.01195.pdf

2。https://en.wikipedia.org/wiki/Convolutional_neural_network

3。https://www . Forbes . com/sites/cognitive world/2019/06/26/the-present-and-future-of-computer-vision/# 185 e 3778517d

4.https://cs231n.github.io/convolutional-networks/

5.https://neur diness . WordPress . com/2018/05/17/deep-convolutionary-neural-networks-as-models-of-the-visual-system-QA/

6.http://cs231n.stanford.edu/

**7.【https://www.youtube.com/watch?v=fTw3K8D5xDs **

8.https://keras.io/api/applications/resnet/

9.https://arxiv.org/pdf/1512.03385.pdf

10.https://cs231n.github.io/

逻辑回归

原文:https://towardsdatascience.com/inside-logistic-regression-9312e22d319d?source=collection_archive---------23-----------------------

逻辑回归背后的理论和直觉,并使用 Python 代码实现它

这是一系列博客的一部分,在这里我将通过使用数学和代码来展示不同方面和机器学习算法的理论。这包括使用 Python 代码的算法的通常建模结构和对它为什么以及如何工作的直觉。

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

在这篇博客结束时,你会知道:

  • 逻辑回归在数学上如何工作以及如何编码。
  • 为什么逻辑回归是线性分类器。
  • 如何评价你做的模型?

介绍

逻辑回归是当有人了解到分类时引入的首批算法之一。你可能已经读过回归和预测变量的连续性。分类是对离散变量进行的,这意味着您的预测是有限的,并且是基于类别的,就像二元结果的是/否、真/假。然而,简单地猜测“是”或“不是”是相当粗糙的。考虑到噪音,而不仅仅是给出一个二进制的答案,通常是有用的。

简而言之,我们想要概率,这意味着我们需要拟合一个随机模型。事实上,最好是给定输入变量 P(Y|X ),得到响应 Y 的条件分布。因此,如果我们的模型说有 51%的机会下雨,但没有下雨,这比它说有 99%的机会下雨要好(尽管即使是 99%的机会也不是一件确定的事情)。这就是为什么它被称为逻辑回归而不是分类的原因,因为它预测的概率是连续的(但有限的)。

很漂亮,对吧?但是,你一定在想,即使结果是有限的,线性回归也可能处理它。这里的有一个全面的答案,它非常直观,每当你试图将回归假设曲线拟合到离散数据并引入异常值时,这条线将试图拟合异常值,因此你需要将假设阈值改为较小的值,否则你的预测将会不准确。

现在让我们进入有趣的部分…

建模

我们有一个二元输出变量 Y,我们希望将条件概率 P(Y = 1|X = x)建模为 X 的函数。现在,逻辑回归属于学习的广义线性模型(GLMs) 家族。所以问题出现了*“我们如何使用线性回归来解决这个问题?”*

  1. 这个想法是让 P(x) 是 x 的线性函数,x 的每一个变化都会影响概率。这里的概念问题是 P 必须在 0 和 1 之间,线性函数是无界的。此外,在许多情况下,我们可能会看到“收益递减”——当 P 已经很大(或很小)时,改变 P 相同的量需要 x 比 P 接近 1/2 时有更大的变化。线性模型做不到这一点。
  2. 下一个最好的想法是让 log(P(x)) 是 x 的线性函数,这样改变一个输入变量会使概率乘以一个固定的量。

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

图 1-对数(x)曲线

正如你在上面看到的,对数只在一个方向上有界限。这意味着,与负向变化相比,x 向正向的变化可能不会显著影响结果。

3.最后,对两边值域有界的 log(P(x))的最佳修改是 logistic(或 logit)变换,log(P(x)/(1p(x))。这也是代表成功与失败比率的日志的事件的日志(赔率)。这条弯弯曲曲的线,也称为 s 形曲线,将是我们对这个模型的假设。在 logit 曲线的图形中可以看到有界性质:

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

图 2

所以,在线性回归或 OLS 中我们的假设是:

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

等式:1.1

如果我们将新发现的变换等同于上面的等式,以限制和投射概率而不是连续结果,我们得到:

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

等式:1.2

求解 P 我们会得到:

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

等式:1.3

现在,为了识别类别,我们可以假设一个阈值(=0.5),并相应地指定:

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

等式:1.4

现在让我们完成一些编码工作,从可视化概率空间和预测空间开始。

导入模块

为了演示该算法,我们将使用 Iris 数据集,这是一个流行的初始分类数据集。让我们只导入和利用 2 个类(存在 3 个类)。

为了保持最大 3 维的数据来可视化每一步,我们将只考虑萼片长度和萼片宽度,当然还有标签。

运行上面的脚本后,您会看到类似这样的内容:

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

图 3

这显示了属于类别 0 和 1 的要素的概率空间。

决定边界

Eq:1.3 和 1.4 的意思是当(β0 + x 1 β1+x2.β2) >0 时猜 1,否则猜 0。所以逻辑回归给了我们一个线性分类器。分隔两个预测类的决策边界是以下问题的解决方案—

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

等式:1.5

一维的点,二维的线(这种情况下),等等…也可以计算点 X 离判定边界的距离。

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

等式:1.6

等式 1.6 也表示判定边界的等式。现在让我们看看预测空间。

运行上面的脚本后,您会看到类似这样的内容:

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

图 4

正如你所看到的,可能会发现存在一个边界,可以将这个空间分成两个部分,分别属于 0 类和 1 类。逻辑回归将利用概率以及预测值空间(如上)来构建 0 类和 1 类之间的线性决策边界。

现在我们已经完成了建模部分。我们要优化的参数是β0,β1,β2。为了做到这一点,我们有一个非常巧妙的技巧。

最大似然估计

这是一种最大化参数正确归属/拟合数据的可能性的策略。这是许多其他统计方法用来优化参数的相同策略。这与线性回归的区别在于,我们不能在这里使用相同的(残差)方法。我们会知道为什么。要做到这一点:

  • 在对数(赔率)空间中可视化所有点。这意味着你必须考虑等式 1.2。将β0、β1、β2 初始化为一些随机值,并为 log(odds)空间制作候选拟合线(2d 的平面)。

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

图 5

  • 现在将数据点投影到直线上,并计算所有点的可能性。

请注意,这里的概率不是作为曲线下的面积(在概率空间中)来计算的,而是作为轴值来计算的,因此它与可能性相同。

候选线的总可能性将是所有个体可能性的乘积,如下式所示。

注意:在计算类 0 的可能性时,可能性将被计算为(1-P(x))

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

图 6

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

等式:1.7

现在我们的目标是最大化这个关于参数的似然函数。为了达到这个目的,我们需要对它求导,但问题是对 f(x)求导。g(x)需要变得难以处理的副产品。所以我们将这个等式转换成对数似然,然后求解。
在对数转换和重新排列变量之后,您会看到类似这样的内容:

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

等式:1.8

现在,通过使用等式 1.2、1.3 替换这些值并重新排列变量,您将看到:

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

等式:1.9

上面的等式比等式 1.7 更容易微分。现在,我们必须对上述方程 w.r.t β0,β1,β2 进行微分,以获得最佳值。因此,我们将区分并概括这三者:

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

等式:1.10

注意,上面的方程是一个超越方程,它没有闭合解。所以,我们不能用 python 代码来解决这个问题,所以我们用数字来解决。

你一定在想,如果我们要用数字来解决这个问题,那么花时间去理解这一切有什么意义。我们必须明白,最大似然法是所有优化算法的基础,也是被广泛使用的。这很简单,也很有效,我们仍然会在数值方法中使用对数似然法。

尽管存在许多数值方法来解决这个问题,例如用于数值优化的牛顿方法。对于这个博客,我们将使用我们古老的梯度下降。继续代码:
首先,定义我们的成本函数,它就是我们的对数似然函数。

现在定义梯度下降函数。

在这之后,我们将做一些矩阵操作来准备模型的输入。

然后是训练部分…

在上面代码的输出中,您将看到模型的优化参数。
现在让我们看看模型如何根据数据和其他超参数进行收敛。

运行上面的脚本后,我们可以看到模型的成本随着迭代的进行而非线性降低。

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

图 7

我们刚刚构建的逻辑模型的决策边界可以使用下面的代码可视化。

注意,直线的斜率和截距可以用等式 1.6 计算。

运行上述脚本将绘制以下内容:

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

图 8

瞧啊。我们刚刚使用逻辑回归对虹膜数据集进行了线性分类。
现在,我们有了这个数据的最佳决策边界和曲线(sigmoid ),但是你怎么知道它是否有用呢? 我们如何评价这样的东西?

R -决定系数和 p 值

对于广义线性模型:线性回归/OLS,我们通过计算决定的 R 系数及其显著性的 p 值来实现。如果您还记得,线性回归中的 R-决定系数是使用(残差)计算的,但在使用逻辑回归进行分类的情况下,这种方法没有意义,因为在 log(odds)维度中,数据点被推到+∞和-∞,因此残差没有意义。

这个问题的解决方案是麦克法登的伪作。这种方法非常类似于 OLS 的 R,所以非常容易理解。

让我们首先快速回顾一下 OLS-R。它给出了一个比较系数值,表明 Y(目标)的总变化中有多少是由 X(直线)的变化描述的。

SE=平方误差

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

等式:1.11

换句话说,就是最差拟合(SE_mean)和最佳拟合(SE_line)的对比结果而已。

现在我们用逻辑回归的方法来讨论 R。就像线性回归一样,我们首先需要找到最佳拟合,并将其与差拟合进行比较。现在,在 log(odds)空间中你的最佳拟合线的对数似然性(见图 6)将代表 LL(fit) 来填充等式 1.11 中的 SE(line)。

这里的奥秘在于计算的是坏拟合线。别担心,这也很直观。在线性回归建模中,我们最差的拟合是 y =均值(y)。在这种情况下,我们将做非常类似的事情。

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

图 9

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

等式:1.12

  • 首先,通过忽略其他特征并简单地取如等式 1.12 中所述的对数(样本比率)来计算最差拟合线,并将其转换到概率空间中。
  • 现在,计算最差拟合线的点的所有对数似然的总和。这会给你 LL(整体概率)。
  • 令人惊讶的是,用上述方法计算的总对数似然类似于计算—> P =(class = 1 的总数据)/总数据。

现在我们有了 ll(总体概率)->差拟合的度量
和 LL(拟合)- >最佳拟合的度量。所以你会是:

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

等式:1.13

r 将在[0,1]的范围内,0 代表最不适合,1 代表最适合。

P 值

现在,我们将使用 p 值计算 R 的显著性。计算 p 值非常简单。

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

等式:1.14

在这种情况下,自由度将是 3(需要 3 个轴上的信息)-1(只需要对数(奇数)轴的截距)=2。现在,在计算上述方程的 LHS 后,您可以从下表中找到 p 值:

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

图 10

对评估的每一个部分进行编码可能是一个忙乱的过程,这要感谢 statsmodels 已经处理好了。它不仅会显示 R 和 p 值,还会显示大量有助于更好地评估模型的其他信息。

从导入 statsmodels 模块开始

由于我们讨论的是特征之间的线性分离,因此我们将与标注的关系定义为线性。

运行上面的脚本将获得以下结果:

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

我们可以观察到我们的 P 值是 1.00,因为我们的数据是线性可分的,还可以观察到我们的对数似然性是低的,符合高 R 值。

逻辑回归的几点和假设:

  • 我们在这个博客中只讨论了二元分类,但是你也可以在多类问题中应用逻辑回归。假设有 k 个类,而不是有一组参数β0,β,0:(k 1)中的每个类 c 将有自己的偏移β0_c 0 和向量β_c,预测的条件概率将是:

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

  • 逻辑回归假设决策边界是线性的。因此,如果您事先知道您的数据包含非线性决策边界,那么也许不同的算法可能会证明比这个更好。
  • 逻辑回归吐出的不是类别而是概率。
  • 多重共线性困扰着每一个算法,因为它扭曲了统计显著性的测试。因此,在运行该算法之前,尝试识别并解决它们。

你已经到达终点了!

恭喜你!陪我到最后,理解机器学习最重要的算法之一,也奠定了同样的基础。

感谢阅读。有想法或反馈?下面评论!

使用 Tensorflow 和 RapidMiner Studio 通过人工智能进行内部威胁检测

原文:https://towardsdatascience.com/insider-threat-detection-with-ai-using-tensorflow-and-rapidminer-studio-a7d341a021ba?source=collection_archive---------16-----------------------

在 tensorflow 和 rapidminer studio 中使用 US-CERT 内部威胁数据进行神经网络创建和建模的 A-Z 教程,面向网络安全专业人员。

这篇技术文章将教你如何预处理数据,创建自己的神经网络,以及使用 US-CERT 的模拟内部威胁数据集训练和评估模型。这些方法和解决方案是为非领域专家设计的;尤其是网络安全专业人员。我们将从数据集提供的原始数据开始我们的旅程,并提供不同预处理方法的示例,以使其“准备好”供人工智能解决方案摄取。我们最终将创建可重复用于基于安全事件的其他预测的模型。在整篇文章中,我还将根据您企业中现有的信息安全计划指出适用性和投资回报。

注意:要使用和复制我们使用的预处理数据和步骤,请准备花 1-2 个小时阅读本页。陪着我,在数据预处理部分尽量不要睡着。许多教程没有说明的是,如果你是从零开始;做这样的项目时,数据预处理会占用你 90%的时间。

在这篇混合文章和教程结束时,您应该能够:

  • 将 US-CERT 提供的数据预处理成人工智能解决方案就绪格式(特别是 Tensorflow)
  • 使用 RapidMiner Studio 和 Tensorflow 2.0 + Keras,通过预处理的样本 CSV 数据集创建和训练模型
  • 执行数据的基本分析,选择人工智能评估的领域,并使用所描述的方法了解组织的实用性

放弃

作者按原样提供这些方法、见解和建议,不做任何担保。在将本教程中创建的模型作为安全程序的一部分之前,如果没有进行充分的调整和分析,请不要在生产环境中使用这些模型。

工具设置

如果您希望跟随并自己执行这些活动,请从各自的位置下载并安装以下工具:

流程概述

对于任何数据科学学科的新人来说,重要的是要知道,你花费的大部分时间将用于数据预处理和分析你所拥有的数据,其中包括清理数据、标准化、提取任何额外的元见解,然后对数据进行编码,以便为人工智能解决方案摄取数据做好准备。

  1. 我们需要以这样一种方式提取和处理数据集,即它由我们可能需要作为“特征”的字段构成,这只是为了包含在我们创建的人工智能模型中。我们需要确保所有的文本字符串都被编码成数字,以便我们使用的引擎可以摄取它。我们还必须标记哪些是内部威胁和非威胁行(真正的肯定和真正的否定)。
  2. 接下来,在数据预处理之后,我们需要选择、设置和创建函数,我们将使用这些函数来创建模型和神经网络层本身
  3. 生成模型;并检查准确性、适用性,确定数据管道的任何部分所需的额外修改或调整

动手检查数据集和手动预处理

检查原始 US-CERT 数据需要您下载必须解压缩的压缩文件。请注意,与我们在数据预处理结束时将使用和减少的量相比,这些集合有多大。

在本文中,我们通过直接访问 answers.tar.bz2 节省了大量时间,该文件包含 insiders.csv 文件,用于匹配哪些数据集和提取的单个记录是有价值的。现在,值得说明的是,在提供的索引中,在扩展数据(如文件)和心理测量相关数据中有相关的记录号。在本教程中,我们没有使用扩展元,因为在我们的例子中,需要额外的时间将所有内容关联和合并到一个 CSV 中。

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

要查看从相同数据中提取的更全面的特征集,请考虑查看这篇名为“基于图像的内部威胁分类特征表示”的研究论文当我们检查我们的模型准确性时,我们将在文章的后面引用那篇论文。

在对数据进行编码并准备好让函数读取它之前;我们需要提取数据,并将其分类到我们需要预测的列中。让我们使用优秀的旧 Excel 向 CSV 中插入一列。在截图之前,我们从场景 2 的“insiders.csv”中引用的数据集中获取并添加了所有行。

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

Insiders.csv 真阳性指数

scenarios.txt 中描述了场景(2):“用户开始浏览工作网站,并向竞争对手寻求就业机会。在离开公司之前,他们使用拇指驱动器(比以前的活动频率明显更高)来窃取数据。”

检查我们的预处理数据,包括其中间和最终形式,如下所示:

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

情景 2 的中间复合真阳性记录

在上面的照片中,这是所有不同记录类型的一个片段,这些记录类型基本上相互附加,并按日期正确排序。请注意,不同的向量(http 对电子邮件对设备)不容易对齐,因为它们在列中有不同的上下文。这无论如何都不是最佳选择,但因为内部威胁场景包括多种事件类型;这就是我们现在要做的。这是数据的常见情况,您将尝试根据时间和与特定属性或用户相关的多个事件进行关联,就像 SIEM 所做的那样。

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

需要整合的不同数据类型的比较

在聚合集中;在将场景 2 的 insiders.csv 中提到的所有项目移动到同一个文件夹后,我们合并了相关的 CSV。制定整个“真阳性”数据集部分;我们使用的 powershell 如下所示:

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

使用 powershell 将 CSV 合并在一起

现在我们有一个完全不平衡的数据集,只有真正的阳性。我们还必须添加真正的负面因素,最好的方法是在 50/50 的无威胁活动场景中使用等量的记录类型。安全数据几乎从来不会出现这种情况,所以我们会尽我们所能,如下所示。我还想指出的是,如果您在 OS shell 中进行手动数据处理——您导入变量的任何内容都在内存中,不会被释放或自行进行垃圾收集,正如您可以从我的 PowerShell 内存消耗中看到的那样。在一系列数据操作和 CSV 争论之后,我的使用量增加到了 5.6 GB。

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

内存不会自动释放。我们还计算每个 CSV 文件中的行数。

让我们看看 R1 数据集文件。我们需要从我们在真阳性数据集提取中使用的文件名中提取我们已知的 3 种类型中每一种类型的确认真阴性(非威胁)(同样,它来自具有良性事件的 R1 数据集)。

我们将合并来自登录、http 和设备文件的所有 3 个 R1 真阴性数据集的许多记录。注意,在 R1 真阴性集合中,我们没有发现增加我们集合数据集不平衡的电子邮件 CSV。

使用 PowerShell,我们计算每个文件中的行的长度。因为我们有大约 14K 的来自真正端的行,所以我任意地从真负端取出来自每个后续文件的前 4500 个适用的行,并将它们附加到训练数据集,这样我们既有真正的,也有真负的。我们必须添加一列来标记哪些是内部威胁,哪些不是。

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

从 3 个互补 CSV 中提取真阴性记录

在预处理我们的数据时,我们已经添加了下面所有感兴趣的记录,并从 R1 数据集中选择了各种其他真阴性无威胁记录。现在,我们已经将威胁和非威胁基线连接在一个 CSV 中。在左侧,我们添加了一个新列来表示查找和替换场景中的真/假 or (1 或 0)。

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

对内部威胁真/假列进行编码的标签

上面,你也可以看到我们开始将真/假字符串转换为数字类别。这是我们通过手动预处理对数据进行编码的开始,这可以省去我们在 RapidMiner Studio 中的后续步骤中看到的麻烦,并为 Tensorflow 使用 Python 中的 Pandas Dataframe 库。我们只是想说明您必须执行的一些步骤和注意事项。接下来,我们将继续处理我们的数据。在走完全自动化的路线之前,让我们强调一下使用 excel 函数可以做些什么。

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

根据提供的日期和时间计算 Unix 纪元时间

出于演示的目的,我们还将手动将日期字段转换为 Unix 纪元时间,正如您所见,它变成了一个带有新列的大整数。要删除 excel 中用于重命名的旧列,请创建一个新表,如“scratch ”,并将旧日期(非纪元时间戳)值剪切到该表中。参照工作表以及您在单元格中看到的公式来达到这种效果。这个公式是:"*=(C2-日期(1970,1,1))86400 "不带引号。

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

编码向量列和特征集列映射

在我们上一个手动预处理工作示例中,您需要格式化 CSV 以通过标签编码数据进行“分类”。您可以通过脚本中的数据字典将此自动化为一次性编码方法,或者在我们的示例中,我们向您展示了在 excel 中映射它的手动方法,因为我们有一组有限的相关记录向量(http 是 0,email 是 1,device 是 2)。

您会注意到,我们没有处理用户、源或操作列,因为它有大量需要标签编码的唯一值,手工处理是不切实际的。使用 RapidMiner Studio 的“turbo prep”功能,我们能够完成这一点,而不需要上面所有的手动争论,同样,在下面的脚本片段中,通过 Python 的 Panda 也可以完成其余的列。现在不要担心这个,我们将向 case 展示每个不同的人工智能工具的步骤,并以最简单的方式做同样的事情。

#print(pd.unique(dataframe['user']))
#https://pbpython.com/categorical-encoding.html
dataframe["user"] = dataframe["user"].astype('category')
dataframe["source"] = dataframe["source"].astype('category')
dataframe["action"] = dataframe["action"].astype('category')
dataframe["user_cat"] = dataframe["user"].cat.codes
dataframe["source_cat"] = dataframe["source"].cat.codes
dataframe["action_cat"] = dataframe["action"].cat.codes
#print(dataframe.info())
#print(dataframe.head())
#save dataframe with new columns for future datmapping
dataframe.to_csv('dataframe-export-allcolumns.csv')
#remove old columns
del dataframe["user"]
del dataframe["source"]
del dataframe["action"]
#restore original names of columns
dataframe.rename(columns={"user_cat": "user", "source_cat": "source", "action_cat": "action"}, inplace=True)

上面的代码片段是使用 python 的 panda 库的示例,该示例将列操作和标签编码为对原始数据集中的每个字符串值唯一的数值。尽量不要被这件事缠住。我们将在 Rapidminer Studio 中向您展示所有这些数据科学工作的简单而全面的方法

对于防御者来说,这是重要的一步:鉴于我们使用的是从 US-CERT 格式化的预先模拟数据集,并非每个 SOC 都可以访问相同的统一数据来应对自己的安全事件。很多时候,您的 SOC 只有原始日志可以导出。从投资回报的角度来看,在进行您自己的 DIY 项目之前,请考虑一下工作量,如果您可以自动将日志的元导出为 CSV 格式,Splunk 或其他 SIEM 等企业解决方案或许可以帮您做到这一点。您必须关联您的事件,并添加尽可能多的列来丰富数据格式。您还必须检查如何保持一致性,以及如何以 US-CERT 必须使用类似方法进行预处理或接收的格式自动导出这些数据。尽可能利用 SIEM 的 API 功能将报告导出为 CSV 格式。

带着我们的数据集走过 RapidMiner Studio

是时候使用一些基于 GUI 的简化方法了。RapidMiner 的桌面版是 Studio,从 9.6.x 开始的最新版本在工作流程中内置了 turbo prep 和自动建模功能。由于我们不是领域专家,我们肯定会利用这一点。让我们开始吧。

注意:如果您的试用期在阅读本教程并使用 community edition 之前过期,您将被限制在 10,000 行。需要进一步的预处理,以将数据集限制为 5K 的真阳性和 5K 的真阴性(包括标题)。如果可以的话,使用教育许可证,它是无限的,并且可以每年更新,你可以在一个有资格的学校注册,邮箱是. edu。

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

RapidMiner 工作室

开始时,我们将启动一个新项目,并利用 Turbo Prep 功能。对于 community edition,您可以使用其他方法或通过左下角的 GUI 手动选择操作员。但是,我们将使用企业试用版,因为它对于初次用户来说很容易完成。

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

导入未处理的 CSV 聚合文件

我们将只导入未处理的真阳性数据的聚合 CSV 此外,删除第一行标题并使用我们自己的标题,因为原始行与 HTTP 向量相关,并不适用于数据集中的后续 USB 设备连接和电子邮件相关记录,如下所示。

注意:与我们的预处理步骤(包括标签编码和缩减)不同,我们还没有在 RapidMiner Studio 上这样做,以展示我们在“turbo prep”功能中可以轻松完成的全部工作。我们还将启用引号的使用,并将其他缺省值留给适当的字符串转义。

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

接下来,我们将列标题类型设置为适当的数据类型。

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

通过该向导,我们进入 turbo prep 选项卡进行查看,它向我们显示了分布情况和任何错误,例如需要调整的缺失值以及哪些列可能有问题。让我们首先确保我们首先将所有这些真正的积极因素识别为内部威胁。单击“generate ”,我们将通过在所有行中插入一个新列来转换该数据集,并使用逻辑“true”语句,如下所示

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

我们将保存列的详细信息,并将其导出以供以后进一步处理,或者我们将使用它作为基础模板集,以便在此之后开始预处理 Tensorflow 方法,从而使事情变得简单一些。

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

导出后,正如你在上面看到的,不要忘记我们需要用真正的负面数据来平衡数据。我们将重复同样的导入真正底片的过程。现在,我们应该在 turbo prep 屏幕中看到多个数据集。

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

在上面,即使我们只导入了 2 个数据集,记住通过添加一个名为 insiderthreat 的列(真/假布尔逻辑)来转换真正值。我们对真正的否定做同样的事情,你最终会得到 4 个这样的列表。

在我们开始做任何有趣的事情之前,我们需要将真正的积极因素和真正的消极因素合并到一个“训练集”中。但首先,我们还需要删除我们认为不相关的列,如交易 ID 和网站关键字的描述列,因为其他行数据都没有这些;和将包含一组对计算权重无用的空值。

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

重要提示:正如我们在其他研究论文中提到的,选择包含复杂字符串的计算列(也称为“特征集”)必须使用自然语言处理(NLP)进行标记化。这增加了除标签编码之外的预处理要求,在 Tensorflow + Pandas Python 方法中,通常需要处理多个数据帧,并根据每个记录的列键将它们合并在一起。虽然这在 RapidMiner 中是自动完成的,但在 Tensorflow 中,您必须将其包含在预处理脚本中。关于这个的更多文档可以在这里找到

请注意,我们没有在我们的数据集中这样做,因为您将在稍后的优化 RapidMiner Studio 建议中看到,更重的权重和对日期和时间的强调是更有效的功能集,复杂性更低。另一方面,对于不同的数据集和应用程序,您可能需要 NLP 进行情感分析,以添加到内部威胁建模中。

完成您的训练集:虽然我们没有说明这一点,但在 Turbo prep 菜单中导入真阴性和真阳性后,单击“merge”按钮,选择两个转换的数据集,并选择“Append”选项,因为两个数据集都已按日期预先排序。

继续到自动模型特征

在 RapidMiner Studio 中,我们继续“自动建模”选项卡,并利用我们选择的聚合“训练”数据(记住训练数据包括真阳性和真阴性)来预测 insiderthreat 列(真或假)

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

我们也注意到我们的实际余额是多少。我们仍然不平衡,只有 9001 条非威胁记录与大约 14K 的威胁记录。它是不平衡的,如果你愿意,可以用额外的记录来填充。现在,我们将接受它,看看我们能用不那么完美的数据做些什么。

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

在这里,自动建模器用绿色和黄色推荐不同的特性列以及它们各自的相关性。有趣的是,它是估计数据的高相关性,但稳定性不如行动和向量。

重要的想法:在我们的头脑中,我们会认为所有的特性集都适用于每个专栏,因为我们已经尽可能地减少了相关性和复杂性。还值得一提的是,这是基于一个单一的事件。请记住,正如我们在 insiders.csv 的答案部分看到的那样,内部威胁通常会发生多个事件。绿色指示器向我们展示的是独一无二的单一事件识别记录。

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

我们无论如何都要使用所有的列,因为我们认为这些都是可以使用的相关列。我们还转到模型类型的下一个屏幕,因为我们不是领域专家,所以我们将尝试几乎所有的模型,我们希望计算机多次重新运行每个模型,找到输入和特征列的优化集。

请记住,功能集可以包含基于现有列洞察的元信息。我们保留标记化的默认值,并希望提取日期和文本信息。显然,带有自由格式文本的项目是带有所有不同 URL 的“Action”列,以及我们希望应用 NLP 的事件活动。我们想要在列之间建立关联,列的重要性,以及解释预测。

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

注意,在上面的例子中,我们在批处理作业中选择了大量的处理参数。在运行 Windows 10 的 8 核单线程处理器、24 GB 内存和配有 SSD 的镭龙 RX570 value 系列 GPU 上,所有这些模型在所有选项设置下总共需要大约 6 个小时才能运行。完成所有工作后,我们在屏幕对比中测试了 8000 多个型号和 2600 多个功能组合。

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

据 RapidMiner 工作室;深度学习神经网络方法不是最佳 ROI 拟合;与线性一般模型相比。虽然没有错误——但这令人担忧,这可能意味着我们的数据质量很差,或者模型存在过拟合问题。让我们来看看深度学习,因为它也指出了潜在的 100%准确性,只是为了进行比较。

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

在上面的深度学习中,它针对 187 种不同的特征集组合进行了测试,优化的模型显示,与我们自己的想法不同,哪些特征会是好的,主要包括向量和动作。我们看到更多的重量放在了有趣的单词和日期上。令人惊讶的是;作为优化模型的一部分,我们在操作中没有看到任何与“电子邮件”或“设备”相关的内容。

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

不要担心,因为这并不意味着我们大错特错。这只是意味着它在训练中选择的特征集(列和提取的元列)在训练集中提供了较少的错误。这可能是因为我们的数据集中没有足够多样或高质量的数据。在上面的屏幕中,你看到了一个橙色的圆圈和一个半透明的正方形。

橙色圆圈表示模型建议的优化器功能,正方形是我们最初选择的功能集。如果你检查规模,我们的人类选择的特征集是 0.9 和 1%的误差率,这使我们的准确性接近 99%的标志;但只有在更高复杂性的模型中(需要神经网络中更多的层和连接),才能让我感觉好一点,并告诉你在从表面上解释所有这些时需要谨慎。

调整注意事项

假设你不完全信任这样一个高度“100%准确的模型”。我们可以尝试以普通的方式使用我们的功能集作为纯令牌标签来重新运行它。我们不会提取日期信息,不会通过 NLP 进行文本标记化,我们也不希望它基于我们的原始选择自动创建新的功能集元。基本上,我们将使用一组普通的列来进行计算。

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

所以在上面,让我们重新运行它,看看 3 个不同的模型,包括原始的最佳拟合模型和深度学习,我们绝对没有优化和额外的 NLP 应用。因此,这就好像我们只在计算中使用编码标签值,而不在其他地方使用。

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

在上面的例子中,我们得到了更糟糕的结果,误差率为 39%,几乎所有模型的准确率为 61%。在不使用文本标记提取的情况下,我们的选择和缺乏复杂性是如此之少,以至于即使更“原始”的贝叶斯模型(通常用于基本的电子邮件垃圾邮件过滤引擎)似乎也一样准确,并且具有快速的计算时间。这一切看起来很糟糕,但让我们再深入一点:

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

当我们再次选择深度学习模型的细节时,我们看到准确性以线性方式攀升,因为更多的训练集群体被发现并验证。从解释的角度来看,这向我们展示了一些东西:

  • 我们最初关于只使用唯一编码值来关注向量和动作频率的特征集的想法,与分析师在数据中发现威胁的可能性一样大。从表面上看,我们发现内部威胁的几率最多有 10%的提高。
  • 它还表明,尽管行动和向量最初被认为是“绿色的”,但对于更好的输入选择,唯一的记录事件实际上与内部威胁场景相反,我们需要为每个事件/警报考虑多个事件。在优化的模型中,使用的许多权重和标记是时间相关的特定和动作标记词
  • 这也告诉我们,我们的这个数据集的基础数据质量相当低,我们将需要额外的上下文,并可能需要对每个独特事件的每个用户的情绪分析,这也是心理测量. csv 文件中包含的 HR 数据度量’ OCEAN '。通过 NLP 使用令牌;当在我们的数据预处理中执行这些连接时,我们可能会调整以包括空值混合的列,以包括来自原始数据集的网站描述符单词,并且可能包括必须基于时间和事务 ID 合并到我们的训练集中作为关键字的 files.csv

部署优化的(或未优化的)模型

虽然本节没有显示屏幕截图,但 RapidMiner studio 的最后一步是部署您选择的优化或非优化模型。在 studio 的上下文中进行本地部署,除了重用您真正喜欢的模型和通过 Studio 应用程序的交互加载新数据之外,不会为您做太多事情。您将需要 RapidMiner 服务器来自动进行本地或远程部署,以便与生产应用程序集成。我们在这里不举例说明这些步骤,但是在他们的网站上有很棒的文档:https://docs . rapid miner . com/latest/studio/guided/deployments/

但是 Tensorflow 2.0 和 Keras 呢?

也许 RapidMiner Studio 不适合我们,每个人都在谈论 Tensorflow (TF)是领先的解决方案之一。但是,TF 没有 GUI。新的 TF v2.0 安装了 Keras API,这使得创建神经网络层的交互更加容易,同时可以将 Python 的 Panda 数据框中的数据输入到模型执行中。让我们开始吧。

正如您从我们的手动步骤中回忆的那样,我们开始数据预处理。我们重新使用相同的场景 2 和数据集,并将使用基本的标签编码,就像我们在 RapidMiner Studio 中对非优化模型所做的那样,以向您展示方法上的比较,以及最终都是基于转换为库的算法函数的统计数据这一事实。再次使用截图,记住我们做了一些手动预处理工作,将 insiderthreat、vector 和 date 列转换为类别数值,如下所示:

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

如果您希望在我们运行 Python 脚本进一步预处理之前查看中间数据集,我已经在 Github 上放置了一份半清理数据的副本:

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

让我们研究一下 python 代码,以帮助我们达到我们想要的最终状态,即:

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

代码可复制如下:

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import feature_column
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split
from pandas.api.types import CategoricalDtype
#Use Pandas to create a dataframe
#In windows to get file from path other than same run directory see:
#https://stackoverflow.com/questions/16952632/read-a-csv-into-pandas-from-f-drive-on-windows-7
URL = 'https://raw.githubusercontent.com/dc401/tensorflow-insiderthreat/master/scenario2-training-dataset-transformed-tf.csv'
dataframe = pd.read_csv(URL)
#print(dataframe.head())
#show dataframe details for column types
#print(dataframe.info())
#print(pd.unique(dataframe['user']))
#https://pbpython.com/categorical-encoding.html
dataframe["user"] = dataframe["user"].astype('category')
dataframe["source"] = dataframe["source"].astype('category')
dataframe["action"] = dataframe["action"].astype('category')
dataframe["user_cat"] = dataframe["user"].cat.codes
dataframe["source_cat"] = dataframe["source"].cat.codes
dataframe["action_cat"] = dataframe["action"].cat.codes
#print(dataframe.info())
#print(dataframe.head())
#save dataframe with new columns for future datmapping
dataframe.to_csv('dataframe-export-allcolumns.csv')
#remove old columns
del dataframe["user"]
del dataframe["source"]
del dataframe["action"]
#restore original names of columns
dataframe.rename(columns={"user_cat": "user", "source_cat": "source", "action_cat": "action"}, inplace=True)
print(dataframe.head())
print(dataframe.info())
#save dataframe cleaned up
dataframe.to_csv('dataframe-export-int-cleaned.csv')
#Split the dataframe into train, validation, and test
train, test = train_test_split(dataframe, test_size=0.2)
train, val = train_test_split(train, test_size=0.2)
print(len(train), 'train examples')
print(len(val), 'validation examples')
print(len(test), 'test examples')
#Create an input pipeline using tf.data
# A utility method to create a tf.data dataset from a Pandas Dataframe
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
  dataframe = dataframe.copy()
  labels = dataframe.pop('insiderthreat')
  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
  if shuffle:
    ds = ds.shuffle(buffer_size=len(dataframe))
  ds = ds.batch(batch_size)
  return ds
#choose columns needed for calculations (features)
feature_columns = []
for header in ["vector", "date", "user", "source", "action"]:
    feature_columns.append(feature_column.numeric_column(header))
#create feature layer
feature_layer = tf.keras.layers.DenseFeatures(feature_columns)
#set batch size pipeline
batch_size = 32
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)
#create compile and train model
model = tf.keras.Sequential([
  feature_layer,
  layers.Dense(128, activation='relu'),
  layers.Dense(128, activation='relu'),
  layers.Dense(1)
])
model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])
model.fit(train_ds,
          validation_data=val_ds,
          epochs=5)
loss, accuracy = model.evaluate(test_ds)
print("Accuracy", accuracy)

在我们的场景中,我们将从 Github 获取数据。我已经在注释中包含了使用 os import 从本地文件导入到磁盘的方法。需要指出的一点是,我们使用 Pandas dataframe 构造和方法,通过输入的标签编码来操作列。请注意,这不是 RapidMiner Studio 向我们报告的优化方式。

在第二轮建模中,我们仍然使用我们在前面屏幕中重新运行的相同特性集列;不过这次是在 Tensorflow 进行方法演示。

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

注意,在上面的数据类型中,vector 仍然显示“object ”,这是一个错误。我急得要命,发现我需要更新数据集,因为我没有像我最初想的那样将所有值作为类别数字捕获到向量列中。很明显,我漏了一个。一旦这一切都被纠正,错误消失,模型训练运行没有问题。

与 RapidMiner Studio 不同,我们不只是有一个大型训练集,并让系统为我们做这件事。我们必须将训练集分成更小的部分,这些部分必须根据以下内容进行批处理,作为使用已知正确的真/假内部威胁数据进行训练的模型的子集,并保留一部分进行分割,剩余部分仅进行验证。

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

接下来,我们需要选择我们的特征列,这也是我们编码的 5 列数据中的“非优化”列。我们在管道的每轮验证(时期)中使用 32 的抽样批量,正如我们在早期定义的那样。

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

请注意,我们还没有执行任何与张量相关的操作,甚至还没有创建模型。这只是数据准备和建立供给张量的“管道”。下面是当我们使用 Keras 以连续格式使用层创建模型时,我们使用 Google TF 的教程演示优化器和损失函数编译模型,重点是准确性。我们尝试用 5 轮来拟合和验证模型,然后打印显示。

欢迎来到剩余的 10%旅程,将人工智能应用于您的内部威胁数据集!

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

让我们再次运行它,现在我们看到像上次一样有大约 61%的准确率!这再次证明,您的大部分成果将来自数据科学过程本身以及预处理、调优和数据的质量。你选择哪种核心软件解决方案并不重要。没有在变化的特征集合中进行优化和测试的多模型实验模拟;我们的原始模型最多只比随机抽样好 10%,人类分析师可能会也可能不会查看相同的数据。

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

人工智能在网络安全领域的投资回报率在哪里

对于可以在单个事件上完成的简单项目任务,作为警报,而不是使用非领域专家的事件;通过 SOC 或威胁搜索实现人工智能的防御者可以更快更好地实现被认为异常或不使用基线数据的 ROI。例如,异常用户代理字符串可能显示 C2 病毒感染,K-means 或 KNN 聚类基于网络威胁情报 IOC,可能显示特定的 APT 相似性。

Github 上有一些很棒的精选列表,可以给你的团队一些想法,让他们用一些我们在本文中展示的简单方法去做其他的事情。无论你选择使用哪种软件解决方案,我们的警报有效载荷很可能真的需要应用 NLP 和一个大小合适的神经网络来进行更精确的建模。请随意修改我们的基本 python 模板并亲自试用。

将大约 60%的准确率与其他真实世界的网络使用案例进行比较

我不得不承认,一开始我对自己相当失望;即使我们知道这不是一个带有标签和输入选择的优化模型。但是当我们将它与社区中其他更复杂的数据集和模型进行交叉比较时,比如 Kaggle :它真的没有我们最初想象的那么糟糕。

微软为社区举办了一场恶意软件检测比赛,并提供了丰富的数据集。比赛最高分显示预测准确率为 67%,这是在 2019 年,有超过 2400 支球队参赛。一名成员分享了他们的代码,该代码获得了 63%的分数,免费向公众发布,如果你想进一步研究,可以作为一个很好的模板。他标题为 LightGBM

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

与排行榜积分相比,面向公众的解决方案仅“差”5%在数据科学领域,5%的差异是一个巨大的数字吗?是的(尽管这也取决于你如何衡量信心水平)。因此,在 2400+个团队中,最好的模型取得了大约 68%的成功准确率。但是从预算投资回报率的角度来看,当 CISO 要求他们下一财年的资本支出时,68%对大多数安全项目来说是不够的。

虽然有些令人沮丧,但重要的是要记住,有专门的数据科学和开发运营专业人员花费他们的整个职业生涯来完成这项工作,以使 models u 达到 95%或更高的范围。为了实现这一点,需要大量的模型测试、额外的数据和额外的特征集提取(正如我们在 RapidMiner Studio 中看到的那样)。

对于将人工智能应用于内部威胁,我们将何去何从?

显然,这是一项复杂的任务。迪肯大学的研究人员在年发表了一篇名为“基于图像的内部威胁分类特征表示法 n”的论文,该论文在文章的前面部分简要提到过。他们讨论了根据同一 US-CERT CMU 数据集提供的大量数据创建特征集的方法,并创建了可用于预测分类的“图像”,准确率达到 98%。

在论文中,研究人员还讨论了对先前模型的检查,如针对内部威胁的“诱饵”,该模型使用不平衡数据最多也有 70%的准确性。有足够预算的安全程序可以在数据科学家和开发运营工程师的帮助下从头开始制作内部模型,他们可以将这份研究报告转化为适用的代码。

网络防御者如何在 AI 方面变得更好,并开始在内部开发技能?

少关注解决方案,多关注数据科学和预处理。我拿了 EdX 的 Data8x 课件(总共 3 个)和参考的(也是免费的)提供了很多细节和方法,任何人都可以用来正确地检查数据,并知道他们在这个过程中在看什么。本课程集和其他课程集可以真正增强和提高现有的网络安全技能,让我们做好如下准备:

  • 评估提供“人工智能”服务和解决方案的供应商的实际效率,例如询问使用了哪些数据预处理、功能集、模型架构和优化功能
  • 构建用例,并在被视为异常的情况下,通过更明智的人工智能特定建模选择来增强他们的 SOC 或威胁搜索程序
  • 能够将高质量数据传输并自动化到经过验证的可靠模型中,以实现高效的警报和响应

关闭

我希望你喜欢这篇关于内部威胁的网络安全应用的文章和教程简介,或者使用两种不同的解决方案将任何数据设置到神经网络中。如果您对专业服务或 MSSP 感兴趣,以加强您组织的网络安全,请随时联系我们,电话:www.scissecurity.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值