P 值的圣杯以及它们如何帮助我们进行假设检验
你是数据科学/ML 领域的吗?那你一定要看这个!
所有的互联网资料都把 p 值的概念搞得太复杂了,让我们通过简单的例子来解读它
这篇文章将会用例子来解释下面的概念:
- 什么是 p 值?
- 如何解读它们?
- 什么是阿尔法,为什么阿尔法=0.05 是普遍的规范?
- 假设检验(什么是无效假设和替代假设,以及 p 值如何与它们相关联?)
这篇文章中会用到的例子
让我们假设一个医学实验室正在开发多种疫苗,以便能够成功治疗冠状病毒。科学家们已经开发出了两种疫苗株- A 和 B,现在他们必须确定它们的有效性。
因此,在第一次试验中,他们分别在一名感染者身上测试了这两种疫苗。结果出来了,注射疫苗 A 的人被治愈了,但是注射疫苗 B 的人没有被治愈。
现在,我们能说疫苗 A 比疫苗 B 好吗?不,我们不能。因为这只是一个人的试验,这给很多事情留下了机会。也许注射疫苗 A 的人有很强的安慰剂效应,或者注射疫苗 B 的人已经是心血管病人,并且对疫苗 B 的一种成分过敏。无数的事情都可能发生。因此,总的推论是,我们不能基于一个样本量就说疫苗 A 比疫苗 B 好。
现在,让我们假设科学家们进行了另一项试验。这一次,他们对两个人分别进行了两种疫苗的测试。
结果-注射疫苗 A 的人都被治愈了,而注射疫苗 B 的人被治愈了。现在,我们能自信地说疫苗 A 比疫苗 B 好吗?
不,我们仍然不能这样说,因为我们在单人实验中谈到的机会因素在这里也适用。样本量仍然太小,无法推断出任何结论。
继续,试验是在很多人身上进行的。
现在,让我们看看多种结果场景。
在图中显示的第一个场景中,请注意疫苗 A 的治愈率为 99.7%,而疫苗 B 的治愈率仅为 0.001%。现在,让我们假设,在疫苗 A 的试验组中,许多态度积极的中间派人士被排挤,导致安慰剂效应,而在疫苗 B 的试验中,许多过敏人群被排挤。 这可能会导致他们体内的反应,导致他们的症状没有减轻,或者可能会发生任何其他随机事件,可能有利于疫苗 A 而不利于疫苗 b。但是,因为我们可以在这里看到试验组的规模足够大,因此,抛开一些随机事件, 疫苗 A 对应的成功事件太多,疫苗 B 对应的失败事件也太多。这一结果确实让我们有信心推断出疫苗 A 与疫苗 B 显著不同,可以说它是两者中较好的一个。
现在,看看第二个结果场景,其中疫苗 A 和 B 的治愈率分别为 37%和 29%。现在,只看这些百分比,你能自信地宣称一种疫苗一定比另一种好吗?
不,我们不能,因为这里不像第一种情况那样有大约 0%和大约 100%的利率。
我们在分析世界中遇到的所有现实生活中的情况更接近于第二种情况,在这种情况下,仅仅靠人类的判断是不够的!在这里,我们求助于统计数据!
我们对困惑之神说什么?不是今天 😄 (哈哈!对于门外汉来说,这是一个蹩脚的、小得了的参考)。
相反,聪明的统计之神把 P 值作为我们武器库中的一个重要工具交给了我们,可以在这种情况下使用。
什么是 P 值?
它是一个介于 0 和 1 之间的数字,用于量化我们对疫苗 A 与疫苗 b 不同的确信程度。该值越接近 0,我们就越确信这两种疫苗之间存在显著差异。
p 值阈值(Alpha)
现在,问题来了,P 值应该有多小才能让我们足够自信?标准α值通常取为 0.05
如果满足以下条件,则证明存在统计上的显著差异:
p 值≤α(一般为 0.05)
在上述情景 2 中,我们看到 p 值=0.24,显然不小于 0.05,因此我们得出结论,两种疫苗彼此之间没有显著差异。
**记住,一个小的 p 值并不能告诉我们 A 和 B 有多大的差异。**例如,p 值=0.04 只是告诉我们 A 和 B 有显著差异,但不能告诉我们有多大的差异(差异可能很小,也可能很大)
但是,让我们更多地讨论为什么要设定 5%的门槛,以及它实际上意味着什么?
如果我们假设我们正在测试两种疫苗,它们实际上是来自一种疫苗的两个相同样本,因此它们彼此没有区别。尽管如此,我们继续用 5%的α值测试这些样本,这意味着 95%的情况下我们会得到 p 值> 0.05,这将确认这两种疫苗没有不同,但是 对于剩余的 5%的情况,由于一系列随机原因,我们可能会得到 p 值< 0.05,这当然会指示错误的结果,这就是假阳性。 (例如-妊娠试验结果为阳性,但该女士实际上并未怀孕,患者得到的活检报告为恶性,而肿瘤为良性-假阳性病例)
因此,alpha 值为 5%意味着 100 次中有 5 次会出现误报。
现在,如果我们在航空科学或生物科学领域工作,精度非常重要,不能让大量的假阳性发生,那么在这些情况下,我们必须使用α值,比如说 0.00001,这意味着 100,000 次中只有 1 次会出现假阳性。这种精度的成本非常高,因此很少有行业/用例要求 alpha 值小于 0.05。
类似地,如果你遇到一个自由的用例,比如垃圾车在每天早上 8 点 30 分钟内到达,我们也可以允许 alpha 值达到 0.2 或 20%。
因此,普遍接受的值 0.05 已经被一般化,因为它适合许多用例,但是在不符合这个置信度要求的情况下,它可以并且应该被调整。
现在让我们接触一下假设检验,因为我们已经讨论了它的前提。我遇到过许多关于这个主题的复杂文章,但是现在你已经阅读了疫苗的例子,这对你来说是小菜一碟,请继续阅读!
- **无效假设:**两种疫苗没有区别(不需要证明什么,如果没有替代假设的证据也可以接受)无罪直到被证明有罪是一个假设无效假设的例子,直到原告毫无疑问地证明被告部分确实是凶手,这样很容易记住定义:)
- **替代假设:**疫苗确实不同,我们说有 95%的置信度(在α= 0.05 的情况下)(这必须用显著的 p 值来证明,这使我们有信心拒绝零假设)
看,这些令人生畏的统计术语确实存在简单的解释!!
到此为止,我们已经结束了这篇文章,如果你有兴趣,你也可以看看我关于统计学和机器学习的其他文章,所有这些文章都有我的手绘插图,简单的例子和大量的学习:)
这些概念有什么正常或不正常的地方?
towardsdatascience.com](/clearly-explained-normal-distributions-and-the-central-limit-theorem-8d7cc5a6052f) [## 解释清楚:强大的中心极限定理
这实际上是最重要的统计定理之一,请继续阅读以获得简单的解释!
towardsdatascience.com](/clearly-explained-the-mighty-central-limit-theorem-b8152b94258) [## 基础统计术语解码
用 VS 风格解释,先左后右!
towardsdatascience.com](/foundation-statistics-terms-decoded-f1def3721c1e)
保重!快乐学习!保持安全和健康:)
家酿和 Pyenv Python 愉快地合作
如何使用 pyenv 的 Python 来满足自制程序的依赖性,因此只有 pyenv 管理您机器上的 Python 3 安装
接下来,我要清理我的桌子!图片作者。
像很多 数据 科学家和 Python 开发者 之前 我,我已经 给了上管理我自己的 Python 构建并转向 pyenv (链接到《走向数据科学》中的编年帖子)。在不同的时间点,我自己从源代码中构建 Python 版本或者在 OSX 上使用预建框架安装程序,同时手工管理/usr/local/bin
中的链接。使用这两种方法中的任何一种,我从任何已安装的版本中旋转虚拟环境都没有问题,但是最近我和 PATH 混淆了我们是使用家酿的python@3.8
还是我安装的框架版本。输入 pyenv。如果你在寻找如何设置 pyenv,有 有无文章 或 博客 帖子 上 如何 到 安装 它正如这些文章中提到的,有许多方法可以在您的 OSX 系统上安装 Python:
- 有内置的 Python 2.7.x(注:Python 2 自 2019 年 12 月起已弃用)。
- Homebrew 将提供一个 Python 3 版本来满足它自己的依赖性。
- 你可以有框架版本。
- 您可以从源代码构建它。
- 或者像许多人建议的那样,您可以使用 pyenv 来管理版本。
您的系统需要内置的,而 Homebrew 实际上只会为您保留一个版本的 Python 3,所以如果您想管理 Python 2 或 3 的特定版本,您需要在后三个版本中进行选择。我省略了 Anaconda,因为我不需要它,也没有花时间去真正理解它是如何工作的,但是我听说过 Windows 用户的成功故事。在这里,我们将选择 pyenv 来管理 python 版本,但是这样做的话,我们的系统上最初会有多个版本的 Python 2 和 Python 3(除了 builtin 版本 2 和 homebrew 版本 3 之外,还有来自 pyenv 的版本)。再说一次,我们对 Python 2 的内置无能为力,OSX 需要它。**对于 Python 3,我们可以让自制软件使用 pyenv 的 Python 版本之一来消除冗余的来源。**在我们开始之前,值得注意的是,如果你像 pyenv 推荐的那样使用你的PATH
,你不太可能经历 pyenv 和 homebrew 之间的冲突,并且 Homebrew 对此发出警告;你正在涉水进入依靠你自己的理解来支持这个用例的领域(正如家酿在他们的帖子中所说的)。
使用 pyenv 的 Python 来满足自制依赖
这些堆栈溢出答案有使用符号链接(symlinks)的正确想法,但是据我所知,他们没有得到正确的链接。让我们把它们做好!
如果你已经有了任何家酿的 python3 的痕迹,首先把它们去掉(brew unlink python3
和brew uninstall python3
)。如果你已经有了来自 Homebrew 的 python@3.8,当卸载它的时候,记下依赖它的包(例如,ffmpeg
,然后重新安装它们。
在这篇文章中,Homebrew 预计是 Python 3.8.6,因为它是 python@3.8,所以首先按照他们的文档安装 pyenv 的那个版本:
pyenv install 3.8.6
这将(默认情况下)把实际的 Python 安装放在
~/.pyenv/versions/3.8.6
现在我们只需要添加一个链接,然后让 brew 完成剩下的工作。我将在这里使用完整路径,因此您可以从任何地方运行它(记住在头脑中把ln -s ... ...
读成“link-symbolic[target][linkname]”):
ln -s ~/.pyenv/versions/3.8.6 $(brew --cellar python)/3.8.6
使用-f
标志,您可以省略后面的/3.8.6
,因为ln
将使用目标的名称。为了在链接上尽可能清晰,您应该
ln -s ~/.pyenv/versions/3.8.6 /usr/local/Cellar/python@3.8/3.8.6
结果应该是这样的:
➜ ~ ll $(brew --cellar python)
total 0
lrwxr-xr-x 1 [my username] admin 36B Oct 14 16:52 3.8.6 ->
/Users/[my username]/.pyenv/versions/3.8.6
最后,让家酿管理其余必要的链接:
brew link python3
这篇文章的灵感来自于我自己对如何让它工作的探索,而这个关于栈溢出的问题的答案是没有答案的(我回答了,我想!)。
Python 中的自制 DBSCAN
如何实现最具弹性的聚类算法之一的快速指南
马丁·桑切斯在 Unsplash 上的照片
用于有噪声应用的基于密度的空间聚类 DBSCAN 是一种很难理解的聚类算法。它创建于 1996 年,经受住了时间的考验,至今仍是对数据点进行聚类的最有用的方法之一。为了好玩,也为了拓宽我的视野,我尝试用 python 编写了自己的 DBSCAN 类。如果你是那种想直接跳到书的结尾的人,你可以在这里看到我的整个项目。
它是如何工作的?
DBSCAN 中的聚类是通过根据点与其相邻点的关系将数据点分为三种类型来确定的。三种类型的点是核心点、边界点和噪声点。通过识别核心点、确定其相邻点是核心点还是边界点来形成聚类。当相邻点本身是核心点时,聚类仅扩展到单个点的邻域之外。
作者 Chire-Own 作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=17045963
考虑上面的二维点。点 A 是核心点的一个例子。在这种情况下,当总共 4 个点在邻域内时,形成核心点。B 点和 C 点是边界点的例子。边界点可能在核心点的邻域内,但是在它们自己的邻域内总共少于 4 个点。点 N 是噪声点的一个例子。它不属于某个聚类,或者在其邻域中没有足够多的点。
更深刻的理解
为了充分理解一个问题,我尝试定义一个关键概念的列表,写一些流程的松散伪代码,花一点时间识别时间和空间复杂度。
定义
最小样本-用户定义的最小点数
ε-用户定义的两点之间的距离
邻域——在ε距离内围绕中心点的空间。
核心点-在其邻域内具有最小点样本的点。
边界点-至少属于一个核心点的邻域,但在其自己的邻域内没有点的最小样本的点。
噪声点-既不属于核心点的邻域,也不具有其自身邻域内的点的最小样本的点。
伪代码
估价
时间复杂度
每个点都与我们数据集中的其他点进行比较,所以我预计时间复杂度为 O(n)。因为我只为每个点添加了两个新的特征,即聚类和点类型,所以我们的空间复杂度是 O(2n)四舍五入到 O(n)。
主要观察结果
聚类由核心点的邻域组成。所以我知道我需要一些最近邻搜索功能的修改。下面是我修改过的最近邻搜索的一个片段,我是从自己的类实现中选择的。
距离对于计算一个点的邻域是至关重要的。大多数数据集都有两个以上的要素,您可能希望在聚类时考虑这些要素。因为我想处理 n 维数据点,所以我创建了一个距离辅助方法,以允许我灵活地处理多个距离公式。使用 L2 范数开启了我的邻域法,从严格的二维到完全的多维。
用单元测试定义行为
当开始任何新代码时,我喜欢设置一组单元测试来帮助定义我的用户契约。当我发现我做的任何不好的假设时,这些可以被修改,但是一般来说,我定义一个测试,然后离开它。这有助于保持我的一致性,并确保我履行我对用户的承诺。
虽然我不能预测用户使用我的类的每一种方式,但我至少可以确定一些我不想让用户做的事情。前三个测试都是关于塑造用法的。第一个确保用户不会用不可能的值或中断的值实例化我的 DBSCAN 类。第二个测试是确保同质数字数据是唯一传入的数据。第三是确保用户在数据传入之前不会试图调用方法。最后,第四个测试是非常基本的功能测试,确保我所做的任何更改都不会破坏基本功能。
当我实现时,我倾向于同时增加我的单元测试。你可以在这里看到我选择的所有单元测试。
履行
有了定义良好的单元测试和伪代码,这无疑是最快和最容易的部分。如果有一个逻辑问题,就像我的第一次尝试一样,通过失败的测试和伪代码中的大缺口,它变得很明显。在我最初的尝试中,我一直在重写集群,但是由于我最初的基础工作和在投入太多时间之前改变方向,我能够很快地弄清楚。你可以在这里看到对我最初尝试的更深入的报道,以及它的不足之处。
估价
至此,所有测试都通过了,我自制的 DBSCAN 工作正常。对于实现 MVP 来说,这已经足够好了。但这对我来说永远不够,所以我决定将它与一个流行的、普遍可用的库进行比较。
哎唷,这比通常可用的库慢 800 多倍。很难看出这种程度的差异,更不用说公开承认了。但是经过一些研究,我的实现与其他数组索引类型的实现不相上下。我还可以探索其他一些技术来提高 DBSCAN 的性能:空间索引和批量邻域计算。听起来像是后续文章的好主题。
我的全部实现可以在我的 Github 上找到。想聊聊吗?在Linkedin上联系我。
同态加密简介:第 1 部分:概述和用例
来源:博通
同态加密简介:
第 1 部分:概述和用例
简介
机器学习算法的进步导致了各行各业的广泛采用。然而,由于保护用户数据的监管限制,处理敏感和私人数据的领域,如医疗保健或金融,已经落后了。
随着机器学习作为服务的出现,实体正在作为服务提供模型推理。在这种情况下,我们可以区分三方,一方是模型所有者(如培训模型的医院),一方是主机(如提供计算能力的云提供商),另一方是希望从服务中受益的客户端。在某些情况下,模型所有者也可以是宿主。必须在这些方之间建立信任,因为客户不希望她的数据被泄露,而模型所有者希望保护她的模型。
在本文中,我们将快速了解机器学习及其带来的进步。然后我们将看到机器学习的数据依赖性如何使其不适合一些敏感的用例,以及新的解决方案如何使模型在加密数据上的训练和推断成为可能。最后,我们将关注同态加密,看看它能涵盖哪些用例。
本文是非技术性的,面向广大读者。接下来的文章将深入探讨同态加密的技术细节,包括同态加密方案的理论和 Python 实现。
一、围绕数据利用的隐私问题
机器学习,特别是深度学习,它是机器学习的子领域,集中在深度神经网络(DNNs)上,已经证明在几个不同的任务上推进了技术发展水平。不同的领域,如使用 ResNet 的图像识别,使用 BERT 的文本处理,甚至使用 WaveNet 的语音生成,都在使用深度学习方面取得了巨大的进步,而其他模型则远远落后。
深度学习的基本原理是在海量数据上训练模型,并通过优化模型的损失。通过这样做,深度学习已经成功地获得了类似人类的性能,因为它能够找到人眼看不见的复杂模式。
因此,机器学习似乎为未来新的技术飞跃铺平了道路,但它严重依赖于数据的使用,无论是用于训练还是用于推理。
这些深度学习模型中使用的大部分数据通常来自公共的非个人数据,如 Wikitext 或 Imagenet。尽管如此,其他场景可能需要更合理的训练数据。例如,语音到文本模型可能需要人们记录他们的声音,诊断工具将需要发送私人健康数据,或者信用分析工具可能需要查看财务信息。
虽然我们看到了机器学习的强大,但我们在这里看到,一些敏感的用例无法通过这种方法直接回答,因为数据太敏感,无法共享,无论是用于训练还是用于推理。因此,在数据隐私和数据效率之间似乎存在一种权衡,在这种意义上,人们可以通过实施严格的过程来维护私有数据的更好的保密性,在这些过程中,数据只能由可信任的人类专家查看,代价是使该过程漫长且昂贵,或者使用经过训练的模型,这些模型可以具有优异的性能和可扩展性,但代价是需要在训练和推断期间查看数据。
然而,在过去的几年中,出现了几种技术,可以兼顾隐私和效率。其中,三个似乎最有希望:
- 同态加密 (HE)是一种公钥密码方案。用户创建一对秘密和公共密钥,使用公共密钥加密她的数据,然后将其发送给第三方,第三方将对加密的数据进行计算。由于加密和解密的同态属性,用户可以得到加密的结果并用她自己的密钥对其进行解码,以查看对她的数据的计算的输出,而无需向第三方清楚地展示一次。
- 安全多方计算 (SMPC)是一个不同的范例,它更依赖于参与者之间的通信。数据可以拆分,模型也是如此,每个参与者只发送她数据的一小部分,这样其他人就不能重建初始数据,但可以参与进来,并对数据部分进行一些计算。然后,一旦每一方都完成了,所有的东西都可以被聚合,输出的结果对每一方都是已知的。
- 可信执行环境 (TEE)由于硬件隐私保证,软件开发得以实现。英特尔的 SGX 技术提供了这种系统的实现。enclave 技术允许程序独立于其他程序执行。所有入站和出站数据都是加密的,明文计算只发生在 enclave 内。然后可以从外部检查 enclave 代码和完整性。
SMPC 提供了一些有趣的功能,比如可以让不同的参与者在隐藏各自数据的同时进行合作。SMPC 的主要优势之一是它计算复杂运算的能力,例如比较或 argmax,而这些在 he 中是不可能的。此外,与 he 相比,使用 SMPC 评估深度模型更容易,因为大多数 HE 方案都是分级的。
然而,SMPC 要求各方遵守协议。此外,它需要一个可信的第三方不与任何一方合作。如果是这样,一方或多方的数据可能会受到损害。最后,因为 SMPC 依赖于各方之间的通信和计算,这需要更多的计算和更多的带宽,这不一定适合通常的客户机/服务器范例,在这种范例中,服务器在很少通信的情况下执行大多数操作。
TEE 提供硬件保障,保证敏感数据在受控环境下处理。在这个被称为 enclave 的安全空间中,数据被解密,并被明文用于计算。在飞地之外,数据仍然是加密的。这使得效率大大提高,因为我们不需要在计算之前加密数据,但是我们可以直接计算明文,并在输出离开 enclave 之前加密输出。
然而,为 tee 编写安全代码是一项艰巨的任务,已经在英特尔 SGX 上发现了几次攻击。“对英特尔 SGX 已发布攻击的调查”涵盖了对英特尔 SGX 的几种类型的攻击,例如旁路攻击,即操作系统内核利用其对平台近乎完全的控制,对依赖内核服务的飞地发起攻击。还存在其他攻击,如缓存攻击、分支攻击或推测性动作攻击,但我们让感兴趣的读者在上面的文章中了解更多。
一旦加密完成,他就可以将几乎所有的计算外包给服务器。使用同态属性,可以在不泄露任何隐私的情况下对加密数据进行计算,并且用户可以安全地解密输出。此外,他不需要像 SMPC 那样多的交流,也不需要比发球台更特殊的硬件。
虽然他相对简单,并且与其他方法相比几乎没有依赖性,但是他不能有效地执行任意多次乘法,并且他只能执行加法和乘法,这使得一些计算更难以执行。
虽然每种方法都有自己的优缺点,但这些技术共有的一个可取的特性是,它们都允许加密模型和数据。这可能为“私人机器学习”的新实践开辟道路,用户将能够共享私人数据,如医疗或财务记录,以便从机器学习服务中受益,而不必实际展示他们的数据。
在本文的其余部分,我们将集中讨论同态加密,因为它是三种方法中最容易部署的。事实上,SMPC 和发球台需要额外的基础设施部署,因为发球台需要使用特殊的硬件,而 SMPC 依赖于可信的第三方(可以是发球台),而他非常简单,可以在没有任何特殊依赖的情况下实现。
二。同态加密的隐私友好用例
我们现在将看到如何在实践中应用这些概念,以及这些隐私友好的方法可能实现的不同用例。
在这一节中,我们将探索他打开的不同用例。正如我们将在另一篇文章中看到的,he 方案使用户能够将明文消息加密成密文,以便用于计算。可以在密文和密文之间,或者在密文和明文之间进行运算。最后,只有加密数据的用户才能解密输出。
因此,该方案可以允许模型和数据被加密,并且结果必须总是返回到秘密密钥的所有者以获得最终结果。使用这些假设,我们将了解如何涵盖不同的场景。
A .模型保密性:来自公开数据的财务指标
学习受益于一个非常活跃的研究和开源社区。这使得许多最先进的模型可以为非研究人员所用。例如, Fastai 一个众所周知的深度学习框架已经实现了民主化的强大模型,如用于图像识别的 ResNet,或用于文本分类的 ULMFiT。
因此,这种模型的价值不在于通常为大多数人所知的架构,而在于训练后获得的权重,因此也在于训练数据。
在这里,我们将探索一个场景,其中用户已经设法收集、清理和预处理了用于给定模型的训练的数据集。虽然训练中使用的数据可以安全存储,但如果用户想在云平台上部署模型,她必须信任云提供商不会窃取权重,也不会有意或无意地泄露模型。
因此,可以想象,通过加密权重,云主机将无法获得关于模型的任何洞察,并且用户在云上部署她的模型变得安全。
CKKS 概况(来源:Daniel Huynh)
上图说明了这一点。场景如下:
- 客户端将她未加密的数据发送到云提供商托管的模型。
- 云主机使用加密的模型和未加密的数据执行计算,然后将结果发送给模型提供者。
- 模型提供者解密结果,然后将其发送给客户端。
因为模型提供者仍然需要解密结果,这在混合云的情况下会更有趣,在混合云的情况下,基础设施的非关键部分托管在公共云上,而更关键的部分隔离在私有云中。在这里,人们可以想象公共云部分负责大部分计算并管理负载平衡,而私有云部分仅解密结果并将其发送给客户端(最终通过公共云)。
这种情况的一个例子是,例如,一家公司分析公共市场的指标,并向其客户汇总数据。然后,将大部分计算托管在公共云上是有意义的,但在将计算发送到云之前,通过加密来保护所有算法。结果可以由该公司解密,然后发送给他们的客户。
B .私有推断:私有集合交集
在私有推断设置中,我们现在将假设相反的情况,用户持有的数据是私有的,但是模型提供者持有的模型不需要加密。例如,在模型所有者和云提供商是同一个实体的情况下,或者在这种情况下,他们相互信任。
在这种情况下,我们的目标是提供一个可伸缩的、隐私友好的解决方案,这样用户就可以用私有数据查询服务器,而不会暴露给服务器。
例如,Private Set Intersection (PSI)是这样一种场景,其中一个用户持有私人信息,但希望检查她的数据是否与更大的相同性质的数据库相交。然后,服务器将操作这个数据库,并且服务器的数据不一定需要加密。他提供了这样做的可能性,同时保护用户的数据隐私。"同态加密的快速私有集合交集"探讨了这种情况,并展示了可以使用 PSI 进行联系发现。在这种情况下,像 Whatsapp 这样的服务提供商拥有关于谁在使用他们的服务的大型数据库,而一个低收入的新客户想知道他们的联系人中谁在使用 Whatsapp。然后这个客户端只需要要求服务器将她与所有用户的联系人列表私下相交,并解密结果,就可以知道她联系人中有谁在使用 Whatsapp。
作为另一个例子,在最近围绕 Covid19 的危机的情况下,人们可以检查用户和已知的感染患者群体之间是否有过接触。这可以在客户端服务器场景中完成,其中用户共享她的位置数据,并且服务器可以对其执行计算以向客户端输出客户端可能遇到的最终患者。
C .三方保密计算:云上托管的医院模型
我们将讨论的最后一个场景是数据和模型都被加密的情况。这可能是一个三方设置的情况,其中一个用户希望对其数据进行分析,一个模型所有者希望提供其模型,一个云提供商提供托管该服务的基础架构。
在标准的 he 方案中,只有由同一公钥生成的密文才能一起用于加法和乘法。这将使得不可能计算由两个不同的客户端生成的任何东西,因此使他相当受限。然而“应用于不经意神经网络推理的具有打包密文的高效多密钥同态加密”提供了一种对来自不同所有者的几个输入进行计算的方法。
多方 HE 概述(来源:利用打包密文的高效多密钥同态加密,应用于不经意神经网络推理
上图概述了这一过程。主要思想是,客户机和模型所有者都可以在将数据发送到服务器之前加密它们的数据。这个将能够使用这两个输入进行计算,然后向每一方发送部分结果。然后,模型所有者将使用她的私钥移除他引入的噪声的一部分,并将其发送给客户端,客户端将移除剩余的噪声并获得输出。
这个场景对于医疗场景特别有意思。客户可能是提供其数据的患者,而模型所有者可能是训练了模型的医院。为了更好地为患者服务,该模型可以安全地部署在公共云上,同时保留医院训练的权重。根据推断,数据将由患者加密,并在上述两步过程中解密。
结论
在这篇文章中,我们已经看到了为什么我们需要更加隐私友好的解决方案,以及何、和 TEE 目前采用的方法。然后,我们看到他可以解决哪些不同的使用案例。
在 GDPR 和 Covid19 的背景下,他似乎是一个非常有前途的领域,我们需要快速发展,但要谨慎对待人们的数据。
我们将在下一篇文章中讨论更多的技术部分,在那里我们将看到如何从头开始构建我们自己的 he 方案。
所以,我希望你喜欢读这篇文章,如果能得到你的反馈,那就太好了,我会在未来试着发布更多的文章。
如果您有任何问题,请随时在 Linkedin 上联系我,您也可以在 Twitter 上找到我!
同态加密简介:第二部分:景观与 CKKS
描述同态加密的前景,他是什么,并首先看看 CKKS 的一个他方案的复数。
来源:维基媒体
同态加密简介:
第二部分:何山水与 CKKS
一、引言
在之前的文章https://medium . com/@ dhuynh 95/homo morphic-Encryption-intro-part-1-overview-and-use-cases-a 601 ADC ff 06 c 中,我们看到了为什么我们需要隐私保护机器学习,Homomorphic Encryption 如何实现它,以及它可以解决什么用例。
在本文中,我们将介绍同态加密的基础知识,并首先看看一个 he 方案的机制,来自论文“用于近似数字算术的同态加密”的 CKKS ,与其他只对整数起作用的方案如 BGV 或 BFV 相比,它允许对实数进行近似算术。
因为在何的领域上很少有全面的指南存在,我们将花时间探索的基本力学,除了代数的基本知识之外,没有对读者背景的太多假设。
环论(数学 113) 为初学者提供环论的简单介绍。
二。同态加密
A .核心原则
他是一种加密方案,允许数据所有者加密他们的数据,并让第三方在不知道底层数据是什么的情况下对其进行计算。然后,对加密数据的计算结果可以发送回数据所有者,他将是唯一能够解密加密结果的人。
更正式地说,两个环 R 和**R’**之间的环同态 h 满足这两个性质:
- h(x + y) = h(x) + h(y)
- h(x * y) = h(x) * h(y)
这意味着,如果我们有一个加密同态 e ,一个解密同态 d ,使得 d(e(x)) = x ,以及一个函数 f ,它是加法和乘法的组合,那么我们可以有下面的场景:
- 用户使用 e 加密她的数据 x ,并将 e(x) 发送给不可信的第三方。
- 第三方对加密的 e(x) 执行计算 f 。因为 e 是同态,所以我们有 f(e(x)) = e(f(x)) 。然后,第三方将数据发送回用户。
- 最后,用户解密输出,得到 d(e(f(x))) = f(x) ,而不会将她的数据直接暴露给不可信的第三方。
B .简史
这些方案首先从 RSA 开始,RSA 提供了一个同态方案,但是只有同态乘法。这是第一个部分同态加密(PHE),这是一个只有一个操作的方案。其他类型的 he 方案可能是某种程度上的同态加密(SWHE ),具有有限数量的运算,以及最有趣的一种,完全同态加密(f HE ),它允许任意数量的评估。
自从 RSA 以来已经提出了几个 HE 方案,例如 Paillier 在论文“基于复合度剩余类的公钥密码系统”中为 PHE 提出的方案,但是直到 Craig Gentry 的工作才在他的博士论文“完全同态加密方案”中提出了第一个 FHE 方案。
Gentry 的突破是通过向 SWHE 引入自举实现的。其思想是,SWHE 通过添加噪声将明文加密成密文。可以对密文进行操作,但代价是增加噪声,如果操作太多,解密将提供错误的结果。Gentry 的 boostrapping 技术可以去除密文中的噪音,因此可以对密文进行无限制的操作。
虽然 bootstrapping 为 FHE 提供了一个理论框架,但它的效率太低,无法用于实践。从那以后,出现了更实用的方案,如 BGV 和 BFV 的整数算法,CKKS 的实数算法。
在关于 he 的这个系列的剩余部分中,我们将集中于 CKKS,一种分级的同态加密方案,这意味着加法和乘法是可能的,但是有限数量的乘法是可能的。虽然自举在 CKKS 是可用的,但是这种操作仍然是昂贵的,并且使得它在实践中不太可用。
三世。CKKS
这里我们将集中讨论 CKKS 方案。本节将介绍 CKKS 的基础,我们将在后面的文章中看到如何实现它。
CKKS 概况(资料来源:Pauline Troncy)
上图提供了 CKKS 的高层次视图。我们可以看到,消息 m ,它是我们想要对其执行计算的值的向量,首先被编码成明文多项式 p(X) ,然后使用公钥加密。
CKKS 使用多项式,因为与向量上的标准计算相比,多项式在安全性和效率之间提供了一个很好的折衷。
一旦消息被加密成由几个多项式组成的 c ,CKKS 提供了几种可以对其执行的操作,比如加法、乘法和旋转。
虽然加法非常简单,但乘法的特殊性在于它会大大增加密文中的噪声,因此为了管理它,只允许有限次数的乘法。旋转是给定密文的槽上的置换。
如果我们用 f 表示一个由同态运算合成的函数,那么我们得到用秘密密钥解密c’= f©将产生p’= f§。因此一旦我们解码它,我们将得到 m = f(m)。
这为我们提供了 CKKS 工作方式的高级视图,我们将在下一篇文章中看到如何实现实现这种方案所必需的加密原语,它们是:
- 设置方案的参数
- 创建密钥和公钥
- 将向量编码成明文多项式,并将明文多项式解码成向量
- 使用公钥将明文多项式加密成密文多项式对,并使用私钥对其进行解密。
- 对密文进行加法、乘法和旋转
结论
我们看到了他一般是如何工作的,他的方案有哪些不同的类型,并且预演了实数近似算术的 CKKS 方案。
这让我们对他有了一个更高层次的了解,并为下一篇文章铺平了道路,在下一篇文章中,我们将深入研究代码并从头开始实现 CKKS。
我希望您喜欢这篇文章,并为下一篇文章做好准备,在下一篇文章中,我们将看到如何在同态设置中将向量编码成多项式!
如果您有任何问题,请不要犹豫,通过 Linkedin 联系我,您也可以通过 Twitter 找到我!
同态加密介绍:第 3 部分:CKKS 的编码和解码
来源: Pixabay
**编辑:**这篇文章现在可以在 OpenMined 的博客上看到。由于编写代码和数学的问题,我决定在 OpenMined 上发布该系列的其余部分,以获得更舒适的读者体验。链接如下:
同态加密简介:
第 3 部分:CKKS 的编码和解码
简介
在上一篇文章中,我们看到了什么是同态加密,它是如何工作的,并对 CKKS 有一个简短的了解。
CKKS 概况(资料来源:Pauline Troncy)
上一篇文章中的这张图展示了 CKKS 的工作流程。如前所述,要对加密的向量执行计算,我们必须先将其编码成多项式,然后再将其加密成一对多项式。
你可能会问,为什么我们需要它使用多项式而不是向量?这是因为多项式有一个“好”的结构,允许非常有效地进行一些计算,同时仍然保持很高的安全性。
因此,CKKS 首先将一个向量编码成一个明文多项式。人们可以把它看作是把一条信息放进一个玻璃瓶,因为信息被装在一个容器里,使它“更容易”处理,而信息仍然清晰可见,任何人都可以恢复它。
**注意:**由于介质的限制,很难编写 LaTeX 和代码,所以在我的 Github 存储库中有一个笔记本,包含了与本文相同的内容,其中包含了所有带代码的文章:https://github.com/dhuynh95/homomorphic_encryption_intro
感兴趣的笔记本是https://github . com/dhuynh 95/homo morphic _ encryption _ intro/blob/master/01 _ encoding _ decoding _ ckks . ipynb,你可以在https://Colab . research . Google . com/github/dhuynh 95/homo morphic _ encryption _ intro/blob/master/01 _ encoding _ decoding _ ckks . ipynb使用 Google Colab 执行它
以下 LaTeX 文档截图来自我的硕士论文《同态随机森林》。
一、预赛
二。普通编码
我们现在将看看如何在实践中实现这一点:
三世。CKKS 编码
我们现在将在实践中看到如何通过修改普通编码器和解码器来编码 CKKS 编码器和解码器:
结论
在本文中,我们看到了编码和解码是如何在 CKKS 中执行的,以及这些过程是如何同态的,因此允许将向量的多项式表示相加和相乘,稍后会发现底层值也被修改了。
这是我们同态旅程的第一步,稍后我们将看到如何使用同态加密和解密多项式。
所以,我希望你喜欢读这篇文章,如果能得到你的反馈,那就太好了,我会在未来试着发布更多的文章。
如果您有任何问题,请不要犹豫,通过 Linkedin 联系我,您也可以通过 Twitter 找到我!
同态加密和机器学习:新的商业模式
同态加密介绍、用例以及对机器学习项目的影响
乔恩·摩尔在 Unsplash 上的照片
人工智能项目的一个主要“问题”是数据隐私。事实上,您可能会为您的公司确定最佳用例,然后意识到您的业务项目依赖于您不被允许使用的数据,因为您无法遵守现有的数据隐私法规(有充分的理由)。这种情况阻碍了我们在现实生活的商业应用中利用人工智能的能力。
**事实上,大多数机器学习系统都是由非常敏感和私人的数据(客户数据、健康记录、闭路电视录像等)提供的。).**在这个行业的几个项目之后,我可以向你保证,对隐私法律问题的担忧是开发新的人工智能解决方案和商业模式的严重障碍。
此外,大多数公司都没有意识到,他们可以利用自己掌握的数据创造新的收入来源,同时保护这些数据的隐私。一种叫做同态加密的解决方案可能有助于改善这种情况。
在本文中,我将解释什么是同态加密(HE),这种技术目前的局限性,以及它如何在保护数据隐私的同时帮助创建新的商业模式。
今天的问题
让我们从一些常见的 ML 问题开始。机器学习模型很难在各种用户之间共享。此外,共享模块是不可行的,因为它在每一端都需要高计算量。
大多数公司依赖云计算,并通过云 API 利用 ML 模型。这种情况有助于解决计算能力的问题,但会将数据暴露给云提供商。
在一些欧洲国家,拥有美国云提供商会阻止你与公共组织和国有公司做生意( 1 )。
此外,目前的数据隐私法规,如欧洲的 GDPR ( 2 )限制了人工智能解决方案的使用。例如,如果您在金融服务行业工作,您的组织需要处理大量个人身份信息(PII)和金融数据,这些信息在存储和传输时都需要加密。
个人身份信息(PII) :任何与可识别的人相关的信息( 3 )。
最后,由于相互之间缺乏信任,竞争对手几乎不可能交换数据。这种情况限制了我们在需要更多数据(健康研究)时的创新能力。拥有一种新的加密方法将使许多公司受益,创造新的生态系统和商业模式。
什么是同态加密?
他允许直接对加密数据进行计算。通过使用先进的密码学,使得**“在匿名数据集上运行机器学习而不丢失上下文”** ( 5 )成为可能。
计算:数学计算的动作。
无论您处理的是静态数据还是传输中的数据,当前大多数公钥加密都要求在操作数据之前必须对其进行解密。
事实上,现有的加密算法使得不先解密就无法处理数据——而解密你的数据并不能让你遵守数据隐私法。如果数据通过任何其他方式加密,在处理之前必须首先解密,这使得数据容易受到未经授权的访问。
他让你在使用数据之前不再需要解密。换句话说,在您处理数据时,数据完整性和隐私得到了保护。事实上,同态加密允许在加密数据仍处于加密状态时对其进行处理。
他/云流程
遵守数据隐私法(GDPR 等。)经常让人工智能团队花时间试图绕过法规或缩小项目范围。他会帮助我们将所有数据加密存储在云端,并对加密数据进行计算。
尽管有这种潜力,这项技术还没有准备好大规模采用。在不久的将来,我希望看到更多有限形式的高等教育,如“可搜索加密”和“多方计算”成为主流。这些解决方案或多或少能达到同态加密所能达到的效果。但是,他们没有何的主要缺点:运算速度慢(6**)。**
目前,同态加密非常慢。这部分是因为同态加密比明文运算具有更大的计算开销。
虽然这项技术已经存在了 40 多年,但计算障碍使它只能停留在学术/研究领域。
新的商业模式
从商业角度来看,将机器学习算法的执行委托给计算服务,同时保持训练和测试数据的机密性将成为可能。这可能是行业的重大变革,并改变云行业。
他还将促成几家竞争公司之间的合作。要理解为什么,首先要分析云计算的兴起。云服务提供商的成功(例如:Azure、Google Cloud 等。)可以解释为在数据中心进行了大量投资,以提供帮助小公司降低成本的服务。
很快,我们可以想象一个用户使用 API 将其加密的数据发送到云端,并从机器学习模型中获得加密的结果。在整个过程中,数据既不会被解密,也不会存储在云中。因此,云提供商无法访问用户的数据。
然而,采用这些服务的一个障碍与云提供商处理的数据的隐私和保密性以及该数据的商业价值/保护敏感数据处理的法规有关。通过利用 HE,云公司可能能够说服新公司使用他们的服务。
他将实现以前不可能实现的新商业模式。
他将帮助创建一个全新的数据行业,将拥有数据的公司与需要数据的公司或个人结合在一起。这种情况使得现有的敏感或受监管数据资产能够以以前被认为不可能的方式被使用。
我希望看到更多的数据市场,使公司能够利用他出售他们的数据。
由于最近的危机,创造新的收入来源的需要变得更加具有战略意义。因此,越来越多的公司开始分析如何利用现有的数据资产。
他可以帮助公司安全地利用数据赚钱,同时保护客户和数据本身的隐私。我希望看到更多专门创建数据市场的创业公司,使公司能够使用 he 出售他们的数据。
通常,公司可能最终拥有与其业务完全无关的大量有价值的数据集(与制造过程相关的数据,等等)。).因此,他们应该寻找一种方法来将这些资产货币化,并将其提供给数据科学家,这些科学家寻求额外的训练数据,以使他们的人工智能系统更加准确,同时保持底层数据的隐私和安全。
在市场营销中,公司经常需要在顾客旅程的每一步(线上和线下)收集数据,以构建购物体验的完整画面。然而,由于数据隐私法规,一些有趣的潜在数据源仍然遥不可及。同态加密可能有助于公司在遵守隐私法规的同时利用新的数据源。
大多数人工智能营销项目缺乏完全准确的上下文数据。
人工智能厂商可能熟悉数据可用性的问题。在一些用例中,人工智能供应商需要更多的数据来成功进行概念验证(缺乏准确性等)。).然而,由于法律原因,这并不总是可能的。利用 HE,人工智能供应商可以访问额外的数据,并在真实数据(银行、医疗机构等)上展示他们的算法。).
他将通过共享数据来帮助竞争对手公司进行合作。
谈到合作,我们可以想象,由于同态加密,同一行业的公司将开始共享数据,并创建新的流。保证数据隐私和经济回报的可能性可能有助于激励通常不愿分享公司数据的参与者(见:联合学习)。
**联邦学习:**一种机器学习技术,它在多个分散的边缘设备或保存本地数据样本的服务器上训练算法,而不交换它们( 7 )。
在具体的使用案例中,从 AI 的角度来看,与类似公司共享数据是最好的解决方案。事实上,你可能会遇到竞争对手的金融机构,它们可能会认为,围绕某些共同风险(如洗钱)开展合作符合它们的利益。通过利用 HE,公司可以将他们的数据集中起来“共同构建反洗钱模型,同时保持他们的敏感客户数据的私密性”( 8 )。在医疗保健行业也可以找到类似的使用案例。
可以肯定的是,在未来几年里,他将会带来更多的突破。正如世界经济论坛( 9 所提到的,数据共享已经帮助了很多行业。例如:
- 用于医学研究的大型集合患者数据
- 实时位置数据让城市交通更加智能
与许多突破性技术一样,市场对 he 的采用将取决于利用 HE 的用例数量。我预计会有越来越多的初创公司变得专门从事同态加密的实施,而咨询公司可能会帮助公司接受与竞争对手分享更多数据的想法。
有关同态加密的更多信息,我推荐以下链接:
- 同态加密相关项目
- 超越信任:为什么我们需要数据共享模式的转变
- 用于机器学习的全同态加密
- 什么是同态加密?
- 使用全同态加密保护云计算
- 同态加密能实用吗?
- 了解数据加密的新趋势,它承诺为人工智能提供更好的隐私和安全性
homscedasti-whatsidity?
当数据科学借用玛丽·波平斯的话
大家好,今天我们要谈论的是同音异义性,也就是数据科学中最难发音的词。这将是一个简短的概述,因为与所有数据科学一样,进入杂草中的机会非常大。
那么什么是同方差呢?字幕上说它是从《欢乐满人间》中借用的,但实际上,这个词源于希腊语。我们有前缀 Homo- 来自希腊语,表示“相同”,我们加上- skedacity ,或 skedastikos ,根据韦氏词典的说法,希腊语表示“能够分散”。所以同方差意味着相同或相似的离差。好了,完成了,现在我们不用再谈了。
哈!开个玩笑,我们将向您展示一些图形,以便您可以真正了解正在发生的事情。如果你想把它分解成简单的英语,我们可以观察数据的分布,并确定误差项,或任何导致我们的数据不整齐一致的东西,在所有的数据点上都是相同的。这导致了一些非常可预测的结果,以统计为生的人喜欢看到同质性,但并不总是如此。同方差确实提供了一个坚实的可解释的地方来开始他们的分析和预测工作,但有时你希望你的数据是杂乱的,如果没有别的原因,只是说“这不是我们应该寻找的地方。”
线性回归中的同方差
让我们来看看同性恋是什么样子的,好吗?要真正知道发生了什么,你还必须知道异方差或它的对立面。如果某样东西不是异方差的,它要么是异方差的,要么两者都有。我们可以使用数学方法,通过检查方差或运行 F 检验来确定某样东西是同方差还是异方差,但最简单的检查方法是运行散点图并查看数据。可视化太棒了!
茄子,墨西哥胡椒,花
现在,在上面的图表中,我们可以看到我的二手车线性回归价格预测项目的一些基本散点图相关性。如果我们知道同异方差意味着相同的分布或离差,那么上面的三张图表示同异方差还是异方差?如果你说异方差,你就赢了!我们看到的是一个典型的异方差的例子!
异方差分布的一个特征是趋向于锥形,正如我们在最右边的图中可以清楚地看到的。它们也可以看起来像我们在左图和中间图中看到的茄子和墨西哥胡椒。基本上,任何时候我们不能自信地通过我们的数据画一条线,并且知道我们得到了大多数值的范围内,那么我们可以开始怀疑异方差!
那么,同性恋是什么样子的呢?这是一个同方差散点图的样子:
这并不完美,但是初步观察,你可以说这倾向于同质化。它肯定比前面的图更具同质性。您可能会注意到,在这个图中有大量的异常值。在线性回归中,异常值对确定数据集的同方差有很大影响。根据它们的影响程度,如果它们对结果没有实际影响,您可以选择忽略它们,或者如果有显著影响,您可以选择进一步转换数据。如果它们倾斜得太厉害,你可以尝试添加更多的特性,或者完全抛弃这个模型。
不管离群值的存在,我们可以看到我们的模型成功地在所有数据点的合理距离内。这满足了我们对“同分布”的定义也就是说,它们沿着我们的模型的线类似地分布。要记住的一件重要的事情是,不管你读了多少教科书,或者像这样的博客,当涉及到真实世界的数据时,从来没有真正的同质性。真实的世界嘈杂、混乱、充满谎言,这将会影响你的数据。因此,所有的模型都会有些混乱,所以我们希望尽可能接近同方差,除非进一步分析残差和进行额外的测试,否则我们可以确信我们观察到的是同方差。
结论
我希望你喜欢这个关于数据科学中最有趣的词的简要概述。对我来说,这可能是我有生以来最难发音的单词。
同异方差,或接近同异方差,是想要得到一个工作模型的数据科学家的黄金标准,事实上,对它的测试,或对异方差的测试是开发这些模型的一个关键组成部分。让它们运行并确认它们意味着运行一个好模型和一个坏模型的区别。
所以下次你看到那个圆锥体的时候,记住,它不是同性恋!
蜜罐&非洲:用 Kibana & SpectX 分析网络威胁
网络安全与非洲
非洲各地的网络威胁— Kibana(弹性地图服务)
围绕网络安全的讨论通常集中在世界上四大恶意攻击者身上。美国、俄国、中国&朝鲜,讨论范围从大规模数据泄露到国家支持的对基础设施的恶意攻击(例如stat xnet或 BlackEnergy 2 )。2019 年,我构建并部署了一个蜜罐系统,用来吸引攻击者并监控和记录活跃的网络事件。蜜罐系统被设计成模仿真实的系统,攻击者在侵入系统之前不会知道其中的区别。它可用于检测攻击或使攻击偏离合法目标。它还可以用来获取有关网络罪犯如何运作的信息。但是我对这些数据的关注是在非洲。我想了解网络安全的前景,因为最近网络安全和技术已经成为整个非洲大陆宣言和政策的焦点。但是作为一个大陆,非洲是互联网普及率最低的地区之一。这对网络安全格局有何影响?
非洲有网络安全问题吗?
我会说是,原因如下。2018 年 1 月,许多媒体报道(首先由法国报纸《非洲世界报报道)称,在埃塞俄比亚亚的斯亚贝巴的非洲联盟总部发生了一起令人担忧的违规事件。
非洲联盟是一个大陆联盟,由位于非洲大陆的 55 个成员国组成。
漏洞每天都在发生,对吧?但不是像这样。这一违规行为据称持续了 5 年。2012 年,中国出资在亚的斯亚贝巴建造了一座价值 2 亿美元的新建筑,中国公司获得了内部技术基础设施的合同。2017 年,在非洲联盟(AU) 总部建成 5 年后,分析师发现,从 2012 年到 2017 年 1 月,数据传输活动在每晚午夜到凌晨 2 点之间处于高峰。我们发现所有系统的数据都被转移到了位于上海的服务器上。中国否认了所有的指控,非盟拒绝对此事发表评论。然而,其结果是,非盟切断了与埃塞俄比亚电信的联系,并对所有电子通信实施了加密,建立了全新的基础设施。但现在问题来了,五年来,什么样的网络政策在监控网络活动?同样值得注意的是,被替换的大部分基础设施是华为网络设备… (如果你有兴趣阅读更多关于这个故事的内容, 请查看贾斯汀·谢尔曼*杜克大学 的报告。)*
让我们来看数据!
- T-Pot 蜜罐— 我写了一篇关于如何部署的指南。
- 我还写了一个如何使用它的指南。
- SpectX——当我无法访问 GUI 并且需要解析日志时使用。可以远程查询日志和进行分析,而无需导入数据。
我如何查看来自非洲的数据?
非洲有 54 个国家,过滤掉所有 54 个国家将花费很长时间,因此我们可以在 Kibana 上使用以下过滤器进行解析:
*{
"query": {
"match": {
"geoip.continent_code": {
"query": "AF",
"type": "phrase"
}
}
}
}*
如果您使用 SpectX 查看日志文件:
*| filter (geoip.continent_code = “AF” )*
其他GeoIP . continental _ codes*😗
*AF - Africa
AN - Antarctica
AS - Asia
EU - Europe
NA - North America
OC - Oceania
SA - South America*
- CC2ASN —为属于世界上任何给定国家的 AS 号码和前缀提供简单的查找服务。
如果你的蜜罐没有访问数据的前端系统,我推荐使用 SpectX 并将其指向你的日志。它自动检测中的列。csv* 文件,您还可以编写一个解析器来给出典型字段的结果:*
*$pattern = <<<PATTERN
$str=(CSVDQS{2,256000}:value| CSVSQS{2,256000}:value| DATA{0,256000}:value);
$header=(BOS LD EOL);
$FS=',';
$header?
$str:f__timestamp $FS, $str:geoip_country_name $FS,
$str:geoip_continent_code $FS, $str:geoip_country_code2 $FS, $str:src_ip $FS,
$str:type $FS, $str:host $FS, $str:link $FS, $str:message
EOL
PATTERN;
LIST('file://Elastic/TitanLogs.csv')
| parse(pattern:$pattern)
| select(_unmatched, *)*
SpectX —查看蜜罐数据的另一种方式 Stephen Chapendama 截图
审查这些数据描绘了一幅有趣的非洲网络安全图景。3 个月内,蜜罐遭受了2186197 次* 攻击。25,787 来自非洲。*
按国家/地区列出的前 5 大攻击直方图
尼日利亚、南非、肯尼亚、津巴布韦和突尼斯 Stephen Chapendama 截图
过去几周,来自尼日利亚的日志有明显的峰值,因此决定通过过滤以下内容进行调查:
*{
"query": {
"match": {
"geoip.country_name.keyword": {
"query": "Nigeria",
"type": "phrase"
}
}
}
}*
有趣的是,在 6000 次攻击中,有 4620 次来自一个 IP 地址,这使得尼日利亚的调查变得更加容易。嗨,41.203.76.251😒令人惊讶的是,这是一个在加纳注册的网络,所以有人试图掩盖他们的踪迹。自 2019 年 9 月首次被报告以来,这一威胁行为者一直活跃在 AbuseIPDB 上,有 553 份报告,目前已被列入 Talos 安全情报黑名单,大多数攻击集中在暴力和 SSH 攻击上。
这个 IP 已经被举报 553 次了!—由 AbuseIPDB 提供
帮助您调查的开源资源:
- 这是我在调查 IP 地址时最喜欢的信息来源之一。通常,安全分析师会连接 API 并自动报告恶意流量,因此它总能让我大致了解一个 IP 最近一次活跃在可疑行为中的时间,以及人们看到的攻击类型。它还提供了批量 IP 检查。
- 思科的 Talos Intelligence(Talos Intelligence)—我经常使用这个平台作为第二信息来源来确认我可能已经知道的事情。思科 Talos 的优势在于,它还能给我提供关于垃圾邮件、邮件数量和网络声誉的信息。
漏洞呢?
大多数基于 Windows 的攻击都试图利用CVE-2001–0540,Windows NT 和 Windows 2000 中终端服务器的内存泄漏,这使得远程攻击者能够通过大量畸形的 RDP 造成拒绝服务(内存耗尽)。在大多数非洲政府大楼里,经常没有修补的旧版本窗户随处可见,更不用说私营部门了。在一些国家的农村地区,大多数电脑没有连接到互联网,这反过来保护他们免受威胁,因为他们通常依赖簿记和纸质记录。由于蜜罐也在监控 RDP 的攻击,数据如下:
RDP 攻击面 Stephen Chapendama 截图
CVE 的笔记:
如果您对部署以服务器为中心的蜜罐感兴趣:
- Amun —漏洞仿真蜜罐
- 蜜罐 —低交互服务器端工控系统蜜罐
- KFSensor —基于 Windows 的蜜罐入侵检测系统(IDS)
- 蜜罐 —低交互蜜罐和网络安全工具,用于捕获针对 TCP 和 UDP 服务的攻击
互联网普及率低对非洲大陆有什么影响?
非洲也有恶意机器人和攻击者的问题。尽管欧洲大陆和世界上一些国家的互联网普及率最低,但网络攻击者正在寻找一种针对企业的方法。但是根据国际电信联盟收集的数据,事情正在发生变化,国际电信联盟是联合国的一个国际专门机构,负责信息和通信技术方面的问题;2011 年,13.5%的非洲人口接入了互联网,而当时非洲人口占世界人口的 15% ,这意味着当时世界互联网用户的 6.2% 是非洲人。
来自 Statista 的关于全球互联网渗透率的数据。
到 2019 年,从国际电信联盟发布的数据来看,非洲28.2%的地区以每 100 名居民为单位拥有互联网接入。相比之下,亚洲&太平洋地区 48.4% 的互联网接入率与欧洲的 82.5% 相比。
从蜜罐数据来看,令我惊讶的是,来自塞舌尔的黑客比来自南非的黑客与蜜罐互动得更多。一个常见的误解是,根据南非的面积,你会认为它的互联网普及率更高。非洲的互联网接入往往分布不规则。塞舌尔在 2017 年,37%的人口拥有互联网接入,相比之下,南非只有 11%的人口拥有互联网接入。然而,值得注意的是,与其他大陆相比,这些数字并没有反映出非洲互联网使用的复杂性。例如,网吧亭现在在英国已经很少见了,但是在非洲,这仍然是人们非常流行的上网方式。但撇开这些信息不谈,非洲电信市场的增长速度比世界其他地区都要快。
结论
在网络安全方面,看到非洲互联网的发展是积极的一步。然而,移动货币的采用和金融科技的繁荣也将带来针对这一领域的网络犯罪的新增长。但随着互联网变得越来越容易访问,它为用户提供了跟上时代和学习基本网络概念的机会。肯尼亚和尼日利亚都有活跃的网络安全社区,爱好者和商业领袖经常在主要城市定期聚会。2017 年的一份关注非洲网络安全的报告提到,非洲的银行和金融服务占了非洲大陆网络犯罪损失的近四分之一,其次是政府、电子商务、移动交易和电信。
普华永道在 2019 年 1 月发布了他们的第 22 届年度全球首席执行官调查,网络威胁被确定为全球增长的第五大威胁,排在过度监管、政策不确定性、技能可用性和贸易冲突之后。随着这一行业的持续增长,它将为非洲的失业者提供就业机会。
总之,随着非洲互联网使用的增长,网络足迹也将增长,这创造了一个机会之窗,造就了下一代网络安全专家,但与此同时,它也将为世界制造新的威胁因素。企业必须适应,社区必须接受教育,最终,非洲将全部连接起来。
延伸阅读:
作者:斯蒂芬·查彭达玛
钩状的
大型科技公司如何开发令人上瘾的应用程序
照片由 Alexa Suter 拍摄(通过 Unsplash
- 为什么脸书吸引了我们的注意力,而其他一些应用却没有?
- YouTube 遵循什么基本原则来确保用户的持续参与?
- 你希望一款应用能为你解决什么问题?
行为发生的条件
B.J. Fogg 有一个公式说,三个要素——动机(M)、能力(A)和触发因素(T)——必须在足够的程度上共存,行为(B)才会发生。
当你有一个高能力、低动机(脸书)或低能力、高动机(魔兽)的应用时,触发器就成功了。当你能力低、动机低时,触发器就会失效(C++编码)。
福格行为模型(通过维基百科
执行一个行为的可能性取决于你的动机、能力和触发因素是否都实现了。
期待比获得奖励更让你快乐
作为社会动物,我们需要建立社会纽带,获得归属感。当我们在现实生活中无法获得情感支持时,我们会求助于虚拟社交网络来寻求情绪缓解。社交媒体上催产素、血清素和多巴胺的突然激增让我们感到快乐。
研究人员观察到,当大脑期待奖励时,多巴胺水平会激增。伏隔核帮助大脑形成对显著环境刺激的记忆。伏隔核不是在你收到奖励的时候被激活,而是在你预期它的时候。
在罗伯特·萨波尔斯基·⁴做的一项实验中,猴子在看到光(信号)后按下一根棒十次(工作),就会得到食物奖励。当猴子看到信号时,多巴胺会立即释放,甚至在它们为之努力之前。
猴子一看到信号,多巴胺就会激增。(经由苏珊·温申克 ⁵)
预期比即时的满足让你更快乐。与先入为主的观念相反,萨波斯基的实验发现不可预测性增加了我们的预期。手指轻轻一扫就能在网飞调出意想不到的视频,这有点类似于玩⁶.的赌场老虎机
一个动作越简单,你就越有可能去做
十年前,在网上分享自己的观点并不像今天这么容易。首先,你必须购买一个域名和一个网络服务器。然后你需要用 WordPress 或者 Blogger 建立一个博客平台。另一方面,在你真正开始写之前,你必须安装插件,修改管理设置。自托管的博客不保证流量。你可能需要做搜索引擎优化来赚钱你的博客。
Twitter 已经不成比例地降低了进入博客世界的门槛。Twitter 刚推出时,每个状态只允许 140 个字符。现在 Twitter 已经把字数限制放宽到了 280 个字符。在 Twitter 上,任何人都可以键入几个词,分享一张古怪的照片或热门视频,然后点击“发布”。简单。简单。
冲浪速度越快,人们越投入
谷歌减少了在网上搜索平凡事物所需的认知努力和时间。谷歌自动纠正拼写,保存密码和自动完成表格。它甚至会根据你的搜索历史给出预测结果。冲浪速度越快,人们越投入 ⁷.
为了让搜索像“天气”这样的关键词变得更快更容易,谷歌从网页上索引了万亿字节的信息,给谷歌添加了更多可点击的操作系统。网页根据流量、浏览量、受欢迎程度和相关性进行排名。
算法现在更聪明了
当你对语音助手说“食谱派柠檬”时,你会得到相关的搜索结果。放心 Alexa 或者 Siri 不会给你“背圆周率引理”之类的误用。
即使你拼错了水果“不能私奔”,你仍然可以得到“哈密瓜”和“摩登家庭不能私奔电视剧集”。
如今,语音助手已经极大地改进了其搜索算法,以处理自然语言查询。如果你让谷歌助手把这个翻译成俄语:
“心有余而力不足。”
回到英语,你应该并且会得到同样的东西。
但是如果你在 20 世纪 50 年代用计算机算法来翻译它,你会得到像这个⁸:这样滑稽的误导性翻译
“伏特加很好,但是肉烂了。”
情感触发因素
行动号召、付费广告和促销活动通常会促使新用户订阅某个频道、追随某个影响者并最终购买产品。付费触发器是在新闻网站或社交媒体新闻源上弹出的广告。它们引人注目,但仍然不如关系触发器有效(看到朋友使用抖音会促使你加入),甚至不如自有触发器有效(自愿订阅电子邮件时事通讯)。
渴望社会认可
当用户向 Quora 或 Stack Overflow 提交答案时,其他成员会对该响应进行投票。被评为最佳答案的回答将帮助作者赢得分数。当积分累积到一定水平时,会员将获得授予特权的徽章。
《英雄联盟》(LoL)、《使命召唤》(CoD)和《魔兽争霸》上的巨魔横行霸道,但却被匿名所掩盖。英雄联盟不得不遏制巨魔的滥用。实行了荣誉制度。玩家被赋予了将因果积分奖励给和蔼可亲、受人尊敬的玩家的能力。这样做,他们也变得合作。
劳动导致爱情
宜家向顾客出售预组装家具。自己组装书架的顾客对自己作品的估价是修理工安装书架的五倍。我们在制造产品或服务上投入了越多的时间和精力,我们就越珍惜它。我们热爱劳动成果,不管是我们的还是别人的。
参照效应
你的台灯坏了。你急需一盏台灯。在亚马逊网站上搜索后,你有四种台灯可供选择,它们看起来几乎没有区别。你会买哪一个?
灯 A 售价 29.99 美元。库存只剩 10 个了。
灯 B 售价 26.99 美元。库存只剩 12 个了。
灯 C 售价 25.99 美元。库存只剩 5 个了。
Lamp D 售价 19.99 美元。库存只剩 2 个了。
出于稀缺效应,你可能会选择灯 D。你也会受到锚定效应的影响,因为价格比较信息锚定了你的购物决定。在易贝的 Craigslist 或者你当地的电子商店可能会有更便宜的台灯。然而,通过选择 D,你会觉得好像你赢得了一笔交易。
天赋进步效应
由于天赋进步效应,当人们相信他们接近完成时,他们就会有动力更加努力地工作。
EdX 提供了学习新编程语言的分步指导。你可以保存你的进度,离开然后随时回来。哈佛 CS50 和 MIT6.00.1x 提供视频讲座、宣讲会、动画、基于云的 Ubuntu 环境、基于浏览器的编辑器、论坛和对作业的即时反馈。除了期末考试和参赛证书,所有资源都是免费的。免费的开源材料被赋予给你,这样你在开始学习时就不会感到不知所措。
沉没成本谬论
Instagram、Twitter、脸书和 YouTube 在其存储库中存储了大量你的信息、照片、视频和联系。仅仅是跨平台传输大量数据的想法就足以让大多数人感到恐惧。你在现有社交网络上分享的照片和视频越多,你就越有动力坚持下去。
YouTube 是美国青少年中最受欢迎的在线平台(通过皮尤研究中心 ⁹)
Facebook 是新冠肺炎疫情期间美国成年人使用最多的社交媒体平台(通过商业内幕情报 ⁰)
沉没成本谬论是不合理的。你在一项努力上投入了越多的感情,即使它不再有利可图或有意义,你也会继续投入更多的努力和时间。
如果你在社交媒体上创建内容,你可能有更大的机会接触到更多的人,并以喜欢、评论、分享和忠实追随者的形式获得社会认可。如果你幸运的话,你的视频可能会像病毒一样传播开来,获得数百万的浏览量。但是这些都是很大的假设。
如果你继续追求一个失败的计划,而你有可能扭转局面,那么从长远来看,你可能会遭受更大的损失(时间、努力、金钱、幸福)。社交网络应用可能会吸引、吸引你,并把你进一步拖入无穷无尽的深渊,要求你在未来投入更多的时间和注意力。
互惠偏差
沃伦·巴菲特和查理·芒格认为,随着消费者越来越习惯于习惯性地使用一种产品,他们往往会更少关注价格。如果一种产品的价格提高了一点点,消费者几乎不会注意到。
视频游戏、软件或应用程序通常会提供免费试用或有限的访问权限,以刺激购买行为。Audible 和 Spotify 为新用户提供 30 天的免费试用,可以随时取消,无需支付任何费用。当试用期结束时,输入信用卡信息的免费试用用户将自动转换为付费用户。由于互惠偏见,我们觉得有义务通过支付订阅费来回报 Audible 的青睐。
框架效应
如果给你看这两个看似相似的广告,哪一个听起来更有说服力?
“如果你在下周一之前购买这个大师班在线课程,你将节省原价的 20%。”
“如果你在下周一之前购买这个大师班在线课程,你将获得 20%的折扣.”
大多数人选择了后者。
框架效应影响你对得失的感知。我们试图通过防止损失来维持现状。比起未来的潜在收益,我们更倾向于优先考虑规避损失。禀赋效应让我们高估了我们已经拥有的东西。
当我们感觉良好时,我们会付出更多
克里斯托弗·卡彭特发现了一种心理技巧,可以影响人们给一个向他索要车费的陌生人多少钱。通过调整一些微妙的词语,听众受到潜意识信息的影响,给出更多:
“但你可以自由接受或拒绝。”
在请求的末尾加上这八个字给了人们一种坚定的自主感。人们很乐意帮忙,给了两倍的钱。更重要的是,它在电子邮件以及 Patreon、Indiegogo 和 GoFundMe 等筹款平台上发挥了神奇的作用。
人类的行为很容易受到影响
用户心理可以用来影响人类行为。然而,最好不要出于邪恶的目的滥用知识来创建应用程序。否则,这将被认为是一种操纵、剥削和欺骗自己利益的行为。
参考
- 尼尔·埃亚尔。2014.上钩
- bj .福格。2009.劝导设计的行为模型
- 维基百科。2017.BJ·福格行为模型
- 罗伯特·萨波斯基。2012.多巴胺头奖!萨波斯基论快乐的科学
- 苏珊·温申克。2015.购买的脑科学
- 加州新港。2019.数字极简主义
- 乌尔斯·赫尔兹勒。2012.谷歌速度福音
- 迈克尔. j .嘉宝德。2018.自然语言处理简单介绍
- 莫妮卡·安德森和江晶晶。2018. YouTube、Instagram 和 Snapchat 是最受青少年欢迎的平台
- 商业内幕情报。2020.新冠肺炎疫情期间美国成年人使用的社交媒体平台
- 彼得·贝弗林。2007.从达尔文到芒格寻求智慧
- 克里斯托弗·卡彭特。2013.对“但你是自由的”合规技巧有效性的荟萃分析
TensorFlow 2.0 中的马到斑马循环 GAN
了解如何实现 cycle GAN 最流行的应用之一
我自己生成的图像
当我开始深度学习时,我遇到了马到斑马循环 GAN。使它从其他甘人中脱颖而出的是这样一个事实:性状的转移不再需要 DNA 了!物理特性不仅仅局限于生物课,创造力也不仅仅局限于艺术课。
我很难理解如何实现,但是 TensorFlow API 让我的工作变得更容易了。
我将向您展示马到斑马循环 GAN 的 TensorFlow 实现。
先决条件:
- TensorFlow:版本 2.x
- Python:版本 3.6.7
- MatPlotLib:版本 3.x
- 还有一杯咖啡:)
这篇博客中的所有实现都是受 TensorFlow 的 CycleGAN 教程[1]的启发。
好吧!所以让我们从 Tensorflow 收集预定义的生成器和鉴别器开始。
鸟瞰图
- 生成对抗网络
- CycleGAN
- 导入库
- 输入管道
- 分为训练集和测试集
- 数据预处理
- 绘图
- 发生器和鉴别器
- 损失函数
- 让我们训练我们的模型
- 来源
生成对抗网络
首先,让我们快速地抛出生成对抗网络(GAN)的基础知识,以帮助不熟悉它的读者。让我们想象一个场景,我们想要生成一个属于特定领域的图像。例如,我们想为年轻人设计一套新服装,我们要求计算机来完成这项任务。要做到这一点,我们需要一个时装设计领域空间的代表。假设有一个函数 F 和一个输入图像 X,我们需要一个非常接近目标区域的 Y,其中 Y=F(X)。GAN 是最终能够找到我们的目标域 Y 的近似表示函数 F 的网络
GAN 是如何做到这一点的?这里有一个技巧,解决方案有两个部分:( I)我们需要一个生成器,它不断从随机初始化中生成图像;( ii)我们需要一个鉴别器来区分生成的图像和真实的图像。因此,发电机就像一个新的时装设计师,他对时尚一无所知,但总是蓬勃发展,以复制一个杰作青年服装,而鉴别者是一个高级时装设计师,他可以说新服装有什么错。只要我们的鉴别器善于判断,我们的发生器就能从反馈中获益。在某一点上,我们的发生器将处于从鉴别器获得正反馈的位置。所以我们将使用深度学习来构建我们的生成器和鉴别器。
为了做出一个好的鉴别器,我们需要将生成的和原始的图像输入到我们的模型中,然后通过比较它的决定和实际情况来训练它。对于发电机,它取决于鉴别器的决定,如果它得到正反馈,则表明发电机正朝着正确的方向前进,反之亦然。有趣的是,他们互相学习,并试图重击对方。
渐渐地,生成器和鉴别器都会擅长它们的任务,这样我们就可以把生成器拿出来独立完成服装设计任务。那么 GAN 是如何把马变成斑马的呢?如果我们稍微思考一下,事实上从随机初始化生成一套新衣服类似于从一匹马生成一匹斑马,唯一的区别是这里我们从一匹马的图像而不是随机初始化开始我们的预测。为此,我们需要一个配对的数据集,但是如果我们没有这样的数据呢?如何从不成对的数据中完成这个任务?
CycleGAN
幸运的是,有一种方法可以从不成对的数据中完成这项任务。CycleGAN 背后的主要思想是,我们可以形成一个循环,其中两个生成器工作来来回转换图像,而不是使用成对的数据来训练鉴别器。准确地说,如果我使用一个生成器将我的图像(比如 x)转换为胡须男(比如 y),使用另一个生成器将我的胡须图像(y)转换为正常图像(比如 x’),如果图像 x 和 x’相同,那么我们可以得出结论,我们的 GAN 可以很好地处理不成对数据。
让我们实现马对斑马的循环吧!
导入库
让我们通过导入所有需要的库来预热烤箱。一些库是:
- 张量流
- 张量流 _ 数据集
- tensor flow _ examples . models . pix 2 pix
输入管道
有两种方法可以为模型构建输入管道:
- 从您的计算机上传数据。(这就像冬天下雨一样!)
- 从 TensorFlow 数据集(tfd)加载数据,这是一个相当简单的方法!但约束是,它可能无法满足您的要求。比如说,如果你要研究“莫奈到甘的摄影周期”,你需要寻找其他的存储库。TensorFlow 还拥有广泛的数据集(请查看[2])。
分为训练集和测试集
我们可以进一步将测试集分成验证集,这里没有实现。
现在让我们在代码之前初始化一些参数,这样我们可以根据需要调整它们。
数据预处理
为了防止过度拟合,我们需要将一些预处理技术映射到我们的数据,为此我们需要编写一些函数:
- random_crop :将图像裁剪到随机的高度和宽度,以确保我们的模型可以处理各种尺寸的图像。
random_crop 的代码片段
- 归一化:将像素值范围从[0,255]缩放到[-1,1]。
用于规范化的代码段
- random_jitter :执行论文【3】中提到的随机抖动和镜像。
随机抖动的代码片段
现在让我们定义两个父函数来合并这些代码片段。
- 预处理 _ 图像 _ 训练
预处理图像训练的代码片段
- 预处理 _ 图像 _ 测试
预处理图像测试的代码片段
注意:random_jitter 仅用于预处理训练集,以使我们的模型更进一步。
现在让我们结合所有的片段。
绘图
地图功能:
map(参数 1,参数 2):其中参数 1 是必须映射的函数。参数 2 是数据样本。
shuffle(BUFFER_SIZE)。batch(1)-混洗数据并按样本方式映射预处理技术。
-
让我们将预处理 _ 图像 _ 训练函数映射到训练 _ 马匹和训练 _ 斑马数据
-
让我们将预处理图像测试函数映射到测试马匹和测试斑马数据
唷!完成预处理。
现在,让我们从 train_horses 和 train_zebras 中选取一个随机样本,并在应用我们的预处理技术之前和之后绘制它,以确保我们没有搞砸。
sample_horse.py 的输出
sample_zebra.py 输出
嗯,我们的预处理技术一切都很好
发生器和鉴别器
让我们来设计模型的主干——生成器和鉴别器!
一、发电机:
生成器的体系结构被分成编码器和解码器,这类似于改进的 U-Net 的体系结构。
- 编码器中的每个块将具有以下层:卷积层-> Batchnorm 层-> Leaky ReLU 层。
- 解码器中的每个块都会有以下几层:转置卷积层-> Batchnorm 层-> Dropout 层(仅针对前 3 个块,以避免过拟合)-> ReLU 层。
- 编码器用于向下采样[4]并抓住图像的本质。另一方面,解码器从编码图像向上采样[5]图像。
- 此外,编码器和解码器之间存在类似于 U-Net 的跳跃连接。
二世。鉴别器:
- 鉴别器是一个 PatchGAN,其中输出的每个 30×30 片对输入图像的 70×70 部分进行分类。
- 鉴别器中的每个块将具有以下层卷积层-> BatchNorm 层-> Leaky ReLU 层,并且最后一层之后的输出形状是 batch_size 30 x 30 x 1。
- 因此,鉴别器函数有两个参数:
- 输入图像和目标图像,它应该分类为真实的。
- 输入图像和生成的图像,它应该将其归类为假的。
在循环 GAN 的情况下,我们使用实例规范化来代替批量规范化,我们也可以使用基于 ResNet 的生成器来代替 U-Net。(在我们的例子中,为了简单起见,我们使用 U-Net)。
周期 GAN 需要训练两个生成器(比如 G1 和 G2)和两个鉴别器(比如 D1 和 D2)。
- 生成器 G1 学习转换图像 X 到 Y(马到斑马)
- 生成器 G2 学习将图像 Y 转换为 X(斑马转换为马)
- 鉴别器 D1 学习区分原始图像 X 和生成的图像 X (G2(Y))
- 鉴别器 D2 学习区分原始图像 Y 和生成的图像 Y (G1(X))
我们不打算为生成器和鉴别器编写代码,而是使用在 pix2pix 中实现的 TensorFlow 预定义的生成器和鉴别器。
我们跑吧!
我们的发电机和鉴别器。
check_generator.py 的输出
check_discriminator.py 的输出
这是我们的发生器和鉴别器产生的随机噪声,我们现在该怎么办?
哦是的!你猜对了!为了得到公平的输出,我们需要一个损失函数。
损失函数
发电机损耗:
它是所生成的图像和一个“1”的阵列的 sigmoid 交叉熵损失,使得它允许所生成的图像在结构上变得与目标图像相似。
鉴频器损耗:
鉴别器损失函数采用 2 个输入,即真实图像和生成图像。
- real_loss 是真实图像和 1 的数组的 sigmoid 交叉熵损失(因为这些是真实图像),generated_loss 是生成的图像和 0 的数组的 sigmoid 交叉熵损失(因为这些是伪图像)。
- total_loss 是 real_loss 和 generated_loss 之和。
好了,现在我们的鉴别器能够区分输出是马还是斑马,但它不能确定输入和生成的图像之间的相似性。
为了明确这个问题,我们将使用重建损失。那么什么是重建损失呢?
让我们假设我们已经把一个英语句子翻译成了印地语句子,现在当我把我的印地语句子转换回英语时,它必须与最初的语句相同,这被称为循环一致性。
摘自“使用循环一致的对抗网络进行不成对的图像到图像的翻译”[3]
重建损失:
- 让我们假设图像 x 经由生成器 G1 传递,生成器 G1 产生生成的图像 Y^.
- 并且生成的图像 Y^经由生成器 G2 传递,生成器 G2 产生重建的图像 X^.
- 现在重建损失是 x 和 X^.之间的平均绝对误差
这里我们需要一个名为 lambda 的新参数,这是你可以调整的,它决定了输出与输入相比有多相似。
现在有一个东西叫做恒等损失,生成器 G 负责把图像 X 转换成 Y,恒等损失就是,如果你把图像 Y 馈送给生成器 G,它应该产生真实的图像 Y 或者类似于图像 Y 的东西。
TensorFlow 还允许我们为训练保存检查点(重量),这是完全可选的。
让我们训练我们的模型!
培训过程由 4 个基本步骤组成:
㈠获得预测
㈡计算损失
㈢计算梯度(反向传播)
㈣对优化程序应用梯度
我们需要一个函数来打印每个时期的输入图像和预测图像,让我们定义它。
啊,看起来有点复杂,对吧?
让我们将所有这些步骤合并到一个函数中。
酷,现在看起来不错。
现在我们已经为训练创建了一个函数,我将为每 5 个时期保存一个检查点。我们还可以调整时期的数量以获得更好的准确性,这里我运行了 40 个时期。
一旦训练完成,我们就可以在测试集上测试我们的模型。
以上代码片段的输出
来源
[1]https://www.tensorflow.org/tutorials/generative/cyclegan
[2]https://www . tensor flow . org/datasets/catalog/overview # cycle _ gan
[3] J. Zhu,T. Park,P. Isola,A. A. Efros,使用循环一致对抗网络的不成对图像到图像翻译,《2017 IEEE 计算机视觉国际会议(ICCV),威尼斯,2017 年,第 2242–2251 页,DOI: 10.1109/ICCV.2017.244
https://www.giassa.net/?page_id=174
https://www.giassa.net/?page_id=200
我的 LinkedInhttps://www.linkedin.com/in/murki-sai-srikanth-083093189(随意连接)。
以每月 1 美元的价格托管一个数据仪表板
用 AWS S3、Lambda、Pandas 和 React 在一个周末建立一个动态数据驱动的站点
我想建立一个简单的网站,每天自动刷新显示一个基本的图表仪表板。(以一种我可以与朋友分享的方式自动化我的日常 COVID 分析)。
刷新我的 AWS 技能是一个额外的收获,因为我已经几年没有使用它了。
设计
计划:
- 收集最新的东京 COVID 数据
- 在 JSON 中运行一些计算和输出
- 构建动态 Web GUI,在仪表板中显示最新数据
并发症:
- 源数据在下午 6 点到 10 点之间更新不一致
- 网站必须自动更新,是免费维护
- 必须是超低成本
解决方案:
- AWS Lambda 可以获取和处理数据,Cloudwatch 事件可以安排运行,SNS 会向我发送警报
- React.js w/ Material-UI 和 RE-Chart 为我提供了 GUI
- S3 将主办 React 编译网站& Lambda 生成的数据
通过使用 S3 网站托管选项,与托管 Node.js 或 Python 服务相比,成本低得令人难以置信。
最简单的设计?(图片由作者提供)
界面
由于这是一个低技术 S3 托管网站,唯一的“接口”是我们每天更新的 JSON 文件。我想要用 JSON 建模的 3 个数据集:
- 东京和日本当天的每日指标
- 趋势指标查看历史数字并计算滚动平均值
- 性别和年龄等人口统计数据的细分
一旦我修复了 JSON 格式,我就可以独立地构建前端和后端了。
**# dailyData.json** {“NewTokyoCase”: 258, “NewJapanCase”: 630, “TokyoCase”: 18865,
“JapanCase”: 56462,“LastTokyoCase”: 339, “TokyoCaseChange”: -81,
“TokyoCaseAvg7d”: 256,“TokyoCaseAvg30d”: 293,
“TokyoCaseAvgDiff”: -19, “TokyoCaseAvg30dDiff”: 0}**# dailyTrend.json** [{"name":"2020-02-18","Tokyo":3,"7dayAvg":3.0},
{"name":"2020-02-19","Tokyo":3,"7dayAvg":3.2857142857},
{"name":"2020-02-21","Tokyo":3,"7dayAvg":3.5714285714},
... ]**# dailyDemo.json** [{"name":"Gender_F","value":135.0,"value2":105.0},
{"name":"Gender_M","value":204.0,"value2":153.0},
{"name":"Age_10","value":16.0,"value2":19.0},
{"name":"Age_20","value":111.0,"value2":83.0},
... ]
AWS Lambda 代码库
Lambda 支持多种语言,但是对于这种类型的工作,Python 是合适的工具。代码库非常简单,只需 HTTP 获取 CSV 文件——然后通过一些 Pandas analytics 运行它,并以目标 JSON 格式输出到 S3。
由于缺少源数据更新的信号,我们只能轮询。仅仅检查文件头是不够的,因为文件似乎一直在更新。最可靠的方法是读取整个文件,并在我们看到添加了新日期时处理它。
代码基础很简单,需要封装在 Lambda 函数中,并返回带有 HTTP 代码的 JSON。
fetch 方法使用请求库,并传回结果以供下一步处理。
analyzeAndSave 代码使用 pandas 和 AWS 的 boto3 库向 S3 写入数据
React.js 代码库
使用 React 样板,如 Material-UI dashboard 及其变体,可以使 GUI 工作得非常快。我削减了材质感提供了一个简单的仪表板。
基于材料设计的材料感:作者的图像
GUI 只是在页面加载时获取 Lamda 生成的 JSON 文件。它将 JSON 数据传递给 re-chart 图形和图表。由于材质的主题,默认情况下看起来不错。
记住,React 编译成静态 JS 文件,并且纯粹是一个客户端应用程序(不需要后端 Node.js!).我只是将静态文件复制到 S3,提供给浏览器,这是一个非常便宜又简单的解决方案。
详述 React 超出了本文的范围,但是我强烈建议学习它[6]。下面是我们获取 JSON 并传递给组件的一些关键代码片段:
re-chart 代码也很基本,从 main.js 调用:
<SimpleReactiveBarChart data={this.state.dailyDemo.slice(2,12)} />
上面的组合创建了一个漂亮的图表,可以跨浏览器工作,有浮动工具提示、图例等,代码很少:
作者图片
部署
让你的 S3 水桶像一个网站一样简单,只需打开一个选项框(并确保文件是公开可见的)。
作者从 AWS 控制台提供的图片
要构建和部署 React,我们只需更新节点的包管理器(package.json ),以调用 AWS CLI 将目标构建文件复制到 S3:
cd ~/git/tokyocovid/material-sense/buildaws s3 cp precache-manifest.*.js s3://tokyocovid/aws s3 cp static s3://tokyocovid/material-sense/static — recursive
后端 Lambda 代码的设置和部署有点棘手,因为 1)您无法轻松地测试 Lambda 2)一些库(如 Pandas)不在默认的 Python env 中,但除此之外,您可以直接压缩和复制。使用 AWS CLI 将文件直接复制到 AWS Lambda:
zip aws_lambda.zip lambda_function.pyaws lambda update-function-code — function-name fetcher — zip-file fileb://aws_lambda.zip
Lambda 有一个很棒的特性,叫做层来管理依赖关系——你可以安装或引用现有的配置(层)来集合你需要的东西。在我的情况下,下面这 3 个支持我所需要的(核心 Py SciPy,Pandas 和 Requests)。
作者从 AWS 控制台提供的图片
最终产品:
虽然这不是开创性的,但对于周末的工作来说,我还是很满意的。它节省了我手动挖掘数据和动态重新运行不同测量的时间。我在运行或更新网站时遇到 0 个问题。
图片由作者查看现场@http://tokyocovid.foostack.org
请注意下面的“反应式”显示屏在移动设备上的表现。
向左移动,向右调整浏览器大小。(图片由作者提供)
到目前为止的账单:
AWS 控制台上作者的图像
给你。这花了我一个周末的时间,我在飞行中学会了 Lamda layers。我怀疑,如果我有 1 亿次点击,我的成本将远远超过 1 美元/月,但我很高兴处理这个问题,如果它发生了。
看看 github 源码,开始你自己有趣的项目。
参考
[1]材料感:【https://github.com/alexanmtz/material-sense】T4
React 的材质界面:https://material-ui.com/
[3]我这个项目的 GitHub:https://github.com/dougfoo/tokyocovid
[4]东京的 COVID 来源站点:https://stopcovid 19 . metro . Tokyo . LG . jp
[5]AWS 上的托管站点:【http://tokyocovid.foostack.org/
【6】正派 React 视频教程:https://www.youtube.com/watch?v=sBws8MSXN7A&t = 1527s
从 Linux VPS 托管 Jupyter 笔记本服务器
如何从您的 Linux 服务器托管 Jupyter 笔记本服务器。
(jupyter logo src = http://jupyter.org/)
Jupyter 笔记本是行业标准工具,使统计计算编程更加容易。这是因为在编写统计数据时,您可能经常想要读取返回,并且能够编辑和重新运行代码。此外,拥有一个虚拟内核来做这件事也非常有用。虽然 Jupyter 笔记本很适合在本地机器上使用,但很难忽略它们是在 HTTP 服务器上运行的。鉴于 Jupyter Notebooks 是通过网络浏览器访问的,这一点尤其正确。
因此,由于 Jupyter Notebooks 是在 web 浏览器中运行的,并且具有成熟的非开发服务器,甚至具有密码和写保护,因此很容易理解为什么您可能希望在虚拟专用服务器(VPS)上运行 Jupyter。)近年来,服务器的租金已经便宜了很多。此外,你可以很容易地租到硬件比你的计算机好得多的服务器。最重要的是,这是一种在大型团队中共享文件,甚至是文本文件的好方法,因为您甚至可以将 Jupyter 用作文件浏览 GUI、bash 终端和文本编辑器。
首先,要在您的 VPS 上建立并运行一个 web 服务器,您当然需要通过 SSH 连接到该服务器。
ssh emmett@my-ip-is-hidden
负载平衡器/网络服务器
为了在 Linux 上为 wsgi 建立一个 web 服务器,我们需要一个 web 服务器。我喜欢使用 NGINX,但是也有几个选择,比如 Apache,它也经常被使用。然而,如果你是新手,我强烈建议你使用 NGINX。NGINX 比 Apache 快,在本文中,我将向您展示如何设置它来托管本地服务器。
要使用 NGINX(顺便说一下,发音是 engine-ex,)我们首先需要安装它。我很确定 NGINX 在所有的包管理器中都是可用的,但是如果你使用的是 Suse 服务器,我当然不能考虑 man。
sudo dnf install nginx
一旦我们安装了 NGINX,我们就可以继续配置我们的 web 服务器了。首先,cd 转到/etc/nginx/conf.d,这是存储 nginx 配置文件的地方。
cd /etc/nginx/conf.d
现在打开一个新的。conf 文件,请确保您以 root 用户身份运行,因为您可能没有权限在此处保存文件:
sudo nano mysite.conf
接下来,我们将创建一个配置文件。如果您的 VPS 上没有运行任何服务器,并且您可以使用端口 8000,那么复制我的就没有任何问题:
**server** {
**listen** 80;
**server_name** your.ip.here;
**location** / {
**proxy_pass** http://127.0.0.1:8000;
**proxy_set_header** Host $host;
**proxy_set_header** X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
现在只需 ctrl+o 然后按 y 保存文本缓冲区,并使用 ctrl+x 关闭 Nano。接下来,我们必须取消默认 NGINX 配置文件的链接。
sudo unlink /etc/nginx/sites-enabled/default
现在,您可以使用以下命令重新加载配置:
nginx -s reload
要测试您的配置,您可以安装并运行 jupyter-notebook,然后转到 NGINX 配置文件中提供的域或 IP。
sudo dnf install jupyter-notebook && jupyter-notebook
现在,如果你在浏览器中浏览你的域名或 IP 地址,你应该会到达 Jupyter。
监督者
最后一步是设置一个管理员来运行 jupyter-notebook 命令。根据您的发行版,您可能需要安装以下任一软件
sudo apt-get install supervisor
sudo dnf install supervisord
现在,我们将 cd 转到我们主管的配置目录。
/etc/supervisor/conf.d/
现在,正如您可能已经预料到的,我们需要更新另一个配置文件。
欢迎来到开发运营的世界。
这是我的,你可以用它作为你的基础。
[program:flask_app]
directory=/
command=jupyter-notebook
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/appname/lognameerr.log
stdout_logfile=/var/log/appname/lognamestdout.log
很简单,对吧?
现在只需重新加载主管,
sudo service supervisor reload
现在,您的笔记本电脑服务器将启动,您可以随时与其他人一起访问和使用它!
结论
我认为拥有自己的远程 Jupyter 笔记本服务器非常酷!这是我在团队中使用的最好的方法之一,因为你的整个团队可以同时访问和修改同一目录中的文件。此外,您将可以使用 Bash、笔记本和一个图形文本编辑器。虽然我确实喜欢 Nano,但我可以理解为什么它可能会让那些不像我这样的终端狂热者感到有些畏惧。您还可以将它用作网络附加存储的本地解决方案,尤其是如果您打算将所有数据科学项目都放在那里的话。这是一个很好的方法,通过把旧电脑变成服务器来利用它。总而言之,很难不发现 Jupyter 服务器的巨大用途,无论是在本地、VPS、NAS 上,还是在 2000 年代初的 2GB RAM 笔记本电脑上运行。
在 AWS Fargate 上使用 Terraform 进行基本身份验证的主机 Polynote 笔记本
本文将帮助您使用 Terraform 在 ECS 上轻松部署安全的 Polynote 环境。
最近我发布了一篇关于旋转 Jupyter 笔记本的文章。本文描述了如何使用 Terraform 轻松启动 Jupyter 笔记本环境。这篇文章将大致相同,但然后与 Polynote 笔记本。
[## 使用 Terraform 在 AWS 中将 Jupyter 笔记本电脑升级为 ECS 服务
在这篇文章中,我将解释如何使用 Terraform 在几秒钟内在 AWS 上运行 Jupyter 笔记本。
towardsdatascience.com](/spinning-up-jupyter-notebooks-as-ecs-service-in-aws-with-terraform-805ac111d74b)
为什么我发表了两篇有些相同的文章?嗯,Jupyter 笔记本有一个问题,对我们(我所在的团队)来说,这个问题使它无法工作。问题是当你刷新页面时输出会丢失,这是一个已知的问题。根据我在互联网上搜索后的理解,这只是一个可视化/表示错误,你的脚本实际上会在后台继续运行,但输出会发送到浏览器会话,当你刷新页面或在另一个设备上打开它时,输出会丢失。除了这个问题,Jupyter 并不是最适合我们的需求,设置需要一些额外的步骤,这些步骤与上一篇文章无关:
- Polynote 需要一个配置文件,该文件需要包含在定制的 Docker 映像中。
- Polynote 环境不能像 Jupyter 笔记本一样用令牌或密码来保护,所以我们需要为此添加一个额外的层(先睹为快:将使用 NGINX)。
先决条件
要使这个设置工作起来,有一些先决条件,让我们从已经启动并运行的 AWS 服务开始(设置这些不在本文的讨论范围之内):
- ECS 集群
- 应用程序负载平衡器
- Route53 内的托管区域和域
我们将与 Terraform 合作,所以你也需要在你的设备上安装那个。Terraform 使您能够以代码的形式组织和管理您的(云)服务和基础设施。您还需要一个像 AWS 命令行界面 (CLI)这样的工具,配置一个概要文件,这样我们就可以,或者说是 Terraform,与您的 AWS 环境进行通信。或者,您可以在您的设备上安装 Docker ,以防您想要更改 Polynote 配置文件并重建 Docker 映像,或者更改 NGINX 映像并重建它。
下载或克隆文件
现在,我假设您已经设置了所需的 AWS 服务,并且已经在您的计算机上安装了所需的软件。出于本文的目的,我已经建立了这个 GitHub 库,在这里你可以找到我们在这里讨论的代码片段的所有最终文件。为了避免可能的错误,我建议将存储库克隆到您的计算机上/从 repo 下载文件,而不是复制并粘贴本文中的所有代码片段(有些部分将不讨论,因此它们不包含在本文中)。
知识库结构
如您所见,存储库包含 3 个文件夹:
- 多项式码头
- nginx
- 将(行星)地球化(以适合人类居住)
polynote-docker 文件夹包含创建官方 Polynote docker 映像的 Docker 映像所需的所有文件。简而言之;通常,当你想运行 Polynote Docker 映像时,你需要一个 config.yml 文件。我已经将该文件包含在自定义映像中,因此我们不必在 ECS 中添加卷。我们不会进一步讨论 Docker 映像,因为我已经将一个映像推送到 Docker Hub,它将在本设置中使用。我还创建了自己的 NGINX 映像,基于这个映像:dtan 4/NGINX-basic-auth-proxy。这张图片向我们的 NGINX 添加了基本的 auth,并且我为 websockets 添加了一个额外的路径,这是 Polynote 工作所必需的。 terraform 文件夹包含在 AWS 上设置整个环境所需的所有文件,该文件夹由以下三个文件组成:
- main.tf(“魔法”发生的地方)
- vars.tf(在 main.tf 中使用的变量声明)
- vars.tfvars(为变量赋值)
编辑变量. tfvars
我们将从编辑 vars.tfvars 文件开始,因为这些变量值将在后面的main . TF**文件中使用。您必须重新访问除了cpu
和memory
之外的所有变量值,当然,除非您想要增加或减少资源。
变量. tfvars
*vpc_id = "YOUR_VPC"
region = "eu-west-1"
profile_name = "LOCAL_PROFILE_NAME"
ecs_cluster_name = "CLUSTER_NAME"
loadbalancer_arn = "LOAD_BALANCER_ARN"
hosted_zone_id = "HOSTED_ZONE_ID"
fargate_subnets = [
"PRIVATE_SUBNET_1",
"PRIVATE_SUBNET_2",
"PRIVATE_SUBNET_3"
]
cpu = 1024
memory = 2048
domain = "mydomainname.com"*
所有信息都可以在 AWS 控制台中找到,除了配置文件名称,这将是您在本地计算机上用来配置 AWS CLI 的 AWS 配置文件名称,例如通过
aws configure --profile=test
,这里的“测试”是配置文件名称。如果您没有设置配置文件名,它可能会设置为“默认”。
Gain Insight Into the Working of The main.tf File
现在,让我们看一下 main.tf 文件,正如我之前所说的,所有的“魔法”都发生在这里。这个文件包含了我们需要的所有资源来使这个设置工作。幸运的是,如果我们做得很好,我们唯一要做的就是运行一个命令,Terraform 会完成剩下的工作,所以知道文件中有什么是很好的。我不会深入研究地形的概念。
获取现有 ECS 集群
*data "aws_ecs_cluster" "ecs_cluster" {
cluster_name = var.ecs_cluster_name
}*
在上面的块中,将检索现有的 ECS 集群,稍后将在脚本中使用该集群。
生成唯一标识符
*resource "random_string" "random_string" {
length = 8
special = false
}*
这可能非常令人困惑,为什么要生成随机字符串呢?因为我们希望能够同时启动多个环境,所以我们需要给一些资源名称添加一个独特的部分。我们正在创建的某些资源不能与现有的同类型资源同名。如果我们不添加这个独特的部分,并且人员 A 已经有了一个正在运行的 Polynote 环境,那么人员 B 就不能创建一个新的环境,因为 AWS 中已经存在一个具有该特定名称的特定资源。
添加任务执行角色
*resource "aws_iam_role" "ecs_task_execution_role" {
name = "ecsTaskExecutionRole-polynote-${random_string.random_string.result}"
assume_role_policy = <<ASSUME_ROLE_POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
ASSUME_ROLE_POLICY
}data "aws_iam_policy" "amazon_ecs_task_execution_role_policy" {
arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}resource "aws_iam_role_policy_attachment" "policy_role_attachment" {
role = aws_iam_role.ecs_task_execution_role.name
policy_arn = data.aws_iam_policy.amazon_ecs_task_execution_role_policy.arn
}*
上面的代码行将创建一个任务执行角色,并将已经存在的amazonectaskexecutionrolepolicy*(由 Amazon 提供)附加到该角色,这允许您将容器的日志发送到 CloudWatch。如果您需要访问 Polynote 笔记本中的其他 AWS 服务,您需要编写必要的策略,并将它们附加到一个新角色(任务角色)上,并将其作为task_role_arn
添加到polynote_task_definition
中。我们不会在本文中讨论这个问题,但是所需的部分可以在 Git 存储库中找到,并且现在已经被注释了。*
添加云观察日志组
*resource "aws_cloudwatch_log_group" "polynote_ecs_log_group" {
name = "/aws/ecs/polynote-${random_string.random_string.result}"
}*
出于日志记录的目的,我们还创建了一个日志组。
生成密码以访问笔记本
*resource "random_string" "password" {
length = 24
special = false
}*
因为我们想用至少一个密码来保护 Polynote 笔记本环境,所以我们生成了一个随机字符串。这一步需要重新考虑,因为在当前的设置中,密码将作为纯文本环境变量传递给容器。最好在秘密管理器中设置一个秘密,并使用任务定义中的secrets
属性来解决这个问题。
创建 ECS 任务定义
*resource "aws_ecs_task_definition" "polynote_task_definition" {
family = "polynote-${random_string.random_string.result}"
requires_compatibilities = [
"FARGATE"]
network_mode = "awsvpc"
cpu = var.cpu
memory = var.memory
execution_role_arn = aws_iam_role.ecs_task_execution_role.arncontainer_definitions = <<TASK_DEFINITION
[
{
"essential": true,
"image": "registry.hub.docker.com/sschrijver/polynote-basic-config:latest",
"name": "polynote",
"portMappings": [
{
"containerPort": 8192,
"hostPort": 8192
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-region": "${var.region}",
"awslogs-group": "${aws_cloudwatch_log_group.polynote_ecs_log_group.name}",
"awslogs-stream-prefix": "polynote-${random_string.random_string.result}"
}
}
},
{
"essential": true,
"image": "registry.hub.docker.com/sschrijver/polynote-nginx:latest",
"name": "nginx",
"dependsOn": [
{
"containerName": "polynote",
"condition": "START"
}
],
"portMappings": [
{
"containerPort": 8080,
"hostPort": 8080
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-region": "${var.region}",
"awslogs-group": "${aws_cloudwatch_log_group.polynote_ecs_log_group.name}",
"awslogs-stream-prefix": "nginx-${random_string.random_string.result}"
}
},
"environment": [
{
"name": "SERVER_NAME",
"value": "127.0.0.1"
},
{
"name": "PORT",
"value": "8080"
},
{
"name": "BASIC_AUTH_USERNAME",
"value": "polynote"
},
{
"name": "BASIC_AUTH_PASSWORD",
"value": "${random_string.password.result}"
},
{
"name": "PROXY_PASS",
"value": "[http://127.0.0.1:8192](http://127.0.0.1:8192)"
}
]
}
]
TASK_DEFINITION
}*
这是一个很长的片段,但是在上面你看到了我们将要运行的 ECS/Fargate 服务的任务定义(蓝图),如果你熟悉 docker-compose.yml 文件,它看起来有点像下面这样(没有logConfiguration
):
*version: '3.4'
services:
polynote:
image: registry.hub.docker.com/sschrijver/polynote-basic-config:latest
expose:
- 8192
nginx:
image: registry.hub.docker.com/sschrijver/polynote-nginx:latest
depends_on:
- polynote
ports:
- 8080:8080
environment:
- SERVER_NAME=127.0.0.1
- PORT=8080
- BASIC_AUTH_USERNAME=polynote
- BASIC_AUTH_PASSWORD=${random_string.password.result}
- PROXY_PASS=[http://polynote:8192](http://polynote:8192)*
此外,请注意PROXY_PASS
中的不同,Fargate 不会像docker-compose
那样处理解析主机,我们必须在任务定义中通过 127.0.0.1 进行连接。
NGINX
您可以看到任务定义中有两个容器。这是因为我们还需要在服务中运行 NGINX。这个 NGINX 实际上会被暴露,并会增加一个额外的基本认证层,这样陌生人就无法访问我们的笔记本电脑,或者更糟;访问我们的 AWS 环境。感谢景岛乐·藤田发布了dtan 4/nginx-basic-auth-proxy库及其代码,我的图片就是基于这些代码。我更新了映像中 NGINX 的版本,还添加了一个 websocket 路径。就我个人而言,我会建议您分叉他或我的存储库,进行一些调整,并将您自己的 Docker 映像推/用到 ECR/Docker Hub,因为在安全性和 Docker 映像标签方面,有些东西肯定可以改进/重新访问。
让我们进一步走到 main.tf 文件。
获取现有的 VPC、负载平衡器和负载平衡器侦听器
*data "aws_vpc" "vpc" {
id = var.vpc_id
}data "aws_lb" "lb" {
arn = var.loadbalancer_arn
}data "aws_lb_listener" "lb_listener" {
load_balancer_arn = var.loadbalancer_arn
port = 443
}*
我们将收到关于现有 VPC、应用程序负载平衡器和负载平衡器监听器的信息。如果您使用端口 80 作为负载平衡器上的监听器,您应该将 443 改为 80。
创建负载平衡器目标组
*resource "aws_lb_target_group" "polynote_target_group" {
name = "polynote-${random_string.random_string.result}"
port = 80
protocol = "HTTP"
vpc_id = data.aws_vpc.vpc.id
target_type = "ip"
health_check {
matcher = "200,302,401"
}
}*
如果您想要将 ECS 服务附加到负载平衡器(或者将负载平衡器规则指向 ECS 服务,这取决于您如何看待它),您还需要一个目标组。这将在稍后定义服务时使用。如您所见,HTTP 响应代码 401 也包含在健康检查中,因为我们的 NGINX 服务将返回 401(未授权)响应代码,因为我们已经包含了一个基本的身份验证层。
创建安全组
*resource "aws_security_group" "polynote_security_group" {
name = "polynote_${random_string.random_string.result}"
vpc_id = data.aws_vpc.vpc.idingress {
description = "Incoming 8080"
from_port = 8080
to_port = 8080
protocol = "tcp"
security_groups = data.aws_lb.lb.security_groups
}egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = [
"0.0.0.0/0"]
}tags = {
Name = "polynote_${random_string.random_string.result}"
}
}*
负载平衡器需要访问 ECS 服务,因此我们向安全组添加了一个入口规则,该规则稍后将附加到 ECS 服务。这个入口规则允许我们的负载平衡器与运行在端口 8080 上的 NGINX 通信。
创建 ECS 服务
*resource "aws_ecs_service" "polynote_service" {
name = "polynote-${random_string.random_string.result}"
cluster = data.aws_ecs_cluster.ecs_cluster.id
task_definition = aws_ecs_task_definition.polynote_task_definition.id
desired_count = 1
launch_type = "FARGATE"network_configuration {
subnets = var.fargate_subnets
security_groups = [
aws_security_group.polynote_security_group.id]
}load_balancer {
target_group_arn = aws_lb_target_group.polynote_target_group.arn
container_name = "nginx"
container_port = 8080
}
depends_on = [
aws_lb_target_group.polynote_target_group]
}*
最后,我们已经准备好了创建 ECS/Fargate 服务的所有构件。我猜上面的片段是不言自明的。
创建负载平衡器侦听器规则
*resource "aws_lb_listener_rule" "polynote_lb_listener_rule" {
listener_arn = data.aws_lb_listener.lb_listener.arn
priority = nullaction {
type = "forward"
target_group_arn = aws_lb_target_group.polynote_target_group.arn
}condition {
host_header {
values = [
"polynote-${random_string.random_string.result}.${var.domain}"]
}
}depends_on = [
aws_lb_target_group.polynote_target_group]
}*
我们希望我们的 ECS 服务可以公开访问,所以我们添加了一个负载平衡器侦听器规则。如您所见,我定义了一个主机头条件,这是因为我将把 Route53 子域指向负载均衡器 DNS(参见下面的参考资料)。如果您想直接使用负载平衡器 DNS,您可能需要稍微调整一下这个资源,并使用path_pattern
条件,就像在 Terraform 文档中所述的那样。如果您这样做,请注意,它将影响脚本中稍后的输出和资源,所以在您进行更改时,请重新访问这些块。
创建 Route53 记录
*resource "aws_route53_record" "polynote_cname" {
zone_id = var.hosted_zone_id
name = "polynote-${random_string.random_string.result}.${var.domain}"
type = "CNAME"
records = [
data.aws_lb.lb.dns_name]
ttl = 300
}output "url" {
value = "https://${aws_route53_record.polynote_cname.name}"
}
output "username" {
value = "polynote"
}
output "password" {
value = random_string.password.result
}*
正如我已经说过的,我在 Route53 中设置了一个指向负载均衡器的子域。毕竟,我将输出完整的 URL 来访问环境,这将在触发正确的 Terraform 命令后最多大约 5 分钟内在线。
运行 Terraform 脚本
现在我们已经(基本)了解了脚本的功能,我们可以执行 Terraform 脚本了。确保您已经编辑了 vars.tfvars ,使其符合您的 AWS 环境,并确保您已经安装了 Terraform,并在您的设备上配置了正确的 AWS 配置文件。
首先,您必须在包含。tf 文件,方法是在终端中执行以下命令:
*terraform init*
terraform init
命令用于初始化包含 Terraform 配置文件的工作目录。这是在编写新的 Terraform 配置或从版本控制中克隆现有配置后应该运行的第一个命令。多次运行该命令是安全的。
来源 : terraform.io
然后,您希望应用带有 vars.tfvars 文件的 Terraform 配置文件,这样您就不必手动输入这些信息。您可以通过运行以下命令来实现这一点:
*terraform apply -var-file=vars.tfvars*
这也将输出 Terraform 将对您的 AWS 环境采取的操作,并要求您确认。仔细阅读 Terraform 将采取的行动,并通过键入yes
确认(随后按 Enter)。现在将在您的环境中创建资源。
当脚本完成时,它将输出一个 URL 和凭证,您可以使用它们来访问 Polynote 环境,如下所示:
*Outputs:password = ZoG2ZMzFxY3aUNCImstvXfYM
url = [https://polynote-py11kxuq.mydomainname.com](https://polynote-py11kxuq.pondatalab.com)
username = polynote*
容器实际运行需要一些时间,所以请耐心等待(大约 5 分钟)。一旦它启动并运行,您进入该网站,将显示一个弹出窗口,您可以在其中输入凭据。当您提供正确的凭证时,您将被转到 Polynote 环境。现在您可以在 Polynote 环境中做任何您想做的事情:-)!我建议创建一个新的笔记本,而不是使用 Blank.ipynb ,因为它会因为任何原因导致内核问题。
多项式界面
破坏 Polynote 环境
完成后,您可以通过执行以下 Terraform 命令来轻松破坏 Polynote 环境:
*terraform destroy -var-file=vars.tfvars*
它会再次要求确认,键入yes
来销毁所有资源。
待办事项
我已经在这篇文章中提到了一些要做的事情。当然还有很多需要改进的地方,但我想确保您了解以下几点:
- Polynote 密码目前是一个环境变量,Secrets Manager 可能是一个更好的选择。
- 重新访问安全 NGINX 层。这个解决方案真的安全吗?至少它提供了某种保护,而默认情况下 Polynote 笔记本没有密码或令牌保护。
- 如果取消对任务角色策略的注释,请注意,它目前没有限制,这意味着它可以访问您的所有 AWS 资源。您不希望这样,所以请确保您进行了更改,以便该服务只能访问它需要访问的资源。
问题或反馈
如果您对本文有任何问题或反馈;请让我知道!
使用 Jupyter 笔记本托管您自己的离线地图服务器
实践教程
在本地服务器上部署底图服务器的分步指南——整个项目可在我的 GitHub 中找到
概述
LeafletJS , MapBox , Esri 等。这些只是一些地图插件,分析师,开发者等。需要各种地理空间可视化的人倾向于使用。不用说,所有这些插件都有一些共同点-它们都需要底图服务来实现有意义的交互。得益于许多开源地图服务,如 OpenStreetMap(OSM) ,解析地图服务 url 进行渲染几乎不费吹灰之力:
作者代码片段|使用 LeafletJS 初始化底图的简单示例
托管离线底图的基本原理
然而,当应用程序由于不可预见的情况(如缺少 WiFi、互联网连接故障、底图服务不再可用等)而无法连接到地图服务时,这种简单的可访问性可能会适得其反。作为一项预防措施,考虑在本地服务器上本地托管自己的底图总是比较明智的,尤其是在需要演示或在工作中使用应用程序的时候。
按作者分类的图像|本地托管底图示例
虽然有几种方法可以做到这一点,我的首选是利用小叶的 mbtiles 插件称为小叶。这需要一些准备步骤,我将在下面介绍。这包括一点计算、一个本地 web 服务器、实用 python 包 mbutil 和基础 leafletJS 库(因为选择 mbtiles 插件意味着与 leafletJS 集成)。
步骤 1:在线搜索预先存在的底图服务并进行选择
首先,决定离线托管的特定底图。一个好的起点是 http://maps.stamen.com/,那里有大量可供公众使用的底图。此外,决定托管哪个底图有助于清楚地了解每个地图切片的 url 格式 (KIV:这一点极其重要,我们将在后面看到。)。为了进行演示,我将选择 MapStamen 的碳粉底图。确定想要托管的底图类型后,继续:
- 缩放至所需的最小缩放级别,例如
11
,并确保当前浏览器视窗当前正在捕获所有正在渲染地区/省份/国家/大陆的地图图块图像。例如,假设我的目标是托管国家新加坡的底图,我的浏览器应该如下所示:
作者图片|展示缩放级别为 11 的maps.stamen.com墨粉底图
2.右键单击并选择“检查”或 Ctrl+Shift+i(在 Windows 上)
作者图片| Google Chrome 浏览器中的开发者工具截图|请注意,底图的每个切片图像中都嵌入了“src”属性
虽然不同的浏览器有不同的配置,但两个基本组件是:
1.浏览器控制台
2.元素选项卡查看 html 标记。
从呈现的每个地图区块图像的src
属性的格式来看,它遵循传统的滑动地图格式,其中 URL 包含{s}-{z}/{x}/{y}
:
z
:缩放级别x
:平铺图像的 X 坐标,以像素为单位y
:平铺图像的 Y 坐标,单位为像素s
:指子域。由于大量使用地图服务,子域a
、b
、c
配置到位。
将以下 JavaScript 代码片段复制并粘贴到控制台中:
输出应该类似于以下内容:
作者图片|运行 JavaScript 代码片段后,从缩放级别为 11 的底图的每个 < img / > 标记的图像**src**
属性中检索所有 x,y 坐标
说明:由于底图中渲染的每个地图分块的 url 格式遵循以下格式:
http://c.tile.stamen.com/toner/11/1614/1016@2x.png
,通过使用标记/
对其进行定界并将其转换为数组,我们可以看到以下结果:
说明:最上面一列代表数组的索引。在这种情况下,在缩放级别11
:
x
可以在5
位置找到y
可以在6
位置找到
maps.stamen 中其他可能的底图选项包括:
- http://tile.stamen.com/toner/{z}/{x}/{y}.png(墨粉)
- http://tile.stamen.com/terrain/{z}/{x}/{y}.jpg(特雷恩)
- http://tile.stamen.com/watercolor/{z}/{x}/{y}.jpg(水彩)
第二步。导入 python 包并初始化纬度/经度或 X/Y 转换函数
Slippy_map_tilenames 处的代码段源代码|函数num2deg
根据缩放级别(zoom
参数)将x
和y
分别转换为latitude
和longitude
。
Slippy_map_tilenames 处的代码段源代码|函数deg2num
根据缩放级别(zoom
参数)将lat_deg
和lon_deg
分别转换为图块图像的x
和y
2.1 将所有图块坐标(x,y)转换成坐标(纬度,经度)以将所有标记组合成一个 GeoJSON 特征集合对象
作者的代码片段|请注意,标记保存在一个文件( output.geojson )中,4 个变量—minx val****maxx val minYVal maxYVal在这里被初始化,用于后续计算
作者的代码片段|输出将在后续计算中使用的前 4 个变量的值
上面代码的输出是:
minXVal 的值为:1612
maxx val 的值为:1616
miny val 的值为:1015
maxy val 的值为:1018
2.2 使用 output.geojson 可视化地图标记
将 GeoJSON 文件渲染到任何地图渲染平台上,以查看实际地图上的坐标。我个人推荐http://geojson.io/,因为它有直观的界面和实用的功能。基于上述示例,从缩放级别11
的图块转换的坐标应如下所示:
图片作者|可视化 output.geojson 数据文件|注意上图尺寸显示的是 4 × 6 地图标记,相当于 4 × 6 平铺。
第三步。计算其他缩放级别的(X,Y)值
在进行实际计算之前,重要的是要确定滑动贴图的图块坐标遵循以下规则:
瓷砖总数= 2ᶻᵒᵒᵐ × 2ᶻᵒᵒᵐ
例如,当缩放级别= 11
时,底图具有 2 × 2 = 2048 × 2048 个切片
根据地图上显示的标记,图块数量为: 4 × 6 图块,其中:
- 最小(x) = 1612
最大(x) = 1616 - 最小(y) = 1015
最大(y) = 1018
按作者分类的图像|底图缩放级别为 11 的切片尺寸| x 范围为 1612 至 1616(含)| y 范围为 1015 至 1018(含)
因此,基于上述逻辑,对于缩放级别12
:
瓷砖总数=2 × 2 = 4096 × 4096
这转化为:(4/2048)×4096×(6/2048)×4096 tiles =8×12 tiles其中:
- min(x)= 1612/4×8 = 3224
max(x)= 1616/4×8 = 3232 - 最小(y)= 1015/6×12 = 2030
最大(y) = 1018/6 × 12 = 2036
按作者分类的图像|底图缩放级别为 12 的切片尺寸| x 范围从 3224 到 3232(含)| y 范围从 2030 到 2036(含)
3.1 上述等式有效的概念证明
作者的代码片段| POC _ equation _ of _ zoom _ map _ tiles . py 的代码片段生成了 output.json ,其中包含一个切片 URL 列表|要测试计算是否合法,只需导航到几个链接以确保链接没有断开,预期结果应该是一个切片图像
根据上述计算的图示,现在可以计算和检索所需的所有底图切片图像。接下来,将根据 Slippy 地图规则建立文件夹层次结构,以包含本地保存的后续图块图像。
作者图片| http://maps.stamen.com/浏览器后端截图显示了存储图片的文件夹结构
因此,从上面可以推断出地图切片图像存储在以下文件夹结构中:
按作者分类的图像|要创建的切片图像的文件夹层次结构
下一节将尝试创建所需的文件夹层次结构。在执行此操作之前,应确定底图的缩放上限。通常,当用户需要查看街道级别的详细信息时,17
或18
是很好的选择。对于本教程,我将设置我的缩放水平上限,只是15
。
早先,缩放级别 11 和 12 的区块尺寸都被导出。因此,在缩放级别n
,由于平铺数量= 2ᶻᵒᵒᵐ × 2ᶻᵒᵒᵐ,
尺寸应为:(4×(2ⁿ)×(6×(2ⁿ)平铺
最小(x) = 1612/4 × 4(2ⁿ)
最大(x) = 1616/4 × 4(2ⁿ)
min(y)= 1015/6×6(2ⁿ)
max(y)= 1018/6×6(2ⁿ)
按作者分类的图像|底图缩放级别 n 的切片尺寸| x 范围从最小值(x)到最大值(x)(含)| y 范围从最小值(y)到最大值(y)(含)
为了减少重复代码,应创建一个应用上述逻辑的函数,以便在任何缩放级别检索图块的x
和y
坐标:
作者代码片段|输出为:缩放级别为 11 到 15 的文件夹结构已创建。
第四步。将切片图像流式传输到创建的本地文件夹中
初始化文件夹结构后,我们现在可以从底图服务中检索缩放级别在minZoomLevel
和maxZoomLevel
(含)范围内的切片图像。
需要注意的是:
- 如果指定的缩放级别上限很高,例如,高于缩放级别
17
将显著增加运行代码的持续时间,则该步骤可能需要几个小时 - 输出的切片图像将占用相当多的磁盘空间。通常,来自地图服务(如 OpenStreetMap)的栅格切片(由单个国家的缩放级别
11
到17
组成)大约占用 500MB。 - 如果托管的底图类型是卫星地图,由于卫星影像的高分辨率,最终输出通常会达到几 GB,因此明智的做法是在将切片图像保存到本地磁盘驱动器之前确保有足够的可用磁盘空间。
Author | Output 的代码片段是:缩放级别为 11 到 15 的所有地图切片图像都已保存到本地目录中。
按作者分类的图像|所有图块图像保存到本地文件夹后,它应该与上面类似。基本上,这是上述所有步骤的总结。
4.1 在 web 服务器上托管文件夹,以确保切片图像保存成功
最后,为了确保保存正确的切片图像,应设置一个 web 服务器,并直接从文件夹中调用底图(只有在确保底图正确渲染后才能进行打包)。
在本演示中,将使用库Flask
和werkzeug
直接在 jupyter 笔记本中设置一个 web 服务器来托管底图。
先决条件
- 包含基础传单库:传单样式表和传单 JS
- 包括传单插件 L.TileLayer.mbTiles 插件及其依赖关系 sql.js
- 将步骤 2 生成的文件
output.geojson
放入下面指定目录结构的static
文件夹中 - 将图块图像文件夹如碳粉复制并粘贴到以下指定目录结构的
static/maps
文件夹中 - 保存一个空白的黑色图块,并将其重命名为
error.png
。将其放入下面指定目录结构的static
文件夹中
作者图片|代表整个文件夹结构,包括 jupyter 笔记本
最后,继续在<script></script>
标记之间的index.html
中包含以下代码片段,以直接从文件夹渲染底图:
作者的代码片段|上面的代码片段使用 leafletJS 初始化了一个新的地图对象|步骤 2 中生成的文件 output.geojson 通过 AJAX 调用,并继续在底图的 bbox 中设置地图视图
作者代码片段| Flask web 应用程序的初始化。注意,已经创建了一个关闭 web 服务器的 API。这个 API 是通过链接http://localhost:9000/shut down访问的
按作者分类的图像|渲染的初始底图视图示例
按作者分类的图像|底图的放大视图
4.2 用 python 包将文件夹打包— mbutil
既然我们已经确保底图渲染了正确的切片图像,现在可以将文件夹打包到单个 mbTile 文件中。这是通过 python 包 mbutil 完成的。要安装 mbutil,我们需要严格遵循以下说明:
- 导航至 mbutil
- 继续克隆/下载 git 存储库,并将 ZIP 存档保存到 jupyter 笔记本所在的文件夹中
作者图片|为 mbutil 选择“下载 ZIP”
3.提取文件夹mbutil-master
并重命名为mbutil
。
4.在 mbutil 文件夹中导航并删除文件.gitignore
。它现在应该是这样的:
作者图片|显示 mbutil python 包的内容
5.继续打开该文件夹中的终端/命令提示符并运行:python mb-util ../static/maps/toner ../static/maps/toner.mbtiles
作者图片|显示命令提示符,表明mbutil
的打包过程正在进行
6.toner.mbtiles
现在已创建,最新的文件夹结构应该如下所示:
图片作者| ( 左)上一个项目结构| ( 右)当前项目结构
7.因此,继续修改标签之间的index.html
中的代码片段,以渲染来自toner.mbtiles
文件的底图:
作者代码片段|上面的代码片段与前面的代码片段几乎相同,只是不是从static/maps/toner/{ z }/{ x }/{ y }渲染底图。png ,底图现在由打包的 mbtiles 文件static/maps/toner . MB tiles渲染而成
第五步。使用 mbtile 文件和传单重新运行 web 应用程序。TileLayer.MBTiles.js 插件
作者代码片段|重新初始化 flask 应用程序以渲染底图
图片由作者提供|如上所述,所有切片地图图像的 url 均以二进制格式呈现,从 toner.mbtiles 获取-本地底图现已成功打包到单个 mbtiles 文件中,并部署到本地服务器上以供使用。
注意:您可以继续删除文件夹static/maps/toner
,只留下 mbtiles 文件供应用程序使用。
恭喜你!现在,您已经在本地服务器上渲染了底图。
请随意在我的 GitHub 分叉项目,并查看实际的 Jupyter 笔记本。
如果你对更多与地理空间相关的内容感兴趣,你可以在 Medium 上关注我,我很乐意分享更多我自己的作品或发现。
希望你们觉得这有用,感谢阅读!
获得李思欣·崔和其他作家在媒体上的所有帖子!😃您的会员费直接…
geek-cc.medium.com](https://geek-cc.medium.com/membership)
热门与否:分析 60 年来美国公告牌百强数据
照片由 Unsplash 上的 israel palacio 拍摄
德雷克和泰勒·斯威夫特是 Billboard Hot 100 无可争议的国王和王后。他们分别拥有 157 首和 109 首不同的歌曲,打破了滚石乐队(57 首)、埃尔顿·约翰(64 首)和披头士乐队(69 首)的记录。意识到这一点后,我想发现音乐行业随着时间的推移发生变化的一些其他方式,即通过确定发行音乐的数量、发行人以及在 Hot 100 上的表现。为此,我将下载 100 个热门图表作为结构化表格,并创建自定义指标来量化这些趋势以及更多内容。
探索性视觉效果
Billboard Hot 100 于 1958 年 8 月首次发布,因此在这次分析中,我的数据包括了 1959 年至 2019 年(不包括 1958 年和 2020 年这两个不完整的年份)每年的每一周——特别感谢 Chris Guo 的 API 。
(图表由作者提供)
随着时间的推移,进入前 100 名的不同艺术家的数量正在减少,这意味着争夺热门 100 名的流行歌星的舞台每年减少大约三个。对于超级巨星来说,这个市场已经成熟,他们可以发行更多的歌曲,同时减少同行的排挤。
(图表由作者提供)
流行音乐在 60 年代末经历了多样性的顶峰,并在 2001 年稳步下降到重复性的顶峰(巧合的是,那一年 Napster 正处于流行的顶峰并被关闭)。自 2001 年以来,宋综艺上的热度有所上升,但仍没有 60 年代那么高。
(图表由作者提供)
另一个相当重要的指标是一首歌首次进入热门 100 强时的周转时间。在 90 年代和 00 年代初,歌曲首次亮相时会有很长的首演片段。快进到 2010 年,大多数歌曲都会在排行榜上停留一两周,然后反弹。
虽然中位数确实描述了大多数情况,但离群值仍有打破这一标准的空间。以下是 2010 年的一些主要外围案例:
沿着记忆之路走一趟……(图片由作者提供)
有如此明显的异常值,平均出道时间怎么会是两周??我认为这些数据支持了一个现实,即有几个艺术家发行了大量的音乐——其中大部分不会持续很久,但那些坚持下来的歌曲会持续很久。谁能忘记席洛·格林和布鲁诺·马斯在排行榜上几乎长达一年的统治!
(图表由作者提供)
随着越来越少的艺术家登上排行榜,这些艺术家中的每一个人每年都会创作 1.5 到 2 倍的歌曲,并在 2018 年爆发。比较 1965 年和 2018 年间最多产的 5 位艺术家:
披头士和德雷克在同一年发行了他们的第五张录音室专辑(图片由作者提供)
“救命!”甲壳虫乐队的(1965)包含了专辑中的 14 首歌曲,而德雷克的“蝎子”(2018)包含了 25 首歌曲,这 25 首歌曲都进入了当年的前 100 名。专辑越来越长这个话题已经被广泛研究过,安德鲁·梅斯就这个话题写了一篇文章:
到目前为止,2018 年一直被看似无止境的大型说唱唱片所主导,这些唱片有着令人生畏的长曲目列表和…
pitchfork.comS](https://pitchfork.com/features/lists-and-guides/are-rap-albums-really-getting-longer/)
流媒体时代伊始,Billboard 开始将专辑中的歌曲作为热门 100 首销售报告的单曲,因为它们可以在 Spotify、Apple Music 和 Tidal 等平台上点播。这与 20 世纪形成了鲜明对比,在 20 世纪,单曲报道主要来自电台广播。如今,鲜为人知或被抛弃的歌曲更有可能登上排行榜。像德雷克这样的艺术家拥有压倒噪音的音量,流媒体时代注定会有流行歌星打破 LP 和 CD 时代艺术家的单曲记录。
新音乐季节性趋势
除了解决空前的单曲唱片的问题,我还想以历年来发行音乐的最佳和最差时机的分类来结束我的分析。传统智慧和音乐营销博客规定了一些关于发布音乐的规则:除了节日音乐,不要在 12 月发布,不要在 SXSW 期间发布,等等。但我想看看哪些月份实际上发行了最多的新音乐,以及随着时间的推移这种情况是如何变化的。(点击放大)
(图片由作者提供)
一月、二月和九月一直是发行音乐的糟糕月份,而十月和三月(SXSW 发生时)通常是新音乐的好月份。六月、十一月和七月似乎是“还可以”的月份,其余的月份噪音太大,无法得出可靠的结论。
最后的想法
与 20 世纪相比,在 2020 年以新艺术家的身份发行音乐是一种完全不同的体验。那些日子的一些守门力量已经被社交媒体、YouTube 和我们所知的互联网所回避。然而,算法、播放列表和数字广告等新时代的把关者继续以独特的方式影响着这个行业。总而言之,这些力量的影响似乎正在缩小新音乐人的机会,但我相信,随着音乐收入恢复到昔日的辉煌,新艺术家成名的机会将会增加。
感谢检查我的分析!要了解我是如何从原始的 Billboard 图表变成你上面看到的指标的,请查看我对这个项目的 GitHub repo 。
希尔顿酒店评论 NLP 分类器
遵循 CRISP-DM 框架的详细项目报告。包括工作演示应用程序。
在这篇博客中,我将回顾我是如何通过为希尔顿酒店评论的 NLP 项目实现一个神经网络模型来改进我的分类器的。我的模型旨在使用情感分析,可以对评分在 1 到 5 分之间的评论进行分类。
这是我项目的 Github 链接:www.github.com/awesomeahi95/Hotel_Review_NLP
我会回顾我项目的目标、过程和结果。
我的项目的商业案例:
如今,公众对产品和服务的讨论和评论已经超越了专门的媒介,现在也出现在社交媒体领域。
目前在 tripadvisor、trustpilot 和 expedia 上可以找到希尔顿酒店的在线评论。大多数评论者给出的分数在 3 到 5 之间,因此,如果一个新客户在前面提到的任何评论网站上浏览在线评论,他们可能会考虑在希尔顿酒店预订房间。
如果他们在听完朋友的话后就已经下定决心了呢?潜在客户的酒店选择可能会受到一条推文的影响。观点不断在社交媒体平台上分享,并被其追随者阅读。通过阅读这些在线帖子,了解这些关注者对我们酒店的看法,可以帮助我们更好地了解公众对我们酒店的看法。
通过使用情感分析,基于 Tripadvisor.com 现有的酒店评论,我创建了一个模型,该模型可以在 1-5 的范围内量化 twitter 上的推文或 reddit 帖子的作者对我们酒店的感受,以及读者对我们的看法。如果评论分类低于 3 分,可以调查这篇帖子/推文,找出他们对我们酒店有负面看法的原因,并解决问题。
Tripadvisor 上的点评示例:
伦敦盖特威克希尔顿酒店 1 星评价
通过阅读文本,人类可以相对容易地对以上评论的分数(在某种程度上)进行分类。我们习惯于从另一个人使用的词语和上下文来理解他对一个话题的感受。
对于一台计算机来说,既要解释人的观点,又要理解人的情感,需要几个阶段:
- 将单词分解成它们的词根形式:
综述(原文/词干/词条)
使用词干化和词尾化这样的技术,把恶心和厌恶这样的词分解成一个词根,厌恶。
- 标记化:
使用正则表达式将句子分解成单词,没有标点符号。
- 删除停用词
像“我”、“他”、“和”等词是最常见的词,可能会影响其他词的值,所以我们删除这些词。至于我的项目,那是以酒店为导向的,我也删除了诸如“酒店”、“房间”和“机场”等常用词。
- 矢量化
(这是最不人性化的一步)
在建模的初始阶段之前,我有两个选择:计数矢量化(单词袋)和 TF-IDF 矢量化。这两种方法都将词频作为通用度量,尽管 TF-IDF 也将词频与整个语料库进行比较,以获得更有意义的度量。
我决定在我的项目中使用 TF-IDF 矢量化。所以我的 lemmatised 评论专栏从这个开始改变了:
对此:
因此,现在一篇评论由一个与我的评论语料库中最常见的 138 个单词相关联的奇异值来表示。
我对我看到的零的数量不太满意,尽管这很有意义。
- 建模和测试
机器学习阶段。在这里,我试验了 5 种分类算法和 5 种集成方法,都进行了一些超参数调整。要了解更多细节,请查看我在博客开头分享的 Github 回购链接中的第三个笔记本。
这些是我的结果:
模型训练阶段的训练和验证准确性
模型测试阶段的训练和测试(在验证准确性栏中)准确性+每个分数的额外指标
我选择了 Stacking(逻辑回归和逻辑回归的 Adaboost 的集合)模型,因为它具有相当好的训练精度和合理的验证精度。你可能会想,这些精度在 0.5 到 0.6 的范围内,肯定不是很好。好吧,考虑到这是一个 5 向多类分类,随机选择一个并且正确的几率是 0.2。此外,这些都是主观分数,即使是人也很难选择正确的分数。用混淆矩阵可以更好地说明这一点。
你可以看到大多数时候模型预测正确的分数,用斜线表示。我们看到的大部分误差(准确度在 50–60%范围内)来自相邻的分数,例如,预测分数为 1,但实际分数为 2。我对此很高兴,因为这个模型仍然足够好,可以区分优秀的评论、一般的评论和糟糕的评论。
在这一点上,计算机可以解释输入的文本,并多少理解其中的含义。
我想要更好的。
为什么不让它更人性化呢?神经网络的设计类似于我们大脑中神经元的功能,所以这可能是我可以做出的改变,以改善我的模型。
- 神经网络
在创建我的神经网络模型之前,预处理有点不同。
我创建了一个字典,其中的关键字是单词,语料库中所有独特的单词,以及值,即与每个独特的单词相关联的数字。我还添加了 4 个特殊键,用于填充、开始复习、未知单词和未使用的单词。我在字典里总共有 17317 个词条。这来自 9405 条评论。
word_index_dict['<PAD>'] = 0
word_index_dict['<START>'] = 1
word_index_dict['<UNK>'] = 2
word_index_dict['<UNUSED>'] = 3
预索引:
索引前的审查
索引后:
索引后的评论
作为最后的预处理步骤,我添加了一个填充层,最大长度为 250 个单词。然后我训练了模型。
- 神经网络架构:
所用神经网络模型的架构
这里 NLP 的特殊层是嵌入层。
单词被映射到向量空间中的向量,在我的例子中是 16 维向量。这一次,每个单词都有一个基于其周围单词的向量,即上下文。矢量化不同于之前的 TF-IDF 矢量化,我们不只是关注基于频率的指标,而是实际关注每个词在给定上下文中的影响。
这越来越像人类了。
现在,像好、好、坏、更坏这样的词有了一些更有意义的数字(向量)与之相关联。可以测试该模型的新评论不仅包含这些单词,还包含围绕这些单词的单词,这些单词更好地描述了评论作者试图表达的内容。这种情况可以用更多的数据来更好地解释,但目前的 9405 审查将做得很好。
- 测试神经网络模型
该模型的测试精度达到了 0.5710 ,优于我们之前模型的精度 **0.5077。**因此,我们有了 7%的改进,这是非常显著的,但观察这种 5 向多类分类的最佳方式还是通过查看混淆矩阵。
神经网络模型测试数据混淆矩阵
如您所见,该模型没有将评分为 5 的评论预测为 1,反之亦然。其他错误分类的分数有所改善,大多数预测更接近中间对角线。
- 应用
我用 Streamlit 和 Heroku 设计了一个模型的演示应用程序,你可以在这里试用:www.hilton-hotel-app.herokuapp.com/
待改进:
- 使用更大的训练数据集
- 尝试更深层次的神经网络
- 将分类的复杂性降低到二元分类
- 实施其他预制的矢量化方法— word2vec 或 GloVe