TowardsDataScience 博客中文翻译 2016~2018(一百六十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

利用特征权重学习提高聚类性能

原文:https://towardsdatascience.com/improving-clustering-performance-using-feature-weight-learning-d65d4fec77cb?source=collection_archive---------11-----------------------

给无监督学习一个目标

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

聚类是一种无监督的机器学习方法,旨在将数据划分为不同的组或簇。有几种不同的形式,包括等级、密度和相似性。每一个都有一些不同的算法。任何机器学习算法中最难的部分之一是特征工程,这对于聚类来说尤其困难,因为没有简单的方法来找出最好的方法将数据分成独立但相似的组。

基于相似性的聚类的指导原则是相似的对象在同一聚类内,而不相似的对象在不同的聚类内。这与大多数传统聚类算法的目标没有什么不同。对于基于相似性的聚类,必须给出一个度量来确定两个对象有多相似。这种相似性度量是基于距离的,并且可以采用不同的距离度量,但是相似性度量通常产生[0,1]中的值,其中 0 没有相似性,1 是相同的。为了测量特征权重重要性,我们将不得不使用加权欧几里德距离函数。相似性度量定义如下:

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

β是我们实际上必须求解的一个值,(w)表示距离权重矩阵,d 表示所有对象之间的成对距离。为了求解β,我们必须假设,如果使用标准权重(全为 1),我们的相似性矩阵将在[0,1]之间均匀分布,导致平均值为. 5。为了找到β,我们求解方程:

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

如果使用加权欧几里德距离,则可以使用该相似性矩阵来识别哪些特征引入了更多噪声,以及哪些特征对于聚类是重要的。最终目标是最小化相似性矩阵的“模糊性”,试图将中间(即. 5)的所有内容移动到 1 或 0。为此,我们使用损失指标:

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

这里(1)表示基本权重(全为 1),而 ρ 表示得到的模糊划分矩阵,它是点 p 和 q 之间的欧几里德距离函数中使用的权重的乘积。

然后,我们可以尝试对这个损失函数使用梯度下降,以尝试相对于相似性矩阵最小化它。梯度下降是机器学习中最常见的优化算法之一,用于通过使用函数梯度(偏导数的组合)来寻找给定函数的最佳参数。通过采取与梯度的负值成比例的步骤,我们可以试图找到函数的局部最小值。我们将不断更新权重,直到达到我们的最大迭代次数,或者函数收敛。所以梯度下降是我们的损失函数,对重量有偏导数。我们将根据梯度和学习率在每次迭代中更新权重。

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

其中 n 是定义的学习率。n 是一个非常重要的参数,因为太小需要太多的计算,而太大,函数可能永远不会收敛。

如果你能从一个 3D 图形的角度来考虑它,它就像拉伸或收缩每个轴,以某种方式将我们的点放入更紧密的组中,这些组彼此之间距离更远。我们实际上并没有改变数据的位置,我们只是改变了衡量驱动相似性度量的距离的方式。

这是一个创建的示例,我在前两个变量上引入了 3 个具有独立质心的聚类,但引入了第三个噪声变量,这会使聚类更加困难。它们由创建数据时给出的实际分类标签来着色。当消除第三个噪声变量时,我们可以看到,识别聚类要容易得多。

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

尽管由于 3D 视角的原因,很难看出差异,但您可以看到聚类在学习到的特征权重下更加清晰。通过扩展可以轻松区分它们的主要特征,它能够更好地识别集群。

测量改进

其有效性的一个很好的代表是模糊 c-均值,一个常用的 k-均值算法的相对。它的工作方式与 k-means 非常相似,但是它会产生一种叫做模糊划分矩阵的东西,而不仅仅是一个聚类标签。

模糊划分矩阵是一组权重,用于测量单个点与给定聚类中心的相似程度,类似于我们之前使用的相似性矩阵。它也可以使用加权距离度量来计算,我们可以将它提供给我们新发现的最佳权重。这也将返回到更新集群中心。像 K-means 一样,这导致聚类中心随着每次迭代而移动,直到达到最大迭代次数或某个改进阈值。

在模糊 c 均值中,你会有一个和我们最初的损失函数非常相似的目标。您希望点变得不那么“模糊”,并且希望它们都尽可能靠近它们的聚类中心,而远离其他点。模糊聚类算法的一个很好的度量是 Dunn 的划分系数,它是模糊划分矩阵的所有分量的总和。

让我们尝试在有和没有我们学习的特征权重的情况下对虹膜数据集使用模糊 c 均值。这里模糊 c-的输出意味着比较所有变量,假设 3 个聚类(因为我们从数据集中知道)。

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

请注意,一些要素之间的界限不太明确,因为我们有多个同等权重的要素,所以界限可能会模糊。现在,当应用特征加权学习方法时,我们得到归一化的距离权重:

{'sepal length': 0.0, 'sepal width': 0.0, 'petal length': 1.0, 'petal width': 0.0258}

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

仍然存在模糊的边界,主要是在我们认为它们在距离权重中的值为 0 的特征上,但是该算法将主要焦点放在花瓣长度上。我们得到了相似的聚类,更强的边界(在一些特征上),并且总体上我们的模糊划分系数增加了大约 23%!

我们现在还知道,如果我们想要生成关于分类它们的规则,我们可以只关注 2 个特征而不是 4 个!

注意事项

仅仅因为使用模糊 c 均值最容易看到结果,并不意味着这种改进措施只能用于该算法。您可以在许多方面使用它,在聚类之前扩展或更好地理解您的数据。我最近在一个使用 OPTICS 算法的应用程序中使用了这种特征约简和重要性技术,并通过根据特征权重学习算法缩放我的特征看到了改进的结果。

如果你想亲自检查或使用它,我已经将这个功能权重学习构建到一个独立的存储库中。

[## Csinclair0/feature_learning

基于相似性聚类的特征权重学习

github.com](https://github.com/Csinclair0/feature_learning.git)

参考文献

王,,王,亚东,王。“基于特征权重学习改进模糊 c 均值聚类”。2004 年 Elsevier B .诉 doi 案:10.1016/j.patrec.2004.03.008

通过路线优化改善运营

原文:https://towardsdatascience.com/improving-operations-with-route-optimization-4b8a3701ca39?source=collection_archive---------1-----------------------

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

撰稿人:Feiko Lai,Michal Szczecinski,Winnie So,Miguel Fernandez

这个故事最初发表在 GOGOVAN 科技博客

请在这里找到我们关于主题 的学术论文。

每天,GOGOVAN 的司机都会抵达亚洲各地的仓库,提取我们的业务合作伙伴要求我们交付给他们客户的数千份订单。

这些订单可以是一系列的东西——从期待已久的新手机,到最后一刻订购的周年礼物。它们都有不同的大小、形状和重量。对于他们中的每一个人,都会有一个人在等待,希望这次快递公司能准时到达…

这就是为什么在 GOGOVAN,我们尽我们所能确保顺利和及时的交付,并提供令客户惊叹的服务质量。每一条送货路线都由我们的运营团队手工精心规划和反复检查,以确保我们不会失败。

手动?!

你刚才不是说你每天有几千个订单吗?!

是的,没错。

过去,运营团队通常需要在取货当天早上手动整理送货路线,并确保我们满足当天的所有送货时间要求。正如您可能想象的那样,这不是一个特别令人兴奋或容易的任务:)

一个人花了大约 1 个小时来创建 100 个路点的次优路线。对于更大的请求,这个时间会成倍增长。

我们立刻意识到这个过程只是在乞求一些自动化。

我们不仅为每天清晨不得不做如此平凡工作的运营团队感到难过,而且我们也知道,随着订单量的增长,这项任务将慢慢变成不可能完成的任务。我们认为这是一个开发尖端技术的机会,该技术将成为 GOGOVAN 数据科学堆栈的核心组件。

我们是怎么开始的?

我们非常以客户和司机为中心。因此,我们总是首先尝试从他们的角度分析问题,以了解我们的解决方案如何影响和惠及他们。经过大量的头脑风暴,我们得出了以下目标:

  • 所有订单都需要按时交付**。**
  • 通过使用缓冲时间和实时距离确保驾驶员不会匆忙准时到达。
  • 通过减少行驶距离来节省燃油
  • 尽量减少司机的空闲时间——没有人喜欢拿着装满包裹的行李箱等待。
  • 提高车辆利用率
  • 完全自动化流程。****
  • 该算法需要能够与我们一起成长**——支持不同类型的交付、车辆和国家。**

确定了我们的主要目标后,我们决定探索学术界和开源的世界——重新发现轮子是没有意义的。我们意识到我们所面临的问题就是众所周知的车辆路径问题。

什么是车辆路径问题?

车辆路径问题【VRP】可以描述为从一个或多个车场到多个*客户约束创建一组最优路线*的问题。目标是向所有客户交付货物,同时最大限度地降低路线成本和车辆数量。**

这个问题是 NP-hard ,已经被伦斯特拉和 Rinnooy Kan 证明。然而,仍然有一些精确的解决方法,使用一个分支限界,或者动态规划,然而,正如上面的论文中所描述的,它们似乎只适用于最多 150 个航路点。

目前,最先进的解决方案是使用元启发式算法获得的:遗传算法 ⁴、禁忌搜索 ⁵和蚁群优化 ⁶.这些是目前该领域主要使用的方法。

对于该领域的深入回顾,我们推荐李晓燕的这篇精彩论文 ⁷。

我们的解决方案

随着 VRP 成为一个被广泛认可的问题,确实有很多公司似乎正在解决这个问题。

然而,不知何故,我们对他们的解决方案并不满意……

我们只知道,如果我们结合我们的运营知识、数据科学和研究专业知识、大量数据以及开源的最新贡献**,我们就可以获得一个强大的内部解决方案,该解决方案:**

  • 更先进,性能更好,有可定制的算法和迭代逻辑。
  • 更便宜、更高效、更具可扩展性。
  • 允许开发有形的知识产权资产并围绕它建立竞争优势。
  • 允许我们向客户保证,他们的交付数据不会超过 GOGOVAN。

考虑了很长时间后,我们决定,如果我们想成为这个领域的领导者,我们需要用我们自己的方式,而不是用一些黑箱解决方案。

所以我们开始了…

第一算法

但是我们并没有马上开始研究学术论文!

首先,我们专注于提出自己的方法,并对其进行评估。这个过程让我们从一开始就对这个领域有了更好的了解,并亲身经历了一些常见的问题(我们没有想当然!).更重要的是,这在后来帮助了我们,因为我们可以很容易地看到学术论文中提出的不同方法的利弊,并想出将它们结合起来的策略。

这样一个过程是理解这个出色的软件包— 谷歌优化工具如何工作的关键。我们知道谷歌的人节省了我们几个月的时间来编写我们想要测试的所有不同的算法。他们允许我们立即进入最有趣的部分!

我们花了很多时间来玩这个库,测试不同的场景,亲眼看看哪些策略在什么时候有效。

我们非常喜欢它,所以决定围绕它来开发我们的工具!

它拥有我们所需要的一切——透明度、实验能力、灵活性和支持。

第一个算法准备好了。我们部署了它。

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

Figure 1: Visualisation of one of our first Route Optimization assignments

快速增长—如何处理更多订单?

路由优化的第一个版本取得了巨大的成功。

提交给 Route Optimizer 的订单量迅速从每个仓库 500 件增加到 1000 多件。理论上,我们应该没事。

但是我们没有。

我们的算法运行时间和内存使用量惊人地快速增长——从 1 分钟 500 MB 增加到 10 分钟 5 GB。随着我们对越来越大的容量进行测试,我们最终达到了最大值— 对于 2000 个航路点,该模块使用了 25GB 的 RAM 内存。

这是不可接受的。

基本上,我们有两个选择:

  • ****建立一个全新的路由优化器,默认情况下能够支持如此大的容量
  • 创建一个新的算法,在当前实现的基础上运行——可能是一种将订单组合成更小批量的方法,然后提交给主优化算法****

由于我们务实**(也喜欢在我们已经完成的伟大工作的基础上再接再厉),我们决定进行第二个选择。**

我们如何创建更小的批量?

让我们从一个著名的聚类算法开始— DBSCAN ⁸.

我们拥有的是一种最先进的方法,将地理点组合在一起。然而,它也有不利的一面:每个星团都必须有相同的半径。

这不是我们想要的,原因很简单:尖沙咀 1 公里半径的一个集群可能包含 1000 个订单,而薄扶林和瀑布湾的其他 1 公里集群可能每个仅包含 3 个订单。

这些集群将会非常低效和不均衡……

在尖沙咀,集群规模会太大,一个集群中会有太多订单。但与此同时,在其他一些区域,这个半径可能不够,因为聚类太小,相对靠近的停靠点将位于单独的聚类中。

这就是为什么我们决定使用一种改进的方法——称为“递归-DBSCAN”。****

递归数据库扫描

它建立在 DBSCAN 的辉煌之上,但同时允许我们更深入地挖掘高航点密度区域,同时将远程订单分组在一起。

对于订单列表,我们的目标是找到平均路点数最大的半径(但聚类数将高于 min_no_clusters )。我们通过使用简单的二分搜索法算法来做到这一点。

一旦我们找到最优解,我们“进入”太大的集群,并应用相同的逻辑,直到我们到达每个集群包含小于 max_len_cluster 的点。

然后,对于每个集群,我们使用谷歌优化工具运行我们开发的路线优化算法。希望这将更快地给我们一个相似的结果,并且使用更少的内存。

伪代码如下:

基准

我们非常好奇我们的方法将如何执行,但同时我们担心递归可能会运行很长时间,从而使我们的算法不比基线方法好。

这就是为什么我们首先决定看看运行时:

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

原来, recursive-dbscan 算法大大优于谷歌优化工具方法。同时,它与 dbscan 方法的运行时间没有太大的不同。

由于 RAM 内存使用问题,我们只能对最多 2000 个订单运行 dbscan 和对 1500 个订单运行 Google 优化工具:当所需内存超过 25 GB 时,这两种方法都会崩溃。

运行时间很重要,但我们感兴趣的是,与基线方法相比,我们的新算法在总距离和使用的车辆数量方面的表现如何。这两个图表显示:

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

正如我们所见,在距离和车辆数量方面,递归方法紧跟谷歌优化工具方法。同时,它优于 dbscan 方法。

这意味着我们的新算法比基线算法更快,而且找到的解的质量也一样好。此外,使用的最大 RAM“只有”1GB!

我们拿到了!

DBSCAN 与递归 DBSCAN

我们还想向您展示递归 dbscan 如何更好地用于远程航路点。

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

Figure 5: Comparison od DBSCAN and Recursive-DBSCAN routes. We are aware that they are still not perfect!

上图中,左侧是一张使用普通 DBSCAN 算法找到的分配图。我们可以看到许多司机只交付一个订单,因为这些订单是他们批次中唯一的订单。

在右侧,我们看到递归方法很好地处理了这个问题,通过对不同区域使用不同的半径,它设法找到了一个仅使用 3 辆车交付所有订单的解决方案!****

这是递归 dbscan 方法如何更适合我们的用例以及我们为什么选择使用它的完美可视化。

结论(又名 TL;博士)

在这篇文章中,我们提出了我们的方法来解决带有时间窗的有容量限制的车辆路径问题。通过使用递归 dbscan 方法,我们能够显著减少运行时间和内存使用,同时保持与基准 Google 优化工具方法类似的结果质量

这种算法对我们的运营团队有很大的帮助**,将几个小时的琐碎手工工作减少到几分钟的 CPU 时间(并由人工复核结果)。**

今后

我们意识到我们的工具并不完美。

一个主要的问题是仍然是一个静态方法**,一旦运行,如果有更好的路线可用,或者如果路况改变,它不会更新自己。在这种情况下,我们有几个选择,一个是实施地理哈希Lyft ,另一个来自我们的合作伙伴——香港理工大学大数据分析研究机构。**

我们的目标是改善路线优化,以便持续监控司机,并且在司机有可能无法按时运送包裹时发出警报**—所有这些都是为了让我们的客户对我们的服务更加满意。**

希望这篇文章为您提供了一些关于我们在 GOGOVAN 解决的问题的深刻见解。如果您对此感兴趣,或者您只是想了解更多,请随时联系我们。

当然,未来还有很大的改进空间,但我们希望分享我们的一些方法,以便在优化按需物流运营这一迷人领域引发讨论和取得进展。

如果您想了解我们数据团队的更多信息,请点击查看我们数据主管的文章

我们一直在寻找顶尖的应用运营和 ML 研究人才。有意者请联系!(现场和远程)

参考文献:

[1]j . k .伦斯特拉和 Kan a . h .(1981),车辆路线和调度问题的复杂性。网络,11:221–227。doi:10.1002/net . 3230110211

[2] Fukasawa,r .,Longo,h .,Lysgaard,j .等人。程序。(2006) 106: 491.

[3]巴尔达奇和明戈齐,数学。程序。(2009) 120: 347.https://doi.org/10.1007/s10107-008-0218-9

[4] Nagata Y. (2007)带容量限制的车辆路径问题的边缘装配交叉。参见:Cotta C .,van Hemert J .(编辑)组合优化中的进化计算。EvoCOP 2007。计算机科学讲义,第 4446 卷。施普林格,柏林,海德堡

[5]br ysy,o .和 Gendreau,M. Top (2002 年)10: 211。https://doi.org/10.1007/BF02579017

[6]谭鑫,卓鑫,张军(2006)带时间窗车辆路径优化问题的蚁群系统。在:黄 DS。、李 k、欧文 G.W .(编)计算智能与生物信息学。ICIC 2006。计算机科学讲义,第 4115 卷。施普林格,柏林,海德堡

[7]李晓燕(2015)带时间窗的有能力限制的车辆路径问题:非营利组织食品提货的案例研究

[8] M. Ester,H. Kriegel,J. Sander 和 X. Xu,“一种基于密度的算法,用于在带有噪声的大型空间数据库中发现聚类”,在 Proc .第二国际。糖膏剂知识发现和数据挖掘(KDD’96),1996 年,第 226-231 页。

利用数据科学和分析改善患者流量

原文:https://towardsdatascience.com/improving-patient-flows-with-data-science-and-analytics-faf29affaa60?source=collection_archive---------19-----------------------

通过改进流程降低成本

我们的团队最近被问到如何利用数据分析和数据科学来改善医院的瓶颈和患者流量。医疗保健提供商和医院可能会有非常复杂的患者流。许多步骤可能会相互交织,资源必须始终在任务之间转移,患者和新患者的严重程度决定了谁需要一直接受治疗。这使得在医院进行流程改进并不容易。这个问题是工艺问题。工业工程师和六西格玛从业者喜欢的东西。他们喜欢在有数千个标签和数千行数据的 Excel 表格中查看医疗保健流程问题。然而,现在我们不再局限于在 Excel 电子表格中对数千行数据进行分析和模型开发。我们现在可以访问更完整的数据集,根据我们的经验,这些数据集可以多达数十亿行,而且更强大的计算系统可以更准确有效地分析患者流量和瓶颈。

现在,有了 SQL、R 和 python 等工具,我们可以快速分析这些数据集。

这不仅仅是工具的问题。事实上,有了如此强大的工具,人们很容易尝试制作能够一次性解决所有问题的模型和算法。这种方法在研究医院的病人流量和瓶颈(或任何问题)时,最大的问题之一是它的视角太过宽泛。这使得评估一项分析何时完成变得非常困难,并且经常让数据科学家和分析师持续数周而得不到真正的答案。

这里的问题是查看所有内容的范围很难管理和确定问题。而不是试图攻击医院的所有流程和程序。更好的办法是将你认为可能存在瓶颈的程序/患者流程/过程分成几大类。这是因为医院有如此多不同的可能路径和流程(下面我将使用“流程”一词来描述患者流),以至于盲目寻找某种瓶颈将会花费很长时间(这就像在医疗保健中寻找欺诈一样,如果你试图做得太笼统,那么几乎不可能找到)。

第一步是找出问题所在。不知道你想瞄准什么,就很难知道解决方案是什么。在一个完美的世界里,你的医院有一个数据库,跟踪所有的过程和程序。这将使开发能够指出主要瓶颈的查询或 Jupyter 笔记本变得容易。这将进一步帮助您的团队减少不必要的工作量。一旦你的团队知道了问题在哪里,那么你的团队就可以用这些唾手可得的果实来寻找问题。

异常

异常,比如病人流动的时间不一致,无论是特定的医生还是一般情况下,都可能表明存在问题。找到这些特定的异常值可能非常简单。

例如,假设您寻找患者流程 x 的时间异常值,并且您假设一周中的特定日期或一天中的特定时间更有可能具有特定步骤的更长时间。然后,您取出这些步骤,并在时间粒度上分析时间,以单独标记每个流程。你可能会发现夏季的生产力下降,或者在 7 月 4 日你的 ERs 溢出,或者一些不太明显的数据点。

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

这里的一个关键点是,你首先提出一个理论。因为有了明确的问题和假设,寻找证据就容易多了。有了明确的问题,你就知道进一步分析的目标。您可以使用查询来清理数据,并将其分解到所需的粒度。这可能是在医院层面,医生层面,甚至可能下降到程序层面。

在此基础上,您可以应用一个擅长突出异常值的基本算法(如基本的 IQR 计算或更复杂的计算)。一旦发现异常值,就可以进一步分析为什么在特定流程中会有较长的时间或不一致的时间。有许多看似合理的原因,但现在你已经决定了一类程序,假设并发现了一个看似合理的弱点。有了这些基本步骤,前进就容易多了。

按照这些步骤,您可以重复类似的过程。从理论上解释为什么你会看到异常值,是什么导致了异常值,并进一步研究数据。这可能是由糟糕的流程造成的,在你需要更多人手的时候人手太少(想想排队论)。一旦你知道要关注哪些步骤,你就可以开始采取下一步措施,比如流程改进团队,他们现在已经找到了确切的问题,而不是简单地派出一个分析师团队跟随医生,猜测问题出在哪里。

瓶颈

除了异常,另一个常见的问题是一些进程可能需要相同的资源。现在,定位这些瓶颈的一种方法是基于第一个异常点。因为瓶颈可能是导致异常的问题之一。然而,瓶颈也可能隐藏在这样一个事实中,即所讨论的步骤总是运行很长,因此没有异常。相反,这种分析需要问一个简单的问题。患者流程中是否有重叠的步骤,并且似乎需要很长时间或至少比预期的时间长。某些步骤可能需要很长时间,例如某些实验室需要一段时间才能运行。还有其他人不应该。分析这些步骤可能会导致医院设置新的套房或雇用新的专家来处理某些领域的繁重负载。

结论

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

改善患者流量是降低患者成本和提高患者满意度的重要一步。通过减少他们在医院和医疗保健系统花费的时间,您可以减少员工照顾他们所需的时间。这应该有助于降低总成本。我们的团队总是把它看作是对患者的一种削减,尽管它也应该反过来降低医疗保健系统的成本。从我们的角度来看,医院、保险公司和顾问能够做的任何有助于降低我们当前系统中医疗保健成本的事情都需要去做。

改进 Python 中的随机森林第 1 部分

原文:https://towardsdatascience.com/improving-random-forest-in-python-part-1-893916666cd?source=collection_archive---------1-----------------------

收集更多数据和特征工程

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

之前的帖子中,我们用 Python 实现了一个简单随机森林的端到端实现,解决了一个监督回归问题。虽然我们涵盖了机器学习过程的每个步骤,但我们只简要地触及了最关键的部分之一:改进我们最初的机器学习模型。我们完成的模型取得了不错的性能,超过了基线,但我们应该能够通过一些不同的方法来改进模型。本文是探索如何使用 Python 和 Scikit-Learn 库改进我们的随机森林机器学习模型的两篇文章中的第一篇。我建议在继续之前先看看这篇介绍性的文章,但是这里涉及的概念也可以独立存在。

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

如何改进机器学习模型

有三种改进现有机器学习模型的通用方法:

  1. 使用更多(高质量)数据和特征工程
  2. 调整算法的超参数
  3. 尝试不同的算法

这些是按照我平时尝试的顺序来呈现的。通常,为改进不良模型而提出的直接解决方案是使用更复杂的模型,通常是深度神经网络。然而,我发现这种方法不可避免地会导致沮丧。一个复杂的模型需要花费很多时间来构建,但是也不能交付,导致了另一个模型的产生,等等。相反,我的第一个问题总是:“我们能获得更多与问题相关的数据吗?”。正如 Geoff Hinton(深度神经网络之父)在一篇名为‘数据的不合理有效性’的文章中所指出的,对问题来说,有用数据的数量比模型的复杂性更重要。其他人附和了这个观点,即一个简单的模型和大量的数据将会击败一个数据有限的复杂模型。如果有更多的信息可以帮助解决我们没有使用的问题,从投入的时间和获得的性能来看,最好的回报就是获取这些数据。

这篇文章将介绍改进 ML 模型的第一种方法,第二种方法将出现在后续文章中。我还将编写几个算法的端到端实现,这些算法可能会也可能不会击败随机森林(如果对特定算法有任何要求,请在评论中告诉我)!这个例子的所有代码和数据都可以在项目 GitHub 页面找到。我在这篇文章中包含了大量代码,不是为了让不熟悉 Python 的人气馁,而是为了展示机器学习变得多么容易,并鼓励任何人开始实现这些有用的模型!

问题重述

简单提醒一下,我们正在处理一个温度预测问题:给定历史数据,我们想预测我们城市明天的最高温度。我正在使用华盛顿州的西雅图,但也可以随意使用 NOAA 气候数据在线工具来获取你所在城市的信息。这个任务是一个有监督的回归机器学习问题,因为我们有我们想要预测的标签(目标),并且这些标签是连续的值(与无监督学习相反,在无监督学习中,我们没有标签,或者在分类中,我们预测离散的类)。我们在简单模型中使用的原始数据是 2016 年以来某一年的最高温度测量值以及历史平均最高温度。这得到了我们“有气象倾向”的朋友的预测的补充,这是通过从历史平均值中随机加减 20 度计算出来的。

我们使用原始数据的最终性能的平均误差为 3.83 度,而基线误差为 5.03 度。这表示最终准确率为 93.99%。

获取更多数据

在第一篇文章中,我们使用了 2016 年的一年历史数据。多亏了美国国家大气和海洋管理局,我们可以获得 1891 年的数据。现在,让我们把自己限制在六年内(2011-2016),但可以随意使用额外的数据来看看是否有帮助。除了简单地获取更多年份的数据,我们还可以包含更多的特性。这意味着我们可以使用我们认为对预测最高温度有用的额外天气变量。我们可以使用我们的领域知识(或专家的建议),以及变量和目标之间的相关性来确定哪些特性是有帮助的。从 NOAA 提供的过多选项中(说真的,我不得不称赞这个组织的工作和他们的开放数据政策),我将平均风速、降水量和地面积雪深度添加到我们的变量列表中。请记住,因为我们预测的是明天的最高温度,所以我们实际上不能使用当天的测量值。我们必须将它转移到过去的某一天,这意味着我们使用今天的总降水量来预测明天的最高温度。这防止了我们通过今天拥有来自未来的信息来“欺骗”。

额外的数据直接来自源代码,状态相对较好,但是在将它读入 Python 之前,我确实需要做一些轻微的修改。我已经省略了“数据管理”的细节,将重点放在随机森林实现上,但是我将发布一个单独的帖子,展示如何清理数据。我在 munging 中使用了 R 统计语言,因为我喜欢它使数据操作具有交互性的方式,但这将在另一篇文章中讨论。现在,我们可以加载数据并检查前几行。

# Pandas is used for data manipulation
import pandas as pd# Read in data as a dataframe
features = pd.read_csv('data/temps_extended.csv')
features.head(5)

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

Expanded Data Subset

新的变量是:

ws_1 :前一天的平均风速(mph)

prcp_1 :前一天的降水量(in)

snwd_1 :前一天地面积雪深度(in)

在我们有 348 天的数据之前。现在来看看尺寸。

print('We have {} days of data with {} variables'.format(*features.shape))**We have 2191 days of data with 12 variables.**

现在有超过 2000 天的历史温度数据(约 6 年)。我们应该对数据进行汇总,以确保数字中没有突出的异常。

round(features.describe, 2)

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

Expanded Data Summary

从描述性统计数据来看,没有什么立即出现异常。我们可以快速绘制所有变量的图表来证实这一点。我省略了绘图代码,因为虽然 matplotlib 库非常有用,但代码不直观,很容易迷失在绘图的细节中。(所有代码都可以在 GitHub 上查看和修改)。

首先是四个温度图。

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

Expanded Data Temperature Plots

接下来,我们可以看看历史最高平均温度和三个新的变量。

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

Expanded Data Additional Variables

从数值和图形上看,我们的数据中没有明显的异常值。此外,我们可以检查这些图,看看哪些特性可能有用。我认为积雪深度是最没有帮助的,因为大部分时间积雪深度为零,同样,风速看起来也太嘈杂了,没有多大帮助。根据以往的经验,历史平均最高温度和以往最高温度可能是最重要的,但我们将不得不看到!

我们可以再画一个探索图,配对图,来形象化变量之间的关系。这在散点图中绘出了所有变量之间的相互关系,使我们能够检查特征之间的相关性。与上面的图表相比,这个令人印象深刻的情节的代码相当简单!

# Create columns of seasons for pair plotting colors
seasons = []for month in features['month']:
    if month in [1, 2, 12]:
        seasons.append('winter')
    elif month in [3, 4, 5]:
        seasons.append('spring')
    elif month in [6, 7, 8]:
        seasons.append('summer')
    elif month in [9, 10, 11]:
        seasons.append('fall')# Will only use six variables for plotting pairs
reduced_features = features[['temp_1', 'prcp_1', 'ws_1', 'average', 'friend', 'actual']]
reduced_features['season'] = seasons# Use seaborn for pair plots
import seaborn as sns
sns.set(style="ticks", color_codes=True);# Create a custom color palete
palette = sns.xkcd_palette(['dark blue', 'dark green', 'gold', 'orange'])# Make the pair plot with a some aesthetic changes
sns.pairplot(reduced_features, hue = 'season', diag_kind = 'kde', palette= palette, plot_kws=dict(alpha = 0.7),
                   diag_kws=dict(shade=True))

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

Pairplots

对角线图显示了每个变量的分布,因为每个变量相对于自身的图形将只是一条直线!这些颜色代表四季,如右边的图例所示。我们想要关注的是实际最高温度和其他变量之间的趋势。这些图在最下面一行,要查看与实际最大值的特定关系,请移至包含变量的行。例如,左下方的图显示了实际最高温度和前一天的最高温度(temp_1)之间的关系。这是一个强正相关,表明前一天的最高气温升高,第二天的最高气温也升高

数据准备

这些数据已经在数字和图形上得到验证,现在我们需要将它转换成机器学习算法可以理解的格式。我们将执行与简单实现中完全相同的数据格式化过程:

  1. 一键编码分类变量(星期几)
  2. 将数据分为要素(独立变量)和标签(目标)
  3. 将数据帧转换为 Numpy 数组
  4. 创建要素和标注的随机训练和测试集

我们可以用几行 Python 代码完成所有这些步骤。

# One Hot Encoding
features = pd.get_dummies(features)# Extract features and labels
labels = features['actual']
features = features.drop('actual', axis = 1)# List of features for later use
feature_list = list(features.columns)# Convert to numpy arrays
import numpy as npfeatures = np.array(features)
labels = np.array(labels)# Training and Testing Sets
from sklearn.model_selection import train_test_splittrain_features, test_features, train_labels, test_labels = train_test_split(features, labels,                                          test_size = 0.25, random_state = 42)

我们设置了一个随机的种子(当然它必须是 42 )来确保不同运行的结果一致。让我们快速检查一下每个数组的大小,以确认一切正常。

print('Training Features Shape:', train_features.shape)
print('Training Labels Shape:', train_labels.shape)
print('Testing Features Shape:', test_features.shape)
print('Testing Labels Shape:', test_labels.shape)**Training Features Shape: (1643, 17)
Training Labels Shape: (1643,)
Testing Features Shape: (548, 17)
Testing Labels Shape: (548,)**

可以走了!我们有大约 4.5 年的训练数据和 1.5 年的测试数据。然而,在我们开始建模的有趣部分之前,还有一个额外的步骤。

建立新的基线

在之前的帖子中,我们使用历史平均最高温度作为我们要击败的目标。也就是我们把明天的最高气温作为当天的历史平均最高气温来评估预测的准确性。我们已经知道,即使是根据一年的数据训练的模型也可以超过基线,所以我们需要提高我们的预期。对于新的基线,我们将使用根据原始数据训练的模型。为了进行公平的比较,我们需要用新的、扩展的测试集来测试它。然而,新的测试集有 17 个特征,而原始模型只训练了 14 个特征。我们首先必须从测试集中删除 3 个新特性,然后评估原始模型。原始随机森林已经根据原始数据进行了训练,下面的代码显示了准备测试功能和评估性能(参考笔记本进行模型训练)。

# Find the original feature indices 
original_feature_indices = [feature_list.index(feature) for feature in feature_list if feature not in ['ws_1', 'prcp_1', 'snwd_1']]# Create a test set of the original features
original_test_features = test_features[:, original_feature_indices]# Make predictions on test data using the model trained on original data
predictions = rf.predict(original_test_features)# Performance metrics
errors = abs(predictions - test_labels)print('Metrics for Random Forest Trained on Original Data')
print('Average absolute error:', round(np.mean(errors), 2), 'degrees.')# Calculate mean absolute percentage error (MAPE)
mape = 100 * (errors / test_labels)# Calculate and display accuracy
accuracy = 100 - np.mean(mape)
print('Accuracy:', round(accuracy, 2), '%.')**Metrics for Random Forest Trained on Original Data
Average absolute error: 4.3 degrees.
Accuracy: 92.49 %.**

在一年的数据上训练的随机森林能够实现 4.3 度的平均绝对误差,表示在扩展的测试集上 92.49%的准确度。如果我们用扩展的训练集训练的模型不能击败这些指标,那么我们需要重新思考我们的方法。

扩展数据的训练和评估

Scikit-Learn 的伟大之处在于,可以用几行代码创建和训练许多最先进的模型。随机森林就是一个例子:

# Instantiate random forest and train on new features
from sklearn.ensemble import RandomForestRegressorrf_exp = RandomForestRegressor(n_estimators= 1000, random_state=100)
rf_exp.fit(train_features, train_labels)

现在,我们可以进行预测,并与已知的测试集目标进行比较,以确认或否认我们扩展的训练数据集是一项不错的投资:

# Make predictions on test data
predictions = rf_exp.predict(test_features)# Performance metrics
errors = abs(predictions - test_labels)print('Metrics for Random Forest Trained on Expanded Data')
print('Average absolute error:', round(np.mean(errors), 2), 'degrees.')# Calculate mean absolute percentage error (MAPE)
mape = np.mean(100 * (errors / test_labels))# Compare to baseline
improvement_baseline = 100 * abs(mape - baseline_mape) / baseline_mape
print('Improvement over baseline:', round(improvement_baseline, 2), '%.')# Calculate and display accuracy
accuracy = 100 - mape
print('Accuracy:', round(accuracy, 2), '%.')**Metrics for Random Forest Trained on Expanded Data
Average absolute error: 3.7039 degrees.
Improvement over baseline: 16.67 %.
Accuracy: 93.74 %.**

嗯,我们没有浪费时间去获取更多的数据!基于六年的历史测量值和使用三个附加特征的训练已经使我们在基线模型上获得了 16.41%的改进。确切的指标将根据随机种子而变化,但我们可以确信新模型优于旧模型。

为什么一个模型会随着更多的数据而改进?回答这个问题的最好方法是从人类如何学习的角度来思考。我们通过经验来增加我们对世界的了解,我们练习一项技能的次数越多,我们就会学得越好。机器学习模型也“从经验中学习”,因为每次它查看另一个训练数据点时,它都会学习更多关于特征和标签之间关系的信息。假设数据中存在关系,为模型提供更多数据将使其更好地理解如何将一组要素映射到标注。对于我们的例子,随着模型看到更多天的天气测量,它更好地理解如何进行这些测量并预测第二天的最高温度。实践提高了人的能力和机器学习模型的性能。

特征约简

在某些情况下,我们可能走得太远,实际上使用了太多的数据或添加了太多的功能。一个适用的例子是我目前正在研究的涉及建筑能源的机器学习预测问题。问题是根据天气数据预测 15 分钟内的建筑能耗。对于每栋建筑,我都有 1-3 年的历史天气和电力使用数据。令人惊讶的是,我发现随着我包含更多的一些建筑的数据,预测的准确性下降了。经过询问,我确定一些建筑在数据收集过程中进行了改造以提高能源效率,因此,最近的用电量与改造前有很大不同。在预测电流消耗时,使用修改前的数据实际上降低了我的模型的性能。变更后的最新数据比旧数据更相关,对于几栋建筑,我最终减少了历史数据的数量以提高性能!

对于我们的问题,数据的长度不是一个问题,因为在六年的数据中没有影响最高温度的重大变化(气候变化正在增加温度,但时间跨度更长)。然而,有可能我们有太多的功能。我们之前看到一些特征,特别是我们朋友的预测,看起来更像是噪音,而不是最高温度的准确预测。额外的功能可能会降低性能,因为它们可能会通过向模型提供不相关的数据来“混淆”模型,从而阻止模型学习实际的关系。随机森林执行隐式特征选择,因为它在最重要的变量上分割节点,但其他机器学习模型不这样做。因此,改进其他模型的一种方法是使用随机森林特征重要性来减少问题中的变量数量。在我们的例子中,我们将使用特征重要性来减少随机森林模型的特征数量,因为除了潜在的提高性能之外,减少特征数量将会缩短模型的运行时间。本文不涉及更复杂的降维,如 PCA ( 主成分分析)或 ICA ( 独立成分分析)。这些在减少特征数量的同时不减少信息方面做得很好,但是它们转换了特征,使得它们不再代表我们测量的变量。我喜欢机器学习模型具有可解释性和准确性的混合,因此我通常坚持使用允许我理解模型如何进行预测的方法。

特征重要性

在 Scikit-Learn 中,查找随机森林的特征重要性很简单。重要性的实际计算超出了这篇博文的范围,但是这发生在后台,我们可以使用模型返回的相对百分比来对特性进行排序。

以下 Python 代码创建了一个由元组组成的列表,其中每个元组都是一对(要素名称,重要性)。这里的代码利用了 Python 语言中一些巧妙的技巧,即列表综合压缩排序,以及参数解包。如果你不完全理解这些,不要担心,但是如果你想熟练掌握 Python,这些是你应该有的工具!

# Get numerical feature importances
importances = list(rf_exp.feature_importances_)# List of tuples with variable and importance
feature_importances = [(feature, round(importance, 2)) for feature, importance in zip(feature_list, importances)]# Sort the feature importances by most important first
feature_importances = sorted(feature_importances, key = lambda x: x[1], reverse = True)# Print out the feature and importances 
[print('Variable: {:20} Importance: {}'.format(*pair)) for pair in feature_importances]Variable: temp_1               Importance: 0.83
Variable: average              Importance: 0.06
Variable: ws_1                 Importance: 0.02
Variable: temp_2               Importance: 0.02
Variable: friend               Importance: 0.02
Variable: year                 Importance: 0.01
Variable: month                Importance: 0.01
Variable: day                  Importance: 0.01
Variable: prcp_1               Importance: 0.01
Variable: snwd_1               Importance: 0.0
Variable: weekday_Fri          Importance: 0.0
Variable: weekday_Mon          Importance: 0.0
Variable: weekday_Sat          Importance: 0.0
Variable: weekday_Sun          Importance: 0.0
Variable: weekday_Thurs        Importance: 0.0
Variable: weekday_Tues         Importance: 0.0
Variable: weekday_Wed          Importance: 0.0

这些数据明确证明了一些变量比其他变量对我们的问题更重要!鉴于有如此多的变量的重要性为零(或由于舍入而接近零),似乎我们应该能够在不影响性能的情况下去掉其中一些变量。首先,让我们制作一个图表来表示特征重要性的相对差异。我留下了这个绘图代码,因为它更容易理解。

# list of x locations for plotting
x_values = list(range(len(importances)))# Make a bar chart
plt.bar(x_values, importances, orientation = 'vertical', color = 'r', edgecolor = 'k', linewidth = 1.2)# Tick labels for x axis
plt.xticks(x_values, feature_list, rotation='vertical')# Axis labels and title
plt.ylabel('Importance'); plt.xlabel('Variable'); plt.title('Variable Importances');

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

Expanded Model Variable Importances

我们还可以制作一个累积重要性图,显示每个额外变量对整体重要性的贡献。虚线表示 95%的总重要性。

# List of features sorted from most to least important
sorted_importances = [importance[1] for importance in feature_importances]
sorted_features = [importance[0] for importance in feature_importances]# Cumulative importances
cumulative_importances = np.cumsum(sorted_importances)# Make a line graph
plt.plot(x_values, cumulative_importances, 'g-')# Draw line at 95% of importance retained
plt.hlines(y = 0.95, xmin=0, xmax=len(sorted_importances), color = 'r', linestyles = 'dashed')# Format x ticks and labels
plt.xticks(x_values, sorted_features, rotation = 'vertical')# Axis labels and title
plt.xlabel('Variable'); plt.ylabel('Cumulative Importance'); plt.title('Cumulative Importances');

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

Cumulative Feature Importances

我们现在可以用它来删除不重要的特征。95%是一个任意的阈值,但是如果它导致明显的低性能,我们可以调整这个值。首先,我们需要找到超过 95%重要性的特征的确切数量:

# Find number of features for cumulative importance of 95%
# Add 1 because Python is zero-indexed
print('Number of features for 95% importance:', np.where(cumulative_importances > 0.95)[0][0] + 1)**Number of features for 95% importance: 6**

然后,我们可以创建一个新的训练和测试集,只保留 6 个最重要的特性。

# Extract the names of the most important features
important_feature_names = [feature[0] for feature in feature_importances[0:5]]
# Find the columns of the most important features
important_indices = [feature_list.index(feature) for feature in important_feature_names]# Create training and testing sets with only the important features
important_train_features = train_features[:, important_indices]
important_test_features = test_features[:, important_indices]# Sanity check on operations
print('Important train features shape:', important_train_features.shape)
print('Important test features shape:', important_test_features.shape)**Important train features shape: (1643, 6)
Important test features shape: (548, 6)**

我们将特性的数量从 17 个减少到 6 个(尽管公平地说,其中 7 个特性是从一周中的某一天的一次性编码中创建的,所以我们实际上只有 11 条唯一的信息)。希望这不会显著降低模型的准确性,并将大大减少训练时间。

重要特性的培训和评估

现在,我们进行与所有功能相同的训练和测试程序,并评估准确性。

# Train the expanded model on only the important features
rf_exp.fit(important_train_features, train_labels);# Make predictions on test data
predictions = rf_exp.predict(important_test_features)# Performance metrics
errors = abs(predictions - test_labels)print('Average absolute error:', round(np.mean(errors), 2), 'degrees.')# Calculate mean absolute percentage error (MAPE)
mape = 100 * (errors / test_labels)# Calculate and display accuracy
accuracy = 100 - np.mean(mape)
print('Accuracy:', round(accuracy, 2), '%.')**Average absolute error: 3.821 degrees.
Accuracy: 93.56 %.**

仅使用 6 个特征,性能遭受 0.12 度平均误差的微小增加。通常,随着功能的减少,性能会略有下降,这必须与运行时间的减少相权衡。机器学习是一个进行权衡的游戏,运行时间与性能通常是关键决策之一。我将很快做一些基准测试来比较这两个模型的相对运行时间(代码见 Jupyter Notebook)。

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

Model Tradeoffs

总体而言,缩减特征模型的相对精度降低了 0.131% ,相对运行时间降低了 35.1% 。在我们的例子中,运行时是无关紧要的,因为数据集很小,但是在生产环境中,这种权衡可能是值得的。

结论

我们没有开发更复杂的模型来改进我们的随机森林,而是采取了收集更多数据点和附加特征的明智步骤。这种方法得到了验证,因为与基于有限数据训练的模型相比,我们能够将的误差降低 16.7%。此外,通过将特征的数量从 17 个减少到 6 个,我们将运行时间减少了 35%,而准确性仅略有下降。总结这些改进的最好方法是用另一个图表。根据一年的训练数据训练的模型在左侧,使用六年的数据和所有特征的模型在中间,而右侧的模型使用六年的数据,但只是最重要特征的子集。

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

Model Comparisons

这个例子展示了增加数据量的有效性。虽然大多数人犯了立即转向更强大的模型的错误,但我们已经认识到,大多数问题可以通过收集更多相关数据点来改善。在本系列的后续部分中,我们将研究改进模型的其他方法,即超参数调整和使用不同的算法。然而,在这种情况下,获得更多的数据可能会在投入的时间和提高的性能方面获得最大的回报。下次你看到有人在第一个模型失败后急于实现复杂的深度学习模型,礼貌地问他们是否已经用尽了所有的数据来源。机会是,如果仍然有与他们的问题相关的数据,他们可以获得更好的性能并在这个过程中节省时间!

一如既往,我感谢任何意见和建设性的反馈。可以在 wjk68@case.edu 找到我

改进主题模型的解释

原文:https://towardsdatascience.com/improving-the-interpretation-of-topic-models-87fd2ee3847d?source=collection_archive---------0-----------------------

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

在我的上一篇博文中,我使用了在令人惊叹的 Scikit Learn 机器学习 Python 库中实现的非负矩阵分解(NMF)和潜在狄利克雷分配(LDA)算法,来在文档集合中查找主题。派生主题的输出包括给主题分配一个数字标签,并打印出主题中的热门单词。通常的做法是简单地打印出每个主题的热门词汇——很多主题模型浏览器、可视化工具和公开网站上的例子都是这样做的!然而,仅仅显示主题中的顶部单词可能不会帮助用户理解每个主题是关于什么的或者确定使用这些单词的上下文。仅显示顶部主题单词不能利用两种算法返回的所有数据。在这篇博文中,我将解释 NMF 和 LDA 返回的矩阵,包括打印出主题中顶部文档的代码,并讨论我改进派生主题解释的想法,特别是当数据集中包含冗长的文档时。

NMF 和 LDA 返回的矩阵

NMF 和 LDA 都采用一个单词包矩阵(没有文档没有单词)作为输入。在单词包矩阵中,文档表示为行,单词表示为列。这两种算法都需要主题的数量( k ),这些主题必须作为参数导出。主题建模算法产生的输出是 2 个矩阵:文档到主题矩阵(无文档 k 主题)和主题到单词矩阵( k 主题*无单词)。大多数主题模型输出仅使用主题到单词矩阵,并显示主题中权重最高的单词。通过显示主题中的热门文档,可以更好地理解主题,这对于 Scikit Learn 来说是相对简单的。

显示主题中的热门词汇和文档

让我们首先编写一个新的 display_topics()方法,它将单词到主题矩阵(H)和主题到文档矩阵(W)作为参数。除了单词(feature_names)和顶部单词数(no_top_words)作为参数显示之外,该方法还需要显示文档集合(documents)和顶部文档数(no_top_documents)。display_topics 方法打印出一个数字索引作为主题名,打印出主题中的热门单词,然后打印出主题中的热门文档。顶部的单词和顶部的文档在返回的矩阵中具有最高的权重。argsort()方法用于对矩阵的行或列进行排序,并按顺序返回权重最高的单元格的索引。

我们需要从 NMF 和 LDA 算法中获得单词到主题矩阵(H)和主题到文档矩阵(W)。词到主题矩阵(H)可以从模型的 component_ attribute 后得到。调用 fit()。将主题转换为文档矩阵有点棘手,但在阅读了 Scikit Learn api 文档后,每个算法都会变得有意义。在算法模型上调用 transform()方法会将主题返回到文档矩阵(W)。下面是从 NMF 和 LDA 获得 H 和 W 矩阵,然后调用 display_topics()方法的完整代码:

一个说明性的玩具例子

一个很小的,我是说非常小的数据集被用来说明一个主题中的热门单词和文档的打印。这个小小的数据集有两个主题,分别是关于用户界面和图形/树。有 9 个非常短的句子组成了这个数据集。下面的代码使用 NMF 和 LDA 查找 2 个主题,在一个主题中打印 4 个热门单词和 4 个热门文档:

来自 NMF 和 LDA 的主题显示如下。NMF 和 LDA 在寻找我们知道的主题方面做得很好。

NMF 话题
话题 0:
树图未成年人调查
-图未成年人 IV:树的宽度与准有序
-树中路径的交集图
-随机、二进制、无序树的生成
-图未成年人:调查

主题 1:
用户时间响应界面
用户对计算机系统响应时间的意见调查
用户感知的响应时间与误差测量的关系
EPS 用户界面管理系统
实验室 ABC 计算机应用的人机界面

LDA 主题:
主题 0:
用户响应时间计算机
-对计算机系统响应时间的用户意见调查
-用户感知的响应时间与误差测量的关系
-EPS 用户界面管理系统
-实验室 ABC 计算机应用的人机界面

主题 1:
树图人类未成年人
-图未成年人 IV:树的宽度和准排序
-图未成年人:调查
-树中路径的交集图
-实验室 ABC 计算机应用的人机界面

主题建模浏览器的构想

当文档很大时,打印主题时显示整个文档是不切实际的。该技术仅对短文档(例如,tweets)或单个段落文档直接有用。一种解决方案是只显示文档中包含任何热门单词的片段。在以后的博文中,我将发布一些 Python 代码来实现这个想法,并提供一个派生主题的上下文关键字视图。将这种想法与可视化工具如 LDAVis T1 结合起来,将会产生一个真正有用的主题模型浏览器,帮助用户解释和探索派生的主题。

改进香草梯度下降

原文:https://towardsdatascience.com/improving-vanilla-gradient-descent-f9d91031ab1d?source=collection_archive---------2-----------------------

应用于训练神经网络的性能改进

简介

当我们使用梯度下降来训练神经网络时,我们会冒着网络陷入局部最小值的风险,在这种情况下,网络会停止在误差曲面上的某个位置,而该位置不是整个曲面上的最低点。这是因为误差曲面不是固有凸的,所以曲面可能包含许多独立于全局最小值的独立局部最小值。此外,虽然网络可能达到全局最小值并收敛到训练数据的期望点,但是不能保证它将如何很好地概括它所学习的内容。这意味着它们容易在训练数据上过度拟合。

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

为了帮助减轻这些问题,我们可以使用一些东西,尽管没有办法明确地防止它们发生,因为这些网络的误差表面往往很难遍历,并且神经网络作为一个整体很难解释。

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

标准梯度下降算法的这些修改为算法的每次迭代使用训练数据的子集。SGD 将在每次权重更新时使用一个样本,小批量 SGD 将使用预定义的数量(通常比训练样本的总数小得多)。这使得训练进行得更快,因为它需要更少的计算,因为我们在每次迭代中不使用整个数据集。这也有望带来更好的性能,因为网络在训练期间的剧烈运动应该允许它更好地避免局部最小值,并且只使用数据集的一小部分应该有助于防止过度拟合。

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

正规化

一般而言,正则化是一种通过向表示模型复杂性的损失函数添加一项来惩罚模型复杂性的机制。在神经网络的情况下,它惩罚大的权重,这可能指示网络已经过度适应训练数据。

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

使用 L2 正则化,我们可以将损失函数重写如下,将网络的原始损失函数表示为 L(y,t) ,正则化常数表示为 λ :

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

正则化将网络中每个权重的平方和添加到损失函数中,惩罚模型对任何一个连接赋予过多的权重,并有望减少过度拟合。

动力

简单地说,动量将过去权重更新的一部分添加到当前权重更新中。这有助于防止模型陷入局部最小值,因为即使当前梯度为 0,过去的梯度很可能不是,所以它很容易陷入。通过使用动量,沿着误差表面的运动通常也更平滑,并且网络可以更快地穿过误差表面。

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

对于简单动量,我们可以将权重更新方程重写如下,将 α 表示为动量因子:

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

也有其他更高级的动量形式,比如 T2 内斯特罗夫方法 T3。

学习速率退火

我们可以调整学习速度,让它随着时间的推移而下降,而不是在整个训练过程中使用一个恒定的学习速度。

最常见的调度具有如下的 1/t 关系,其中 Tμ_0 被提供超参数,并且 μ 是当前学习率:

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

这通常被称为“搜索然后收敛”退火时间表,因为直到 t 到达 T ,网络处于“搜索”阶段,并且学习速率没有降低太多,之后,学习速率变慢,网络到达“收敛”阶段。这大致与开发探索之间的平衡有关。开始时,我们优先探索搜索空间并扩展我们对该空间的整体知识,随着时间的推移,我们过渡到利用我们已经发现的搜索空间中的好区域,并缩小到特定的最小值。

结论

这些是改进标准梯度下降算法的一些方法。当然,这些方法中的每一种都会向您的模型添加超参数,因此会增加调整网络所花费的时间。最近,更新的算法如亚当阿达格拉德、和阿达德尔塔如雨后春笋般涌现,它们使用了其中一些技术以及许多其他技术。他们倾向于在每个参数的基础上优化,而不是全局优化,因此他们可以根据个人情况微调学习速度。他们在实践中往往工作得更快更好;然而,要正确实施它们要困难得多。下图说明了同时工作的上述每个梯度下降变化。观察到更复杂的版本比简单的动量或 SGD 版本收敛得更快。

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

马尔可夫鼠

原文:https://towardsdatascience.com/in-5-mins-the-markov-mouse-a4f7a38289fb?source=collection_archive---------1-----------------------

什么是马尔可夫链?

马尔可夫链是一种描述一系列可能事件的模型,其中每个事件的概率仅取决于前一个事件达到的状态,即如果我们可以仅根据流程的当前状态对其未来进行预测,就像了解流程的完整历史一样,那么该流程被称为“马尔可夫流程”。让我们带着一个问题直接进入它。

问题:

让我们模拟一只老鼠在迷宫里走来走去。迷宫是一个包含九个房间的封闭空间,房间之间有门道相连。

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

THE MOUSE AND THE MAZE

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

Mouse snacking before entering the maze !

有通向相邻房间的门,即有门:

从 1 到 2 4

从 2 到 1 3 5

从 3 到 2 6

从 4 到 1 5 7

从 5 到 2 4 6 8

从 6 到 3 5 9

从 7 到 4 8

从 8 到 5 7 9

从 9 到 6.8

我们假设鼠标是“马尔可夫鼠标”,即鼠标随机地从一个房间移动到另一个房间,其中鼠标到达下一个房间的概率仅取决于它当前所在的房间,而不取决于它如何到达当前房间。

下面是我们可以用提供的信息创建的转移概率数据,称为转移矩阵:

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

Transition Matrix

它为我们提供了鼠标从源房间到目的房间的概率。例如,如果鼠标出现在房间 1,它可以以 1/2 的概率去房间 2,或者它可以以 1/2 的概率去房间 4。同样,如果老鼠在 2 号房间,它可以去 1 号、3 号或 5 号房间——每个房间都有 1/3 的概率。

符号:

转移矩阵用 P 表示。左上角的矩阵元素用 P(1,1)表示,而右下角的矩阵元素是 P(9,9)。示例:

P(1,1) =鼠标从房间 1 移动到房间 1 的概率= 0

P(1,2) =老鼠从房间 1 移动到房间 2 的概率= 1/2

P(3,6) =老鼠从房间 3 移动到房间 6 的概率= 1/2

重申马尔可夫性质,P(2,3)是假设鼠标从状态 2 开始,鼠标下一步到状态 3 的概率。马尔可夫性意味着概率不依赖于早期的历史。

现在我们已经对流程进行了建模,让我们来看看两个有趣的问题:

问题 1

鼠标从 1 号房间出发,经过两次跃迁到达 6 号房间的概率是多少?

解决方案 1

让我们从直觉开始这个问题——在第一次转换中,鼠标可以从状态 1 进入状态 2 或 4。

如果鼠标进入状态 2,那么在第二次转换中,它只能进入状态 3、4 或 5。

如果鼠标进入状态 4,那么在第二次转换中,它只能进入房间 4、5 或 7。

因此,鼠标不可能在两次转换中从房间 1 到达房间 6。老鼠从 1 号房间出发到达 6 号房间的概率为 0。

问题二

鼠标从 2 号房间出发,在两次转场中再次到达 2 号房间的概率是多少?

方案二

从房间 2 开始,鼠标可以通过以下方式再次到达房间 2:

一、 2 →1 → 2

→概率= P(2,1)*P(1,2) = 1/3 * 1/2 = 1/6

二。 2 → 3 → 2

→概率= P(2,3)*P(3,2) = 1/3 * 1/2 = 1/6

三。 2 →5 →2

→概率= P(2,5)*P(5,2) = 1/3 * 1/4 = 1/12

将所有的个体概率相加,我们得到 1/6 + 1/6 + 1/12 = 5/12。因此,如果鼠标从房间 2 开始,它可以以 5/12 = 0.4167 的概率在两次转换中再次到达状态 2。

解决上述两个问题的另一种方法是矩阵乘法。如果我们将转移矩阵提升到 2 的幂(P ),我们将得到转移矩阵或鼠标在两次转移中从任何其他房间到达任何房间的概率。下面是 P 矩阵。

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

P² Matrix

从上面的矩阵我们可以看到,在两个跃迁中 P(2,2) = 0.4167P(1,6) = 0 ,和我们上面计算的一样。

这是理解马尔可夫链的一个很好的起点,当我们更进一步时,我们可以回答更有趣的问题,例如:

如果从 1 号房间开始,老鼠会在每个房间呆多长时间(持续时间的百分比)?

如果有无限个跃迁,我们会达到稳态吗,它会是什么样子?

从一个特定的房间开始,在 100 次转换中,鼠标最有可能出现在哪里?

————****—————

LinkedIn 上连接

资料来源:http://www.columbia.edu/~ww2040/4701Sum07/MarkovMouse.pdf

在一场人工智能与内容营销者的对决中,谁将赢得未来?

原文:https://towardsdatascience.com/in-a-ai-vs-content-marketer-showdown-who-will-win-the-future-22b737213868?source=collection_archive---------11-----------------------

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

Photo by Pamela Saunders on Unsplash

2017 年 6 月底,1300 名行动号召会议与会者聚集在加拿大温哥华,与 Unbounce 的人工智能机器正面交锋,看谁能最好地预测登陆页面的性能。参与者将查看 Unbounce 的 204 个登录页面中的一个,分析该副本,并确定哪个将获得高于平均水平的转化率。与此同时,Unbounce 的算法也被设置为做同样的事情。

在 17,000 名参与者输入后,结果被记录下来。Unbounce 的人工智能(AI)算法在 80%的情况下正确预测了高于平均水平的转化率,而参与者的平均正确预测率为 50%。

问题是,在这些与会者中,有一些世界上最聪明的营销专家,他们来自顶级公司,如 Adobe、Mirum,甚至 Unbounce 自己的 Oli Gardner。CTA 会议发言人 Joel Klettke 的专长是转换文案,他获得了 57%的正确预测率(以人类标准衡量,这是一个令人印象深刻的成绩),远远低于算法的成功率。他们每个人都被耍了。Unbounce 的下一个前沿:使用机器视觉创建一个类似的算法来预测网站设计转化率。

尽管如此,其他品牌也在创造类似的算法来预测图像转换率。Visit Utah 的营销团队与 Cortex 合作,Cortex 是一种人工智能算法,可以对图像元素进行评级,以发现哪些元素可以在目标受众之前产生更大的参与度。当该品牌需要吸引寻求滑雪体验的游客时,该算法通过咨询犹他州的营销人员,告诉他们滑雪者更喜欢只有一个人的场景、干净的雪道、蓝天和松树,帮助将转化率提高了 23%

AI 算法比人更会营销吗?那么,这给创意内容营销者留下了什么?AI 能在多大程度上比创意营销人员更好地完成内容营销工作?虽然不总是在摊牌活动中,但 Unbounce 和 Cortex 并不是唯一一个让创意营销人员与人工智能算法对抗,看谁能更好地完成设计或文案工作的公司。让我们来看看其中的一些,以确定创意营销人员在人与机器的世界中所处的位置。

让我们看看文案如何对抗人工智能……最近的一项研究中,焦点小组被要求给几份文案打分。参与者不知道的是,有些是由人工智能生成的,有些是由人类撰稿人生成的。最终,机器生成的内容在客观性和可信度方面表现良好,但在参与度方面表现不佳——易读、有趣、写得好、连贯和清晰。

尽管如此,Gartner 预计 2018 年总业务内容的 20%将由机器生成。然而,“商业内容”和“营销文案”之间的差异,为人工智能何时应该用于内容创作和机器生成内容的总体目的提供了关键的见解。

“人工智能驱动的内容生成可以为金融机构生成详细的报告,处理海量数据,并将其转化为逻辑清晰的文本。但是,如果你要求它写一个新鲜的、引人注目的故事,抓住读者的想象力,它将会悲惨地失败,“ Bill Zeintek SEO 专家,搜索引擎优化专家,以及拥有深厚足迹的数字营销策略师说。

用于报告目的的文本,例如业绩报告和股票交易摘要,其中“值得信赖”和“客观”等指标是关键,如果是机器制作的,会做得很好。自动化生产流程意味着文案人员消除或减少耗时的收集、编译、标准化、清理和汇总大数据的手动流程。

但是,旨在吸引受众的营销应该写得很好,清晰,有趣,易读——换句话说,它需要人性。

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

Photo by Headway on Unsplash

也许人工智能驱动的内容设计会更好…… 这是 Grid.io 的首个营销视频中的脚本:“你的网站应该反映你是谁。而且做起来应该很好看。当然,你可以自己造一个。但是设计、开发、拖放……如果你能做你关心的事情,让其他事情……发生,不是更好吗?网站直接自己做不是更好吗?这就是所谓的网格。”

该品牌声称,使用一个名为 Molly 的人工智能机器人,她可以创建个性化的高质量网站,而你则可以运营你的业务。只需选择调色板或上传品牌标志,Molly 就能为您的企业打造完美的数字家庭,既能反映您的产品,也能反映其团队。听起来好得难以置信?确实是。

最终,它的局限性让许多用户希望得到更多。测试用户认为它需要一个更加个性化的展示来区分它,从而吸引访问者,并且它作为一个作品集而不是一个品牌网站。用户开始设计论坛来展示他们的发现:“终于看到 grid.io 网站了。我认为你们的工作是安全的。”

尽管如此,人工智能在支持图形和网页设计师方面取得了长足的进步。Adobe Sensei 在 Adobe Summit 2017 上首次亮相了他们新的人工智能设计功能,并展示了其尖端的图形设计和网页设计功能的原型。

虽然它不能为你做所有的图形设计,但它做了一些令人印象深刻的工作,包括基于图像和图像组件识别的自动照片裁剪,基于设计师图像数据库的元素推荐;图像元素交换;消除难看的图像成分;以及设计建议,如布局、颜色和照片尺寸。

虽然它不会从头开始想象和创建界面或用户体验设计,但它将通过确定哪些照片和副本可能会吸引一小部分用户来支持内容个性化,并实时将它们替换为自定义演示。

结果:“人类增强设计” Cedric Huesler,Adobe 营销云的主管,他参与了原型的工作。

尽管最初有些不信任,但有创意的营销人员从人工智能那里获得一些帮助是安全的。
Jesus Ramirez,Adobe 制作杰作项目的参与者,解释了人工智能对创意营销人员的作用:“当相机被发明出来时,人们认为我们不再需要画家了。对于人工智能,我想有些人会有这样的印象,即计算机将完成所有的工作,但归根结底,它只是另一种工具。”

“只是另一个工具,”的确。像 Unbounce 和 Adobe 这样的案例研究表明,尽管有参与限制,创意内容营销人员仍然可以依靠人工智能来增强自己的优势。波长分析和数据分析师的创始人 Natalie Robb 认为,人工智能将最好地帮助内容营销者创造更好的内容,并更有效地使用这些内容。

她表示:“内容营销人员将不再面临一些手工劳动。”。手工劳动,如裁剪图像、交换元素、总结某个主题的主导思想、综合数据、预测副本的转换率;在内容颜色、布局或图像之间进行选择;还有更多。

那么,创意营销人员该何去何从?娜塔莉总结道:“内容营销者必须与技术一起发展,成为数据和通信的大师,但他们不会被取代。”需要人类的创造力来制作有趣的、精心制作的、连贯的、整体吸引人的内容,以供目标受众消费。

使用 YOLO 和 TensorFlow.js 的浏览器内对象检测

原文:https://towardsdatascience.com/in-browser-object-detection-using-yolo-and-tensorflow-js-d2a2b7429f7c?source=collection_archive---------3-----------------------

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

Original image

前一段时间,我花了几个晚上玩最先进的物体检测模型 YOLO,这对那些每天对机器学习感兴趣的人来说肯定是已知的。最初写于Darknet——开源神经网络框架——YOLO 在定位和识别图片上的物体的任务中表现非常好。由于我对 TensorFlow.js 感兴趣已经有几个星期了,我决定看看 YOLO 将如何处理浏览器内计算的局限性。完整的源代码以及我以前的 TF.js 项目可以在 GitHub 上找到。如果你想玩演示版,请访问“我学习机器学习”项目网站

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

**注:**我还推荐阅读最近出现在《走向数据科学》上的一篇文章,这是我这个项目的起点。我将尽量不重复其中包含的信息,而是拓宽其中提出的主题,并希望用我的经验丰富它。

老枪暂时…

几个月前,《YOLO》第三版发布了。我有机会用 Python 测试它的功能,我非常希望能在我的小项目中使用它。在花了两天时间浏览了各种存储库、论坛和文档之后,结果发现现在还不可能这样做。如前所述,要在 TensorFlow.js 项目中使用原始 YOLO 模型,您必须首先进行两步转换。第一步将我们从 Darknet 带到 TensorFlow / Keras,第二步将我们的模型转换成 TensorFlow.js 可以理解的形式。不幸的是,由于 YOLOv3 在其架构中引入了新的层,并且像 DarkflowYAD2K 这样最受欢迎的工具都不支持它们向 TensorFlow 的转换,我们现在必须坚持使用旧的工具。将来,我肯定会回来把 v2 换成新的型号。

让我们把手弄脏吧

将模型与我们的应用程序连接起来的过程是非常标准的,在本系列的第一篇文章中已经详细描述过了。然而这一次,有更多的脏活等着我们,主要涉及预测前后的数据处理。

F 首先,我们的模型必须要有一个适当维数的张量——确切地说是——【1,416,416,1】。通常情况下,这些值与训练图像的尺寸和批量大小有关。这种方形输入是有问题的,因为通常图片不会以这种方式裁剪。剪切图像以满足上述条件,会带来丢失有价值的数据的风险,这可能导致对图片中的对象的错误识别。为了限制这种不良影响,我们使用流行的 smartcrop 库,它通过选择最有趣的片段来框住照片。下图是上述机制的一个很好的例子,也是一个成功的预测,如果没有这个技巧可能会失败。最后,我们归一化每个像素的值,使它们在 0 和 1 之间。最后一点对我来说特别重要,因为我花了将近两个小时寻找导致我的模型性能如此糟糕的 bug。迟到总比不到好…

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

Original image

作为每次预测的结果,模型返回具有相当奇怪维度的张量[1,13,13,425]。这些谜一样的数字在这篇文章中被有效地揭露出来,这篇文章完美地解释了在 YOLO 的引擎盖下正在发生的事情。我把它推荐给任何想理解这个美丽算法的人。我们现在的任务是将这个张量转换成图片中物体周围整齐的矩形。这一步非常广泛,很容易成为另一篇文章的主题。在不涉及太多细节的情况下,我要说的是,我们将使用诸如交集超过并集和非最大值抑制之类的技术来去除不太可能的结果,并将剩余的具有高概率的矩形聚集到检测到的对象的边界框中。我建议查看包含这些计算的源代码

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

Original image

不同设备之间的不一致性

在完成了 alpha 版本的工作后,我决定在我的朋友面前展示我的新玩具。通过这种方式,我非常意外地发现,该模型在不同的设备上可以表现得非常不同。检测到的对象的类别不会改变,但是它们的概率值可以改变几十个百分点。在下面显示的模型中,阈值被设置为 0.5。这意味着所有概率较低的对象都将被过滤掉。这就是左下方图片中斑马的命运,它的概率下降了 25%以上。TensorFlow.js 仍然是一个年轻的库,正在与某些问题作斗争——目前有几个问题与他们的 GitHub 上的不一致性有关。显然,在每台设备上进行完全相同的计算并不容易。我为 TensorFlow.js 团队祈祷,希望他们能解决所有这些问题。

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

Original image

速度杀人

F 最后,我想就 web 编程的一个重要方面(尽管经常被忽视)写几句话,那就是应用程序的速度。将 YOLO 转换成 TF.js 可以理解的形式后,创建了 20 多个文件,总共大约 45 MB。在缓慢的 3G 连接上加载如此大量的数据需要近乎神圣的耐心。如果我们决定在生产中使用这种类型的解决方案,这当然值得注意。

寥寥数语

TensorFlow.js 仍然非常年轻,但它给了我们开发人员和日期科学家惊人的可能性。你应该知道我提到的某些限制,但是给 TF.js 一个机会是值得的,因为在我看来,它的真正能力还没有被开发。

在我们信任的代码中

原文:https://towardsdatascience.com/in-code-we-trust-7620207f4dfe?source=collection_archive---------16-----------------------

在机器学习项目中试验软件开发管道——第二部分——管理您的代码。

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

正如我在我的第一篇文章中提到的,为了改变我们编写代码的方式,从某种自制的过程到更专业和一致的过程,为软件开发者提供适当的基础设施和工具是一件好事。

考虑一个安装和维护此类工具的集中环境会有所帮助。这就是我之前命名的“C.I .环境”——c . I .代表“持续集成”,这个术语强调以自动化的方式生产最终的集成应用程序**[1]**。这样的环境也可以被视为一种有组织的软件工厂——这里的术语从传统制造业获得灵感——一台完美的润滑机器,有助于提高个人生产率,减少每个人出错的机会。简而言之,帮助开发人员用最少的努力产生好的代码。

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

到目前为止还不错,但是…这在实践中意味着什么呢?

好的,正如你所知道的,我在这里的目标是回顾一下为我们的代码生产管道选择工具时的一些选择和选项。我将主要关注开源工具:尽管围绕**[2有非常好的商业和专有解决方案,但我更喜欢向每个人免费提供选项(我来自意大利北部的一个小镇,那里的人以吝啬闻名[3;-) ).**

回到我们的环境,以及我们需要在其中放置什么样的东西:在非常基本的层面上,事情实际上可以变得更复杂,我们需要工具来:(a)管理源代码**,提供代码模板,处理源代码版本等,(b)管理构建过程,将源代码转换为二进制(可执行)工件,处理依赖关系,版本管理和存储生成的组件等。最后但同样重要的是,©为这些组件的最终配置部署提供仪器。**

正如我们所看到的,当涉及到某种模型训练的 ML 项目时,实际上在(b)和©之间有一个进一步的步骤,这包括产生训练好的模型。即某种新的人工制品,它以某种紧凑的形式存储模型参数,以供以后使用。

但是让我们按顺序处理事情:第一点——源代码控制和版本控制——是非常重要的一点。在修改后保存代码版本是一个基本的习惯。它提供了一种在变更发生时监控这些变更的方法,它协调不同人的贡献并跟踪对代码所做变更的所有权,它提供了已完成工作的备份,并允许在某些变更引入错误或故障的情况下恢复工作版本。不错,不是吗?一般来说,某种形式的版本控制不仅应该应用于应用程序代码,还应该应用于二进制代码、ML 模型、文档、配置和脚本。

总之,版本 一切

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

当谈到对源代码的控制和版本控制时,首先想到的是 Git[4]。当然,还有其他选择,但是可以肯定地说,现在 Git 可以被认为是绝对的赢家。

众所周知,Git 是一个分布式版本控制系统:与 CVS 或 SVN 等其他工具不同,我们原则上不需要一个集中的存储库。不过,在实践中,出于协调和归档的目的,最好有一个中心位置,供开发人员推送他们的代码更改。一种选择是利用一些基于 Git 的在线公共存储库,如 GitHub 或 Bitbucket,但私营公司通常会在将源代码放在自己公司堡垒的安全墙之外时感到紧张。

您可能更喜欢在自己的本地服务器上托管源代码管理中央存储库。只是将 Git 项目的裸存储库放在一些共享文件夹中——通过 shell 命令访问——是一种选择,但是如果您想要一些不错的 UI 工具,可以尝试 Git lab[5];我过去用过它,它工作得很好。

这里的好消息是,对于基于机器学习的软件项目的具体情况,我没有找到任何改变版本控制工具或工作流的具体原因。代码就是代码,不管你的代码是用 Angular 实现漂亮的用户界面,还是用 Java REST 服务包装 JDBC 数据库查询,还是用 Tensorflow 定义深度神经网络架构的 Python 代码,Git 都能很好地工作。

那么,下一步呢,管理构建过程,将您的源代码转换成二进制(可执行)产品?对于这一点,唯一依赖你的 IDE 的项目配置和构建机制[6]通常不是一个好主意,最好使用一些特定的构建和依赖管理工具。与 ide 不同,构建工具通常是基于 shell 的,这意味着它们可以通过基于文本的脚本和配置文件来管理。然后你的整个构建过程可以被组织、存档、版本化等等… 版本化一切,记得吗?

构建和依赖管理工具将您的源代码编译成二进制代码,跟踪包的依赖关系,并自动统一地管理它们。企业规模的软件项目通常有大量的依赖项,手工管理它们通常会导致真正的噩梦。

构建工具的问题是,当选择一个工具时,您必须确保它适合您的技术堆栈。因为我的正常工作主要是基于 Java 的项目,所以我最常用的工具是 Maven[7]

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

当我开始使用 Tensorflow 和 Keras 代码时,我必须找到一种方法来使我的 Python 代码适应现有的构建工作流(或者反之亦然)。Python 有自己的构建和依赖管理工具,基于 distutils 和 setuptools,挑战是将这些与我们的 Maven 工作流集成。

Maven 是一个相当灵活的工具,允许通过基于插件的系统扩展其功能。我在网上搜索了一些与 Python 相关的插件:实际上有一些可用的插件,既有 Python 专用的插件,也有使用通用的 exec-maven-plugin 来启动 Python 子进程,调用 setup . py[8]——但最终,我决定采用一种不同的方法。

我面临的问题是一个更普遍的问题的实例,被称为多语言编程。也就是说,使用不同的编程语言来建模应用程序的不同部分,每种语言提供性能、可用的库或 API、表达能力等。最适合每个特定的功能或软件层。

所谓的微服务架构的最近趋势[9]使得这种编程非常流行:你可以在 Python 中有一个服务层来服务 ML 模型(想想 TensorflowServing),一个 Java 服务的业务逻辑层和一个提供用户界面功能的 typescript/Angular 应用层。根据应用程序的需要,您可以考虑添加任意多的语言。请记住,在任何完整的现实世界应用程序中,提供机器学习能力的功能可能只是许多交互部分中的一部分。

在这样一个混乱的环境中,我没有试图让一个像 Maven 这样的工具适合所有的技术,而是回归到为不同的项目使用不同的工具:Maven 用于 java 项目,setuptools 用于 python,Angular cli 用于 Angular 项目等等。然后,为了给操作提供统一的结构,一组 bash 脚本将通过为每种给定的技术开发适当的工具来实现每个开发阶段。一款打造**。sh 脚本,一个 test.sh 脚本,一个用于主要开发生命周期阶段的 deploy.sh 脚本,以及像 setver.sh 这样的用于更改当前构建版本的支持脚本(例如,在 Maven 的情况下,这个脚本编辑 pom.xml 文件),等等。**

用于生成和初始化项目代码的项目模板(如 Maven 原型或 Python cookiecutter 模板)将在主项目文件夹下包含一个./scripts 子文件夹,其中包含给定技术的脚本的正确版本,这样开发人员就不必担心调用了什么,只要。/scripts 文件夹包含在系统路径中。我不知道这种组织方式是否代表了当前多语言编程开发的最佳实践,但在我的案例中,它工作得相当好。

关于我在本文开头列出的清单——要放入 CI 环境的东西的清单——我们仍然需要讨论管理生成的二进制文件、配置和部署它们的工具。

在这里,我们也有这样的问题,不同的语言使用不同的工具会导致我们的应用程序组件产生异构的、不兼容的二进制格式。(我们可能有。java 组件的 jar 文件,Python 的 wheels 等等)。我只是预计,为了解决这个问题的一部分,我已经在一个叫做 docker 的漂亮的小工具中找到了宝贵的帮助,但是由于我已经写得比我计划的多,我将把它留到另一天。

像往常一样,我希望你觉得这篇文章有趣!

参考文献和注释

[1] 我们在这里可以使用的其他类似术语是连续部署,或连续交付(c . d .);或者是 DevOps 环境,在这种环境中,重点依次放在应用程序组件的部署及其向最终用户的持续供应上。我对这些术语的使用并不是非常精确或正式,我只是想表达一个一般概念,即某种计算环境是在公司层面上建立的,它提供了管理我们的软件生命周期所需的所有工具。

【2】 吉拉软件为例

https://www . quora . com/Why-do-Italians-say-the-Genovese-are-stiggy;-)

4】https://git-scm.com/

https://about.gitlab.com/

[6] 当然,也有例外。例如,尽管我已经有几年没有使用微软技术了,但我知道一般来说,构建过程与。网游世界

https://maven.apache.org/

[8] S ee 例如shining panda的解决方案,它使用通用的 maven exec 插件来包装对 Python 的 setuptools 的调用。

[9] 为了更好地解释微服务架构,你可以看看马丁·福勒的 文章——引自那里:

微服务架构这个术语是在过去几年中出现的,用来描述一种将软件应用程序设计成可独立部署的服务套件的特殊方式。虽然这种架构风格没有精确的定义,但围绕业务能力、自动化部署、端点智能以及语言和数据的分散控制,组织有一些共同的特征。”

或者查查山姆纽曼的书 建筑微服务

为廉价的数据科学辩护

原文:https://towardsdatascience.com/in-defense-of-cheap-data-science-f630f248d400?source=collection_archive---------3-----------------------

回到 2014 年,在我加入世界银行后不久,我带着“ Iamthecode ”去了塞内加尔。其中一个目标是举办数据科学研讨会和培训。尽管我很兴奋能参加最新最棒的遥感、数据管理、卫星图像的培训,但我没能意识到一个非常基本的关键。甚至想起来都很尴尬:我那花哨到爆的 MacBook Pro 笔记本电脑——价值他们三年的全部平均收入——。一半的人没有笔记本电脑(在他们的工作单位/大学只有台式机),而那些有笔记本电脑的人有几年前的旧电脑。

几个月后,我们的团队设法采购了三台游戏笔记本电脑(与 IT 部门的对话并不容易)。在我们合作的国家,它们同样超出了大多数人的承受能力,但游戏笔记本电脑具有最佳的性能/成本/重量。例如,我们用它们在科索沃或阿根廷农村进行无人机地图处理(由于连接速度的原因,云处理不适合),但我们也用它来训练神经网络和其他数据科学的东西。

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

Processing drone cadastral maps in Kosovo, pulling all available things with CPUs and GPUs.

数据科学对发展和发展中国家有着巨大的好处。开始时,分析通常是最基本的,而且是基于数量和质量都大大降低的可用数据。最重要的是,解决这一数字鸿沟挑战的紧迫性与数字红利的丧失相结合。事实上,“数字红利”是 2016 年发布的世界银行报告的标题(我记得和作者讨论过这个话题)。如果数据科学在发展中发挥作用,我们创新实验室的目标之一就是用发展数据在典型的发展基础设施中证明这一点。

许多数据科学工具都是免费的,可以在普通的笔记本电脑上使用。Linux、python、git、qgis、perl、bash……几乎在任何计算机上都可以做很多事情。然而,我看到越来越多的昂贵工具激增(不仅是许可成本,还包括最低性能或假设快速连接)。像 Hadoop、张量流、AWS 红移、ArcGIS 等工具……

廉价数据科学是优雅地退化到一台普通计算机和糟糕的连接的设计原则。如果花的时间比较多,或者需要捆绑上网需求,也是可以的。重要的是,你不要忽略那些没有 MacBook Pro 或互联网连接来构建强大的 AWS EC2 实例的人。

今年 1 月我离开银行的时候,原因之一就是尽可能地从“另一边”了解发展。我扔掉了我的 MacBook,我买了最便宜的笔记本电脑,我可以带着它旅行,并且可以完成大部分工作。一台不算太贵的 300 美元 Thinkpad。仍然大约是 MacBook 的 10 倍。此外,我还买了一个 40 美元的覆盆子酱,看看我能从中榨出多少。

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

300 , 3000 , 3000 ,3000, 100$ and 40$ computer. How much Data Science could you do with each?

从那以后,我用这台“廉价笔记本电脑”完成了我所有的个人和职业用途,包括编码咨询、去不丹培训和建立一个物流系统,或者在 T2 卫星公司处理巨大的卫星图像。有可能用非常少的资源、硬件和连接来交付惊人的专业级数据科学产品。这也迫使我求助于有用的技巧,提醒我当互联网又慢又贵的时候,事情是如何回来的。使用 USB 脱机安装,设置 intranet 和 torrent 服务。Git 到内部网机器上,而不是 github 上…

我认为,做廉价数据科学也越来越难了。一些轶事证据。回到不丹,我想与团队一起利用的大部分数据科学在线课程都使用花哨的多媒体视频和套接字来进行远程浏览器内代码执行。在我们的环境中,这是不可能的,因为带宽有限,而且在办公时间也很拥挤。我不得不求助于又老又长的 pdf 手册(通常是 LaTex)。了不起的人fast . ai特别乐于助人,关心帮助我解决这个问题。尽管如此,在我看来,许多最新的数据科学进展使用的框架无法在运行缓慢的计算机上运行。事实上,许多通用工具,如 nvm、npm、docker,都没有容易打包的命令来进行离线分发。如果有 4 个人安装相同的软件,那么您需要从远程资源为每台笔记本电脑下载每个小的子依赖项。

我担心数据科学的进步正在创造一个不必要的更高的准入门槛。通常的计算机设置变成了最小设置。我们可能遗漏了一部分潜在的数据科学家,他们的生活可能会发生最大的变化,他们的工作会改变最需要的人的生活。

讽刺的是,我用今天刚买的 MacBook 给你写信。虽然道德上让我很痛苦,但我也必须承认,这种设置可能让我损失了大约 30%的效率。其他人,尤其是那些和我有同样电脑的人,可能不同意这一点。如果我花更多的时间调整和维护它,我可能会有同样的效率。也许这就是我的观点。我想专注于交付价值,而不是维护系统,如果我能避免的话。我不知道。在数字红利框架中,我不能错过这 30%的效率。

我不知道这是否意味着我游说“廉价数据科学”的实验失败了。这无疑迫使我展现了我在塞内加尔或我们购买游戏笔记本电脑时才瞥见的意识。我真的希望阅读这篇文章至少能帮助你考虑你运行的软件,你构建的软件,是否会优雅地降级。

捍卫简单,数据可视化之旅

原文:https://towardsdatascience.com/in-defense-of-simplicity-a-data-visualization-journey-86676bd05c57?source=collection_archive---------2-----------------------

我职业生涯的最后 8-9 年一直专注于数据可视化,这给了我足够的时间来发展我在这个领域的一两个理念。我说两个,但我真正指的是大约六个半心烦意乱的职业危机产生时刻(持续几周或几个月),询问我想从这个领域中得到什么,我正在做的事情是否是“正确的事情”,以及我是否应该做其他事情。

鉴于 Elijah Meeks 关于为什么 数据可视化从业者正在离职的深思熟虑的文章,我认为分享我的道路可能是值得的,因为我所坚持的哲学(在这篇文章的标题中巧妙地掩饰为“简单”)是我多年来感觉最好的哲学。

觉醒

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

Always be learning (source)

首先认识到数据可视化是一个领域。这看起来很令人惊讶,但是我们并不是生来就有这种知识,也没有人在我没有问的情况下教给我这方面的知识。接下来的几年只是努力跟上。学习数学,学习不同类型的可视化等等。我没有自己的声音,我真的只是试图弄清楚什么是什么,如何建立它,如何做好工作。我做了很多坏事。很多原型都被扔掉了,我真的很伤心,因为我还不知道如何在这个领域评价“好”。这也是一段时间以前的事了,所以例子的基数要小得多。我选择阿曼达·考克斯作为我职业生涯中的英雄,并继续前进。

想成为数据艺术家的人

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

The struggle is real (source)

选择一群才华横溢的人作为我的榜样,既鼓舞人心,同时又令人沮丧。我刚刚了解了如何做这些事情,而这些人在提出表达数据的创造性方法方面比我强得多,比如 T2。我刚刚开始能够选择正确的方法并建立它们。我涉足了一些兼职项目,试图做出一些创造性的数据解释,从没有真正展示任何东西的数据中制作东西,只是总体上推动自己尝试将一点点艺术-东西-东西带到我的实践中。不过,我不认为这些努力是成功的,因为我似乎从未找到任何能引起我共鸣的东西。不知何故,这些东西都没有让我展示的人产生任何感觉。他们可能会喜欢,但仅此而已。我不满意,因为我仍然不知道为什么我在做这件事。

中场休息

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

BRB DataVis (source)

厌倦了我的缺乏进展和仍然缺乏发言权,我决定从数据可视化中休息一下,只是更好地在 web 应用程序上工作。他们当时风靡一时(还记得 Backbone.js 出来的时候吗!?)我很兴奋能在网络上制作有生命和表演性的东西。

helllooooooooo 数据新闻

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

I LUV DATA JOURNALISM (source)

我很幸运地与伦敦的《卫报》签订了合同,这是我在 Bocoup 的第一个项目之一。突然间,我和一组优秀的数据可视化工具一起研究一些真正有意义的故事。我们与全球发展办公室合作,他们既有有趣的故事要讲,也有一个伟大的使命,那就是揭示否则可能不会得到足够报道的重要故事。在我知道之前,我必须思考如何把我的视觉化编织在一起;胶水是什么。有一个更高的目的,那就是以一种有意义的方式将它们放在一起,并与广泛的人群(新闻消费者)交流。)这是一次令人谦卑的经历,也教会了我很多。它教会了我快速迭代设计,扔掉东西,制造可重用的组件,能够快速编码,这个故事是国王。我为我们做出的作品感到骄傲,但我有一种挥之不去的感觉,也许有些东西我们没有做到。数据中有一些很有说服力的妙语/趣闻,但是我们做的探索性交互需要一段时间才能达到,或者需要用户交互(嘿,还记得 steppers 吗?!)我们不确定用户在做什么。我担心我们采取的方法不是最好的,但我不知道什么是最好的(因为我不是记者)。

工具制造时代

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

Tools are important (source)

当我试图弄清楚我如何适应或不适应这个新闻世界时,我很快发现很多东西都不见了:紧迫的截止日期需要一些可重用性或妥协,我不喜欢这样做,不断增长的数据类型和规模允许进行更复杂的分析,而大多数新闻编辑室不一定具备这种技能。在 Bocoup,我通常是一个问题解决者,比起努力成为一名记者,我更容易投入到这个世界中,努力为我的新闻同行建立工具和资源。我还一边在远处佩服他们,一边想办法偷他们的招数。

在这一点上,我绝对是一个新闻迷。我正享受着由《纽约时报》等媒体催生的交互式图形的黄金时代,我正通过管道把它们传递给我同样投身于政治的父母。然而有趣的事情发生了——它们没有粘在一起。我父母没收到。现在,你可以把这个扔给我的父母,他们已经老了,但是我的妈妈是一个音乐老师,她花了一生的时间来阅读我甚至不能解析的乐谱,我的爸爸是一个机械师,他知道如何从 80 年代的示意图中修复不可思议的机器。然而,他们就是不喜欢这些互动,他们只是不停地问我“这是什么意思?”。在某个时候,我开始截图并发送长篇解释,然后跳过所有截图,只关注对话。那时我意识到,我不想做大多数人都做不到的东西。虽然我很爱他们,但我的同修并不是我的主要观众。

数据和设计颠覆了视觉效果

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

Data IS beautiful (source)

之前的经历让我很快意识到两件事:

  1. 如果人们想要一个故事,给他们一个故事。不要浪费他们的时间去得到它。
  2. 如果人们有他们想要解决的问题,尽你所能做最简单的事情来帮助他们解决问题。

这两个原则意味着一些事情。

  1. 首先,我必须更好地进行数据分析。大多数时候,显示单个数值计数、中位数和平均值实际上并不能解决任何人的问题。我在大学里上的那堂统计学课(完全通过 powerpoint 讲授,讲的是抛硬币)并没有起到什么作用。我钻研了现在被称为数据科学的世界,以了解我可以在数据中找到答案的所有方法。我仍在学习很多东西,我很幸运有吉姆·瓦兰丁汉姆在身边帮我学习。
  2. 对于我来说,要学习如何让用户使用和理解,我必须开始思考感知、心理学和人们在与我制作的任何东西交互时的用户体验。我学到的很多东西并不支持制作复杂的视觉效果的愿望。我们都知道制作一个毛团状的网络图通常是没有帮助的——好吧,到目前为止科学也同意这一点。

我开始从优秀的书籍中学到更多关于人类感知的知识,比如科林·威尔的信息可视化:设计感知。当时,我还遇到了莱恩·哈里森,他在数据可视化感知方面的工作已经改变了实践(这个星期我能引用这篇论文多少次?!).我也开始和 Bocoup 非常优秀的设计师一起工作,比如 Jess Klein ,他开始提醒我可用性和有用性是王道。制作大多数人无法理解或不知道如何使用的界面有什么意义?如果是小说又怎么样?如果对大多数人来说没有意义,那么我真的没有解决任何人的问题。

问题解决(又名当前哲学)

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

Bridge crossing at its best (source)

这些天来,我放松了对自己作品视觉效果的要求。当然,得到业内同行的认可确实很棒,但为小诊所从业者构建一个真正简单的工具来首次以数字方式跟踪他们的患者体验数据实际上更棒;向他们展示并解释一个方框图,然后突然看到他们利用它。方框图永远不会获奖,但一个制作精良、使用简单的工具会让某人的生活变得更好,或者至少更轻松一点。

有时这些工具使用简单的图表,有时我们会想出一些更复杂的东西。有时候,我们有太多的数据,我们需要将它们简化为可消费的东西,或者以某种可以通过交互过滤的方式来表示它们。不管是什么情况,我有一个巨大的工具包,我用它来制作对人们来说简单的东西。

不,我还需要做一些我父母能理解的事情。#人生目标。

深入总结艾的音乐翻译模式

原文:https://towardsdatascience.com/in-depth-summary-of-facebook-ais-music-translation-model-7516a0c3f2ce?source=collection_archive---------10-----------------------

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

这不是第一次,我们正在解决音乐翻译,其中你试图将钢琴轨道转换为吉他。有很多很多这样的尝试。但是,让脸书·艾最近的论文[1]与众不同的是,他们将它作为一种无监督的学习来对待,并实现了惊人的领域推广。因此,模型在训练时可能没有观察到一个长笛或口哨样本,但它仍然可以将长笛演奏转换为钢琴曲目。

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

现在,假设我们想要将管弦乐队演奏的莫扎特交响乐的音频转换为钢琴家演奏贝多芬的音频。我将演示 4 种不同的方法。

Level-0:新手如何接近

像我这样的新手会迫不及待地认为这是一个转录问题。我会简单地通过短时傅立叶变换找到音符和和弦,然后用新乐器演奏。传统的语音处理提供了许多方法,如基于 Eighen 乐器的乐器概括[6],多音转录[3]然后解码等。每个乐器在时域中都有独特的音符开始和瞬变。但难点在于,即使是单个乐器(频谱包络)在频域,也不遵循不同音高的峰值模式。我们怎么能忘记复调音乐中的次谐波,等等。所有这些因素使问题变得非常困难。

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

Level-1:深度学习科学家如何接近

如果我在音乐理论方面稍好,那么我可能会使用 CNN 学习音乐转录,它通过 midi 格式生成标签。Midi 是大多数合成器录制数字音乐的标准格式。在 Midi 中,每个按键的按下和释放都是一个事件。我们有像 MAPS[7]这样的数据集,可以用来解决复调钢琴的转录问题。

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

Level-2:一个 NLP 的家伙将如何接近

如果我是一个 NLP 的家伙,我可能会使用序列到序列模型[5],但我将需要匹配的行为和目标工具的轨道。

Level-3:学习直接翻译和领域泛化

如果你真的是优秀的音乐家,那么你会明白每种乐器的细微差别是 MIDI 无法捕捉到的。这也是本文的创新之处。

Noam 等人借用了 wavenet 的自回归架构,并利用它将问题转化为“下一个音符是什么?有点问题。这使得它无人监管。

可以在官网(https://deep mind . com/blog/wave net-generative-model-raw-audio/)了解 wavenets。但本质上,波网摇滚,因为随着学习门扩大卷积,导致感受野增加,因此更好的预测,更丰富的隐藏特征的潜在空间。这些特征是捕捉人类声音或音乐本质的特征,就像 CNN 中的特征地图(具有不同的架构)。

现在,如果你想学习一个自动回归模型来预测 piano 的下一个样本,那么你只需要学习 wavenet 编码器和解码器。这里,编码器将把先前的序列投影到潜在空间中。然后,解码器试图从潜在空间中的隐藏值中找出意义,以解码序列中的下一个值。

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

如果这个模型可以为钢琴编码,为其他乐器解码,那不是很好吗?一类条件自回归模型?

这就是脸书人工智能集团所做的。Noem 等人[1]在同一个编码器上训练多个乐器域,并为每个类别配备不同的解码器。你可能会想,这有什么用呢?

但是共享的编码器迫使它学习共同的特征。我们仍然需要告诉模型,这是一个钢琴轨道,而不是一个管弦乐队。为此,我们有一个域混淆网络,它可以理解匹配的类/域。该论文将此视为对手,因为公共潜在空间试图找出公共特征,失去唯一性,而混淆矩阵试图分离公共表示,并使它们更具类条件性。共性和特性之间的斗争。这也需要精心选择正则化系数,这样才能两全其美。

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

让我们来看看目标函数。我们从域 j 中选取一个样本 sj,然后进行随机音高移位,以避免模型对数据的无脑记忆。在论文中,他们提到,样本在 0.25 到 0.5 秒内完成-0.5 到+0.5 个半音的随机音高。这表示为 O(sj,r),其中 r 是随机种子。你可能会想,这有什么大不了的。但那些与谷歌品红或任何时间生成模型合作过的人,肯定知道模仿的诅咒。有时,模型开始像鹦鹉一样,做简单的顺序记忆(明显的过度拟合)。这就是为什么这个放大和扭曲的过程在这里非常重要。这就是为什么在多个域上训练编码器是重要的。

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

然后,我们让这个扩充的输入通过 wavenet 编码器的扩展卷积移动到潜在空间,然后通过特定域解码器 Dj 返回到原始空间,以获得下一个值的预测。我们将预测的下一组值与具有交叉熵损失的实际下一组值进行比较。作为对手或反目标,我们也有一个监督正则化项,它试图根据编码后获得的特征向量来预测域。他们称之为领域混乱网络。

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

这里的推论非常简单。我们只是根据我们的目标域 j 来调整解码器 dj。因此,如果你给它输入管弦乐曲目,它就会返回目标域 j 中的翻译(钢琴等)。但这是最酷的部分。如果你把一个看不见的乐器输入到模型中,并遵循自动编码过程,使用 j 乐器的解码器,那么它仍然可以近似地工作,这真是太棒了!!!这是因为,它表明编码器真正地概括了可见和不可见领域的潜在表征。这个概念是许多生成算法的核心,比如 GANs,变分自动编码器,我强烈推荐你阅读参考资料。

那是我所有的朋友。我已经做了一个超级棒的视频。一定要小心。 对博客表示支持 在媒体上鼓掌:)

订阅我的 youtube 频道 。我每周都发布关于 AI 近期话题的数学直觉的视频*。链接如下:http://youtube.com/c/crazymuse*

Youtube 视频(基于本博客):

有用链接

[1]主题深度讲解:https://www.youtube.com/watch?v=QL_joojCzvs

[2]https://www.youtube.com/watch?v=vdxCqNWTpUs 脸书团队演示:

[3] 谷歌洋红:https://magenta.tensorflow.org/

[4] 地图数据集:http://www . TSI . telecom-Paris tech . fr/AAO/en/2010/07/08/MAPS-database-a-piano-database-for-multi pitch-estimation-and-automatic-transcription-of-of-music/

*[5] NSynth 数据集:【https://magenta.tensorflow.org/nsynth *

【6】【https://github.com/vishnubob/python-midi】有用的博客 Midi-python:

参考文献

[1] Mor,n .,Wolf,l .,Polyak,a .,& Taigman,Y. (2018)。一个通用音乐翻译网络。arXiv 预印本 arXiv:1805.07848。

[2]范·登·奥尔德,a .、迪耶曼,s .、曾,h .、西蒙扬,k .、维尼亚尔斯,o .、格雷夫斯,a .、… &卡武克库奥卢,K. (2016)。Wavenet:原始音频的生成模型。arXiv 预印本 arXiv:1609.03499。

[3]西格蒂亚,s .,贝内托斯,e .,&迪克森,S. (2016)。用于复调钢琴曲改编的端到端神经网络。IEEE/ACM 音频、语音和语言处理汇刊(TASLP),24(5),927–939。

[4] Sutskever,I .,Vinyals,o .,& Le,Q. V. (2014 年)。用神经网络进行序列间学习。神经信息处理系统进展(第 3104-3112 页)。

[5]罗伯茨,a .,恩格尔,j .,拉弗尔,c .,霍桑,c .,&埃克,D. (2018)。学习音乐长期结构的层次潜向量模型。arXiv 预印本 arXiv:1803.05428。

[6]贝内托斯和迪克森(2013 年)。使用时间约束移位不变模型的多乐器复音音乐转录。美国声学学会杂志133 (3),1727–1741。

[7] V. Emiya,钢琴音乐的自动改编,博士论文,巴黎电信,法国,2008

赞美人为的愚蠢

原文:https://towardsdatascience.com/in-praise-of-artificial-stupidity-60c2cdb686cd?source=collection_archive---------18-----------------------

为什么今天的人工授精不是“真正”的人工授精,但对您来说可能没那么重要。

让人工智能再次变得伟大

“人工智能就是电。“a . Ng

"那些不学习历史的人注定要重复历史。"桑塔亚那

N 在阳光明媚的硅谷,一家新的人工智能公司以闪亮的新承诺和/或令人瞠目结舌的融资回合成为头条新闻。这种狂热并不局限于硅谷:一片概念有些重叠的云——大数据、数据科学、机器学习、人工智能、深度学习——近年来已经成为主流;严肃的商界人士甚至声称数据科学家是“21 世纪最性感的工作”,部分证明了我成为 NBA 超级巨星的失败尝试(为了一些清晰的照片证据,将这种生活与下面的生活进行比较)。

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

Still, not as sexy as the life of a data scientist.

对许多老(ish)从业者来说,世界似乎终于赶上了我们一直知道的事情:制造智能机器非常酷!另一方面,在人工授精的含义、人工授精的承诺和人工授精实际能实现的目标上,似乎存在一些可怕的混乱。

作为一名资深从业者和另一家拥有人工智能领域的旧金山初创公司“T14”的创始人,我发现自己完全沉浸在一个生态系统中,在这个生态系统中,乐观主义往往只与对人工智能历史中基本事实的真正无知相匹配:我不禁想知道,我们是处于一个时代的开始,还是处于一个时代的结束?

在接下来的文章中,我提交了我对人工智能非常主观的概述——昨天、今天、明天——并将犯下终极(呆子)罪:将科学炒作与商业价值脱钩。

免责声明:在接下来的内容中,我们不会从学术角度提出特别原创的主张;即使只是考虑非学术的东西,我们的一些考虑也是共用的 [这里](http://nautil.us/issue/67/reboot/why-robot-brains-need-symbols)这里这里 这里 。这篇文章的目的不是在学术上讨论一些支持或反对人工智能的有力论据,而是从“内部人士”的角度看待当前的炒作,并将其放在更广泛的背景下,特别是对受过教育的新领域读者来说。没有任何完整性和中立性的假设,你会在最后找到一个参考文献列表,相当令人印象深刻的人和进一步的评论。**

在人工智能之前做人工智能很酷

"你会看到,我们的艺术由一些数学和大量的想象力组成."达伦马特

为了提醒自己我多大了,并对今天的炒作有所了解,让我们跳回到我们都知道并热爱的 90 年代。我在下面学究式地转载了人工智能创始人约翰·麦卡锡在对彭罗斯的书的评论中的一些言论(你没想到彭罗斯会出现在 2018 年的人工智能博客上,是吧?):

人工智能的进步是由:

  1. 用逻辑公式或其他合适的方式表示更多种类的关于世界的一般事实。
  2. 识别智力机制,例如常识推理中涉及的逻辑推理之外的机制。
  3. 代表人们在常识推理中使用的近似概念。
  4. 设计更好的搜索可能性空间的算法,例如让计算机进行逻辑推理的更好方法。

像其他科学一样,人工智能产生数学问题,并提出新数学。到目前为止,最重要和典型的是非单调推理的形式化

Wow : 我们刚刚在 A.I .上浏览了一整段,没有遇到“深度学习”。抛开彭罗斯不谈(抱歉,我对的逻辑学家和的家伙捣乱情有独钟),文章中的参考文献与当前的辩论相去甚远,令人尴尬而着迷。

*如果你对人工智能的热情始于九十年代的经典读物(如*明斯基,1988,珀尔,2000,霍夫施塔特,1995,等。),麦卡锡关于人工智能进步的观点会在你心中产生共鸣,就像一首来自遥远而快乐的过去的歌曲。然而,如果你刚刚来到数据科学派对,这些话很可能听起来很空洞:虽然今天在“人工智能公司”的面试可能会涉及到,比如说,普通最小二乘法,但大多数候选人可能对 非单调推理 甚至的意思一无所知。“到底发生了什么?”这时你可能会问(“我们应该雇佣他们吗?”你也可能会问,但这是一个棘手的问题)。

在一个口号中,数据的不合理有效性发生了(作为一个概念,而不仅仅是开创性的哈勒维、诺维格和佩雷拉,2009 ,不出所料,佩雷拉是这一概念的一个非常标志性的代表)。

为了明白我的意思,是时候更深入地探究第一个人工智能的光辉岁月了:屏住呼吸。

冬天来了

“你可以给思想定价。有些花费很多,有些花费很少。一个人如何支付思想的费用?我认为答案是:有勇气。”维特根斯坦

众所周知,这门学科“诞生”于达特茅斯研讨会:约翰·麦卡锡是的麦卡锡创造了“人工智能”一词,以标志着对概念和任务的计算学习,这些概念和任务在以前只属于人类智能。如果我必须用一句话来总结那些辉煌的过去——有时被称为象征性的人工智能——大致如下:

一般(“常识”)智能行为的关键是以一种允许明确操作和组合概念的方式来表示概念:我们对这种“表示”的最佳猜测是形式逻辑,而我们对“操作”的最佳猜测是逻辑推理。

尽管开国元勋们很乐观,但事实证明,从原理中复制伯特兰·罗素的定理是“相当容易的”,但让自主代理像一个 2 岁的孩子一样走过一个房间“基本上是不可能的”。商业应用在规模上被证明是不成功的,“人工智能”变成了一件坏事:冬天确实来了,而且对我们所有人来说,几乎“埋葬”了这个领域——至少在主流文化和大规模商业活动的眼中是这样。

虽然不确定人工智能复兴的根本原因,但在我看来,谷歌的大规模增长发挥了很大作用,证明了一家建立在核心技术和算法(今天我们称之为“人工智能”)基础上的公司确实可能是“下一个大事件”。谷歌对待能够完成“以前只留给人类智能的任务”的产品的方式有什么不同?

让我们从一个非常熟悉的例子开始:Gmail awesome 垃圾邮件过滤器,这个例子直接取自我自己的收件箱。

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

A message flagged as “spam” by my Gmail account.

对于人类来说,有许多常识性的推理来决定一条消息是合法的还是垃圾邮件,例如:

  • 严肃的企业不会写信给人工智能创业者谈论石油合作伙伴关系;
  • “石油销售部门”的主管(不管是什么)不会有一个展望领域(谁会有一个展望领域呢?).

换句话说,你的推理会是:

a) 明确的 —即,如果被问到,你可以使用类似上述的概念来陈述为什么你认为该邮件是垃圾邮件(例如,你有“表述”,并且这些表述很容易通过语言共享);

b)在很大程度上基于大量重要的知识**,从完全理解英语开始——也就是说,同样的信息在俄语中不会以同样的方式进行分析。**

如果你认为向计算机教授所有这些听起来像一场噩梦,那么,你就明白了为什么古老的人工智能方法很快就被认为是非常不切实际的,甚至对于简单的“认知任务”也是如此。那么,谷歌的出路是什么?

事实证明,要将一封邮件可靠地归类为垃圾邮件,并不需要深厚的英语知识或常识信念。我们可以通过将挑战转化为一个简单的统计问题来回避语言意义的问题:在垃圾邮件和合法邮件中,“合作伙伴”和“石油”这两个词会同时出现多少次?如果你对电子邮件中的所有单词都问这个问题,你会有一个“全局概率”,即电子邮件本身是垃圾邮件还是合法邮件:你处理的包含这些单词的电子邮件越多,你的过滤就越准确。

如果你想一想,这是一个不可思议的工程技巧:我们从一个需要非平凡智能来解决的问题开始,我们承认我们不能完全理解/复制这种智能,我们意识到用平凡的算法和大量数据代替非平凡智能可以实现完全相同的目标:事实证明,解决本质上的意义问题更容易(这个人是在用文字欺骗我做什么吗?)通过完全忽略的意思并利用共现模式。

随着谷歌和大数据时代的兴起,一场完美风暴开始让“智能机器”再次变得酷起来:增强的计算能力、前所未有的可用数字信息和许多聪明的算法(如上文的垃圾邮件分类器)开始为各种商业上成功的产品提供动力。虽然细节有所不同,但大多数成功都有一个共同点:将表示复杂知识的漫长而艰苦的工作转化为某种优化问题;由于我们无法横向扩展智能,我们转而扩展了数据收集。

从某种意义上说,人工智能冬天过后,我们学到的大部分东西并不是如何建造更智能的机器:对我来说,最重要的信息确实是,我们认为需要智能的许多实际问题实际上可以通过愚蠢的算法和大量的数据点来解决。

智能作为曲线拟合的产物是当今深度学习的炒作。

深度学习和浅薄的想法

“一个聪明人不值得花时间去争取多数。从定义上来说,已经有足够多的人可以做到这一点。”哈代

毫无疑问,深度学习在各种“人工智能任务”中取得了突破性的、可衡量的进步,并释放了人工智能技术实际应用的惊人潜力。如果有可能与我们的智能手机交谈,并从中获得除沮丧之外的东西,这在很大程度上要归功于语音识别方面与深度学习相关的改进;如果使用谷歌翻译作为理解外语歌曲的第一近似值是合理的,那么这在很大程度上是由于机器翻译中与深度学习相关的改进——这个列表还可以继续下去。

淡化神经网络的科学和工程成就是完全没有意义和完全愚蠢的。

虽然有但是。学习“模仿人脑”的神经元样结构的想法(是的,人们实际上大声说出来)确实是非常古老的:最近发生的变化是硬件和算法的改进使得(嗯,相当简化事情)在更多数据上训练更大的网络成为可能,并大幅提高各种任务的性能。“作为曲线拟合的智能”的一般思想仍然是一样的:给定足够的数据和聪明的计算技术,我们一次又一次地从“昂贵”和“难以捉摸”的知识到“便宜”和“可测量”的优化进行交易。

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

Real 2018 slide from a real A.I. unicorn: gotta love the human brain metaphor.

有趣的是,人类和机器之间的差异已经变得很明显,与其说是在他们得到了多少对/错的答案,不如说是在他们错得有多离谱。换句话说,即使人类和机器同意这幅图片的标题:

他们会基于非常不同的“思维过程”达成一致。作为证明,以下机器生成的标题(“冲浪板上的恐龙”)不仅是错误的:它实际上远远不是一个对整个游戏产生怀疑的“智能猜测”——一个物理系统怎么可能让理解图像如此错误?

嗯,事实上这是不可能的:当系统“碰巧”正确/错误时,没有理解,因为一般的教训仍然是一样的——为了在许多看似智能的任务上达到 90%的准确性,确实根本没有必要智能。

*当手头的任务具有某种程度上抵制“曲线拟合”的深度(不是有意的双关语)结构时,事情通常会变得更糟:我一生都对语言感兴趣,所以很自然地会问深度学习到底揭示了人类语言多少。以一个非常酷的项目为例, deepmoji ,它使用深度学习来制作一个模型,这个模型“已经学会理解情绪和讽刺”*。即使最初的论文非常有趣,我们也很容易意识到“理解讽刺”可能比宣传的更难以捉摸。考虑下面的一对句子:

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

Testing Deepmoji with negation (original video here).

  • 我的航班被延迟了…太神奇了。
  • 我的航班没有延误…太神奇了。

而在第一种情况下,DeepMoji 检测到讽刺,并建议适当的“愤怒”表情符号(真棒!),第二句话,只有三个字母(N-O-T)不同,完全被误解了:根本没有讽刺的意思。与之前的图像一样,这表明我们最初并没有真正“理解”讽刺,但我们“只是”能够训练神经网络来拾取统计特征,在特定条件下,这些特征被证明足够精确。

在结束之前,让我们强调最后两点:

  • 可解释性:人们经常注意到深度学习模型是“黑箱”,因为人类很难理解他们为什么做他们所做的事情。虽然大多数观察家强调这种特征的明显的伦理和实践后果,但我们对人工智能历史的小小探索(不一定证明但是)表明,某种程度的可解释性可能是“智能”的关键部分:拥有表征意味着某种“模块化”结构,这种结构比简单的权重矩阵更自然地导致回答“为什么问题”;**
  • 数据:大量的统计学习(不仅仅是深度学习)需要大量的数据才能工作。虽然吨级数据不是一个精确的数量,但重要的是要注意,无论您如何定义,它可能比其他更高效的物理系统需要的数据多得多:哪些系统?很有可能,你现在身边就有一个这样的人:他们被称为“孩子”,他们有时甚至会从一个简单的例子中学到复杂的概念。虽然我们当然可以想象是一个超级智能的外星种族,需要很长时间才能掌握新的任务,但通过考虑机器学习的缓慢和昂贵,我们很容易衡量我们离真正的智能还有多远。**

最终,尽管“曲线拟合”已经变得令人印象深刻,但越来越多的从业者认为,人工智能需要的是新想法,而不是更多的数据/GPU(深度学习的真正先驱 Geoffrey Hinton 最近表示,我们应该“抛弃这一切,重新开始)。我们将在最后提到一些我们喜欢的开创性发展,因为我们现在不得不问:我们应该如何处理所有这些新发现的人工愚蠢?

预测机器

“有时候,似乎人工智能的每一个新步骤,都没有产生大家都同意是真正智能的东西,而只是揭示了真正智能不是什么。”霍夫施塔特

Agrawal、Gans 和 Goldfarb,2018 是三位经济学家最近的,通过经济理论的透镜分析了人工智能的复兴。他们的核心论点相当简单:人工智能意味着更低的预测成本,由于预测具有巨大而广泛的商业价值,随着人工智能渗透到我们个人和企业生活的方方面面,许多经济过程将在不久的将来被改变。

在这一点上,应该清楚的是,他们心目中的“人工智能”显然不是麦卡锡和他的朋友们在达特茅斯的那个夏天开始建立的;他们所想的是过多的小型、特定任务、精细优化的软件,这些软件将比现有系统更好地解决狭窄的业务问题——垃圾邮件过滤器、电子商务中的推荐书籍传送带、何时购买芝加哥机票的通知、针对天气、航空公司价格波动的优化等。

这,“仅仅”是这,当前的人工智能革命,通过更好地完成“愚蠢”的任务,正在席卷消费者和企业市场:虽然这些预测机器不会达到任何程度的智能或理解,但结合在一起,它们降低了成本,提高了许多过程的效率。

从这个角度来看,虽然技术不再是主要的参与者,但它显然是这种新商业生态系统的推动者:没有开源工程工具和库、教育资源、计算能力、纯粹的数据的繁荣,这些“T0”人工智能群对于 X 公司来说都是不可能的,而且许多情况仍然会相当不优化。随着预测被更好的库和服务抽象和封装,我们可以看到在不远的将来,人工智能组件在代码库中会像今天与数据库交互一样常见。虽然用经过适当优化的曲线拟合工具来交换理解智力的梦想对一些人来说肯定令人沮丧,但将人工智能从大学实验室带入疯狂的商业世界是恢复兴趣、增加资金和吸引人才的必要步骤。从商业角度来看,有数十亿美元的机会摆在那些只需要一点点科学和适量数据的人面前(麦肯锡估计人工智能可能每年创造超过 3.5 万亿美元的价值):对于“基于预测的人工智能”来说,春天,当然是而不是冬天,正在来临。

很明显,与“真正的”人工智能所能实现的相比,所有这些“愚蠢的”人工智能都是毫无价值的;不幸的是,人工智能作为一个领域多年来一直在做的一件事,就是与它自己的期望严重不符。在这方面,“预测机器”的出现虽然不如“思维机器”的未来出现那样令人兴奋和改变游戏规则,但却标志着该学科历史上一个前所未有的里程碑——即商业价值超过了象征性的“不归路”。

尽管炒作和乐观情绪会时好时坏,“曲线拟合”最终给了人工智能一个席位:的确,有时候明智胜过

一个遥远的未来

“霍夫斯塔德定律:它总是比你预期的要长,即使你考虑到了霍夫斯塔德定律。”D. R. Hofstadter

在过去的 60 年里,我们从“演绎机器”到“预测机器”——离“思考机器”还有多远?嗯,这个是一个非常难的预测:没有人知道目标有多远,更糟糕的是,没有人知道我们会走哪条路。如上所述,仅凭“自下而上的方法”或“符号推理”似乎是极不可能满足的:然而,如何有效地将两者完全结合起来仍然是一个谜。在更具“象征性”的部分,最近一波不可思议的想法、论文和工具在概率编程中承诺以一种前所未有的方式将逻辑和概率结合起来:如果你对我们自己的观点感到好奇,我们最近发表了一篇长的、固执己见的和认知友好的帖子,里面有可运行的代码样本。

如果人工智能历史——我们对其进行了部分和主观回顾——能给我们一些启示,我有信心提出三点建议:****

  • 对于人工智能中的业务人员:不要恐慌。当然,人工智能市场可能很快会放缓,深度学习可能会开始停滞,媒体的所有乐观情绪可能会冻结一点。虽然确实有很多”。人工智能初创公司“只是”随波逐流”,近年来制造的许多预测机器将会留在这里,还有更多的机器有待发明。当然,我们可能想在某个时候重温整个“人工智能”标签,但这并不意味着我们要赶走婴儿。**
  • 对于人工智能的研究人员:回到基础。人工智能建立在理解认知的跨学科努力之上;有趣的是,大部分关于深度学习的原创想法来自心理学杂志(如辛顿 1985,罗森布拉特 1958 )。虽然现在很难确定路线图,也几乎不可能看到各个部分——计算机科学、心理学、语言学、神经科学、逻辑——是如何整合在一起的,但从不同角度解决一个非常困难的问题不会损害我们的机会。
  • 对于 A.I .的投资者来说:引领创新,不要只是跟随。资金一直在行业持续流动,尤其是深度学习初创公司。然而,所有这些对人工智能的狭隘看法的资金可能会让我们陷入“局部最小值”,而其他有前途的方法,离宣传更远,受到的关注更少。这不仅仅是对科学不利:如果你在那些幂回报定律中寻找好的异常值,随着“预测机器”市场变得拥挤,你对下一件大事的最佳押注可能完全来自一种新的方法。

那么人工智能初创公司的创始人呢(如果有人关心他们的话)?好吧,在为真正的机器智能提前规划的同时,我们可能应该继续在我们的日常追求中追求更卑微和平凡的里程碑。我们的灵感和指导不亚于艾伦·图灵本人:

“我们只能看到前面不远的地方,但我们可以看到那里有许多需要做的事情。”

让我们永远不要忘记,完成这件事取决于我们自己。

再见,太空牛仔

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

如果您有问题、反馈或评论,请与jacopo . taglia bue @ tooso . ai分享您的人工智能观点。

别忘了在 LinkedinTwitterInstagram 上获取 Tooso 的最新消息。

感谢

感谢整个 Tooso 团队,Stefano Pacifico 和 Davide Romano 对这篇文章之前的草稿的评论。

在我们之前关于学习概念的媒体报道中,以及在我们 11 月的人工智能讲座中,已经详细讨论了其中一些观点:我们要感谢人工智能未来会议的组织者和参与者,感谢他们对我们的观点做出的热情贡献和有益反馈。

杂项笔记和更多阅读材料

  • 显然,任何工业规模的垃圾邮件过滤器都会采用比上面解释的朴素贝叶斯分类更复杂的思想,但直到今天,它仍然是一种非常简单有效的基线算法,具有很大的教学价值。对于数据科学新手和不懒惰的读者来说,这里有一章非常不错。
  • 微软深度学习 Twitter 机器人可以在这里找到:我们在听 Josh Tenenbaum 的精彩演讲时了解到了它,其中涉及许多有趣的问题:学习、概率编程和基于模型的推理。
  • 在我们最近关于概念的帖子中,我们详细讨论了乔希·特南鲍姆在“贝叶斯学习”方面的最新作品。如果你想从某个地方开始, 认知的概率模型 是一本真正令人惊叹的书。
  • 在我们最近关于概念的帖子中,我们详细讨论了流体概念道格拉斯·霍夫斯塔德。一些简短的文章暂且不提,感觉霍夫施塔特大部分都从幕后消失了:慈曼赤道格拉斯!
  • 我们在最后掩盖了与主题相关的大量学术材料:在没有任何完整性假设的情况下,你可以得到一堆经典材料(例如福多尔,皮里申,1988平克,普林斯,1988 )和下面参考文献中更近期的材料(例如达维奇,2017,马库斯,2018珀尔,2018 )。 Lake,Baroni,2017 是 NLP 最近的一个作品,我们很喜欢;对于如何将归纳偏见与深度学习结合起来的一些想法,Google Brain,Deep Mind 等公司的人有一篇很好的论文。(参见下面的参考文献)。虽然一些人最近一直在使用推特(Twitter)来讨论这些和类似的话题,但很多这样的争论确实可以追溯到几十年前(正如我们指出的,一些基本的事情还没有改变。】。
  • 图灵奖获得者朱迪亚·珀尔多年来一直是“偶然模型”的倡导者,即如果没有推理因果过程和做出反事实判断的能力,就无法实现真正的智能。认知科学家也提出了类似的想法(见 Lake,Ullman,Tenenbaum 和 Gershman,2016 的概述),特别强调了人类学习的“组合性方面”,即利用简单概念构建复杂概念的能力( Lake,Salakhutdinov 和 Tenenbaum,2015 )。基于模型的学习是我们关于概率编程的帖子的主要主题,其中包含注释代码示例和额外的参考资料,以进行更深入的探索。
  • 专家读者可能已经注意到,我们使用“表示”有点随意(草率?)在我们的讨论中;特别是,我们强调“外显表征”是类人智能的一个关键组成部分,但我们没有详细评论在深度学习经验成功中至关重要的表征。当涉及语言时,这两种类型之间的差异更明显(因为 1)人类使用语言在他们之间进行交流,2)非平凡的组成性是语言的本质),但这肯定是所有人工智能任务之间的真正差异。对于概念倾向的读者来说,福多尔,Pylyshyn,1988 是符号与神经架构中表征精神状态的一个里程碑式的讨论。

引用(惰性格式)

编程(JHU 课程,课程 2)

原文:https://towardsdatascience.com/in-progress-review-course-2-r-programming-jhu-coursera-ad27086d8438?source=collection_archive---------0-----------------------

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

Histogram Showing Mortality Rates (Part of Week 4 Assignment)

数据科学专业的第二门课程“R 编程”是一门向用户教授 R 基础知识的入门课程。虽然我确实认为它很好地讲解了基础知识,但对于真正的 R 初学者来说,任务难度有点太大。因此,我决定将我的所有代码发布在我的 github 上。

我带着一点曲折完成了这门课程。我决定使用非常流行的 data.table 包,而不是纯粹使用 data.frame,data . frame 没有 data.table 广泛用于大型数据集。

第 1 周重点:删除和子集化数据是一项非常有用的技能。向量、列表、矩阵和因子的教学是极好的。并不太难。

R Programming JHU Quiz 1

第二周重点:词法范围是所有对象必须存储在内存中的原因。编程作业很有用。如下所示,我已经决定尽可能地对 data.table 语法进行专门化,因为它在行业中被广泛使用。

R Programming JHU Week 2 Quiz

第二周的恐惧:许多用户抱怨这周的项目难度增加了很多。这也是我决定将所有作品放在 github 上的部分原因。

R Programming JHU Assignment 1

第 3 周重点:在下面的测验中练习我的数据表技能(或缺乏技能)的机会。很高兴看到通用数据集的使用,因为它们易于操作。《T4》的任务还不错。

第 4 周亮点:测验还不错。R 剖面仪讲座。有一个很好的说明,当代码被设计、运行和理解时,优化是一个优先事项。通过排序、分组等方式找出各州最好的医院很有趣。在我看来,考虑到这是一个初学者的专业,这个作业有点多。这个缩略图是我在这个作业的早期生成的。

R Programming JHU Assignment 3

总的来说,这是一门对工业界非常有用的课程,因为它教会人们获取数据文件并对其进行操作。然而,对于初学者来说,它的期望太高太快了。如果你有任何问题,请留言告诉我!

另外,请看我的课程 3 获取和清理资料复习

追求幸福(上)

原文:https://towardsdatascience.com/in-pursuit-of-happiness-4283c8c335c4?source=collection_archive---------2-----------------------

幸福的国家都是相似的;每个不幸的国家都有自己的不幸之处。

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

Global well-being

在一个增长往往等同于经济的世界,OCED 提出了福祉的重要性,这使国家层面的幸福成为人们关注的焦点。

今天我在看联合国委托的 2016 年世界幸福报告,该报告包含全球幸福指数和一系列社会经济因素,如经济、家庭、健康、自由、信任和慷慨。越来越多的国家将幸福作为衡量社会进步的标准。众所周知,不丹使用国民幸福总值(GNH)作为发展指标。鲜为人知的是,3 月 20 日被定为国际幸福日。

我注意到的第一件事是一个广泛的模式,在每个因素上排名越高的国家越幸福。因此,经过一些数据清理后,我研究了每个地区的国家在社会经济福祉方面的表现。

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

一些观察结果:

  • 慷慨、信任和自由都很低
  • 有些地区(如北美)比其他地区(如南美)更加 T4 化。
  • 地区有离群值:信任指数在东南亚相当低,新加坡除外;东非的毛里求斯经济指数特别高,也高于世界平均水平;与南亚国家相比,斯里兰卡和不丹的家庭指数要好得多。

这是可视化数据集的第一步。接下来,我打算研究社会经济福祉如何对国家层面的幸福做出贡献,以及这一趋势如何逐年变化。

我今天学到的是,为了循环图表,需要在 print()语句中包含 ggplot。这些图表只是极坐标上的柱状图投影。

你可以在这里阅读更多关于世界幸福报告的内容。

感谢阅读。这是我关于数据科学和视觉故事的# 100 天项目的# 12 天。

产品分类:Spotify

原文:https://towardsdatascience.com/in-this-article-i-provide-a-detailed-analysis-of-spotify-as-a-company-music-industry-direction-eeb945d7257c?source=collection_archive---------3-----------------------

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

在这篇文章中,我详细分析了 Spotify 作为一家 公司 (音乐产业方向、市场竞争、增长战略)和作为一款 产品 (特点分析、Spotify 的 ML 概述、UI 建议)。

尽管 Spotify 在计划公开募股之前正忙于清理其诉讼和债务,投资者对这家音乐流媒体巨头的估值为 160 亿美元。在全球 1.466 亿付费音乐用户中,Spotify 拥有 7000 万 T21 用户,在音乐流媒体市场中的份额不到 50%。

了解你的历史……并重复它。

那么是什么让 Spotify 走到了今天?有几个关键策略曾经奏效并将继续奏效:

社会特征:

  • 订阅你的朋友,看看他们在听什么。由于 Spotify 与脸书整合在一起,找到你的朋友变得很简单。看到你的朋友听什么会让你感觉联系更紧密,并为音乐发现增加额外的分数。
  • 通过直接连接到平台的简单链接,与任何人分享歌曲/播放列表。每一份股票都像一张请柬,促进增长。
  • 公共播放列表是 Spotify 上音乐发现的主要部分。Spotify 有 3000 万首歌曲,有 20 亿个播放列表。考虑到该平台的设计提倡制作播放列表并将其公之于众,如此巨大的数字并不令人惊讶。默认情况下,播放列表是公开的,制造摩擦来隐藏你的音乐品味。从头开始制作播放列表或添加到现有的播放列表,只需点击一下鼠标。

智能定价(定期订阅 10 美元/月):

  • 为学生提供 5 美元的折扣订阅,以抓住在线社交网络中最常见的细分市场,因此最有可能引起使用该服务的邀请。
  • 最多 6 人的家庭订阅费为 15 美元,激励整个家庭转向一个平台,减少竞争对手的市场份额。

锁定设计。随着用户保存的歌曲和定制的播放列表越来越多,他们越来越有可能继续使用 Spotify,因为没有将用户库导出到 Spotify 生态系统之外的功能。虽然这可能会对加入 Spotify 构成威慑,但这是一个明智的策略,因为它是新竞争对手的强大进入壁垒。除非竞争对手能提供完全不同的、更好的东西,否则大多数已经在 Spotify 上收藏了一个系列的用户不会换。为了弥补不能拥有自己音乐的不适,Spotify 含蓄地宣传了这样一种信念,即有一个巨大的音乐海洋应该是我们真正感兴趣的,而不仅仅是保留你已经拥有的音乐。

真实性。通过允许歌曲在音乐选择算法上“推广”来赚钱是很诱人的,但迄今为止 Spotify 担心失去听众的信任是正确的。通过将听众的兴趣放在心上,Spotify 很快让每个人都适应了它的音乐查找功能,如发现周刊和艺术家/歌曲电台。

数据驱动的文化:Spotify 几乎立即开始追求通过算法来了解音乐的目标,认为这是开发其功能的最佳方式。当 Apple Music 吹嘘其“手工管理的播放列表”时,Spotify 正忙着从该领域雇佣尽可能多的机器学习/数据科学专家。

Spotify——你进入音乐世界的向导。

最重要的是,Spotify 寻求表现得像一名导游,一名算法大师,在你的音乐启蒙之旅中握着你的手。这反映在 Spotify 的营销和用户界面上。

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

source

许多人对 Spotify 机智的活动(2016–2018)窃笑,这些活动经常与重要新闻*(亲爱的 3749 名观看“这是我们所知的世界末日”的人,英国退出欧盟投票的那一天,坚持住*),或者轻松地嘲笑社会规范*(“比那些在跑步播放列表上写着‘慢手’的 46 个人更传统地锻炼。”*)。除了机敏的喜剧之外,他们之间的共同主题是基于数据的 音乐知识,以及对用户的关注

UI 的设计方式使得每个元素都像一扇等待打开的门,一个等待探索的新领域。如果你喜欢这首歌,右击打开歌曲电台,寻找相似的音乐。寻找新的东西——查看你的每周发现或者点击你朋友的订阅。想要收听您最喜欢的音乐吗——选择一个您的每日混音播放列表。

更正式地说,Spotify 的 UI 仅仅是 Spotify 核心的机器学习冰山的表面。它有 3 个主要的数据来源:

  • 播放列表(关于什么音乐被视为相似的信息),
  • 个人收听历史(音乐播放顺序模式),
  • 喜欢/不喜欢/跳过电台(关于歌曲如何混合在一起的信息)。

所有这些都是与内容无关的数据,但通过使用神经网络预测仅来自音频信号的数据(即歌曲内容本身),Spotify 的算法也变得与内容相关

Spotify 正在使用一整套协作过滤方法(通过在数据中寻找模式来分解艺术家-用户、歌曲-用户矩阵,使其变得紧凑)【Spotify 的幻灯片,为其提供每个用户和每个艺术家/歌曲的潜在表示(数字向量)。这给了 Spotify 一个全面的音乐地图,相似的歌曲被放在一起,用户倾向于只在地图的特定区域听音乐。

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

t-SNE visualization of found latent space (i.e. map of music), [A. van den Oord, S. Dieleman, B. Schrauwen]

通过遍历该地图,Spotify 可以找到与您指定的偏好(例如,每周探索、向播放列表推荐歌曲)或给定查询(例如,播放列表的电台、歌曲、艺术家等)相关的相近但新颖的歌曲。).[ 详细解释

总而言之,Spotify 的大部分导航功能只是导航音乐地图的包装器,只去你感兴趣或可能感兴趣的区域。

高质量的音乐需要快乐的艺术家。

Spotify 并不是号称每流付费率最高的公司。每条流媒体的价格为 0.0038 美元,落后于 Google play(0.0059 美元)、Apple Music(0.0064 美元),但领先于 Pandora(0.0011 美元)和 YouTube(0.0006 美元)。[ 信息是美丽的 ]然而 Spotify 并不吝啬——它向该行业支付了大约 70%的收入,其中大部分是版税。原因在于市场历史和激进的艺人标签合同

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

Economist article

早在 2008 年,Spotify 继承了处于衰落期的音乐行业,当时互联网正以免费下载的文化蚕食音乐利润。然而,即使在 1999 年音乐产业的巅峰时期,消费者在音乐上的平均花费也是 28 美元/年(41.46 美元,如果考虑通货膨胀因素的话)。今天,许多人愿意再次为音乐付费,甚至是每年 120 美元的订阅费。因此,当更多的消费者接受新的音乐模式时,Spotify 将使音乐行业的收入潜力增加两倍。

在此之前,Spotify 与旗下艺人保持良好关系至关重要。Spotify 很明智,它已经向艺术家们提供了免费数据,比如在哪里寻找他们的活跃粉丝来举办一场演唱会,有多少人在观看每首歌曲等等。它可以使用相同的数据来帮助艺术家的营销活动。了解每首歌的听众,艺术家可以根据地点定制他们的表演内容,并决定在哪里租广告位最好,以及以什么情绪为目标。

标签正在成为支付链中一个过时的中间人,从所有版税中拿走很大一部分。因此,从长远来看,Spotify 可以致力于成为自己的品牌。这将减少浪费的利润,并允许 Spotify 以更丰厚的版税份额吸引艺术家。它已经拥有所有必要的数据来维护艺术家的最佳音乐会日程,建议与相关艺术家合作,帮助将艺术家的作品交付给最有可能的观众,等等。这将引起标签行业的强烈反对。然而,考虑到 Spotify 已经面临压力要从 CRB 支付更多版税,而且它没有像苹果或亚马逊那样的替代收入可以依赖,Spotify 基本上被迫尽可能地减少中间商。

目前,Spotify 可以在粉丝和艺术家之间建立更明确的对话。粉丝们明确要求与他们最喜欢的艺术家保持一致,这一点从天才(已经集成在 Spotify 中)——歌词解释平台的流行以及以艺术家解释他们的创作过程为特色的播客(例如歌曲浏览器)中可以看出。围绕歌曲创作一个故事往往和创作歌曲本身一样重要。Spotify 可以创建有利于分享此类故事的平台功能(通过整合现有平台或从头开始设计功能):

  • 一个简单的基于向上/向下投票的 Q/A 标签可以充当艺术家回答粉丝最迫切问题的简单方式,为他们提供“被听到”的安慰感。(想想 reddit 上的 r/AMA。)
  • 艺术家在做什么,他们在哪里表演,以及他们的合作进展如何的专门信息。或许,与艺人的 Twitter 账户整合可以做到这一点,但它有与音乐无关的风险。
  • 根据有多少需求和最终的资源量,短记录会话更新(即长度为 15-45 秒的“snapchats ”)可以作为艺术家和他们的粉丝之间的短暂亲密时刻。Instagram 整合可能会减少艺术家在各种平台上的维护。

通过提供更明确的数据分析工具,并为艺术家提供与观众亲密接触的机会,Spotify 可以弥补其较低的报酬率,并与艺术家保持健康的关系,这最终应该会让艺术家们看到 Spotify 不仅是一个流媒体平台,而且是一个必要的一体化工具,可以真正帮助他们的职业生涯。

结束语。

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

statista

Spotify 距离完全巩固其市场地位还有很长的路要走。由于聪明的初始促销、社交定制设计、ML 焦点和对艺术家的免费数据服务,它领先于游戏。然而,其竞争对手正在积极投资音乐流媒体业务,愿意忍受支付更高的版税,并通过在硬件上预装他们的平台(如亚马逊、谷歌、苹果)甚至与软件集成(如苹果)来偷工减料。但如果 Spotify 能够通过提供不仅仅是一个流媒体平台来保持与艺术家的良好关系,并通过其真实的音乐发现设计来吸引更多的听众,它将有机会在未来进一步重塑音乐行业。

不相容性和可预测性——萨尔维尼 vs 迪迈奥:基于推特的分析

原文:https://towardsdatascience.com/incompatibility-and-predictability-salvini-vs-di-maio-a-twitter-based-analysis-131c15fced54?source=collection_archive---------23-----------------------

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

Luigi Di Maio (left) and Matteo Salvini (right). Image from liberoquotidiano.it

意大利最近的大选中诞生了所谓的“黄绿”混合联盟,五星运动(5SM)和北方联盟(LN)的议员在两院都占据了多数席位。然而,他们非常不同的政治背景和优先事项正在促成一种令人不安的共存,质疑这两个派别在这样一个独特的机构中的兼容性。然而,联合五星和北方联盟是最低阶层的共同关切,通常通过不可满足的承诺和无视其他政党和/或旧的国家和超国家机构,如欧盟来解决;一句话:民粹主义。

这足以保证意大利政府长期执政(理论上是 5 年)吗?要回答这个问题,我们需要以某种方式量化这两股力量之间的重叠——以他们的领导人路易吉·迪迈奥(5SM)和马泰奥·萨尔维尼(LN)为代表。我在这里要做的是使用 Python 对两位领导人最近的推文进行简单而有意义的分析。我们将看到重叠被量化为低至约 15% 。为了补充我的研究,从 3mi1y here 的帖子中获得灵感,我将衡量——或者更好地说,让你来衡量——两位领导人的可预测性。更准确地说,我将使用一个一阶马尔可夫模型来构建一个 Salvini-和/或 Di Maio-tweet 生成器。

显然,说意大利语的人在充分理解我的结果的真实性方面有优势。然而,这篇文章可能与愿意对 Twitter 数据进行类似分析的用户有关。

导入推文

要导入特定用户的推文,必须申请一个开发者 Twitter 账号,可以在这里。然后,它足以创建一个个人应用程序(激励其使用等)。根据新法规)获得:

  • 消费者密钥
  • 消费者秘密
  • 访问令牌
  • 访问令牌秘密

完成后,我们就可以导入推文了。我使用了 tweepy 包,并遵循了这里报道的步骤

#fill below with your credentials
consumer_key = '......'
consumer_secret = '...yours...'
access_token = '...'
access_token_secret = '...' auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)collect_tweets_Salvini=[]
collect_tweets_DiMaio=[] for status in tweepy.Cursor(api.user_timeline, screen_name='[@matteosalvinimi](http://twitter.com/matteosalvinimi)').items():
    #Split and re-join to get rid of \n and similar charachters
    temp = status._json['text']    temp = ' '.join(temp.split())
    collect_tweets_Salvini.append(temp)

for status in tweepy.Cursor(api.user_timeline, screen_name='[@luigidimaio](http://twitter.com/luigidimaio)').items():
    temp = status._json['text']
    temp = ' '.join(temp.split())
    collect_tweets_DiMaio.append(temp)

这段代码返回两个列表collect_tweets_...,其中包含两位政治家的大量推文(每条约 3200 条)。有许多替代的方法可以得到这些,例如见这里

第一部分:探索性数据分析和重叠测量

数据清理和功能定义

在执行任何类型的分析之前,我们需要清理我们的数据。有些类型的推文与我们无关,比如转发。还有,我们想去掉@、#、表情符号等。我定义了以下函数:

用函数clean_tweets() 清理一条推文的过程如下:首先用prune_tweet()修剪它,它检查推文中的所有单词,如果它们不满足某些要求(例如,如果它们以@)就丢弃或修改它们,这是用goodWord()实现的目标。然后,通过tweet_process(),删除意大利语中的标点符号和常用词(如冠词)。最后,我们还消除了重复的单词。这整个过程是通过运行以下命令实现的:

clean_Salvini = clean_tweets(tweets_Salvini)
clean_DiMaio = clean_tweets(tweets_DiMaio)

创建一个列表列表,其中每个元素都是一个不同的干净的 tweet。

一个非常有用的工具来检查每个政治家的推特语料库的组成,是词云。我们展平列表的列表,以生成两位政治家使用的所有单词的集合,并使用它们作为输入来创建单词云。

这是结果

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

Figure 1: Salvini Twitter wordcloud.

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

Figure 2: Di Maio Twitter wordcloud.

单词云显示了某种程度的相似性(“governo”、“oggi”、“diretta”的大小差不多)。最明显的区别涉及人名的出现:大量使用“Salvini”一词来称呼 LN 领导人,而使用“Renzi”(前总理和民主党领导人)来称呼 M5S 领导人。我让你在这里下结论,看看下面的单词出现次数会更容易些

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

Figure 3: Salvini Top 20 words.

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

Figure 4: Di Maio Top 20 words.

好吧,我真的希望不要在这里得出任何结论,尽可能少一些政治偏见,但事实上,“salvini”这个词的使用超过了两个列表中的所有其他词——大约一个数量级——值得一些评论。这主要是由于两个原因:第一个原因是,LN 领导人喜欢以#Salvini 标签开始他的推文。第二个是对沟通的受害者般的态度,因为许多帖子都报道了其他人对他的评论,萨尔维尼反过来能够以新的方式提出这些评论,以增加选民的支持。你可以通过浏览推文列表来明确检查这一点。

现在,如何衡量两者的重叠部分?自然语言处理中最常见的技术是对每条 tweet 进行矢量化,使其适合数字分析。这涉及到 tweets 的标记化和相关的东西(例如,见这里的)。后一种分析与分类问题特别相关,一个经典的例子是将电子邮件分类为垃圾邮件或不是垃圾邮件。试图将这种方法强加于我们的案例显然是行不通的:就推文相似性而言,Di Maio 被归类为 Salvini 的可能性非常低。最后,我们谈论的是两个不同的人…因此,我将使用的方法如下:

  • 以一位政治家为参照,得到他的前 20 个词(图 3,4);
  • 找到他的包含前 20 个列表中最大出现的单词的 5 条推文,通过产生其相对重要性的函数进行加权(前 5 个列表);
  • 将第二位政治家的一条推文t2与上面t1前五名中的一条推文进行比较。测量它们的重叠,作为出现在t1中的t2中的单词的分数
  • 将如此获得的 5 个重叠部分平均。

用实例来说明这个过程会更容易理解。让我们以萨尔维尼为参照政治家。他的前 20 个单词如图 3 所示。现在,通过扫描推文语料库并计算前 20 个词中的每一个出现的次数,获得了他的推文的相关前 5 名列表,我们首先根据它们在语料库中的出现进行加权。举个例子,最初的推文(被归类为最重要的,看起来有用……)

'#Salvini: dopo mesi di lavoro offro agli italiani, che mi pagano lo stipendio, non solo il decreto, ma anche un....'

这对应于删减的 tweet

'decreto lavoro offro solo dopo salvini pagano stipendio italiani pro mesi'

包含单词(及其相对权重,参见图 3): ('lavoro ‘,115),(’ solo ‘,109),(’ dopo ‘,98),(’ Salvini ‘,864),(’ italiani ',186)。因此,这条推文的部分“分数”是:score _ sum = 115+109+98+864+186 = 1372。我们需要考虑到较短的推文获得较高分数的概率较低。然后,我们将分数除以修剪后的 tweet 的长度,在上面的例子中,长度= 11。除此之外,为了执行有意义的分析,我们希望为修剪后的 tweet 的长度设置一个下限,比如 10。每条推文的得分为

分数=分数总和/长度* \Theta(长度-10)

其中\Theta (length)是 Heaviside 阶梯函数,正参数为 1,否则为 0。

代码:

现在我们有了前五名的名单,是时候将其中的每一个元素与 Di Maio 的推文进行比较了。对于 Di Maio t2的单个推文,五个重叠被量化为每个t1.中包含的t2中的字数,这产生了 Di Maio 的#总推文(= 3191) x 5 矩阵。我们取每列重叠的最大值,然后取它们的平均值。发现最大值量化为 15%,如介绍中所述(见下文)。好吧,如果你相信这个分析…

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

Figure 5: Statistical properties of the overlap matrix described above.

第二部分:马尔可夫链

最后,我们采用离散时间马尔可夫链来模拟推文中的领导者。(一阶)马尔可夫链是一个随机过程,其中事件 X_m 在时间 t_m 的可能性只取决于前一时间 t_(m-1),而没有关于时间 t_(m-2),t_(m-3)等的记忆。这意味着从 X_1 到 X_n 发生一系列事件的概率可以分解为

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

其中 p(X_m |X_{m-1})是 X_m 给定 X_{m-1}的条件概率。

为了在我们的 twitter 数据上训练马尔可夫链,我们做了以下事情:

  • 取语料库中所有单词的集合
  • 固定其中一个,统计其后每隔一个单词的出现次数。
  • 归一化以概率的形式转换出现的次数。
  • 迭代集合。

例如,在句子“你好,世界,你好,月亮:今天是星期六”中,我们会有一组独特的单词(你好,世界,月亮,今天,是,星期六)。然后,我们固定单词“hello ”,并统计它后面的每个单词在句子中的出现次数:

你好→[你好:0,世界:1,月亮:1,今天:0,是:0,星期六:0],

将每个计数除以总出现次数= 2,得出一个单词被另一个单词替代的频率(别名概率):

p(世界|你好)= p(月亮|你好)= 0.5,

p(你好|你好)= p(今天|你好)= p(是|你好)= p(星期六|你好)=0。

创建这种对象的 Python 方法是定义字典。我们通过以下函数在我们的 tweets 语料库上执行这个操作

注意这里我们想保留文章,标点符号等。在推特的语料库中。因此,我们只应用功能prune_tweet()而不是clean_tweets()。正如上面可以看到的,只要提取出任何 4 个标点符号,我就停止生成推文。我们跑

clean_Salvini_WP = list(map(prune_tweet,tweets_Salvini))
clean_DiMaio_WP = list(map(prune_tweet,tweets_DiMaio))dict_S = firstMarkov(clean_Salvini_WP)
Salvini = normalizeFirstMarkov(dict_S)dict_DM = firstMarkov(clean_DiMaio_WP)
DiMaio = normalizeFirstMarkov(dict_DM)

这是用这种方法生成的几个句子:

萨尔维尼:“意大利的帕索里尼·斯克里韦瓦反对萨尔维尼。7 mesi del centro di invalidità。意大利,rozzo。

迪马约:我是说,意大利是意大利最大的国家。再见,伦佐波利。

他们听起来像他们吗?哈哈哈。

很明显,这个简单的模型可以通过采用更高阶的马尔可夫链或用其他一些来加权概率函数以考虑语言中的常见模式(例如,添加 exra 权重来区分冠词和形容词等)来改进。).或者,人们可以通过任意混合引用两位领导人的话来改变输出。我将把它作为这个简单项目的后续工作。

欢迎建议!

谢谢

利用剑桥分析概念整合持续主动病毒式营销

原文:https://towardsdatascience.com/incorporating-continuous-active-viral-marketing-by-using-cambridge-analytica-concepts-75f1d845628c?source=collection_archive---------9-----------------------

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

Viral Marketing (image is taken from https://infinitymkt.com/viral-marketing/)

我们只是把信息输入互联网和 的血液中,然后看着它成长,时不时地推它一下,看着它成形所以这种东西渗透到网上社区,并不断扩大,但没有品牌——所以它是不可归属和不可追踪的

在这些话中, Cambridge Analytica 首席执行官 Alexander Nix 透露了 Cambridge Analytica 声称它如何运营特朗普总统的“所有”数字竞选活动的秘密,正如第四频道新闻在调查中发现的那样。

在我们的新论文(阿隆·塞拉马頔·戈登伯格伊拉德·本-加尔埃雷兹·什穆利)、“主动病毒营销:将持续的主动播种努力纳入扩散模型”中,该模型最近被 专家系统接受并应用(ESWA) 。我们展示了这种方法如何在社交网络中实际工作。

正如论文中所述,现有的病毒式营销网络模型通常假设一个被动病毒过程,即社交网络中的用户在没有外部干预的情况下感染其他用户。然而,在现实世界中,公司和组织投入了大量的努力来推广他们的产品、服务或想法,这表明这些营销项目的采用很少是被动病毒传播的结果。

在这种观察下,我们提出了一种新的社交网络扩散模型,称为主动病毒营销,它更适合现实世界的营销场景,其中新想法的采用依赖于营销人员持续的主动推广努力。**在提出的模型中,试图感染潜在(未受感染)用户的营销成功取决于该用户的采纳朋友(受感染邻居)的数量,**假设用户更有可能采纳一种产品,如果他/她的更多朋友已经采纳了该产品,同时考虑到由于记忆丧失效应,社会影响会随着时间的推移而减弱。

这项研究提出了一套实用的方法来安排网络中的营销尝试在一段时间内的时间。这些方法背后的主要思想是在选择下一个种子节点时,除了静态社交网络拓扑之外,还利用关于邻居节点的动态采用状态的信息。一项广泛的实验证明,与主要依赖社交网络拓扑的现有最先进方法相比,所提出的播种启发式方法如何将产品采用率提高 30%-75%。

我们欢迎任何反馈!

用一个简单的 Python 机器人增加你的 Instagram 粉丝

原文:https://towardsdatascience.com/increase-your-instagram-followers-with-a-simple-python-bot-fde048dce20d?source=collection_archive---------0-----------------------

我在 4 天内有大约 500 名真正的追随者!

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

Picture taken by me — Ho Chi Minh City

培养观众是一项昂贵而痛苦的任务。如果你想建立一个与你相关并有共同兴趣的观众群,那就更难了。我总是看到 Instagram 有一个很好的方式来推广我的照片,但我从来没有超过 380 个粉丝…每隔一段时间,我决定再次在 Instagram 上发布我的照片,我设法定期发布一段时间,但从来不会持续超过几个月,我也没有多少粉丝让我保持动力和参与。

这个项目的目标是建立一个更大的观众群,并作为一个加号,可能会带动一些交通到我的网站,我卖我的照片!

一年前,在我最后一次运行 Instagram 时,我得到了一个可以让你追踪谁没有关注你的应用程序。我很好奇,因为有几次我的关注者数量莫名其妙地减少了。经过一番研究,我意识到一些用户基本上是如何抓取关注者的。他们评论、喜欢并关注他人——寻找追随者。只是为了在接下来的日子里不再关注他们。

我不能说这对我来说是一个惊喜,Instagram 中有机器人…这只是让我想自己建立一个!

这就是我们在这里的原因,让我们开始吧!我用 Python 开发了一个简单的机器人,当时我正在摆弄 Selenium,试图找出一些项目来使用它。简单地说,Selenium 就像一个浏览器,你可以在 Python 中非常容易地与之交互。

理想情况下,增加我的 Instagram 受众会让我有动力定期发布帖子。另外,我在我的个人简介中加入了我的网站,人们可以在那里购买一些照片。我认为这有点夸张,但是谁知道呢?!我的销售额到目前为止基本为零,所以跟踪那个转化应该很容易!

如果你想访问我的其他网络抓取文章——以及媒体上的几乎所有内容——你考虑过订阅吗?你会大力支持我的工作!

[## 阅读媒体上的每一个故事!

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

medium.com](https://medium.com/@fneves/membership)

正是这个世界所需要的!又一个 Instagram 机器人…

在对这个项目进行了一番思考之后,我的目标是增加与我相关的人的数量。我想得到真正想关注我并看到我更多作品的追随者。在最常用的标签中很容易遇到奇怪的内容,所以我设计了这个机器人来查找特定的标签,并与那里的照片进行交互。通过这种方式,我可以非常具体地了解我希望我的观众有什么样的兴趣。例如,我真的很喜欢长时间曝光,所以我可以瞄准使用这个标签的人,并围绕这种内容建立一个观众群。简单高效!

我的画廊融合了不同的主题和风格,从街头摄影到空中摄影,还有一些旅行照片。因为这是我的家乡,我也有很多里斯本的照片。这些将是我在目标标签中使用的主要话题。

这不是一个“在 24 小时内获得 1000 名追随者”的机器人!

那么我们在谈论什么样的数字呢?

我在几个不同的标签中运行了几次这个机器人,比如“travelblogger”、“travelgram”、“lisbon”、“dronephotography”。三天之内,我的粉丝从 380 人增加到 800 人。大量的喜欢,评论,甚至一些有机增长(人们关注我,但没有被机器人关注)。

需要说明的是,我并不是在密集使用这个 bot,因为如果你运行得太快,Instagram 就会停止响应。它需要在动作之间有一些睡眠命令,因为在短时间内进行一些评论和跟随后,Instagram 会停止响应,机器人会崩溃。

你将登录到你的帐户,所以我几乎可以肯定,如果你加快这个过程,Instagram 可以知道你在做一些奇怪的事情。最重要的是,在做了十几个标签之后,在相同的标签中寻找新用户变得越来越困难。你需要几天时间来更新那里的用户群。

但是我不想在过程中跟着那么多人…

在 Instagram 中获得关注者的最有效方式(除了发布很棒的照片!)就是跟着人走。这个机器人对我来说真的很好,因为我不在乎我是否关注 2000 个人来获得 400 个关注者。

这个机器人保存了一个列表,里面有它运行时被跟踪的所有用户,所以有一天我可能真的会对这个列表做些什么。例如,我可以访问每个用户的个人资料,评估他们有多少关注者或帖子,并决定是否继续关注他们。或者,我可以从他们的图库中获取第一张图片,并检查其日期,看看他们是否是活跃用户。

如果我们从机器人中移除关注行为,我可以向你保证增长率将受到影响,因为人们不太倾向于根据单一的喜欢或评论进行关注。

你为什么要分享你的代码?!

这就是我和自己的辩论。即使我真的相信回报社会(我也从中学到了很多!),有几个付费平台做的和这个项目差不多。有些是黑幕,有些是名人用的。我自己启动一个类似平台的可能性还没有被排除,那么为什么要提供代码呢?

考虑到这一点,我决定给这个过程增加额外的难度,所以我将把代码作为图片发布在下面。我写了“曾经”,因为与此同时,我意识到我得到的图像是低质量的。这反过来让我重新考虑并张贴要点。我就是那么好!图像背后的想法是,如果你真的想使用它,你必须自己键入代码。这就是我限制这个工具的使用的方法,只限于那些真正经历了整个过程去创造它,甚至可能改进它的人。

当我自己键入代码,而不是复制/粘贴脚本时,我学到了更多。希望你也有同感!

这个剧本没有想象中那么复杂,我知道还有很大的改进空间。但是,嘿… 它起作用了!我有其他项目,我想添加到我的投资组合,所以我的时间来进一步发展它是相当有限的。尽管如此,如果我深入研究,我会尝试更新这篇文章。

这是最后一个字幕!

你需要 Python(我用的是 Python 3.7)、、Selenium 、一个浏览器(我用的是 Chrome)以及……显然,一个 Instagram 账户!关于机器人将做什么的快速概述:

  • 打开浏览器,使用您的凭据登录
  • 对于 hashtag 列表中的每一个 hashtag,它都会打开页面,点击第一张图片打开
  • 然后,它会喜欢,跟随,评论,并移动到下一张图片,在 200 次迭代循环(数量可以调整)
  • 保存您使用 bot 关注的所有用户的列表

如果你到了这一段,谢谢!你完全应该得到你的奖励!如果您发现这对您的个人资料/品牌有任何帮助,请在下面分享您的体验:)

为了配合 Selenium 使用 chrome,你需要安装 chromedriver 。这是一个相当简单的过程,我没有任何问题。只需安装和替换上面的路径。一旦你这样做了,我们的变量 webdriver 将成为我们的 Chrome 标签。

在 3 号单元格中,您应该用自己的用户名和相应的密码替换字符串。这是为了让机器人在显示的字段中键入它。你可能已经注意到,当运行 2 号单元格时,Chrome 打开了一个新标签。在密码之后,我将登录按钮定义为一个对象,在下面的行中,我单击它。

如果你想知道那些奇怪的弦是什么,不要害怕!在我的 文章 中,关于房地产网站的网页抓取,我也经历过类似的任务,包括检查网页以告诉机器人去哪里找。您可以非常容易地做到这一点,只需右键单击您想要映射的元素,并选择 Inspect。

一旦进入 inspect 模式,找到与您想要映射的内容相对应的 html 代码。右键单击它并将鼠标悬停在复制上。您将看到,对于如何复制它,您有一些选项。我在整个代码中混合使用了 XPath 和 css 选择器(在 find_element_ 方法中可以看到)。我花了一段时间让所有的参考顺利运行。有时,css 或 xpath 指示会失败,但是当我调整睡眠时间时,一切开始平稳运行。

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

在本例中,我选择了“复制选择器”并将其粘贴到一个 find_element_ 方法中(单元格编号 3)。它会给你找到的第一个结果。如果是 find_elements_ ,将检索所有元素,您可以指定要获取哪个元素。

一旦你做到了这一点,时间的循环。您可以在 hashtag_list 中添加更多的 hashtag。如果您第一次运行它,您仍然没有您所关注的用户的文件,因此您可以简单地创建 prev_user_list 作为空列表。

一旦你运行一次,它将保存一个带有时间戳的 csv 文件。该文件将在您第二次运行时用作 prev_user_list 。简单且容易跟踪机器人做了什么。

在接下来的运行中使用最新的时间戳进行更新,每次运行 bot 时,您都会得到一系列 csv 积压文件。

代码非常简单。如果你对 Python 有一些基本的概念,你可能会很快学会。我不是 Python 忍者,我能够创建它,所以我想如果你读到这里,你就可以开始了!

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

循环中的 print 语句是我发现能够有一个跟踪器的方式,它让我知道机器人一直处于哪个迭代。它将打印它所在的标签、迭代的编号以及为注释动作生成的随机数。我决定不在每一页都发表评论,所以我添加了三个不同的评论和一个 1 到 10 之间的随机数来定义是否有任何评论,或者是三个中的一个。循环结束后,我们将 new_followed 用户添加到先前用户的“数据库”中,并保存带有时间戳的新文件。你也应该得到一份小报告。

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

就是这样!

在几个小时没有检查电话之后,这些是我得到的号码。我绝对没有想到它会做得这么好!在我开始测试它的 4 天里,我有了大约 500 个新的追随者,这意味着我的观众在几天内翻了一番。我很好奇接下来几天我会失去多少新粉丝,看看这种增长是否可以持续。在我最新的照片中,我也有很多“赞”,但我猜这比后面的照片更令人期待。

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

I didn’t get the screenshot at the exact start of the bot, but you get the idea!

如果能让这个机器人在服务器上运行就好了,但是我还有其他项目要探索,配置服务器不在其中!欢迎在下面留言,我会尽力回答你的问题。

如果你想更认真地对待这个问题,我强烈推荐这些书:

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

Picture taken by me — Azores

感谢阅读!如果你喜欢这篇文章,我邀请你看看我的其他故事。我主要感兴趣的是数据科学、Python、区块链和数字货币、技术,以及其他一些东西,如 摄影

如果你想取得联系,可以在这里联系我或者直接回复下面的文章。

声明:本文中的一些链接是附属链接。这意味着,对你来说零成本,如果你通过链接完成购买,我将赚取代销商佣金!

使用交互式代码在 Numpy 和 Tensorflow 中通过梯度上升进行独立分量分析

原文:https://towardsdatascience.com/independent-component-analysis-via-gradient-ascent-in-numpy-and-tensorflow-with-interactive-code-98b9a73e5d19?source=collection_archive---------4-----------------------

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

GIF from this website

我想了解更多关于独立分量分析的知识,我发现实际上有多种方法来计算这种运算。

请注意,这篇帖子是为了我对 ICA 更深入的了解。

计算独立分量分析的演进

首先,Bell 和 Sejnowski 使用 infomax 原理开发了原始 ICA。(于 1991 / 1994 年提出)。

Paper from this website

还有使用定点算法的 FastICA。(1997 年提交)

Paper from this website

还有从 Inria 出发的 FasterICA。(2017 年呈现)

Paper from this website

我对 ICA 如此着迷的原因之一是因为它的悠久传统。如上所述,从 1991 年到 2017 年,各种研究人员一直在研究这种方法。最后,我不太确定这个 pdf 是什么时候创建的,但是有一种方法可以通过 Andrew NG 的随机梯度下降来执行 ICA。

Paper from this website

带梯度上升的 ICA

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

Andrew Ng’s Gradient Ascent (left) Shireen Elhabian’s Gradient Ascent (Right) (source)

现在,当使用梯度上升执行 ICA 时,没有一个可靠的公式可以遵循。在我们不知道源密度的情况下,Ng 教授建议我们使用 Sigmoid 函数作为累积分布函数,但是 Elhabian 教授使用了 tanh 函数。(所以我想这真的取决于具体情况。).

我不会深入讨论梯度上升法的细节,因为我高度推荐论文本身,而是总结一下。

设 x = As 其中 x 是变换后的数据,A 是变换矩阵,s 是原始信号。我们要做的是估计 A,这样我们就可以恢复原始信号。当我们设置 A^-1 = W 时,我们可以很容易地看到 w 来自哪里。现在让我们来看看这种方法与 FastICA 相比如何。

使用 ICA 的 2D 数据分离

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

让我们首先从最简单的情况开始,如上所示,我们有两个真正独立的数据源作为散点图 2D。经过一些变换后,我们得到了如右图所示的散点图。我们已经可以看到,对于 PCA,新的基向量是相互正交的,它们指向数据中最大方差的位置。然而,对于 ICA 来说,新的基向量指向数据彼此最独立的方向。

在看结果之前,下面是我实现的代码的屏幕截图。我们将使用 FastICA、PCA、带 Sigmoid 的 ICA 和带 tanh 的 ICA。

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

如上所述,在最后阶段,我们可以观察到每种方法都(以自己的方式尝试)来恢复原始信号。注意,对于 epoch,我使用 10000 作为总迭代次数,学习率为 0.00003。

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

接下来,当我们绘制相关矩阵时,我们可以观察到类似上面的情况,我们可以安全地忽略除了前两行之外的所有内容。(让我们仔细看看它们)。

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

我们可以观察到 FastICA 在将数据分解成独立组件方面做得很好。(尽管变量发生了逆转,但这并不是一个大问题。)对于 PCA,我们可以看到不同变量之间仍然存在一些相关值。最后,使用双曲正切函数可以更好地分解数据。

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

当我们绘制每种方法的散点图时,我们可以清楚地看到 FastICA 和带双曲正切函数的 ICA 在分解方面做得最好。

使用 ICA 的波形数据分离

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

现在使用 sklean ICA 的例子,让我们看看梯度上升 ICA 如何处理波浪数据。同样,我们可以看到,对于这个例子,三个不同的信号通过某个随机变换矩阵 a 组合在一起。

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

如上所述,让我们首先使用 FastICA 和 PCA 来恢复原始信号。

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

为了让事情更有趣,让我们使用正常梯度更新规则,以及亚当优化器来更新权重 w。(并看看他们如何比较。)上述 ICA 梯度上升方法对 CDF 使用 sigmoid 函数。

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

最后,让我们使用双曲正切函数作为 cdf,看看哪个性能更好。此外,我还使用 tensorflow 实现了相同的技术。

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

如上所述,当所有的分解都完成时,我们可以观察到所有的方法都产生它们的恢复信号版本。

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

同样,我们可以画出相关矩阵,看看每种方法是如何执行的。

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

同样,我们只需看到前三行,显然 FastICA 在分解信号方面做得最好。对于 PCA,我们可以看到两个信号被恢复(部分),但是在不同信号之间仍然具有一些相关值。对于所有的梯度上升方法,我们可以看到 tanh 结合正常梯度更新规则产生了最好的结果。

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

当我们可视化结果信号时,我们可以看到 FastICA 做得最好。

互动码

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

对于谷歌实验室,你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

有关 2D 数据分离的代码,请点击此处。
有关波形数据分离的代码请点击此处。

遗言

研究 Andrew NG 和 Elhabian 教授的工作是一种荣誉,因为现在我们可以直接通过 back prop,我们可以大胆地做一些非常非常有趣的事情😉

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。

同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。我也实现了广残网,请点击这里查看博文 pos t。

参考

  1. 熊猫,R. (2018)。重命名 pandas 中的列。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/11346283/rename-columns-in-pandas
  2. seaborn . heat map-seaborn 0 . 8 . 1 文档。(2018).Seaborn.pydata.org。检索于 2018 年 7 月 14 日,来自https://seaborn.pydata.org/generated/seaborn.heatmap.html
  3. matplotlib?,H. (2018)。如何改变用 matplotlib 绘制的图形的大小?。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib
  4. 标签,M. (2018)。Matplotlib 颜色根据类别标签。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/12487060/matplotlib-color-by-class-labels
  5. /ml/机器学习数据库/鲍鱼索引。(2018).Archive.ics.uci.edu。检索于 2018 年 7 月 14 日,来自http://archive . ics . UCI . edu/ml/machine-learning-databases/鲍鱼/
  6. 熊猫。data frame . plot . scatter—pandas 0 . 23 . 1 文档。(2018).Pandas.pydata.org。检索于 2018 年 7 月 14 日,来自https://pandas . py data . org/pandas-docs/version/0.23/generated/pandas。DataFrame.plot.scatter.html
  7. 法,一.(2018)。使用 pandas plot 方法设置图形大小时不一致。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/42215252/consistency-when-setting-figure-size-using-pandas-plot-method
  8. 熊猫。data frame . plot-pandas 0 . 23 . 1 文档。(2018).Pandas.pydata.org。检索于 2018 年 7 月 14 日,来自http://pandas . pydata . org/pandas-docs/version/0.23/generated/pandas。DataFrame.plot.html
  9. xaxis,P. (2018 年)。熊猫数据框线图显示 x 轴上的日期。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/44213781/pandas-data frame-line-plot-display-date-on-xaxis
  10. 带颜色散点图缺少 xticks 问题#10611 pandas-dev/pandas。(2018).GitHub。检索于 2018 年 7 月 14 日,来自https://github.com/pandas-dev/pandas/issues/10611
  11. numpy.linalg.inv — NumPy v1.14 手册。(2018).Docs.scipy.org。检索于 2018 年 7 月 14 日,来自https://docs . scipy . org/doc/numpy-1 . 14 . 0/reference/generated/numpy . Lina LG . inv . html
  12. NumPy . eye—NumPy 1.14 版手册。(2018).Docs.scipy.org。检索于 2018 年 7 月 14 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . eye . html
  13. 使用 FastICA 的盲源分离—sci kit—学习 0.19.1 文档。(2018).Scikit-learn.org。检索于 2018 年 7 月 14 日,来自http://sci kit-learn . org/stable/auto _ examples/decomposition/plot _ ICA _ blind _ source _ separation . html # sphx-glr-auto-examples-decomposition-plot-ICA-blind-source-separation-py
  14. 2D 点云上的 FastICA-sci kit-了解 0.19.1 文档。(2018).Scikit-learn.org。2018 年 7 月 14 日检索,来自http://sci kit-learn . org/stable/auto _ examples/decomposition/plot _ ICA _ vs _ PCA . html # sphx-glr-auto-examples-decomposition-plot-ICA-vs-PCA-py
  15. 梯度下降优化算法综述。(2016).塞巴斯蒂安·鲁德。检索于 2018 年 7 月 14 日,来自 http://ruder.io/optimizing-gradient-descent/index.html#adam
  16. 2D 点云上的 FastICA-sci kit-了解 0.19.1 文档。(2018).Scikit-learn.org。检索于 2018 年 7 月 14 日,来自http://sci kit-learn . org/stable/auto _ examples/decomposition/plot _ ICA _ vs _ PCA . html
  17. Python?,H. (2018)。如何用 Python 计算一个 logistic sigmoid 函数?。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/3985619/how-to-calculate-a-logistic-sigmoid-function-in-python
  18. matplotlib?,H. (2018)。如何改变用 matplotlib 绘制的图形的大小?。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib
  19. NumPy . arctan—NumPy 1.14 版手册。(2018).Docs.scipy.org。检索于 2018 年 7 月 14 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . arctan . html
  20. NumPy . arctan—NumPy 1.14 版手册。(2018).Docs.scipy.org。检索于 2018 年 7 月 14 日,来自https://docs . scipy . org/doc/numpy/reference/generated/numpy . arctan . html
  21. 价值观?,h. (2018)。如何解释 numpy.correlate 和 numpy.corrcoef 值?。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/13439718/how-to-interpret-numpy-correlate-and-numpy-corrcoef-values
  22. Python,C. (2018)。在 Python 中计算皮尔逊相关和重要性。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/3949226/calculating-Pearson-correlation-and-significance-in-python
  23. 相关系数:简单的定义,公式,简单的步骤。(2018).统计学如何?检索于 2018 年 7 月 14 日,来自http://www . statistics show to . com/probability-and-statistics/correlation-coefficient-formula/
  24. SciPy . stats . Pearson r—SciPy v 1 . 1 . 0 参考指南。(2018).Docs.scipy.org。检索于 2018 年 7 月 14 日,来自https://docs . scipy . org/doc/scipy/reference/generated/scipy . stats . Pearson r . html
  25. inria——数字世界的发明者。(2018).因里亚。检索于 2018 年 7 月 14 日,来自https://www.inria.fr/en/
  26. (2018).INF . fu-Berlin . de . 2018 年 7 月 14 日检索,来自http://www . INF . fu-Berlin . de/le hre/WS05/musterekennung/info max/info max . pdf
  27. 下载 FastICA。(2018).Research.ics.aalto.fi 于 2018 年 7 月 14 日检索,来自https://research.ics.aalto.fi/ica/fastica/code/dlcode.shtml
  28. (2018).Cs.helsinki.fi 于 2018 年 7 月 14 日检索,来自https://www.cs.helsinki.fi/u/ahyvarin/papers/NC97.pdf
  29. CS229:机器学习。(2018).Cs229.stanford.edu。检索于 2018 年 7 月 14 日,来自http://cs229.stanford.edu/syllabus.html
  30. (2018).Cs229.stanford.edu。检索于 2018 年 7 月 14 日,来自 http://cs229.stanford.edu/notes/cs229-notes11.pdf
  31. 数组?,H. (2018)。如何用几个 numpy 1d 数组创建熊猫数据帧?。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/45399950/how-to-create-a-pandas-data frame-with-numpy-1d-arrays
  32. 剧情?,H. (2018)。如何更改 seaborn 图的图形大小?。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/31594549/how-do-I-change-the-figure-size-for-a-seaborn-plot
  33. matplotlib?,H. (2018)。如何改变用 matplotlib 绘制的图形的大小?。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib
  34. 热图标注字体大小问题#430 mwaskom/seaborn。(2018).GitHub。检索于 2018 年 7 月 14 日,来自https://github.com/mwaskom/seaborn/issues/430
  35. 热图,L. (2018)。在 seaborn heatmap 中分隔组的线条。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/39352932/lines-to-separate-groups-in-seaborn-heat map
  36. tf.eye |张量流。(2018).张量流。检索于 2018 年 7 月 14 日,来自https://www.tensorflow.org/api_docs/python/tf/eye
  37. TF . global _ variables _ initializer | tensor flow。(2018).张量流。检索于 2018 年 7 月 14 日,来自https://www . tensor flow . org/API _ docs/python/TF/global _ variables _ initializer
  38. 重新启动,R. (2018)。无需重启即可重置 IPython 内核。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/35492914/reset-an-ipython-kernel-without-restart
  39. 人们。(2018).Sci.utah.edu。检索于 2018 年 7 月 14 日,来自 https://www.sci.utah.edu/people/shireen.html
  40. (2018).Sci.utah.edu。检索于 2018 年 7 月 14 日,来自http://www . sci . Utah . edu/~ shire en/pdf/tutorials/El habian _ ICA 09 . pdf
  41. matplotlib,M. (2018)。在 matplotlib 中将 x 轴移动到绘图顶部。堆栈溢出。检索于 2018 年 7 月 14 日,来自https://stack overflow . com/questions/14406214/moving-x-axis-to-the-top-of-a-plot-in-matplotlib

奥运会上的印度

原文:https://towardsdatascience.com/india-at-the-olympics-d3b1c4e1468d?source=collection_archive---------12-----------------------

对青年事务和体育部的建议

在亚运会上,印度共获得 671 枚奖牌,排名第六。在英联邦运动会上,印度共获得 504 枚奖牌,排名第四。然而,在奥运会上,印度只获得了 28 枚奖牌,排名第 67 位。数据分析可用于为青年事务和体育部(GOI)提供建议,以提高印度在奥运会上的表现。分析流程图如下所示

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

分析的每个阶段的主要结果如下所示。

层次聚类

通过对参加过奥运会的国家进行聚类(基于每个国家在过去 120 年中获得的奖牌数量),我们发现有三个主要的聚类——一个是美国单独的聚类(红色聚类),第二个是 19 个国家的聚类(黄色聚类),第三个(蓝色)是世界其他国家(包括印度)的聚类。印度在蓝色集群中,下一步将进入第二集群(黄色集群),在一届夏季奥运会上赢得至少 53 枚奖牌。

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

解释集群

上述分组可以用各国在人口、人均国内生产总值、平均人类发展指数、公共卫生支出占国内生产总值的百分比、预期寿命以及平均教育指数方面的巨大差异来解释。

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

在所有这些变量中,选择其中四个用于下一阶段,即。人口、人均 GDP、预期寿命和公共卫生支出的回归分析。

多元线性回归

所选变量的散点图显示,人口和人均国内生产总值具有指数模式,如果进行转换,效果会更好。

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

“顺序替换”方法用于选择多元线性回归的最佳子集,即获得的奖牌数回归到公共卫生支出、预期寿命、log(人均 GDP)和 log(人口)上。

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

在进行删除诊断之后,回归模型在独立变量中具有显著的 F 统计量以及显著的β系数;也满足多元线性回归的假设。

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

然而,该模型的调整后 R 平方较低,仅为 22%。该模型的可视化显示,它在预测奖牌数量方面做得不太好。

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

因此,考虑使用逻辑回归模型。

逻辑回归

各国获得的奖牌数转化为一个二元变量,1 代表“53 块奖牌及以上”,0 代表“53 块奖牌以下”。“穷尽”模型选择方法为逻辑回归提供了相同的变量子集,即公共卫生支出、预期寿命、log(国内生产总值/人均)和 log(人口),具有最低 AIC 值。

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

负截距意味着当所有自变量都为 0 时,印度获得 53 枚以上奖牌的几率不到 50%。公共卫生支出每增加 1%,获得 53 枚以上奖牌的几率就会增加 0.50916,即增加 66%。同样,预期寿命增加 1 岁,赢得 53 枚以上奖牌的概率对数可能增加 0.42712,即增加 53%。此外,人均 GDP 每增加 k 倍,k^1.42818 时报获得超过 53 枚奖牌的几率就会降低;人口每增加 k 倍,k^0.815 时报获得超过 53 枚奖牌的几率就会增加。

回归诊断表明,logit 与数据拟合得很好,没有自相关,并且伪 R 平方度量更好(比线性模型更好)。然而,VIF 值高于多元线性回归,表明可能存在自相关。删除诊断揭示了要删除的 9 个观察值,并且逻辑回归模型被重新拟合到训练数据。构建混淆矩阵以基于二进制结果的值对数据进行分类,优化的截止值为 0.60。

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

预测分析

下一步是预测至少两届奥运会的变量,即直到 2026 年。不同的预测模型适用于 4 个变量(公共卫生支出、预期寿命、人均国内生产总值和人口)。这些方法包括移动平均、霍尔茨温特(乘法和加法)、指数和双指数方法,使用水平、趋势和季节性(α、β和γ)的默认参数值以及优化值。将每个模型的预测值与实际值进行对比,以确定最适合每个变量的模型。

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

基于训练和验证数据集的结果平均百分比误差(MAPE)来选择模型。然后对印度的变量进行预测,直到 2026 年。

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

研究发现,在未来 12 年,印度可能达到 72 岁的预期寿命,15.6 亿以上的人口和 3000 美元的人均国内生产总值(目前 2016 年)。

结果分类

逻辑回归模型用于对印度获得超过 53 枚奖牌的几率进行分类。基于对这 4 个变量的预测,尽管概率随着时间的推移而增加,但这种增加不足以得出印度将在 2020 年或 2024 年奥运会上进入第 2 组(黄色组)的结论。

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

将印度的增长与其他两个集群(即美国和竞争对手)的当前水平进行比较,以得出政策建议。

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

推荐

印度正以指数速度增长,但公共卫生支出却没有增长。国民的整体健康水平需要提高。此外,印度经济似乎不是为培养世界级运动员而设计的。印度落后于其他两个集群,为了提高印度在奥运会上的机会,政府干预是必要的。政府。印度政府需要将公共卫生支出增加一倍(占 GDP 的百分比)。青年事务和体育部需要为鼓励体育运动提供更多支持。这可以采取与第二组国家建立体育合作的形式(即“竞争者”),鼓励运动员在第二组国家(即“竞争者”),在城镇和乡村发展世界级的体育训练设施,并向现有的体育团体等提供财政援助。

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

面临的挑战

互联网上关于奥运会的数据集相互矛盾。我假设奖牌数是由参加比赛的“运动员”来计算的。国家一级的体育和运动员数据不容易获得。决定运动员在奥运会上表现的因素需要更多的研究。

使用的工具

Google Chrome 用于背景研究和下载基础数据;用于数据预处理和初步清理的电子表格软件;r 用于处理数据和得出统计见解;用于可视化结果的表格;苹果 QuickTime,用于演示代码工作流程;iMovie 用于编辑影片剪辑,YouTube 用于托管视频

参考文献

弗里皮克(2018)“弗里皮克的图标”,www.flaticon.com,2018 年 9 月 20 日访问。

奥运会(2018)“结果”,https://www.olympic.org/olympic-results,2018 年 9 月 12 日访问。

数据中的世界(2018)“健康”,https://ourworldindata.org/health-meta,2018 年 9 月 11 日访问

联合国数据(2018)“雇员”,http://data.un.org/Data.aspx?q=sport&d = UNIDO&f = table code % 3a 04% 3 bisic code % 3a 3693,于 2018 年 9 月 12 日获取。

维基百科(2018)“教育指数”,https://en.wikipedia.org/wiki/Education_Index,2018 年 8 月 20 日访问。

维基百科(2018)《按人口统计的国家列表(联合国)》,https://en . Wikipedia . org/wiki/List _ of _ countries _ by _ population _(联合国),2018-8-20 访问。

维基百科(2108),“亚运会上的印度”,【https://en.wikipedia.org/wiki/India_at_the_Asian_Games ,于 2018 年 9 月 17 日访问

维基百科(2108),“英联邦运动会上的印度”,https://en . Wikipedia . org/wiki/India _ at _ the _ Commonwealth _ Games,2018 年 9 月 17 日访问

维基百科(2108),“奥运会上的印度”,https://en.wikipedia.org/wiki/India_at_the_Olympics,于 2018 年 9 月 17 日访问

世界银行集团(2018)“国内生产总值(现值美元)”,https://data.worldbank.org/indicator/NY.GDP.MKTP.CD,2018 年 8 月 12 日获取。

印度人类住区研究所-实习旅程至今。

原文:https://towardsdatascience.com/indian-institute-for-human-settlements-internship-journey-so-far-7ffbb9d521d0?source=collection_archive---------2-----------------------

到我在 NIT Surat计算机工程第五学期结束时,所有的同学要么在寻找实习机会,要么已经在校园里找到了。我是那群寻找好实习机会的人中的一员,尤其是研究实习。我之前在初创公司实习过几次,也有过自己的初创公司,所以这次我想去做一个研究实习,这将非常适合我未来的努力。我犯的第一个错误是把我的 CGPAs 记在心里,我没有申请任何外国大学实习项目,以为我会在筛选过程中被直接从名单中剔除,但情况并非总是如此。

在 11 月至 12 月期间,我开始记下一份来自世界各地在数据科学和机器学习领域工作的教授的名单,并在 12 月底之前开始给名单上的教授发电子邮件。这是我的第二个错误,因为那时全球各地都是圣诞假期和冬季假期。在那段时间里,我发出了大约 50-60 封电子邮件,为每一位教授策划一个特定的内容。我开始收到自动生成的回复,提到“度假”、“旅行”、“不在办公室”等等。学长们总是说要获得一个研究实习机会,你所需要的就是耐心,这也是我一直坚持的。到了三月,我知道现在是时候了。

今年 3 月,我申请了几个研究所的实习项目和几个在我感兴趣的领域工作的初创公司。三月对我来说基本上是最难熬的一个月,因为我要在 3 月 30 日写 GRE,还得去实习研究。同时协调两者是困难的。我每天的时间表是早上和晚上阅读 GRE 考试,下午与教授和初创公司进行面试。在我的 GRE 考试之后,在下周的一个周一下午,我和一个朋友坐在一起寻找项目结果,在那里我得到了我的第一份研究实习,师从来自 IIIT 德里计算生物学中心的 Ganesh Bagler 教授 (1 次面试),项目是使用机器学习进行食物配对分析(分子水平)。周三,我又收到了来自班加罗尔your story(1 次面试)和班加罗尔 (2 次面试)印度人类住区研究所(IIHS)的两份工作邀请。在 Yourstory,项目是创建一个机器学习工具,它根据给定的面试数据,使用自然语言处理自动生成文章和故事。在 IIHS,该项目旨在使 Landsat 8 和 Sentinel 2 波段图像的土地覆盖分类自动化。现在的问题是选择去哪里

我听从了自己的心声,决定接受 IIHS 的邀请。

印度人类住区研究所(IIHS)是一个国家教育机构,致力于公平、可持续和有效地改造印度住区。

他们就是这么说自己的。这里最棒的事情是,我必须在多位教授和导师的指导下工作,他们都拥有国外知名大学的学位。我在他们的招待所住了一周。2017 年 5 月 10 日,我开始了在班加罗尔 IIHS 的实习。第一天我很早就到了,坐在接待处,这时一位来自人民职能部门的女士走过来,向我打招呼“欢迎来到 IIHS”,并带我一起去,我做了所有的手续和材料。那天,作为城市校园之旅的一部分,我见到了在 IIHS 工作的每一个人。有趣的是,我穿着正装去那里,那里的人穿着便装和 kurtas。我第一天学到的一件事是,在职业世界里,没有人使用“先生”、“女士”、“T2”和“T3”。我应该直呼我的教授和导师的名字。我非常惊讶地看到这里的人们经过多年的研究后为各国政府撰写住房政策,有些人设计排水系统,有些人研究世界各地的各种城市居住计划。我在地理空间实验室有一些很棒的同伴,他们叫洛克什、查鲁和尼勒克什,他们带我学习地理信息系统的基础知识。我过去常常问他们一些非常愚蠢的问题,他们总是积极地帮助我。他们是实验室里的地理空间忍者,让工作环境变得愉快。

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

The IIHS City Campus building

第一周—城市信息实验室

我被分配的第一个项目是由普林斯顿大学的城市统计学家 Shriya Anand 负责的。在她的房价分析项目中,数据生成是一个大问题,我在那里帮助他们。我必须创建一个工具,从所有流行的住房平台获取价格、纬度、经度、位置、平方英尺面积、新/转售等数据。当时我知道如何用 Python 抓取数据,并认为这是一个简单的第一个任务,直到我遇到了魔术砖的无限滚动平台。每当你滚动到最后,它生成新的数据,页面高度增加。像 beautifulsoup 这样的普通库在这里没有用,必须使用 selenium 的浏览器自动化。我必须解决无限滚动的问题,让数据保持原样。最后,我将一些 javascript 代码注入到我的 python 脚本的 selenium 模块中,该模块为我完成了这项工作,此处提供。到那个周末,我已经准备好了 PyQt 应用程序,它为你完成了所有的浏览器自动化和抓取工作。

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

Caffeine Love

第 2 周—地理空间实验室

我对地理空间情报这个热门词汇感到兴奋,更兴奋的是对它进行研究。主题是“机器学习如何应用于地理空间数据,以及我们如何自动生成分析?”。这个项目是我这次实习的主要项目,我必须在荷兰特温特大学研究员 Teja Malladi 和加州大学伯克利分校研究员兼城市规划师Krishna chandran Balakrishnan的指导下工作。最初,我和他们开了几次会,以了解项目的整体情况。简而言之,我可以告诉你的是,从卫星图像中,他们想直接找到建筑物的高度,居住在这些定居点的人的阶级,一个地区种植的作物类型,预测城市的城市发展以及你能想到的所有疯狂的事情。根据我们的谈话,我必须做研究和建立智能系统,可以从卫星图像进行这种分类。所以,在我的第二周,我浏览了很多关于 OpenCV(计算机视觉)的资料,它是如何工作的,我能从中得到什么。

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

Geospatial Lab, IIHS

第 3 周—地理空间实验室

现在,我已经准备好利用我现有的所有技能,包括数据科学、机器学习、计算机视觉和地理信息系统。我从实验室的同伴那里得到了一些 Landsat 8 波段的图像。Landsat 8 有 11 幅波段图像组合成一幅单幅卫星图像。我们都听说过 jpg、png、gif、tiff 等图像格式,这些波段图像是 Geotiff 格式的。Geotiff 图像的特殊之处在于,这里的每个像素都有一些 RGB 值以及附加到该像素的经度和纬度。这是我无法想象的事情…嘣!你把这个图像加载到一个软件中,它就直接适合所有地理空间分析的世界地图。OpenCV 可以接受所有格式的图像,但是 Geotiff 狗屎!通过四处搜索,我发现 OpenCV 在这里不能为我做任何事情。我遇到了另一个令人惊奇的东西,叫做GDAL——地理空间数据抽象库,它用于读取地理标签和它拥有的所有地理空间数据。OpenCV 可以单独从 geotiffs 中读取 RGB 值(实际上是 BGR,因为 OpenCV 实际上遵循它)。然后,我开始从波段中提取 RGB 数据,探索机器学习算法,如神经网络、SVM 和决策树等,并将它们应用于数据以检查结果(准确性)。我有一个算法的训练数据池,但以训练集格式获取数据是一项艰巨的工作。

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

SF042

除了工作,迄今为止,IIHS 的文化融合了学术界和工业界。我花了 5000 美元在班加罗尔呆了 4 天,找到了一个不错的单人合租 PG 住。当你有大学朋友在城里时,周末总是很有趣。夜生活很棒,因为每隔一条街你都能找到很棒的酒吧。我去了一趟南迪山,那是一块坚固的花岗岩,也是班加罗尔附近(60 公里外)风景最好的小山站。到目前为止,我唯一不喜欢的是这里的交通:)

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

A view from Nandi Hills

总之,当你将计算机科学的知识运用到地理信息学、城市规划和人类住区发展等其他跨学科领域时,总会感觉很神奇。为了实现我暑期实习的最终结果,还有很多东西需要探索,更多的特征需要从地球资源卫星数据中提取。希望一切顺利!

个人利益与公共利益:人工智能玩家的公地悲剧

原文:https://towardsdatascience.com/individual-gain-vs-the-common-good-tragedy-of-the-commons-with-ai-players-77ffb40f0c6a?source=collection_archive---------18-----------------------

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

Panorama photo I took at Lake Cochabamba on a trip to Bolivia in 2017

对于社会科学专业的学生来说,公地悲剧将是一个熟悉的例子,说明理性的个人行为如何对整个社会产生负面影响。公地悲剧的最初例子发生在 1833 年,当时英国经济学家威廉·福雷斯特·劳埃德讨论了在公共土地上放牧的问题。从那以后,个人过度利用公共土地/物品的想法被应用到不同的主题中。另一个经典的例子是新英格兰鳕鱼渔场的过度捕捞。

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

New England Cod fishing

公地悲剧的基本前提是,以理性方式行事的个人会耗尽公共资源,因为他们最大化了自己的效用,即使可以说保留这些公共资源供未来使用符合他们的最佳利益。这是因为未来是不确定的,个人有动机最大化自己的个人效用。在没有任何外部监管/行动的情况下,这意味着他们应该利用现有资源,而不是为了不确定的未来而抑制消费。

社会科学提出的避免这种公地悲剧的解决方案是制定法规或措施来帮助抑制即期消费,这将有助于所讨论的资源在未来生存。这方面的一些例子是将资源放在私人手中,对其使用附加费用/许可,或者对其施加法律/法规以供政府/社会执行。

这一切都很好,但我是一名数据科学家,喜欢构建人工智能。那这和这里有什么关系?我认为数据科学和深度学习通常是朝着某个目标优化的过程。这个目标可以是最大化胜率或准确率,这是很好的,也是非常令人满意的。然而,随着人工智能越来越多地融入我们的社会,我们选择优化的目标将会产生越来越多的社会后果。为了说明选择优化什么是重要的,这篇文章将讲述我如何建立一个环境,让强化学习机器人的训练上演公地悲剧,以及调整它们的奖励如何改变游戏的社会影响。

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

Another Lake Cochabamba photo, glad I am getting mileage out of this part of my photo portfolio

教机器人钓鱼

第一步是建立一个游戏环境来模拟公地悲剧。我的例子是基于我在网上为经济学课程找到的一个版本。

游戏由两个玩家和渔场中的一些起始数量的鱼初始化,当渔场数量下降到某个阈值以下时,游戏结束,该阈值代表由于过度捕捞导致的种群崩溃。最后吃到最多鱼的人获胜。每个回合玩家同时宣布他们将捕获多少鱼,如果总捕获量没有迫使种群低于阈值,每个玩家获得他们的捕获量,并且剩余的鱼都有一个后代,最大数量永远不会超过最初的鱼数量。在最后一个回合,剩下的鱼根据玩家在该回合宣称要拿多少鱼来分配。因此,如果我声明 10 条鱼,你声明 8 条鱼,剩下 9 条,我将得到 5 条,你将得到 4 条。

游戏本身是一个循环,只有当渔业人口崩溃(低于 8 的阈值)或游戏达到 100 回合时才会打破。我添加了 100 转的限制,以避免循环无限运行。

在游戏中,鱼的起始数量是 20 条,我有两个玩家,一个是“电脑玩家”,它会根据当前的渔业水平随机选择鱼的价值,还有一个 Keras 强化学习机器人。这个 Keras 机器人将是这篇文章的重点,通过测试调整其奖励结构如何影响游戏的结果。

作为上下文输入到神经网络中的游戏状态是 5 节点输入的当前计算机得分、机器人得分、总渔业计数、过去计算机得分、过去机器人得分。网络的输出层是 20 个节点,代表在给定的回合中要申报的不同数量的鱼,1-20 条鱼。为了更好地了解机器人的训练周期,我认为有必要回顾一下强化学习,特别是深度 q 学习。

游戏详情见悲剧. py 。TOC 类包含游戏函数和其他一些运行游戏和报告结果的实用函数。

网络位于 netlearner.py 文件中

快速深度 Q-学习回顾

这一部分是为了展示机器人是如何被训练的,以及它们是如何学习它们所展示的特定游戏行为的。从高层次上来说,机器人的条件是基于它们对结果的奖励和惩罚。为一个神经网络机械地做这件事显然和为一个生物做这件事不太一样,所以最好把它展示出来。基本流程如下:

  1. 代理(在这种情况下是网络)被告知游戏的当前状态。这可能是 atari pong 游戏的像素,也可能是你选择的任何表示。这是当前鱼的数量,玩家和电脑的分数,玩家和电脑最近的拍摄。我的想法是,这是一个人类玩家在玩游戏时会有的环境类型。
  2. 代理从动作空间中选择一个动作。在 Pong 的例子中,Andrej Karpathy 把它作为上升的概率。在本例中,这意味着选择 20 个输出节点中的一个,对应于声明捕获 1-20 条鱼。这里需要注意的一点是,这里有探索与开发的概念。本质上是说,有时应该随机选择一个动作,而不是简单地做代理认为最好的事情。这有助于代理探索和发现额外的奖励,否则如果它只是利用它知道的奖励,它将不会发现。
  3. 行动被归入环境,任何奖励被收集,环境进入下一个状态、框架或回合。机械地,我这样做是通过将奖励添加到网络输出的卡槽组合中。对于正的奖励,该类别在输出数组中的值增加,并且网络将再次看到给定该输入,该特定类别是有益的。
  4. 代理根据其收到的奖励进行更新。在奖励被用于修改输出阵列之后,网络以修改后的输出阵列为目标在初始输入状态上被训练。这有助于巩固好的选择,同时也考虑到坏的选择。
  5. 冲洗并重复。

参见前面提到的 netlearner.pyharvest . py文件之间的交互

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

Photo from Tsukiji bluefin tuna auction in Tokyo from a 2014 trip. Seems appropriate for a tragedy of the commons writeup

以公共利益为代价的胜利

我发现奖励的标准配置创造了非常“贪婪”的机器人。通过标准配置,我的意思是我把奖励放在赢的时候,负奖励放在输的时候,没有奖励放在两者之间。通常这样做是为了让机器人能够了解什么行为导致他们获胜,并允许他们最大限度地提高胜率。这种行为在像 Atari Pong、Cartpole 或其他以胜利为目标的游戏中很有用。但这种获胜的最大化并不一定意味着它有良好的社会后果。

我甚至尝试根据回合数来调整输赢奖励(我在一些测试中使用了回合数的 sqrt ),以激励在较长的游戏中获胜,但结果仍然相同,机器人玩的是非常贪婪的游戏风格。

那么我说的“贪心打法”是什么意思呢?…基本上,当我用这些奖励训练机器人时,机器人赢得了大约 99%的时间,这很酷!基本上,机器人已经想出了如何最大化他们对我编写的小电脑玩家的胜率。然而,他们平均在一个回合中达到 99%的胜率。

机器人陷入的策略是宣布在第一轮捕获更多数量的鱼,这导致渔场的数量立即崩溃。然后,因为在最后一轮的条件下,种群是根据每个玩家申报的鱼的数量来划分的,如果机器人申报的鱼多,它会自动击败对手。即使机器人可以通过玩更长时间来获得额外的奖励,即使它设置为在 10%或 20%的回合中探索,它仍然落入相同的策略,并且不学习玩更长时间的游戏。

这很有趣,因为这种类型的机器人具有共同的回报结构和最大化获胜的行为几乎与经典公地悲剧中的代理人完全相同。机器人可以通过在更长的时间内保持资源来获得更大的回报,但相反,它决定现在消耗资源以最大化其短期收益,因为它可能会也可能不会在未来获胜。因此,虽然这个机器人已经学会了如何赢,并且赢得很好,但它也过度消耗并破坏了有问题的资源。

现在让我们用一行代码来捣乱…

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

2017 photo from Valencia, Spain. I liked the futuristic look of this part of the city.

一个提高公共效用的机器人

所以我在上一节中列出了机器人的奖励结构,现在如果我调整奖励结构的一部分会怎么样。把胜利和失败的奖励留在原地,我进行了多次测试,其中对继续转弯的奖励在 1.5、5 和 10 之间的正值之间变化。我发现它创造了“利他”的机器人,可以玩更长时间的游戏,但机器人的胜率因此受到影响。

从技术角度来看,我正在测试这个想法,即设置 1.5 的奖励意味着机器人会发现学习玩长度大于 2 的游戏对自己有益(因为奖励是获胜回合数的 sqrt)。我对机器人如何玩 1000 多个游戏窗口进行了基准测试,发现根据迭代,机器人的胜率在 85-91%之间,平均游戏持续 2-4 轮。

在奖励为 5 的情况下,机器人以相当低的 36%的胜率和 7 的回合数开始,但是以 59%的胜率和 11 的游戏长度结束了它的训练,并且来自训练的最后部分的一些测试游戏是长度为 100 的游戏,机器人以 406 到 401 的分数获胜。

在奖励为 10 的情况下,机器人的胜率不会超过 30-40%,但它们的游戏会进行到 100 轮。所以他们学习对游戏继续有用的行为。但不一定会赢。由于机器人会非常专注于简单地让游戏继续,很多时候他们遵循的策略是每回合简单地拿走 4-5 条鱼。因此,如果我试图优化这些机器人来获胜,这是一个非常糟糕的训练它们的方式。

然而,我们不只是想让机器人获胜,所以让我们退后一步,想想机器人的行为!

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

Shibuya X photo from a trip to Tokyo, I had my family sit in a second story of a Starbucks for an hour so I could take short timelapse photos of the crossing… Things like this are why it is hard to travel with photographers I think.

确定的胜利或为共同利益而优化

在一个未受监管的公地悲剧版本中,作为理性代理人的参与者应该试图最大化他们的短期收益,而不是希望一个不确定的未来。“贪婪”的机器人反映了这种行为,它们采取接近 100%胜率的策略,在第一个回合就获胜。

然而,如果我们考虑资源的消耗。立即烧掉所有的资源很少是我们的目标,相反,资源的继续存在对每个人都有好处。因此,如果我们能够建立激励机制,允许可持续的捕捞,这将导致比一轮捕捞更多的鱼。

从机械/游戏理论的角度来看,玩这个游戏的可持续方式是让两个玩家每个回合拿 5 条鱼,总共拿 10 条。这使得渔业数量从 20 下降到 10。因为渔业数量不低于 8,所以人口翻倍,从 10 到 20。这意味着渔业可以无限期地维持下去。

这种平衡在实际操作中很难保持,因为参与者之间没有交流,并且需要参与者放弃短期收益(一定的胜利)而不是让所有参与者收集更多的鱼(增加集体效用)。在现实世界中,这可能会随着监管/监控/文化规范/私有化之类的事情而发生。

因此,当“贪婪的”机器人为快速获胜而优化时,那些因继续游戏而获得更多奖励的“利他的”机器人开始为行为而不是简单的获胜而优化。事实上,机器人开始表现得非常类似于我上面提出的这种更可持续的最佳游戏。

在奖励为 10 的情况下,机器人玩这种保守游戏的更安全版本,并且每回合只玩 4-5 条鱼,基本上放弃任何获胜的机会。至于平衡胜率和平均回合数,奖励 5 机器人保持更具竞争力的姿态,每回合吃 4-6 条鱼。这种额外的竞争力反映在他们更高的胜率,同时仍然试图不耗尽渔业。

所有更无私的机器人都被优化来尝试并赢得比赛,但是是在更长的比赛中。这种多部分优化意味着有一些权衡,在这种情况下,这意味着他们赢得了更低的百分比的时间,但如果在更大的背景下,你可能会认为这是没问题的。

在玩更长时间的游戏时,机器人有时会赢,但有时也会落后很多,例如一些 100 回合的游戏以 350-400 到 600+的分数结束。虽然就胜利或失败而言,这是一个相当惊人的损失,但如果你考虑到鱼类的继续存在为整个社区带来了额外的效用,那么即使机器人没有为自己赢得那么多,这仍然是一个非常有利的结果。

通过比较一个模拟生成的鱼的总数,这个惊人的损失可能是一个好的结果。“贪婪”机器人的胜利使双方玩家总共收获了 20 条鱼。机器人赢了,资源没了。“利他”机器人玩 100 场游戏,可能会输,但双方玩家会收集 800-1000 条鱼。

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

Photo from back home on Maui, Hawaii

最后的想法

作为一名经济学家/社会科学家,这篇文章直截了当地展示了如何使用深度学习/强化学习对偏好的修改进行建模,以说明达到更高水平的整体社会效用的方法。

作为一名数据科学家,这篇文章是我拐弯抹角的评论,随着人工智能与社会的融合程度越来越高,我们选择如何优化人工智能以及我们在构建人工智能时所做的权衡将会产生更多后果。

我可能会改进我在这篇文章中应用的 RL 方法,并尝试让机器人学习更强的策略来增加他们的胜率,无论回合数是多少。截至目前,连续回合奖励较高的机器人牺牲了胜利,陷入了非常弱的整体策略。通过更多的实验,机器人可能会学会如何维持鱼的数量,但也会采取行动缩小它们与对手之间的差距,或增加对对手的领先优势。这可以是另一个时间的项目。

感谢阅读!

Github 回购此处

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

One last picture taken on the way to Honolua Bay on Maui, Hawaii

用机器学习和动手 Python 对网站进行行业分类

原文:https://towardsdatascience.com/industrial-classification-of-websites-by-machine-learning-with-hands-on-python-3761b1b530f1?source=collection_archive---------2-----------------------

嘿伙计们,欢迎来到我的第一个技术教程。在本教程中,我想解释提取,清理和分类网站到不同的类别。我会用 python 环境运行我的代码进行数据抓取,用神经网络对网站进行分类。

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

Text classification

文本分类是在数据科学的许多不同领域中广泛使用的自然语言处理任务之一。一个有效的文本分类器可以使用 NLP 算法有效地自动将数据分类。

文本分类是监督机器学习任务的一个例子,因为包含文本文档及其标签的标记数据集用于训练分类器。

一些常见的文本分类技术有:

  1. 朴素贝叶斯分类器
  2. 线性分类器
  3. 支持向量机
  4. 装袋模型
  5. 增压车型
  6. 深度神经网络

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

网页抓取网页抓取网页数据提取是用于从网站中提取数据的数据抓取。一般来说,这是通过模拟人类网上冲浪的软件从不同的网站收集特定的信息来完成的。

可用于网页抓取的一些技术有:

  1. 人类复制粘贴
  2. 文本模式匹配
  3. HTTP 编程
  4. HTML 解析
  5. DOM 解析
  6. 垂直聚集
  7. 语义标注识别
  8. 计算机视觉网页分析

在本教程中,我们将尝试将完整的模型实现为三个不同的模块:

  1. 数据抓取
  2. 用于创建训练数据集的基于关键字的分类
  3. 将神经网络应用于实际测试模型

模块 1:数据搜集

在本模块中,我将使用 Python 3.5 环境来实现我的脚本。因此,请跟随以获取完整的参考资料。

步骤 1:从网站请求数据

为了提取 web 数据,可以使用许多不同的包,但是在本教程中,我将使用 请求

**import** **requests
url='**https://medium.com/**'
try:** page = requests.get(url)        #to extract page from website
    html_code = page.content        #to extract html code from page
except **Exception** **as** e:
    print(e)

在上面的代码中,requests.get()方法将使用 https 协议从网站请求页面,并将页面加载到对象“ *page”中。*下一行代码将把 HTML 代码移动到字符串 *html_code 中。*因此,到目前为止,我们已经从网站上提取了数据,但它仍然是 HTML 格式,与实际文本相差甚远。

步骤 2:从 HTML 页面中提取文本

为了从 HTML 页面中提取完整的文本数据,我们有两个非常受欢迎的包,beautiful souphtml2text 。使用上一步找到的 html_code 字符串,我们可以应用下面两种方法中的任何一种。

**from** **bs4** **import** BeautifulSoup
try:
    soup = BeautifulSoup(html_code, 'html.parser')  #Parse html code
    texts = soup.findAll(text=**True**)                 #find all text
    text_from_html = ' '.join(texts)                   #join all text
except **Exception** **as** e:
    print(e)

在上面的代码片段中, BeautifulSoup 包将解析 HTML 代码并将数据分配给 soup 对象。findall () 函数从代码中找到所有可见的文本,并返回一个字符串列表,我们将它存储在*文本中。*最后,我们使用 join() 函数将所有单独的文本连接成一个公共字符串。

**import** **html2text** h = html2text.HTML2Text()                 #Initializing object
h.ignore_links = **True** #Giving attributes **try:** text = h.handle(html_code)            #handling the HTML code 
    text_from_html=text.replace("**\n**"," ") #replacing next line char
except **Exception** **as** e:
    print(e)

在这个替换块中,我们使用 package html2text 来解析字符串,并直接从 html 代码中获取文本。我们还需要用空格替换空行,最后找到 text_from_html。

类似地,我们可以在大约 1000 多个 URL 上使用循环,并从这些站点提取数据,并将它们存储为 csv(逗号分隔文件)格式,我们可以在分类模块中进一步使用该格式。

模块 2:基于关键字的分类

对于任何机器学习算法,我们都需要一些训练集和测试集来训练模型和测试模型的准确性。因此,为了创建模型的数据集,我们已经有了来自不同网站的文本,我们将根据关键字对它们进行分类,然后在下一个模块中应用结果。

在本教程中,我们将把网站分为三类,即:

  1. 技术、办公和教育产品网站(Class_1)
  2. 消费品网站(Class_2)
  3. 工业工具和五金产品网站(Class_3)

这里的方法是,我们将拥有属于特定类别的某些关键字,我们将这些关键字与文本进行匹配,并找到具有最大 Matching_value 的类别。

Matching_value =(与一个行业匹配的关键字数)/(匹配的关键字总数)

因此,相应地,我们有一个单独类别的关键字列表,如下所示:

Class_1_keywords = ['Office', 'School', 'phone', 'Technology', 'Electronics', 'Cell', 'Business', 'Education', 'Classroom']Class_1_keywords = ['Restaurant', 'Hospitality', 'Tub', 'Drain', 'Pool', 'Filtration', 'Floor', 'Restroom', 'Consumer', 'Care', 'Bags', 'Disposables']Class_3_keywords = ['Pull', 'Lifts', 'Pneumatic', 'Emergency', 'Finishing', 'Hydraulic', 'Lockout', 'Towers', 'Drywall', 'Tools', 'Packaging', 'Measure', 'Tag ']keywords=Class_1_keywords + Class_2_keywords + Class_3_keywords

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

现在,我们将使用 关键字处理器 来查找从 URL 接收的文本中的关键字。

关键字处理器 在 pypi 上的 flashtext 包中有。

**from** **flashtext.keyword** **import** KeywordProcessor
kp0=KeywordProcessor()
**for** word **in** keywords:
    kp0.add_keyword(word)kp1=KeywordProcessor()
**for** word **in** Class_1_keywords:
    kp1.add_keyword(word)kp2=KeywordProcessor()
**for** word **in** Class_2_keywords:
    kp2.add_keyword(word)kp3=KeywordProcessor()
**for** word **in** Class_3_keywords:
    kp3.add_keyword(word)

在上面的代码中,我们将使用关键字加载 KeywordProcessor 对象,我们将进一步使用这些关键字来查找匹配的关键字。

为了找到匹配值的百分比值,我们定义一个函数百分比如下:

**def** percentage1(dum0,dumx):
    **try**:
        ans=float(dumx)/float(dum0)
        ans=ans*100
    **except**:
        **return** 0
    **else**:
        **return** ans

我们现在将使用 extract_keywords(string)方法来查找文本中出现的关键字。我们将查找该列表的长度,以找到文本中匹配关键字的数量。以下函数将查找百分比,并选择百分比最大的类。

def find_class:
    x=str(text_from_html)
    y0 = len(kp0.extract_keywords(x))
    y1 = len(kp1.extract_keywords(x))
    y2 = len(kp2.extract_keywords(x))
    y3 = len(kp3.extract_keywords(x))
    Total_matches=y0   
    per1 = float(percentage1(y0,y1))
    per2 = float(percentage1(y0,y2))
    per3 = float(percentage1(y0,y3))
    **if** y0==0:
        Category='None'
    **else**:
        **if** per1>=per2 **and** per1>=per3:
            Category='Class_1'
        **elif** per2>=per3 **and** per2>=per1:
            Category='Class_2'
        **elif** per3>=per1 **and** per3>=per2:
            Category='Class_3'
    return Category

在上面的函数中使用一个循环,我们可以根据关键字找到所有网站的类别。我们将分类数据保存到文件 Data.csv 中,我们将进一步使用该文件。因此,现在我们已经为应用神经网络进行分类准备好了数据集。

模块 3:应用神经网络

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

Classification of websites

在下面的实现中,我们将从头开始创建一个神经网络,并将使用 NLTK 单词标记化器进行预处理。首先,我们需要导入从上述步骤中获得的数据集,并将其加载到一个列表中。

**import** **pandas** **as** **pd** data=pd.read_csv('Data.csv')
data = data[pd.notnull(data['tokenized_source'])]
data=data[data.Category != 'None']

上面的代码将加载和清理分类数据。空值将被删除。

下面的代码将根据它的类创建一个数据字典。

**for** index,row **in** data.iterrows():
    train_data.append({"class":row["Category"], "sentence":row["text"]})

为了应用神经网络,我们需要将语言文字转换成数学符号,用于计算。我们将列出所有字符串中的所有单词。

words = []
classes = []
documents = []
ignore_words = ['?']
*# loop through each sentence in our training data*
**for** pattern **in** training_data:
    *# tokenize each word in the sentence*
    w = nltk.word_tokenize(pattern['sentence'])
    *# add to our words list*
    words.extend(w)
    *# add to documents in our corpus*
    documents.append((w, pattern['class']))
    *# add to our classes list*
    **if** pattern['class'] **not** **in** classes:
        classes.append(pattern['class'])

*# stem and lower each word and remove duplicates*
words = [stemmer.stem(w.lower()) **for** w **in** words **if** w **not** **in** ignore_words]
words = list(set(words))

*# remove duplicates*
classes = list(set(classes))

print (len(documents), "documents")
print (len(classes), "classes", classes)
*print (len(words), "unique stemmed words", words)*

例如,输出将是:

1594 个文档
3 个类[‘Class_1 ‘,’ Class_3 ‘,’ Class_2’]
唯一词干 40000 个

现在,我们将为该模式创建一个单词列表,并使用 NLTK Lancaster 斯特梅尔创建一个单词包。

**from** **nltk.stem.lancaster** **import** LancasterStemmerstemmer = LancasterStemmer()
*# create our training data*
training = []
output = []
*# create an empty array for our output*
output_empty = [0] * len(classes)

*# training set, bag of words for each sentence*
**for** doc **in** documents:
    *# initialize our bag of words*
    bag = []
    *# list of tokenized words for the pattern*
    pattern_words = doc[0]
    *# stem each word*
    pattern_words = [stemmer.stem(word.lower()) **for** word **in** pattern_words]
    *# create our bag of words array*
    **for** w **in** words:
        bag.append(1) **if** w **in** pattern_words **else** bag.append(0)

    training.append(bag)
    *# output is a '0' for each tag and '1' for current tag*
    output_row = list(output_empty)
    output_row[classes.index(doc[1])] = 1
    output.append(output_row)

print ("# words", len(words))
print ("# classes", len(classes))

输出:

word 41468

class 3

现在,我们对数据进行最后的预处理,并创建一些函数。

乙状结肠功能

**def** sigmoid(x):
    output = 1/(1+np.exp(-x))
    **return** output

*# convert output of sigmoid function to its derivative*
**def** sigmoid_output_to_derivative(output):
    **return** output*(1-output)

清洁功能

**def** clean_up_sentence(sentence):
    *# tokenize the pattern*
    sentence_words = nltk.word_tokenize(sentence)
    *# stem each word*
    sentence_words = [stemmer.stem(word.lower()) **for** word **in** sentence_words]
    **return** sentence_words

包话功能

**def** bow(sentence, words, show_details=**False**):
    *# tokenize the pattern*
    sentence_words = clean_up_sentence(sentence)
    *# bag of words*
    bag = [0]*len(words)  
    **for** s **in** sentence_words:
        **for** i,w **in** enumerate(words):
            **if** w == s: 
                bag[i] = 1
                **if** show_details:
                    print ("found in bag: **%s**" % w)

    **return**(np.array(bag))

最终将用于神经网络的函数:思考函数

**def** think(sentence, show_details=**False**):
    x = bow(sentence.lower(), words, show_details)
    **if** show_details:
        print ("sentence:", sentence, "**\n** bow:", x)
    *# input layer is our bag of words*
    l0 = x
    *# matrix multiplication of input and hidden layer*
    l1 = sigmoid(np.dot(l0, synapse_0))
    *# output layer*
    l2 = sigmoid(np.dot(l1, synapse_1))
    **return** l2

现在我们已经准备好训练我们的神经网络模型。我们将通过 scratch 实现它,并将对每个神经元使用逻辑回归。只有一层,但有 50000 个历元,我们将训练我们的模型。完整的训练示例将在 CPU 上运行。

**def** train(X, y, hidden_neurons=10, alpha=1, epochs=50000, dropout=**False**, dropout_percent=0.5):

    print ("Training with **%s** neurons, alpha:**%s**, dropout:**%s** **%s**" % (hidden_neurons, str(alpha), dropout, dropout_percent **if** dropout **else** '') )
    print ("Input matrix: **%s**x**%s**    Output matrix: **%s**x**%s**" % (len(X),len(X[0]),1, len(classes)) )
    np.random.seed(1)

    last_mean_error = 1
    *# randomly initialize our weights with mean 0*
    synapse_0 = 2*np.random.random((len(X[0]), hidden_neurons)) - 1
    synapse_1 = 2*np.random.random((hidden_neurons, len(classes))) - 1

    prev_synapse_0_weight_update = np.zeros_like(synapse_0)
    prev_synapse_1_weight_update = np.zeros_like(synapse_1)

    synapse_0_direction_count = np.zeros_like(synapse_0)
    synapse_1_direction_count = np.zeros_like(synapse_1)

    **for** j **in** iter(range(epochs+1)):

        *# Feed forward through layers 0, 1, and 2*
        layer_0 = X
        layer_1 = sigmoid(np.dot(layer_0, synapse_0))

        **if**(dropout):
            layer_1 *= np.random.binomial([np.ones((len(X),hidden_neurons))],1-dropout_percent)[0] * (1.0/(1-dropout_percent))

        layer_2 = sigmoid(np.dot(layer_1, synapse_1))

        *# how much did we miss the target value?*
        layer_2_error = y - layer_2

        **if** (j% 10000) == 0 **and** j > 5000:
            *# if this 10k iteration's error is greater than the last iteration, break out*
            **if** np.mean(np.abs(layer_2_error)) < last_mean_error:
                print ("delta after "+str(j)+" iterations:" + str(np.mean(np.abs(layer_2_error))) )
                last_mean_error = np.mean(np.abs(layer_2_error))
            **else**:
                print ("break:", np.mean(np.abs(layer_2_error)), ">", last_mean_error )
                **break**

        *# in what direction is the target value?*
        *# were we really sure? if so, don't change too much.*
        layer_2_delta = layer_2_error * sigmoid_output_to_derivative(layer_2)

        *# how much did each l1 value contribute to the l2 error (according to the weights)?*
        layer_1_error = layer_2_delta.dot(synapse_1.T)

        *# in what direction is the target l1?*
        *# were we really sure? if so, don't change too much.*
        layer_1_delta = layer_1_error * sigmoid_output_to_derivative(layer_1)

        synapse_1_weight_update = (layer_1.T.dot(layer_2_delta))
        synapse_0_weight_update = (layer_0.T.dot(layer_1_delta))

        **if**(j > 0):
            synapse_0_direction_count += np.abs(((synapse_0_weight_update > 0)+0) - ((prev_synapse_0_weight_update > 0) + 0))
            synapse_1_direction_count += np.abs(((synapse_1_weight_update > 0)+0) - ((prev_synapse_1_weight_update > 0) + 0))        

        synapse_1 += alpha * synapse_1_weight_update
        synapse_0 += alpha * synapse_0_weight_update

        prev_synapse_0_weight_update = synapse_0_weight_update
        prev_synapse_1_weight_update = synapse_1_weight_update

    now = datetime.datetime.now()

    *# persist synapses*
    synapse = {'synapse0': synapse_0.tolist(), 'synapse1': synapse_1.tolist(),
               'datetime': now.strftime("%Y-%m-**%d** %H:%M"),
               'words': words,
               'classes': classes
              }
    synapse_file = "synapses.json"

    **with** open(folder_path+synapse_file, 'w') **as** outfile:
        json.dump(synapse, outfile, indent=4, sort_keys=**True**)
    print ("saved synapses to:", synapse_file)

最后,我们将训练模型:

import time
X = np.array(training)
y = np.array(output)

start_time = time.time()

train(X, y, hidden_neurons=10, alpha=0.1, epochs=50000, dropout=**False**, dropout_percent=0.2)

elapsed_time = time.time() - start_time
print ("processing time:", elapsed_time, "seconds")

输出:

用 10 个神经元训练,alpha:0.1,dropout:False
输入矩阵:1594x41468 输出矩阵:1 x3
10000 次迭代后的 delta:0.0665105275385
20000 次迭代后的 delta:0.0610711168863
30000 次迭代后的 delta:0.0561908365355
40000 次迭代后的 delta

正如我们所看到的,训练这个模型花了将近 11 个小时。在如此密集的计算之后,我们准备测试数据。

测试数据的函数:

*# probability threshold*
ERROR_THRESHOLD = 0.2
*# load our calculated synapse values*
synapse_file = 'synapses.json' 
**with** open(synapse_file) **as** data_file: 
    synapse = json.load(data_file) 
    synapse_0 = np.asarray(synapse['synapse0']) 
    synapse_1 = np.asarray(synapse['synapse1'])

**def** classify(sentence, show_details=**False**):
    results = think(sentence, show_details)

    results = [[i,r] **for** i,r **in** enumerate(results) **if** r>ERROR_THRESHOLD ] 
    results.sort(key=**lambda** x: x[1], reverse=**True**) 
    return_results =[[classes[r[0]],r[1]] **for** r **in** results]
    *#print ("\n classification: %s" % ( return_results))*
    **return** return_results

让我们测试模型的准确性:

classify("Switchboards Help KA36200 About Us JavaScript seems to be disabled in your browser You must have JavaScript enabled in your browser to utilize the functionality of this website Help Shopping Cart 0 00 You have no items in your shopping cart My Account My Wishlist My Cart My Quote Log In BD Electrical Worldwide Supply Remanufacturing the past SUSTAINING THE FUTURE Hours and Location Michigan Howell")

输出:

[['Class_3 ',0.9766343788614435]]

classify("  New Website Testimonial Policies Parts Catalog Contact Support Forum Documentation Themes WordPress Blog Products Spindle Parts Latest News Kennard Parts Suggest Ideas Legal/Disclaimers WordPress Planet News About CDT Home Latest News Testimonial Products Parts Catalog About CDT History Staff Policies Centrum Legal Disclaimers Contact About CDT Custom Drilling Technologies established in 1990 has been providing superior customer service to the printed circuit board industry for almost 20 years We specialize in Excellon Drilling and Routing Equipment Parts and Service Our staff has over sixty years of combined experience in the design building troubleshooting operation programming")

输出:

[['Class_1 ',0.96297535870017]]

如你所见,我们在这些测试中获得了相当高的准确度。我在不同的数据上尝试了这个模型,发现它有相当高的准确性。

在这种只有一层的模型中,大约 95%以上的精度被认为是非常准确的。对于不同模型的进一步分类,我们可以使用 Keras 或 Tensorflow。为了减少训练模型的时间,我们可以使用 NVIDIA GPU。

现在,借助反向传播的深度神经网络,我们可以很容易地收集数据并对其进行分类。

在后续教程中,我将尝试解释 Keras 和 Tensorflow 的工作和实践。

请在下面的评论区或通过我的 LinkedIn 页面分享您对本教程的反馈:https://www.linkedin.com/in/ridhamdave/。也分享一下你对这个教程的疑惑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值