TowardsDataScience 博客中文翻译 2019(一百八十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

探索过去五年的畅销书

原文:https://towardsdatascience.com/exploring-best-selling-books-of-the-last-five-years-8f4740449289?source=collection_archive---------20-----------------------

每周,《纽约时报》( NYT)都会公布小说和非小说类的十大畅销小说。作为一个狂热的读者,我想确定这些列表是否会为未来的阅读提供建议(即它们是否会更强烈地迎合特定的子流派),并最终回答过去一年多来对我来说最困扰的问题之一:是只有我还是最近的畅销书中有很大一部分包含“女孩”这个词?!

接下来是我用报纸自己的 API 自行策划的 NYT 畅销书数据集的快速探索。这项工作部分受到了其他人的工作的启发,特别是迈克尔·陶伯格(https://medium . com/@迈克尔·陶伯格/how-to-name-a-best seller-6f 7313 fbb 9 e,)https://towards data science . com/book-titles-are-getting-longer-1c 341 FBD 4829)。我选择考察两个时间段:去年和过去五年,以便挖掘任何潜在的趋势。

正如你对每周出版率的预期,每周出现在列表上的书名没有太大变化。因此,作为第一步,我删除了所有重复的内容。下面的词云显示了前五年剩余语料库中每个词的流行程度。果然,我们马上看到“女孩”这个词在图表中占主导地位。

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

Best selling title words over the last five years.

仅在去年,这一趋势并没有消失。取而代之的是出现频率更高、主题更黑暗的词汇,比如“谋杀”、“战争”、“迷失”、“魔鬼”,甚至“黑暗”本身。

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

Best selling title words over the last year.

在这个续集和前传的时代,我们可能还会期待最近看到更长的标题,因为系列附加了修改描述(想想《哈利波特与……》)。事实上,这是勉强正确的,因为五年期间的平均标题长度为 2.74 个单词,而去年增加到 2.79 个单词(逐年分析在这里将被证明是最有用的)。

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

Distribution of title lengths over the last five years (left) and one year (right).

图书描述的聚类

除了书名之外,API 还提供了对小说适度详尽的描述。有了这些数据,我们应该可以初步猜测这本书的类型。然而,由于最畅销的书籍是那些吸引最广泛的人,我们可能不会期望在这项工作中取得突出的成果。

标题本身的信息内容可能不够密集,无法做出任何准确的判断。因此,我们将使用描述的原始文本。实际上,无论何时处理原始文本,都必须执行标记化、删除常用(停用)单词以及将每个单词简化为最基本形式(词干化/词汇化)的标准预处理步骤。在这里,我们在将标记提交给 TfidfVectorizer 之前这样做,TfidfVectorizer 根据每个标记在所学词汇中的出现频率将其转换为数字特征。通过这种方式,我们已经建立了自己的“书籍相关”语料库,而没有使用任何先前创建的嵌入。

有许多广泛使用和可用的聚类技术。对于这些无监督学习方法中的任何一种,最困难的决定是使用多少个聚类作为起始参数。在我们的例子中,我们可以想象的类型数量肯定是有限的,至少在第一次剪辑时是如此。再说一次,NYT 畅销书排行榜不太可能在可能的子流派的嵌套树中走得太深。(无监督学习的大部分乐趣是看算法能得出什么)。

在最常见的聚类类型 k-means 中,有一些聪明的方法来证明这种选择,比如“肘方法”。该方法试图选择“k ”,使得由下一个最高选择所解释的方差的边际增益第一次降低。换句话说,它选择的转折点,或“肘”在方差图解释对集群数量。使用我们的数据集,多达 50 个集群,我们获得了下图:

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

Attempt to select the ideal number of clusters using the elbow method.

我们已经可以看到,K-means 很难对聚类进行排序,因为在图中没有可识别的肘部。由于这个原因和其他原因,更常见的是使用剪影方法,该方法使用距离度量(通常为欧几里得距离)来评估聚类的点之间的间隔。接近 1 的轮廓系数意味着良好的分离。然而,同样在这里,我们获得了随着聚类数几乎线性增加的轮廓分数,这表明没有实现清楚的分离。

在我们五年的数据集中,我们有大约 1400 个独特的标题。剩下的最明显的选择是假设在集群之间平均分配,并选择 sqrt(1400)=37 作为第一个猜测。

这样做后,我们可以通过使用 TSNEVisualizer 来证实我们对分离不良的聚类的怀疑,TSNEVisualizer 在二维空间中呈现矢量化的语料库,由预定的聚类着色。

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

TSNE Visualization of our novel descriptions.

虽然乍一看这看起来很乱,但似乎确实有一些更密集的口袋可能真正捕捉到相似之处。

与 K-means 聚类相比,谱聚类是一种图聚类技术,它使用相似性矩阵来识别聚类,而不仅仅是距离度量。实际上,谱聚类通常更好地分离重叠的数据点;它不太关心它们在空间中的位置,而更关心它们在内容上的相似性。这些声音与我们息息相关;从现在开始,我们将使用谱聚类。

这样做,我们得到了一个在集群中很常见的分布,其中最大的集群使那些比它小的集群相形见绌。

Cluster_number Count
0     261
33     88
13     87
36     65
18     64
17     64
2      63
10     59
1      58
19     49
30     48
32     47
24     42
.
.
.

我们如何最好地可视化文本聚类以了解它们包含的内容?最好的方法之一是使用华盛顿大学的白蚁 d3 软件包,它可以按主题绘制常用词的流行度或显著性。这个项目的工作主要是用 Python 来完成的,所以我们现在将把自己限制在这种语言上。也许我们可以对每个主题中的单词进行排序,并给出一个或两个单词的中间值?通常,这仍然会导致单词缺乏意义,尤其是当集群的规模很小时。

nltk 包有一个很好的方法,叫做 freqDist,它确定单词在字符串中的频率分布。对于上面显示的最常见的聚类 0,如果我们只对那些长于 5 个字符并且出现超过 3 次的单词进行采样,我们将得到如下列表:

Cluster 0:

['america', 'american', 'ancient', 'artist', 'becomes', 'between', 'british', 'criminal', 'dangerous', 'during', 'encounters', 'father', 'follows', 'forensic', 'former', 'friendship', 'herself', 'investigation', 'investigator', 'involving', 'island', 'missing', 'mysterious', 'nantucket', 'parents', 'people', 'private', 'pursues', 'search', 'sequel', 'series', 'summer', 'together', 'treasure', 'vampire', 'wedding']

这里当然有很多词,但它们确实非常多样,缺乏一致性。与具有 63 个数据点的更紧密的集群 2 相比,我们开始看到一种模式出现:

Cluster 2:

['detective', 'detectives', 'disappearance', 'husband', 'investigate', 'investigates', 'lieutenant', 'murder', 'partner', 'president', 'series']

事实上,如果我们访问第 2 类的前 5 个元素的完整描述,我们会得到:

Sally Grissom investigates the disappearance of President Harrison Tucker’s wife.
D.D. Warren and Flora Dane investigate whether a pregnant woman shot and killed her husband.
Detective Dave Robicheaux and his new partner Bailey Ribbons investigate the death of a young woman by crucifixion.
Nick Fourcade and Annie Broussard, a husband-and-wife detective team, investigate a boy’s murder and the disappearance of his babysitter.
A television producer investigates the murder of a physician and whether it was his wife who killed him.

所有明显的调查秘密!

最后,我们还可以仅使用上面找到的最大聚类的描述作为我们的新语料库来进一步对其进行子聚类。现在我们有了 sqrt(261)=16 个更小的集群。对于其中最大的一个,我们现在有以下常用词和一些描述的样本:

['american', 'encounters', 'finds', 'found', 'widow']
A Star Wars saga. Grand Admiral Thrawn must choose between his sense of duty to the Chiss Ascendancy and loyalty to the Empire.
A photographer embarks on a road trip to reconnect with three men she might have married.
Maxim Trevelyan inherits several estates and beds his cleaner Alessia Demachi, an Albanian piano prodigy who has been trafficked into England.
Hans-Peter Schneider pauses his ghastly deeds to seek a dead man’s gold hidden under a Miami mansion, but its caretaker’s surprising skills prove daunting.
Investigations by Leaphorn, Chee and Manuelito overlap in the desert Southwest.

我们仍然有单词“american”和“encounters ”,但是比我们最初的集群 0 少了很多。然而,这些描述本身仍然缺乏一致性。

结论

我们研究了《纽约时报》畅销书数据库,揭示了近年来更黑暗主题的趋势。似乎也有迹象表明书名的长度正在增加。然后,我们看了看使用 K-means 和谱聚类基于书籍的描述对书籍进行聚类,并就可视化结果的方法提出了一些想法。虽然出现了一些共同的主题,但似乎没有足够的信息来对流派做出结论性的陈述。

敬请关注后续文章,我们将使用迁移学习来预测 Kindle 书评的极性(积极或消极)!

请在https://github.com/scjones5/nyt-bestsellers.git找到代码。

使用 Python 探索布伦特原油价格数据

原文:https://towardsdatascience.com/exploring-brent-oil-prices-data-using-python-9742b64aad57?source=collection_archive---------34-----------------------

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

Photo by Pixabay on Pexels

在本帖中,我们将对布伦特油价数据集进行一些简单的探索性分析。我们首先导入 pandas 库并将数据读入 pandas 数据框:

import pandas as pddf = pd.read_csv("BrentOilPRices.csv")

我们还可以显示前五行:

print(df.head())

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

First five rows of Brent oil price data

接下来,我们可以将“Date”列转换为 datetime 对象,并查看前五行:

df['Date'] = pd.to_datetime(df['Date'])
print(df.head())

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

First five rows of Brent oil price data with datetime object timestamps

我们还可以查看最后五行数据:

print(df.head())

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

Last five rows of Brent oil price data

我们可以从数据中看到,价格是从 1987 年到 2019 年。我们还可以看到有 8,216 行数据。接下来,我们可以使用“seaborn”数据可视化软件包绘制价格与时间的关系图:

import seaborn as sns
sns.set()
plt.title('Brent Oil Prices')
sns.lineplot(df['Date'], df['Price'])

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

prices vs. time

我们还可以看看价格的分布:

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

Histogram of Brent Oil Prices

在下一篇文章中,我们将建立一个简单的回归模型来预测未来的布伦特原油价格。这篇文章的代码可以在 GitHub 上找到。感谢阅读。祝好运,机器学习快乐!

使用 Foursquare 和 Zomato API 探索印度昌迪加尔的场馆

原文:https://towardsdatascience.com/exploring-chandigarh-india-using-foursquare-and-zomato-api-1d4501291320?source=collection_archive---------9-----------------------

数据科学顶点项目

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

Sukhna Lake, Chandigarh

作为 IBM 在 Coursera.org 的应用数据科学顶点课程的一部分,我参与了一个顶点项目,在这个项目中,我使用 Foursquare API 和 Zomato API 来获取印度昌迪加尔各个场馆的位置、评级和价格信息。在本文中,我将讨论我将来自两个 API 的数据结合起来并从中提取有意义的信息的方法。

[## kb22/Coursera _ 顶石

该库将包括 Coursera 上应用数据科学顶点课程顶点项目的代码。…

github.com](https://github.com/kb22/Coursera_Capstone/blob/master/Exploring%20venues%20in%20Chandigarh.ipynb)

请注意,这些地图可能不会直接出现在 Github 的笔记本视图中,因此您可以通过克隆 repo 并检查maps文件夹来检查它们。

介绍

在本文中,我们将根据评级和平均价格来探索印度昌迪加尔的场馆。每当一个人游览一个城市时,他们就开始寻找逗留期间可以参观的场所。他们主要根据所有场馆的场馆评级和平均价格来寻找场所,以便这些场所符合他们的预算。因此,我们在这里的目的是确定人们可以参观的地方。

在这里,我们将根据从 Foursquare 和 Zomato APIs 收集的数据以及从 Data Science 应用程序检索的信息来确定适合不同个人的地方。

数据讨论

数据是从两个 API 收集的,Foursquare API 和 Zomato API。第一步是在昌迪加尔中心点半径 4 公里的范围内搜寻场地。在使用 Foursquare API 提取了 120 多个位置之后,使用 Zomato API 将纬度和经度值用于获取场地的详细信息。

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

Venues retrieved from Foursquare API

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

Venues retrieved from Zomato API

我们看到一些场地重叠,而另一些场地则相距甚远。因此,通过仔细分析,我们决定从两个数据集中删除所有纬度和经度值相差超过0.0004的相应地点。完成后,我们发现仍有一些场馆没有对齐,可分类如下:

  1. 有些场馆内有 Zomato API(Elante Mall 的必胜客)提供的特定餐厅/咖啡馆。
  2. 两个位置如此接近,以至于它们实际上具有相同的纬度和经度值(披萨厨房和 Zara)。
  3. 一些场馆已被新场馆取代(Underdoggs 现已被 Brew Estate 取代)。

虽然可以保留属于第 1 类和第 3 类的场馆,但我们应该放弃第 2 类场馆。这给我们留下了 49 个场馆的数据集。

方法学

作为第一步,我们从两个 API(four square 和 Zomato)中检索数据。我们从昌迪加尔市中心提取场地信息,最远距离为 4 公里。然后,纬度和经度值用于从 Zomato 获取场馆评级和价格。

基于两个源的名称、纬度和经度值,来自这两个源的数据被仔细地组合在一起。最终数据集将包括每个场馆的评级和价格值。

接下来,我们分析根据每个场馆的收视率和价格创建的数据。我们识别顶级类别类型。我们确定了许多场馆所在的地方,以便任何游客都可以去一个地方,享受在众多场馆选项中进行选择的机会。我们还探索了高评分和低评分的区域,同时还绘制了高价位和低价位场馆的地图。最后,我们根据每个场馆的可用信息对场馆进行聚类。这将使我们能够清楚地确定哪些场馆可以推荐,以及具有哪些特点。

最后,我们将根据游客的评分要求和费用来讨论和总结哪些场馆需要开发。

分析

在分析阶段,我研究了昌迪加尔地图上的场馆类别、场馆评级分布和价格区间。

种类

当我们从 Foursquare API 中提取类别时,识别城市中最受欢迎的场馆类型真的会很有帮助。我们绘制了同样的柱状图。

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

看来昌迪加尔的大多数场所不是咖啡馆就是印度餐馆。如果游客试图探索其中任何一个,他们是幸运的。

评级

接下来我们就来看看场馆的收视率。作为一名游客,你想知道哪些地方有评级较高的场馆。我们可以绘制一个条形图,显示所有场馆的评分和每个评分的计数,以查看所有场馆的平均评分。

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

我们看到评级范围从1.05.0。剧情揭示最大场馆评分接近 4 。游客也可能有兴趣知道高评级场馆实际位于何处。

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

Venues with different ratings

橙色或红色的场馆等级低于 3 级,而标有绿色或深绿色的场馆等级为 3 级及以上。我们可以看到,很多高收视率场馆都位于第 35 扇区、第 17 扇区附近。 Elante Mall 拥有个分级在全系列的场馆。另外,从第 11 区到第 7 区和第 26 区的场馆带有高评级场馆

价格

接下来,我们使用散点图探索所有场馆的人均价格,以及具有人均平均价格的场馆数量。

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

从上图我们可以看到,大量场馆的均价在 200 卢比到 400 卢比之间。我们还可以根据场馆的价格范围来划分场馆,看看哪些区域有什么价格的场馆。

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

Venues with different prices

从地块中,我们观察到35 区和 17 区附近的场馆主要是价格较低的。靠近7 区和 26 区的场馆价格很高。Elante Mall 似乎有高价和低价的混合场地。

使聚集

我们现在将根据价格范围、位置等因素对所有这些场馆进行分类,以确定相似的场馆以及它们之间的关系。我们将把场地分成两个独立的组。

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

从地图上,我们可以看到两个集群:

  1. 第一集群(绿色)遍布整个城市,包括大部分场馆。这些场馆的平均价格区间为 1.71,评级差约为 3.57
  2. 第二集群(红色)分布非常稀疏,场地非常有限。这些场馆的平均价格区间为 3.21,评级差约为 4.03

结果和讨论

在从 Foursquare 和 zoma to T21 API 中收集数据后,我们得到了 120 个不同场馆的列表。然而,并不是两个 API 中的所有场地都是相同的。因此,我们必须检查它们的纬度和经度值以及它们的名称,以便将它们组合起来,并删除所有异常值。这导致场地总数为 49 个。

我们发现,在所有的场地中,大多数是咖啡馆和印度餐馆。喜欢咖啡馆/印度餐馆的游客肯定会从昌迪加尔之旅中受益。

虽然评分范围从 1 到 5,大多数场馆的评分接近 4 。这意味着大多数餐馆提供的食物质量好,受到城市居民的喜爱,因此表明其评价高。当我们在地图上标出这些场馆时,我们发现在 17 区、35 区和伊兰特购物中心周围有一簇簇场馆。这些集群也有非常高的评级(超过 3)

当我们看一下每个场馆的价格时,我们发现许多场馆的价格在每人 200 到 400 卢比之间。然而,的价格变化非常大,整个系列从 100 卢比开始,一直涨到 1200 卢比。根据价格范围在地图上标出场馆,我们发现位于17 区和 35 区附近的场馆价格相对低于 7 区和 26 区的场馆。Elante Mall 中存在低价和高价的组合。

最后,通过聚类,我们发现许多场馆价格相对较低,但平均评分为 3.57 。另一方面,少数场馆价格较高,平均评分为 4.03

  1. 如果你想找价格便宜、评级相对较高的地方,你应该去 35 区看看。
  2. 如果你在寻找最好的地方,有最高的评级,但也可能有很高的价格标签,你应该参观第 7 区和第 26 区。
  3. 如果你想探索这座城市,但没有具体的标准来决定你想去的地方,你应该试试 Elante Mall。

公司可以使用这些信息来构建在线网站/移动应用程序,根据搜索标准(名称、评级和价格)为用户提供城市中各种场馆的最新信息。

结论

这个项目的目的是探索参观昌迪加尔的人可以探索的地方。已经使用 Foursquare 和 Zomato API 确定了比赛场地,并在地图上进行了标注。地图显示一个人可以参观的三大区域**:第 35 区第 7 区&第 26 区伊兰特购物中心。根据游客的场地评级和价格偏好,他/她可以在三个地方中进行选择。**

用 R 探索电影中的彩色故事

原文:https://towardsdatascience.com/exploring-chromatic-storytelling-with-r-part-1-8e9ddf8d4187?source=collection_archive---------12-----------------------

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

一次丰富多彩、数据驱动的电影色彩世界之旅

你最喜欢的电影的主色调是什么?电影制作人对色彩的运用是如何随着时间而变化的?光看一部电影的调色板就能猜出谁是导演吗?

在电影制作中,色彩是向观众传达信息最有力的手段之一。掌握色彩的确至关重要,许多最伟大的导演和摄影师都有丰富的视觉艺术背景。

颜色可以在我们不知不觉中影响我们的心理和情感。不同的颜色可以用来创造场景中的和谐或紧张,加强导演试图传达给观众的想法,引起对关键视觉主题的注意,展示角色的旅程,等等。

根据情节、主题、目标观众甚至只是导演的喜好,电影可以是激进的色彩,深入探索整个色轮,也可以是单色的,温和的,遵循完全不同的审美。

从下一章开始,我们将使用数据驱动的方法和构建适当的数据-viz 工具来探索彩色故事的这些和许多其他观点。
在我们丰富多彩的旅程中,我们将探索一些从著名电影中挑选出来的有趣例子,试图猜测导演选择背后的原因,并通过 R 脚本了解能够做些什么。

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

A glimpse of Wes Anderson’s color aesthetic in The Life Aquatic with Steve Zissou. [©Touchstone Pictures]

:技术部分已标注。如果您想了解文章的主要内容,而不想参与令人讨厌的编码部分,请随意跳过它们!

一.一切从哪里开始:数据

什么是视频?

V 视频只是连续图像的集合(即),当以合适的速度再现时,这些图像给人以运动的感觉。每个视频可以正式表示为一个 4 阶张量

图像在数字上被定义为三阶张量,其中每一层都是代表不同颜色通道的二维数字阵列。因此,图像的颜色由这些通道的组合来定义

根据编码的不同,张量的每个单位(即像素)可以是实数(HSL,HSB/HSV,归一化 RGB),也可以是整数(RGB)。为了更好地解释颜色模型,看看这个。现在让我们坚持使用 RGB 编码,这是最直观的一种。
RGB 是加色模型,其中帧由三个颜色通道 : 红色®绿色(G)蓝色 (B)叠加表示。通道的每个单元是 0-255 强度范围内的整数(即 8 位)。

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

Visual representation of second, third and fourth order tensors in imaging.

用 Matlab ⑇实现视频导入和帧预处理

我们要处理的数据是张量。在 R 中检索视频源的张量分量有点棘手;因此,在最初阶段,我们将使用VideoReader对象在 Matlab 中工作。

上面的脚本逐帧检查视频源。每一帧都是一个 ×宽×3 张量。因为我们最感兴趣的是探索整个剪辑的颜色趋势,而不是关注此时单个帧的调色板,所以我们需要提取的唯一信息是每个帧的平均颜色(即 RGB 三色组)

运行这个预处理管道需要一些时间。电影通常以 24 fps(即每秒帧数)显示,这意味着我们每秒钟的视频要处理二十多张图像。假设输入分辨率为 720p,为了获得单个帧的平均颜色,我们必须计算 1280 ⋅720 =921600 像素≃ 1 Mp 的平均值三次(每个通道一次)。所以得到一秒 视频需要处理的字节量是 0.92 Mpixel ⋅24 frames⋅ 8 bit⋅ 3 声道≃ 66 Mb !这基本上就是视频源这么重的原因了,对了。

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

Converting Uma Thurman from frames to RGB spreadsheets. Frames from Pulp Fiction, by Quentin Tarantino. [©Miramax]

一旦处理流水线已经运行,我们最终得到一个三列(即 RGB 平均值)和 N 行的逗号分隔值文件,输入视频源的每一帧一个。现在我们准备好出发了!

二。弄脏双手:框架线

框架线

S 由于我们的输入基本上只是一个时间序列的颜色,人们可能绘制的第一件事就是颜色时间线。从现在开始,我们将要创建的所有彩色条形码将被称为 框架线 。基于电影框架的美丽艺术作品可以在这里找到(非常感谢查理·克拉克的灵感!)和这里的。
这是我们在本章结束时能够构建的示例:

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

Frameline representation of 2001: A Space Odyssey, by Stanley Kubrick.

每一行代表一组连续帧的平均颜色,从时间 0(左)开始到电影结束(右)。最后一个瓦片是整部电影的平均色调。图块的厚度取决于我们想要平均的时间窗口。如果时间窗口太宽,有意义的颜色信息会在平均过程中丢失;如果我们选择一个非常短的时间窗口,过度拟合会使框架线很难解释。如果我们将宫崎骏的幽灵公主娜乌西卡的框架线并列,我们可以清楚地看到当采样窗口太宽时,最有趣的颜色变化是如何被洗掉的。

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

Princess Mononoke and Nausicaa of The Valley of The Wind framelines. In both the movies, blue scenes start to fade out when the sampling window exceeds 100 seconds. As the time window become wider, the main color of the movie kills all the other tones, starting from the less represented ones.

在⑇实施框架线

现在让我们看看如何在 R 中实现所有这些。我们已经有了一个。csv* 文件,每帧的平均 RGB 值,所以数据导入已经基本完成。*

现在我们有了一个合适的输入数据框,我们将使用ggplot2包来绘制我们的第一个彩色框架线。 Ggplot 大概是 R 上最强大最流行的数据 viz 包 。绘制复杂的框架线需要掌握一点 ggplot,这不符合第一篇文章的目的。无论如何,这里有一个简化但功能齐全的脚本来绘制您的第一个框架线:

颜色平均值通常看起来非常暗/不饱和。这是非常生理的,因为场景经常在灰色和暗色调的中性色调下播放,而今天的电影往往有点无色。我们可以帮助我们的大脑和眼球使用鲜艳的颜色。这可以很容易地从 RGB 颜色模型切换到色调-饱和度-亮度 模型 (HSL)并打开最后两个组件。我们稍后会花一些关于 HSL 的单词。现在,我们只能说plotwidgets包中的modCol函数使得生动性增强实现非常直接。

框架检查:星球大战传奇

现在,让我们通过**检查星球大战宇宙**的颜色来让事情变得更有趣。通过对前面的脚本稍加修改,我们可以轻松地构建一个如下所示的可视化地图:

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

The Star Wars Saga framelines, starting from first trilogy (1st-3rd row) to Episode VIII (last row).

除了是一件我会自豪地挂在我床头的艺术品之外,这本画框集还揭示了乔治·卢卡斯在他史诗般的太空歌剧中使用色彩的大量信息。例如,让我们把注意力集中在使用更非典型调色板的那一集:《帝国反击战》(第二排)。

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

The Empire Strikes Back frameline with some manually extracted key frames. [©Lucasfilm LTD]

在这一集《天行者的奥德赛》中,我们的英雄穿越银河系,在三个不同的地方着陆:霍斯达格巴云城*。在这里,乔治·卢卡斯巧妙地将不同的主色与每个地点联系在一起:耶鲁蓝代表冰冷的霍斯,深绿色代表沼泽,淡紫色代表云城。不同的颜色有助于展示故事的空间过渡但它们也设定了每个部分的基调调整饱和度和亮度:卢克在达戈巴沼泽的自省时刻没有周围部分那么饱和,每次原力的黑暗面上升,暗色调就占主导地位。在整个故事中,这些图案可以被观察到几次,给它一些颜色一致性。*

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

The most vivid and intense point of the entire saga. Can you spot it on the framelines map? [©Lucasfilm LTD]

在每一部三部曲中也可以观察到颜色的一致性:在第一部三部曲中主要的色调是冷的,在前传三部曲中切换到更加温暖的色调,在著名的穆斯塔法决斗中高潮达到了一个强烈的火红色。让我们试着想象一下这些趋势。

摘要图块:色调、亮度和饱和度

在前面几节中,我们提到 RGB 不是唯一的颜色模型,也不是我们最感兴趣的颜色模型。只是简单直观而已。要检查有趣的颜色趋势,从 RGB 模式切换到 HSL 模式可能是个好主意。色调(H)明度 (L)和饱和度 (S) 实际上是我们谈论色彩故事时最重要的一些颜色属性。

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

Bicone representation of the HSL color space. [from Wikipedia]

HSL 颜色空间可以被视为一个双锥,其中每个点(即颜色)都在一个圆柱坐标系中表示,其中 S∈*【0,1】,L∈【0,1】和 H∈【0,360】。虽然我们都知道饱和度和亮度的含义,但色调的定义可能有点模糊。国际照明委员会(CIE)将色调定义为一种刺激与被描述为红色、绿色、蓝色和黄色的刺激相似或不同的程度。我们基本上可以称之为色影。***

这三个通道/属性中的每一个都可以被隔离,将其他的设置为固定值:例如,我们可以通过将亮度通道设置为 0.5(半强度)并将色调通道设置为 0(即纯红色)来检查每一集的平均饱和度值。亮度和饱和度通道可能会被重新缩放,以显示电影之间的差异。这种检查可以以摘要区块的形式可视化,其中每个方块代表一个不同的情节。**

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

Summary tiles for saturation (left), brightness (middle) and hue (right) channels of the Star Wars saga. From top to bottom: Sequel Trilogy, Prequel Trilogy, Original Trilogy.

上面显示的摘要图块证实了我们上面所说的关于色调的内容。此外,我们可以清楚地看到,与第一部和第二部相比,前传三部曲显得不那么黑暗和高度饱和。相反,续集三部曲的前两集是整个传奇中最黑暗、最不饱和的章节,第七集:原力觉醒获得了两个类别的第一名。将所有的帧线合并在一起,平滑产生的时间序列,可以更好地检查 HSL 通道随时间的趋势

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

Saturation (left), brightness (middle) and hue (right) channels trend over time in the Star Wars saga.

在这一点上,开始猜测下一集将会如何可能会很有趣。考虑到每个三部曲的第一章和第三章都没有第二章那么饱和,我们可以预期第九集的饱和度会更低。关于色调,色块矩阵是非常对称的,因此很难说电影的温度会是多少;考虑到整个故事的基调,我们可以推测一个不那么温暖的红色基调。
下注吧,12 月底见,看谁是赢家!

三。找点乐子:电影和导演比较

彩色指纹:韦斯·安德森和宫崎骏

既然我们知道如何收集电影色彩中的暗示,让我们来看看一些最具代表性的导演的作品和他们的电影。许多电影制作人已经形成了一种独特的美学风格,通过在他们的作品中使用调色板很容易辨认出来。在最近的电影导演中,最引人注目的是韦斯·安德森和他的传奇故事。

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

Fantastic Mr Fox, by Wes Anderson. [©20th Century Fox, palettes from here]

安德森非常喜欢柔和的色调,他将这些颜色运用到了几乎所有的场景元素中。这让他完全垄断了自己电影的意义和潜台词。

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

Color fingerprints of three contemporary directors: Wes Anderson, Hayao Miyazaki and Christopher Nolan.

有许多有意识和无意识的偏见导致导演在他/她的职业生涯中选择类似的调色板。例如,自然和生态是宫崎骏思想的里程碑,这清楚地反映在他在绝大多数杰作中使用的调色板上。

颜色象征:矩阵

与导演的情况类似,电影和电视节目也可能会使用特定的调色板;一些电影对特定颜色的运用如此之多,以至于他们最终将自己与这些颜色联系在一起。例如,让我们想想绿色的。你联想到的第一部格林的电影是什么?还有为什么是矩阵*?***

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

Framelines of The Matrix trilogy, by The Wachowskis.

《黑客帝国》可能是电影摄影中最明显和最著名的色彩关联案例之一,因为虚拟世界中发生的每个场景都是绿色的,灵感来自老式显示器的磷绿色。色彩象征在沃卓斯基的作品中强烈而明显;事实上,绿色并不是我们看到的唯一主色:当场景从矩阵转移到现实世界时,绿色完全被深蓝色调色板所取代。****

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

Chord diagrams of color hues transitions in The Matrix trilogy. The dominance of green fades away in the third episode, where the plot is almost entirely set in the real (blue) world.

这一选择背后的原因当然不是随机的:在色彩心理学中,黄色的绿色与恶心和疾病联系在一起,而蓝色的色调应该让观众感觉更舒服。从这个意义上说,通过将尼奥的正常存在设定为一种病态的、幽闭恐惧症的绿色,我们可以欣赏现实世界以其蓝色色调提供的新鲜感。相反,亮度对比是用来提醒观众,与《黑客帝国》的虚假和受控环境相比,现实是多么富有戏剧性。

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

The Matrix vs Reality. Color palettes extracted automatically using k-means. [© Warner Bros]

滑过色谱:哈利波特传奇

说到绿色:你有没有注意到最新的哈利波特电影有多绿色?嗯,事情并不完全是这样开始的。

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

Framelines of The Harry Potter saga. Can you spot the Dolores Humbridge’s office scene?

实际上,《哈利·波特》很好地总结了我们之前说过的关于颜色的所有东西。不同色彩的巧妙运用清楚地定义了人物和地点:例如,想想霍格沃茨的四所房子、咒语和教师办公室。在传奇故事中,的导演们探索了整个色彩光谱、,从明亮、温暖的红棕色慢慢褪色为黑暗、无菌和冷绿色,在传奇故事的中间穿过一些蓝色。从这个意义上来说,看看*颜色如何随着角色一起演变,随着事件的发展变得越来越冷、越来越暗是很有趣的。*******

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

Harry’s character color evolution from The Philosopher’s Stone to The Deathly Hallows. [© Warner Bros]

JK 罗琳以一本儿童书开始了这一切,孩子们在魔法世界里奔跑尖叫。为了捕捉这种氛围,之前以执导《独自回家》而闻名的克里斯·哥伦布决定使用温暖明亮的调色板。至于书,故事很快成长成熟,随着哈利长大成人变得越来越复杂和悲剧。这清楚地反映在后续导演的色彩选择上,正如《传奇》中亮度成分的单调下降趋势所指出的那样。

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

Brightness trend over the entrie Harry Potter saga. The set slowly become darker and darker, with the only exeption of the Harry and Dumbledore Talk at King’s Cross scene.

结论

这里是我们半音阶探索的第一部分结束的地方。我们看到在电影*、中有许多使用色彩的方法,并且可以开发许多不同的技术来探索这些方法。为了收集这个项目中使用的所有函数,并使它们在 R 环境中易于访问,我构建了一个名为 c hromaR 的 R 包 跳转到 第二部分 如果你想了解更多!***

*** [## 用 R 探索电影中的彩色故事:ChromaR 包

关于如何生成电影框架线和许多其他彩色数据的实用见解

medium.com](https://medium.com/@detsutut/the-chromar-package-892b716ee2c9) [## Tommaso Buonocore -作者-走向数据科学| LinkedIn

查看世界上最大的职业社区 LinkedIn 上 Tommaso Buonocore 的个人资料。托马索列出了 5 项工作…

www.linkedin.com](https://www.linkedin.com/in/tbuonocore/)***

使用 ICAs 从 fMRI 数据中识别静息状态网络

原文:https://towardsdatascience.com/exploring-cognitive-differences-via-resting-state-networks-2112bf5291e2?source=collection_archive---------15-----------------------

实践教程:从数据收集到特征提取

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

本教程通过分析 fMRI 数据的基本实践教程,提供了对神经影像研究合理实践的深入了解。我讨论(1)提出一个合适的研究问题,(2)数据收集,(3)质量控制,和预处理(4)特征提取。

下一个 post- 使用具有 rs-fMRI 数据的 LSTMs 从健康对照中分类 ADHD集中于数据分析*。*

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

A neuroimaging study pipeline (Lindquist, 2008). This tutorial (#1) focuses on the steps highlighted in purple.

本教程的代码可以在 这里 **找到。**做好准备,请下载 freesurferdocker 、以及 python

我选择检查精神分裂症(SZ)患者的静息状态网络,并将其与这些健康人进行比较。

我很好奇精神分裂症是否表现出功能上的差异,主要是这种差异是否能在静息状态的网络中找到。

我认为这是一个有趣的问题(也是 fMRI 分析教程的一个很好的案例研究),因为它通过探索已知与异常神经回路相关的疾病,提供了对功能连接性分析的见解(Yu 等人,2012)。

数据收集

不,这部分与 MRI 机器的操作无关,而是集中于提供现有扫描供公众使用的各种在线资源。其中 openfMRIOasisopenNeuro1000 功能连接体项目

大多数数据集呈现原始的、去标识的数据,而有些数据集包含一些预处理脚本。有用的数据集将按照某种标准进行组织;常见的是脑成像数据结构 (BIDS)格式。在 BIDS 格式的数据集中,您可以看到按层次结构组织的文件:首先是主题 id,然后是扫描类型,然后(如果适用)是与每种扫描相关的不同任务或运行。文件本身最有可能是 NIFTI 文件(神经成像信息学技术倡议)或压缩的 NIFTI 文件(。nii 或. nii.gz)。

我使用来自 openneuro 的这个数据集。它包括对 290 名被诊断患有各种生理精神疾病(精神分裂症、双相情感障碍、多动症、抑郁症、创伤后应激障碍等)的个人以及健康对照组的扫描。除了各种条件之外,该数据集还包括捕捉不同任务的几种类型的扫描。为了探索上面提出的研究问题,我选择关注 SZ 患者的静息状态 fMRI 扫描。

fMRI 数据由 3T 西门子 Trio 扫描仪获得。扫描参数如下-层厚=4 mm,34 层,TR=2 s,TE=30 ms,翻转角= 90°,矩阵 64×64°,FOV=192 mm,斜切面取向。在静息状态扫描期间,参与者被要求保持放松并保持睁开眼睛;在扫描过程中,他们没有受到任何刺激,也没有被要求做出反应(Poldrack,2016A)。

从数据集描述中,我们可以看到 T1w(解剖学)扫描已经被使用free surfer MRI _ defage篡改(通过面部特征移除匿名化)。根据定义,损坏的数据之前经过了一些预处理。理想情况下,处理原始数据可以确保更加统一的预处理,但是如果不是这样,那么了解已经采取了哪些步骤是非常重要的。

因为这篇文章关注的是数据准备,所以我使用数据的一个子集来演示这个教程。一名 SZ (sub-50006)和一名对照(sub-10228)受试者。数据目录(根据投标组织)应如下所示:

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

BIDS formatted data

目录,这包括数据集描述、主题人口统计信息表和任务描述文件。

让我们看看我们的数据。

NIFTI 图像包含一个头,它可以很好地为您提供关于图像的大量元数据。当我们需要校正图像的噪声和其他失真时,这些信息将变得很方便。(更多详情此处)

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

我们还可以通过元数据找到扫描的切片数量(Z 轴的尺寸)和 TR。TR: 2.0,切片数:34。(万岁,这些数字似乎与作者报告的数字相符)。

此外,我们可以使用 freesurfer 轻松地将它们可视化。通过检查图像,我们可以识别扫描中的明显问题(奇怪的方向、伪像、对比度差,甚至图像缺失)。有一些工具允许自动执行这样的质量控制(我们将很快讨论它们)。

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

质量控制和预处理

在运行预处理管道之前,让我们看看手头数据的质量。质量控制(QC)有助于检测存在严重问题的图像,如伪影或严重失真。

用于分析大规模网络的数据的质量控制特别关注时间一致性。Power 等人(2011 年)详细介绍了几个图像质量指标(IQM ),重点是识别非伪相关性。我使用一个名为 mriQC 的软件,因为它根据同行评审的出版物(其中包括 power 等人,2011;Krüger 等人,2011 年)。下表描述了与确保时间一致性和避免虚假关联相关的 IQMs。包含坏的伪像或非常低的 SNR 的图像将被排除,而其余的进入预处理管道。在预处理期间将使用 DVARS 和 FD 来形成时间掩模(即,突出显示要移除的特定切片)。

IQMs

SNR (信噪比)

  • 这是主要的空间度量。使用结构数据提取信号功率与噪声功率的比值。SNR 对于估计统计功率很重要。
  • 它计算噪声均方根的信号幅度。较高的值表明重复测量的信号更稳定,因此测量的可靠性更高。

tSNR (时间信噪比)

  • 报告时间序列的时间进程 SNR 的中值。
  • 它计算平均 BOLD 信号(跨时间)与其对应的时间标准差图之间的比率。
  • 当稍后使用数据来比较信号变化时,tSNR 很重要(低 tSNR 可能会使数据产生偏差)

DVARS (方差的导数)

  • 衡量大脑图像的强度与之前的时间点相比变化的程度。因此,它是一个时间度量。
  • 它通过体素上的导数 RMS 方差来索引 BOLD 的变化率。具有异常高值的切片被标记为排除。

FD (框架式位移)

  • 测量头部在连续帧之间的位置变化量。
  • 它计算重新校准参数的导数的绝对值之和。具有异常高值的切片被标记为排除。

该命令为您的数据目录中的所有参与者运行 QC-这是一个漫长而繁重的计算。请确保分配足够的资源(或逐个磨合)。

在查看指标之前,我先看一下结构化的可视化报告。从报告中获得的关键信息是污损过程(此处可见粗体噪声可视化上的黄色标记)。

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

Defaced structural data

功能报告报告一段时间内的 DVARS、FD 和异常值测量值。这些图表表明,sub-10228 提供了比 sub-50006 更清晰的扫描。

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

sub-10228 noise measurements. DVARS max:89 mean:24.4 FD- max:2.3 mean:0.2

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

sub-50006 noise measurements.DVARS max: 131.9 mean: 42.2 FD- max:2.7 mean:0.58

组功能报告揭示了 tSNR 和 SNR 的高值。

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

在检查数据并确保我们对其质量满意之后,让我们执行预处理。

我使用 fMRIPrep ,因为它试图提供一个标准化的预处理管道,并解决 fMRI 数据的健壮和可重复预处理的挑战。fMRIPrep 是一个独立于分析的工具,它为 fMRI 数据提供了一个灵活、最小且健壮的管道。此外,它是易于使用的开源软件,对其局限性和发展保持透明的讨论。

请注意我使用的标志- '- -fs-license-file '向 fMRIPrep 指示您的 freesurfer 许可证文件在哪里,- -fs-no-reconall ‘跳过 freesurfer 重建步骤(它有些错误,在这里不是必需的),而’- -output-spaces '定义了从其重新采样数据的解剖空间(T1w 指的是图像本身,fsaverage5 指的是 free surfer 模板,而 template 指的是 MNI 地图)。

类似地,这个命令为数据目录中的所有参与者运行 fMRIPrep。要注意。fMRIPrep 很重。更多信息点击这里

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

fMRIPrep computing time under different conditions

fMRIPrep 在其管道中使用结构和功能映像。它输出头部运动校正、切片定时校正后的图像,并与同一受试者的结构空间对齐,符合蒙特利尔神经研究所(MNI)的空间。MNI 是一个标准化的空间,允许将不同的大脑标准化为一个单一的、可比较的图。

简而言之,fMRIPrep 管道。更多信息请访问文档

  • 分析 T1w 图像以检测脑屏蔽和脑组织分割

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

  • T1w 参考扫描用于空间标准化。图像将被映射到它们的原生空间以及 MNI(以及您通过标记’- 输出空间’)指定的任何其他空间)

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

  • 第一个功能性重新对准通过使用 FSL 的 MC flight算法来建立运动校正,以头部运动为目标。

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

  • 使用 AFNI 的 3dTShift 功能进行切片时间校正,以便将所有切片在时间上重新对齐到每个 TR 的中间。
  • 磁化率失真校正(SDC)集中于修正由扫描仪内部磁场不均匀性引起的空间失真
  • 超过 0.5 mm FD 或 1.5 标准 DVARS 阈值的帧被标注为运动异常值。

这些步骤的顺序支持更稳健的校正(Power 等人,2012 年)。

比较原始数据和预处理数据的 DVARS、FD 和异常值测量,我们看到预处理减少了数据中的噪声。

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

sub-50006

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

sub-10228

特征提取:静息状态分析方法

一旦数据被清理、去噪和预处理,我们就可以(最终)识别连通性特征。请记住,静息状态网络在空间独立的区域中表现出相关的时间模式(Jandric 等人,2018)。检查这种相关性模式的两种常见方法是基于种子的相关性分析(SCA)和独立分量分析(ICA)。SCA (Biswal 等人,1995 年)是一种基于模型的方法;因此,它需要先验地将大脑划分为感兴趣的区域(ROI)(Lee 等人,2013)。SCA 特别有用,因为它实施起来很容易,解释起来也很简单(Soares et al .,2016)。基本上,它使用先验选择的种子区域的时间序列来识别全脑功能连接图(基于指定的 ROI)。另一方面,ICA 是一种无模型的方法,并将来自整个大脑的数据分解为已识别信号的时间过程和空间图。这些信号,即独立分量,是展现最大空间独立性但随时间共同变化的区域的集合(Cole 等人,2012;史密斯等人,2013 年)。

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

Commonly used analysis methods in functional MRI studies (Soares et al., 2016)

Nilearn 是一个 python 库,支持这些(以及许多其他)神经影像分析方法。

首先,我们需要上传预处理过的图像:

这些工具是我们需要的,以便得到一个地区地图集,并产生一个相关矩阵。如上所述,在 SCA 中,我们使用先验图谱,而在 ICA 中,我们基于数据集创建一个图谱。

第一个函数创建一个掩码。我喜欢尼尔对面具的定义。他们让我们“把掩蔽物体想象成瑞士军刀,用于将 3D 空间中的原始神经成像数据塑造成与手头的研究问题相关的观察单位”。屏蔽器将只过滤我们感兴趣的数据部分。掩蔽者使用图谱来转换 fMRI 扫描。

事实上就是这样。变换的 fMRI 扫描反映了区域到时间步长的 2D 矩阵(即[10,160]将反映跨越 160 个时间步长的十个区域的值)。

但是为了有一个好的、简单的、可视化的效果——我们计算提取区域的相关矩阵并绘制它(第二个和第三个函数)。

SCA 分析

我包括两种类型的地图集。第一个是哈佛-牛津概率图谱(Makris et al .,2006;弗雷泽等人,2005 年;Desikan 等人,2006 年;Goldstein et al .,2007),第二个是 Smith 的 ICA 功能图(Smith et al .,2009)。

哈佛-牛津图谱基于 MNI 定义的区域,因此展示了众所周知的大脑区域的先验分割。另一方面,史密斯的图谱反映了独立分析静息态 fMRIs 及其显示的激活大脑动力学产生的区域。因此,它介于 SCA 和 ICA 之间。它确实提供了一个独立于当前数据的掩码,但是它的起源是在一个相似数据集的 ICA 中。

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

我们使用这两个地图集来创建基于提取区域的面具。计算它们相应的相关矩阵并绘图。

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

ICA 分析

在 ICA 中,我们不是导入地图集,而是使用数据集本身来计算它们。

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

一旦生成了区域,这个过程就像我们在 SCA 中所做的一样。我们创建一个掩码并计算相关性。

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

在本教程的下一部分— 我们如何在统计分析中使用这些数据。SZ 受试者和对照组之间的静息状态网络有差异吗?

作为一个小玩笑,这个图显示了一个 SZ 患者的相关矩阵。你能发现任何明显的不同吗?

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

*This figure reflects the correlation between regions identified via the control ICA (so the plots could be comparable)

参考文献

Biswal、f . z . yet kin、v . m . Haughton 和 j . s . Hyde(1995 年)。使用回波平面磁共振成像研究静息人脑运动皮层的功能连接。马格纳。原因。医学。34, 537–541.doi:10.1002/MRM。19360.863863863616

科尔,D. M .,史密斯,S. M .,,贝克曼,C. F. (2010)。静息态 FMRI 数据分析和解释的进展和缺陷。系统神经科学前沿,4,8。

德斯坎 RS,塞贡内 F,菲施尔 B,奎因 BT,迪克森 BC,布莱克尔 D,巴克纳 RL,戴尔 AM,马奎尔 RP,海曼 BT,阿尔伯特 MS,基利安尼 RJ。一种自动标记系统,用于将 MRI 扫描上的人类大脑皮层细分为基于脑回的感兴趣区域。神经影像。2006 年 7 月 1 日;31(3):968–80.

埃斯特万 O,比尔曼 D,沙尔 M,科耶霍 OO,波尔德拉克 RA,戈尔戈莱夫斯基 KJ;MRIQC:推进来自未知部位的 MRI 图像质量的自动预测:PLOS 一中 12(9):e 0184661;doi:10.1371/journal . pone . 0184661。

弗雷泽 JA,邱 S,布雷兹 JL,马克里斯 N,兰格 N,肯尼迪 DN,赫伯特 MR,本特 EK,科内鲁 VK,迪特里奇 ME,霍奇 SM,劳奇 SL,格兰特 PE,科恩 BM,塞德曼 LJ,Caviness VS,比德曼 j。精神病学硕士。2005 年 7 月;162(7):1256–65

Jandric,d .,Lipp,I .,& Mumford,J. (2018)。OHBM 按需操作:静息状态功能磁共振成像分析。检索于 2019 年 10 月 26 日,来自https://www . ohbmbrainmappingblog . com/blog/ohbm-on demand-how-to-resting-state-fmri-analysis

Krüger 等人,氧合敏感磁共振成像中的生理噪声,Magn。原因。医学。46(4):631–637, 2001.doi:10.1002/mrm.1240

Lang,E. W .,Tomé,A. M .,Keck,I. R .,Górriz-Sáez,J. M .,& Puntonet,C. G. (2012 年)。大脑连通性分析:一个简短的调查。计算智能和神经科学,2012,8。

Lee,M. H .,Smyser,C. D .和 Shimony,J. S. (2013 年)。静息态功能磁共振成像:方法和临床应用综述。AJNR Am。神经放射学杂志。34, 1866–1872.doi: 10.3174/ajnr。A3263

林德奎斯特,硕士(2008)。功能磁共振成像数据的统计分析。统计科学,23(4),439–464 页。

N. K. (2008 年)。我们能做什么,不能做什么。自然,453(7197),869。

里昂大学(2017 年)。死鲑鱼和巫毒教的相关性:我们应该怀疑功能磁共振成像吗?。大脑,140(8),e53-e53。

大脑成像中的前瞻性运动校正:综述。Magn Reson Med 201369: 621–636.

马克里斯 N,戈尔茨坦 JM,肯尼迪 D,霍奇 SM,Caviness VS,法拉尼 SV,Tsuang 山,塞德曼 LJ。精神分裂症患者左侧和全部前岛叶体积减少。精神分裂症患者,2006 年 4 月;83(2–3):155–71

缪泽,K. T .,杰斯特,D. V .(编辑。).(2011).精神分裂症临床手册。吉尔福德出版社

Poldrack,R. A .,Congdon,e .,Triplett,w .,Gorgolewski,K. J .,Karlsgodt,K. H .,Mumford,J. A .,… & Bilder,R. M. (2016A)。神经和认知功能的全现象检查。科学数据,3160110。

Poldrack,R. A .,Baker,C. I .,Durnez,j .,Gorgolewski,K. J .,Matthews,P. M .,Munafo,m .,… & Yarkoni,T. (2016B)。扫描地平线:神经影像研究的未来挑战。bioRxiv,059188。

Power,J. D .,Cohen,A. L .,Nelson,S. M .,Wig,G. S .,Barnes,K. A .,Church,J. A .,… & Petersen,S. E. (2011 年)。人脑的功能网络组织。神经元,72(4),665–678。

Power JD,Plitt M,Kundu P,Bandettini PA,Martin A (2017)时间插值改变 fMRI 扫描中的运动:伪影检测的幅度和结果。PLOS 一号 12(9): e0182939。doi:10.1371/journal . pone . 0182939

Raichle,M. E .,MacLeod,A. M .,Snyder,A. Z .,Powers,W. J .,Gusnard,D. A .,& Shulman,G. L. (2001 年)。大脑功能的默认模式。美国国家科学院学报,98(2),676–682。

Smith SM,Fox PT,Miller KL,Glahn DC,Fox PM,Mackay CE,
Filippini N,Watkins KE,Toro R,Laird AR 和 Beckmann,参见 2009。
激活和休息时大脑功能结构的对应。美国国家科学院院刊(PNAS),106(31):13040–13045。

史密斯、S. M .、维道尔、d .、贝克曼、C. F .、格拉瑟、M. F .、简金森、m .、米勒、K. L .、… &巴奇、D. M. (2013)。静息态功能磁共振成像的功能连接组学。认知科学趋势,17(12),666–682。

Soares,J. M .、magal hes,r .、Moreira,P. S .、Sousa,a .、Ganz,e .、Sampaio,a .、… & Sousa,N. (2016 年)。功能磁共振成像指南。神经科学前沿,10,515。

Yu,q .、A . Allen,e .、Sui,j .、R . Arbabshirani,m .、Pearlson,g .、D . Calhoun,V. (2012 年)。精神分裂症患者静息态功能磁共振成像下的脑连接网络。药物化学当前主题,12(21),2415–2425。

探索数据中的循环。

原文:https://towardsdatascience.com/exploring-cycles-in-data-a1746fb19735?source=collection_archive---------8-----------------------

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

Photo Credit : https://www.pexels.com/photo/two-yellow-labrador-retriever-puppies-1108099/

简短的概述

我们充满了循环。

周期是生活的一部分,是自然的一部分,也许是你可能会遇到的一些数据,我们所说的周期是指事件在时间和空间中以一定的周期性重复发生。

如果你生活在地球上,你每天都会经历白天/夜晚的循环,大约一天的三分之一时间会变得黑暗和寒冷,然后剩下的时间会变得明亮和温暖,这一系列的事件会在我们称为一天的时间段内重复发生。

季节是另一种类型的循环,连续几天寒冷,然后变暖,这在更长的时间内重复,生与死是另一个循环的例子,但这里的时间尺度如此之大,以至于我们通常忘记或没有注意到我们是一个更大循环的一部分。

为什么要学习周期?

通过研究周期,我们可以发现它们,并调整我们的行为以利用或避免所述周期的某个阶段,例如,如果我们知道从现在起 6 个月后温度将会变冷,食物将会匮乏,我们就可以相应地做好准备。

如前所述,周期无处不在,我们生物被硬编码到它们的某些方面(日子和季节),并创造我们自己的周期(睡眠/醒来,生育周期,工作/玩耍,等等,等等。),然而知道如何识别和描述它们的效用扩展到了其他领域…

考虑一下金融市场中的周期问题以及何时投资,这里的周期受已知和未知因素的影响,但如果你想成为一名成功的投资者,你需要知道你在周期中的位置,或者如一位著名投资者所说:

**"Being too far ahead of your time is indistinguishable from being wrong."**- Howard Marks ( Oaktree capital )

一个循环的细节。

首先,让我们看看最简单的周期:

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

And some relevant data points: +---+----+---+---+----+----+----+----+----+----+
| **X** | 0  | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 |
+---+----+---+---+----+----+----+----+----+----+
| **Y** | -4 | 0 | 4 | 0  | -4 | 0  | 4  | 0  | -4 |
+---+----+---+---+----+----+----+----+----+----+Note that the values **-4** and **4**repeat themselves over the non-repeating axis **0…32**, what we have here are 2 cycles that start and end at **(0,-4)** with a length of 16.

这是另一个遍布自然界的周期(科学与工程,通常被称为 正弦波 :

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

Sine waves deserve their own separate discussion, for now just note that they provide us with additional ways to talk about cycles and describe their parts.

但更多的时候,你会遇到像这样的原始周期:

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

The axes are left out on purpose so you can hopefully note that there are 2 large full cycles and an incomplete 3rd one, you can identify the first 2 by their peaks and troughs, the 3rd one is longer in length and hasn't peaked yet...After noticing these features, we can then reveal the mystery data as the Dow Jones Industrial Stock Average (DJIA) from May 1997 to May 2019 (~ 22 Years), these cycles represent the financial ups and downs of millions of people on planet earth during those years.

检测周期

在代表您的数据的图表上直观地检测周期是一种非常有效的方式来弄清楚这个周期业务,不幸的是它缺乏一些改进,我们可以询问关于我们的周期的具体指标,然后我们将被留在图表上做手势…这个周期大概 hmmm 2 拇指宽

幸运的是,聪明人一直在以结构化和数学的方式处理周期,所以我们可以利用这一点。

I'll explore a common and popular algorithm for cycle detection (Floyd's Tortoise and Hare) but there are a few more if you want to explore them at your own pace, here's a good place to start:[https://en.wikipedia.org/wiki/Cycle_detection](https://en.wikipedia.org/wiki/Cycle_detection)

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

弗洛伊德的龟兔赛跑

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

我们从一个数字序列开始(这里的循环很明显),把乌龟和兔子放在同一个起点上。

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

就像寓言中一样,兔子跑得快,乌龟跑得慢,兔子以两个2的空间增量移动,而乌龟每次只移动一个1

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

以这种速度,如果有一个循环,乌龟和兔子将在相同的值0相遇,从而揭示循环0,4,8,4,0,简单而优雅,但是…

**Notes:(1)** This is a very naive explanation of the algorithm (for the sake of clarity), in reality we need to deal with nodes and pointers and also implement the algorithm in your language of choice, a good starting point is python, you will need to learn and implement [**linked lists**](https://medium.com/@kojinoshiba/data-structures-in-python-series-1-linked-lists-d9f848537b4d)**,** after thatyou can add complexity, here's a few implementations: [**Rossetta Code: cycle Detection**](https://rosettacode.org/wiki/Cycle_detection#Python)**.****Notes:(2)** It might not be obvious, but you can now get cycle metrics, once you have a cycle, you can get the min/max (trough/peak ...0,8) and calculate amplitude, things like frequency and period are also possible once you incorporate pointers (the X axis, which in this example we are omitting but assume the data is continuous like a time series).**Notes:(3)** This problem/algorithm has multiple practical applications, a favorite of coding interviews, it also helps detect infinite loops and cryptographic collisions amongst other uses. 

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

Photo Credit: https://www.pexels.com/photo/animal-canine-close-up-dog-546229/

高级循环学

周期的世界是广阔的,取决于你的具体需求和项目,创建你自己的研究路径或分析可能是方便的,这并不是说有更先进的方法来看待数据中的周期和相应的技术和工具,这里有一些你可能想考虑的兔子洞…

希尔伯特-黄&小波 **变换:**另外两种分解信号的方法,每种都有不同于傅立叶分析的方法,根据数据的类型和可用性可能会更好。

预测:

预测是一个沉重的课题(c*heck the notes below)*,一旦你发现你的数据有周期性成分并完成量化,你还需要弄清楚它是否以及何时会重复,它会跟随一个趋势吗?上,下,横着?是什么在推动这个循环,是什么让你如此确定它会永远重复下去?

这些问题不仅需要一些关于周期的知识和在未来重现周期的数学和算法,更重要的是,还需要你预测的主题的知识,以获得关于未来行为和驱动行为的潜在原因的见解。

例如,当生物体死亡时,生物学中的一个循环迟早会突然停止;周期性的季节性趋势(想想假日销售)可能会被新技术破坏,或者像我们将看到的外部因素也可能影响周期,这里的背景是王道,假设你遇到了以下未标记的数据/图表…

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

没有上下文,我们可以合理地观察到存在周期,并且我们可以很轻松地预测下一个周期,这里是实际发生的情况以及缺少的上下文…

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

通过恢复上下文、实际数据和之前的观察,我们现在可以认识到当前周期没有以正常或预期的方式运行,然后我们可以寻找可能的原因并弄清楚。

**Notes:** A few sources related to forecasting (especially time series) and cycles:**-** [**Forecasting: Principles and Practice**](https://otexts.com/fpp2/)An excellent introduction.- [**Prophet**](https://github.com/facebook/prophet)(Facebooks forecasting library), check the [**white paper**](https://peerj.com/preprints/3190.pdf) for a related discussion on forecasting, also a pretty cutting edge tool.**-** [**Time Series in Python- Part 2\. Dealing with seasonal data**](/time-series-in-python-part-2-dealing-with-seasonal-data-397a65b74051)**:** An excellent series on forecasting and extracting cyclical elements. 

作为周期的介绍和概述,我希望这是一个起点;如果你有任何意见或想建议增加或减少,让我知道。

最好的,

基诺。

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

关于作者:

【出生于 Eugenio Noyola Leon(基诺)我是一名设计师,软件开发人员&艺术家目前居住在墨西哥城,你可以在 www.k3no.comT5找到我

探索纽约的环境修复场所

原文:https://towardsdatascience.com/exploring-environment-remediation-sites-in-new-york-f52b437d7982?source=collection_archive---------30-----------------------

使用 Matplotlib 和 Seaborn 进行数据探索

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

Photo by Luca Bravo on Unsplash

在本文中,我将探索位于纽约的各种环境修复站点,并尝试将数据集中包含的信息可视化。该数据由纽约州托管,可在 Kaggle 上获得。您可以在下面浏览该笔记本:

[## 探索纽约的环境修复场所

使用来自 NYS 环境补救地点的数据

www.kaggle.com](https://www.kaggle.com/bhanotkaran22/exploring-environmental-remediation-sites-in-ny)

资料组

  1. 数据集中有 70,324 个站点。
  2. 每个站点信息有 42 个不同的数据列。每份记录都包括了关于场地、项目、废物处理等信息。每个记录还包括大量信息,如地址、邮政编码等。
  3. 一些列具有空值,例如Address 2Waste Name
  4. 每一列中的条目都是类型integerfloatsobjects

数据探索

程序类型

数据集中总共有 5 种不同的程序类型:

  • HW——州超级基金计划
  • BCP——棕色地带清理计划
  • VCP——自愿清洁计划
  • ERP——环境恢复计划
  • RCRA——危险废物管理计划

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

最常见的项目类型是州超级基金项目。此外,最不常见的类型是危险废物管理计划,在所有数据中几乎可以忽略不计。

站点类别

每个站点的类别/状态使用字母数字代码进行识别,如下所述:

  • 02 —危险废物的处置对环境或健康构成了重大威胁
  • 03 —污染目前不会对环境或健康构成重大威胁
  • 04 —该站点已正确关闭,但需要继续进行站点管理
  • 05 —不需要进一步的操作
  • A —活动
  • C —已完成
  • p——初步信息表明某一场地可能受到污染的场地
  • PR——现在或曾经受 RCRA 要求约束的场所
  • N —没有进一步的操作

虽然每个类的描述都很清楚,但是有些看起来是多余的,比如同时使用05N来表示不需要做更多的事情。不过,还是来看看剧情吧,看看有没有透露什么信息。

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

数据分布本身是非常独特的。有一点很明显,那就是许多场地项目已经完工。

项目完成日期

虽然所有网站都提供了建议的完成日期,但我更感兴趣的是已经关闭的网站,以及数据中是否有任何趋势。

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

正如我们从上面的线图中看到的,从 1985 年到 2005 年,很少有网站关闭,然而,在那之后,数量显著增加。【2015 年关闭的最大站点。

由于 1985 年至 2005 年期间,随着人口的激增,废物产量增加,因此关闭的场所数量减少,关闭的场所也减少了。

污染物

与其探究废物的名称,不如知道哪个场地有什么污染物。这可以允许将类似的解决方案应用于具有相同污染物的场所。T2 有超过 237 种不同的污染物需要处理。

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

Sites with the given contaminant

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

Sites with the given contaminant

是所有场所中最常见的污染物,多达 2500 多个场所含有铅。最不常见的污染物是酸洗液矿物/白酒碳酸钙

控制类型

控制类型分为顶层的制度控制和工程控制,进一步包括契约限制、决定文件、环境通知、环境地役权和其他控制。

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

契约限制是最常见的控制类型,约占总数据集的 45%。

结论

这些数据揭示了许多关于修复场地的信息,使我们能够处理组合在一起的类似场地。

希望你喜欢我的作品。请随时分享你的想法,建议和想法。

探索探索性数据分析

原文:https://towardsdatascience.com/exploring-exploratory-data-analysis-1aa72908a5df?source=collection_archive---------14-----------------------

后退一步理解数据集的简单指南

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

Stock photo by https://pixabay.com/

探索性数据分析(EDA)的全部意义在于,在对数据集做任何事情之前,先退后一步看看数据集。EDA 与数据项目的任何部分一样重要,因为真实的数据集非常混乱,很多事情都可能出错。如果你对你的数据不够了解,你怎么知道去哪里寻找那些错误或混乱的来源呢?

花些时间了解您将要使用的数据集。每当我处理新数据集时,我都会例行地问自己/检查以下几点:

1.数据导入是否正确?

我过去常常为找到导入数据的正确方法而苦苦挣扎。在 R 的基本库中可以找到read.csv()函数,因此它是我用来导入数据集的第一个函数。

# the two assignment statements below render the same output> df <- read.csv("mydataset.csv")
> df <- read.csv("mydataset.csv", header = TRUE)

read.csv()的默认标题选项设置为 TRUE ,这意味着该函数将数据集中的第一行观察值分配给列名。

假设mydataset.csv只包含没有定义列名的观察值。如果header = FALSE是函数中指定的而不是,则导入的数据框的列名将获得数据集中第一个观察值的值。检查这一点的最好方法是简单地查看导入数据的前几行。在这种情况下,使用colnames()也会有所帮助。

# returns the first few rows of df
> head(df)# returns a vector of characters that correspond to the column names 
> colnames(df)

避免这种情况的一种方法是使用可以在 r 中的data.table库中找到的fread()。在这种情况下,header 选项被设置为 auto ,因此该函数会自动检查第一行观察值是否可以是列名,并相应地分配 TRUE 或 FALSE 值。我建议不管怎样,先看看前几行,但这比read.csv()更快、更方便

: read.csv()返回一个数据帧,fread()返回一个数据表。

2.是否存在缺失值和异常值?

成功导入数据文件后,我总是检查数据集中是否有任何丢失的值。我发现检验这一点的最好方法是按列对来自is.na()的所有真值求和,如下所示:

> colSums(is.na(df))

处理缺失值的方法有很多。丢失值的处理本身是一个单独的主题,但是我在这里试图强调的是对这些值的意识。一旦我知道数据集中有丢失的值,我就可以采取适当的措施来处理这些值。

也值得问问自己“为什么这些价值观缺失了?”。了解数据集中某些值缺失的原因有助于您更好地理解数据。请记住,这个练习的全部目的是帮助您获得数据集的完整度量,以便您知道您正在处理的是什么。

一些数据集也可能有非常不寻常的值。用一个例子来讨论这个更容易,所以让我们看看来自faraway包的pima数据集。数据集的描述可以在这里找到。

查看数据集每列的一些基本汇总统计信息是确保数据集中的值有意义的良好起点。看看下面的pima数据集的概要。

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

Summary of the dataset run in R.

具体看一下glucosediastolictricepsinsulinbmi的最小值。这些变量取值为 0 有意义吗?不会。一个人不可能没有血压或没有体重指数。这些值为 0 的唯一可能的解释是,这些条目是没有收集数据的实例(即,它们是缺失值)。将这些值设置为 NA 值,以便可以用数据集中的任何其他缺失值来处理它们。下面是一个如何替换变量bmi的 0 值的例子:

# pima loaded as a dataframe
> pima$bmi[pima$bmi==0] <- NA

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

Updated summary of the bmi variable in R.

注意bmi摘要的变化。这样这些值更有意义。

现在来看看test。这个变量被认为是糖尿病迹象的二元指标。为什么会有均值?这清楚地表明,R 将 1 和 0 识别为定量变量,而不是分类变量。运行class()查看这些值在 R:

> class(pima$test)
[1] "integer"

要让 R 将该列作为分类变量来处理,可以使用factor():

> pima$test <- factor(pima$test)
> class(pima$test)
[1] "factor"

检测这些实例非常重要,因为这些异常值可能会严重影响预测模型以及从中得出的任何结论。

3.形象化

以各种方式可视化您的数据可以帮助您看到您在探索的早期阶段可能错过的东西。以下是我的一些直观形象:

直方图

继续前面关于pima数据集的例子,下面是我使用ggplot2tidyr库绘制的直方图。这种可视化方法有助于我查看数据集中每个变量的频率/点数:

> pima %>%
+   gather() %>% 
+   ggplot(aes(value)) +
+   facet_wrap(~ key, scales = "free") +
+   geom_histogram(stat="count")

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

Nine bar graphs by count for nine variables in the dataset.

通过可视化您的数据,您可以看到变量tricepsinsulin明显有大量的缺失值。这表明,在这种情况下,必须小心处理丢失的数据。理解为什么如此多的值丢失可能是一个需要注意的重要特性。

注意:如果您之前没有纠正异常的 0 值,您将会看到类似的可视化效果。

关于使用ggplot2tidyr进行可视化的代码详情,请看这个网站

散点图矩阵

散点图矩阵可以帮助您了解数据集中任意两个变量之间是否存在某种关系。使用iris数据集来看看这个成对散点图的对称矩阵。

> pairs(iris)

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

Pairwise plots for the iris dataset

你可以看到,只要看看上面的图,在Petal.LengthPetal.Width之间有一些线性关系。您甚至还没有进入建模阶段,就已经对您想要关注的变量有了深入的了解!

相关矩阵图

这个相关矩阵图为理解两个数值型变量如何相互变化提供了直观的帮助。换句话说,它实际上只是一个相关矩阵的可视化表示。

函数cor()用于评估相关矩阵,库corrplot中的函数corrplot()用于基于相关矩阵创建热图。看看下面使用相同iris数据集的例子。

# use only numeric type variables
> correlations <- cor(iris[,1:4])# correlation plot
> corrplot(correlations)

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

Correlation matrix plot

从刻度可以看出,大的正相关值更蓝,大的负相关值更红。因此,从这个图中,看起来Petal.LengthPetal.Width是强相关的,并且看起来Petal.LengthSepal.Length之间也有很高的相关性。注意对角线是完全正相关的,因为它代表了变量与自身的相关性。

虽然这些结论类似于之前用散点图得出的结论,但这种方法只是提供了一个更具体的理由来相信两个属性是相关的。

经历这个理解数据的过程是至关重要的,不仅仅是因为我提到的原因。它最终也可能帮助你在选择型号时做出明智的决定。我在本文中概述的方法和过程是我在获得新数据集时最常用的一些方法和过程。您可以使用数据集探索和试验更多的可视化方式。不要退缩。你只是想看看你的数据并理解它。

我希望这篇文章有助于提供一些关于什么是探索性数据分析以及为什么经历这个过程很重要的见解。

探索国际足联

原文:https://towardsdatascience.com/exploring-fifa-277f469c8cdc?source=collection_archive---------10-----------------------

“足球的重要之处在于,它不仅仅是足球。”~特里·普拉切特爵士。

足球或英式足球,不仅仅是一项游戏,它是许多人的一种情感。人们追随他们最喜爱的俱乐部不亚于他们的宗教!伟大的球员受到全世界的称赞。但是并不是所有人都知道这些球员的工资是多少?,是什么促成了它们的市场价值?让我们一起来试着回答这些和类似的问题。因此,没有进一步的原因,让我们开始吧!

国际足球协会联合会(国际足联)自称是足球协会、足球联合会、沙滩足球和电子足球的国际理事机构。使用国际足联的 2019 年球员数据集,我们将尝试回答一些有趣的问题。

Kaggle 笔记本同样可以在这里找到。而这里的是 Github 的链接,供你参考(复制下文)。要完全跟上,我们建议你分叉 Kaggle 笔记本/Github 回购。我们还提供了文档的链接,以进一步了解所用函数的技术细节。

看&感受数据

在进行所有花哨的分析之前,了解数据的外观和感觉是非常重要的。该数据集的概述可在此处找到。在导入必要的库并使用’ df.head()'之后,我们得到了下面的输出(对不起,它不能滚动,它只是一个视图)

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

进一步检查数据集中所有可用的属性(字段)

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

从上面可以清楚地看到,根据我们的需要,我们当然需要删除某些列(字段),并且可能进一步清理数据。但是我们现在将把它放在一边,继续定义我们需要使用这个数据集来回答的问题。

你可以明确地看到,这个数据集可以提出几个问题,这取决于需求、感知和你需要完成的目标。以下是我们想出的问题-

球员的市值和工资有关系吗?

在查看数据后,我们决定进行一些数据清理和格式化。准备工作完成后,我们绘制了市场价值与工资的关系图(如下)。

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

可以清楚地看到,通常随着市场价值的增加工资也会增加,但我们也有更高的工资和接近零的市场价值!裁决- 市场价值确实在一定程度上影响球员的工资。

球员们最喜欢哪只脚,这对他们的定位有什么影响?

我们发现在我们的数据集中,不到 25%的球员是左撇子(如下图所示)。

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

为了检查运动员的偏好脚是否对运动员的位置有任何影响,我们采用了按运动员的位置分组的偏好脚的比例。

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

从上面可以看出,除了少数例外,左脚和右脚的比例是相同的。也就是说,无论你是左撇子还是右撇子,职位的分布都没什么关系,一个职位对另一个职位的需求大致相同。

进一步探究,根据脚的前 5 个位置(查看下面),我们发现 CB(中后卫)是第三个最受欢迎的位置,st(前锋)在这两个位置中都排在前 5 位。虽然有一些惊人的不同,像守门员大多是右脚!*威尔第-*是的,脚确实有影响,但只是很少,不是很实质性。

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

此外前锋、门将和中后卫是球员数量排名前三的位置(参考下面的截图)!

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

我们能根据一个球员的属性(比如准确性、射门能力、反应、运球等)预测他的价值吗?

诸如“首选脚”、“位置”、“传中”、“射门”、“头球精准”、“短传”、“截击”、“运球”、“弧线球”、“控球精准”、“长传”、“控球”、“加速”、“冲刺速度”、“敏捷度”等特征被选择。

使用一键编码对位置和首选脚列进行编码,并在格式化数据后,删除 nan(nan 是数据不存在的空值);我们分割数据,并尝试使用 RandomForestRegressor (集成学习器)和 GridSearch 进行预测(这就像在超参数调整的最佳参数列表中逐个搜索)。我们获得了“0.42”的 R 平方分数(模型评估)。

注-该模型可以进一步改进,使用不同的算法和/或特征工程。

同样使用相互信息回归器,我们发现以下是决定一名球员价值的 5 个最重要的特征-反应、控球、沉着、运球和短传。裁决- 并不是所有的特征都同样有用,同样一个人可以在给定足够的数据和玩家属性的情况下预测市场价值。

此外,我们还可以从数据中提出相当直接的问题(假设我们有适量的数据)。下面是我们尝试的两个这样的问题,后面是结论。

工资中位数最高的俱乐部(前 11 名)?

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

解约条款最大的球员(前 11)?

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

结论

给定 FIFA 19 球员数据集,可以问几个问题。上面我们提出了 5 个问题,我们试图回答,你可能对同一个问题不感兴趣,或者可能喜欢从不同的角度探索数据集。我们在这篇博文中的探索只是冰山一角,通过先进的机器学习技术加上正确的问题集,可以实现和理解很多东西!您可以随意使用笔记本这里这里并摆弄数据集。

希望您喜欢阅读这篇博文,上面的 EDA 向您概述了如何处理某个数据集以及可以使用的一些技术。

探索与熊猫的足球夏季转会活动

原文:https://towardsdatascience.com/exploring-football-summer-transfer-activity-with-pandas-5b9127c759ee?source=collection_archive---------34-----------------------

欧洲前 25 大支出足球队的转会交易

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

Image Courtesy of Sandro Schuh via Unsplash

探索夏季转会的有用熊猫特征

夏季转会窗口为欧洲足球队提供了招募关键球员的机会,以加强他们各自的阵容,迎接即将到来的赛季。边缘和破坏性的球员也可以被抛弃,被租借到不同的俱乐部去积累经验。

为了深入了解欧洲最大的 25 家俱乐部的转会交易,我搜集并整理了每支球队的关键信息。这些信息包括每个团队的支出和收入。此外,我还想知道与球员年龄相关的招募策略。抓取的数据如下所示。

本教程将演示如何使用简单、直观的 Pandas 功能和特性来研究数据。另请注意,截至 2019 年 8 月 13 日,此信息可能会更改和更正。

西班牙的西甲联赛、意大利的意甲联赛、德国的德甲联赛和法国的法甲联赛都在 9 月 2 日的不同时间有转会截止日期。

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

1.将对象数据类型转换为浮点数据类型

在开始任何数据分析之前,检查每一列都是数值数据类型是很重要的。df.dtypes 属性表明,“Income”列是一个 Object (string)数据类型。Pandas 将我的 Excel 文件中的“Income”列解析为 object 数据类型,因为某些球队的条目(连字符)是非数字的,例如上面显示的索引为 8 的阿斯顿维拉。

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

要转换这个对象列,有必要使用 to_numeric 函数,并告诉 Pandas 通过使用 errors = ’ compete '将任何无效输入转换为 NaN 值。如果知道 NaN 值实际上表示 0,可以使用。将 0 作为参数传递的 fillna(0)方法。

现在,当使用 df.dtypes 检查数据类型时,income 列是一个 float 数据类型,现在可以用于以后基于数字的操作。在数据框中,在指数 8 处,阿斯顿维拉的收入现在可以被视为 0,与之前显示的连字符相对。

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

2.新列和列重新排序

球员支出和球员销售所得之间的净差额很容易计算,但它让我们对欧洲 25 家最大支出者的财务转移交易有了有趣的了解。

新列“Net_Difference”是通过从支出列中减去收入列创建的。为了便于阅读,最好让 Net_Difference 列靠近它所引用的两个列。

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

数据帧的列被转换成列表,并且数据帧 df 根据索引列被重新分配。这里,前三列保持不变,但最后一列(用 python index -1 表示)跟在后面,最后一列包含特定于年龄的数据。通过打印数据帧的头部,信息可以更直观地对齐以便解释。

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

3.过滤从描述方法输出的数据

描述方法给出了数据集的数字数据摘要。但是,如果我们想要截断这个输出,只需使用。loc 函数,并根据需要过滤行和列。

在下面显示的输出中,我希望只看到具体关于年龄的数据快照,并且我只对该快照中的 min 到 max 行感兴趣。

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

4.将连续数据转换为分类数据

收入列可以用来创建一个新的收入类别数据列。在这里,可以使用 pd.cut 函数将收入列中的连续数据分成-1–40、40–80 和 80–350 范围内的区间。我给这些箱子贴上了标签:低、中、高。

这代表了每个俱乐部收到的收入是低、中、高。现在,快速扫一眼牌桌就能发现哪些球队为他们各自的球员获得了高收入。

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

5.设计数据框架的样式

对数据帧进行样式化可以增加视觉冲击力并有助于数据解释。在 githib gist 中显示的示例代码中,我展示了各种样式化 DataFrame 的方法。例如,要为列添加背景渐变,可以使用。background_gradient 属性,这个渐变将创建一个指示收入趋势的信息性配色方案。蓝色越深,收入越高。

此外,我为每个列值添加了一个横条,以指示该团队在净差额列中是盈利还是亏损。标题也可以添加到数据帧中,以告知观众具体信息的内容。

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

6.招聘策略并引用 query()字符串中的变量

下面 github gist 的代码片段的第一行显示了对列进行重新排序的另一种方法。

我还确定了到达年龄和离开年龄的平均值。

了解哪些球队正在招募年龄低于所有 25 支球队平均年龄的球员将是很有见地的。

为此,我创建了一个名为 arrival_mean 的变量,为了在查询字符串中引用它,我简单地在它前面加上了一个元字符’ @ '。

看起来像皇家马德里、曼联甚至罗马这样的球队正在齐心协力签下年轻球员。这是他们今夏转会政策的信息,所有这些似乎都是为了签下优秀的年轻球员,让他们有更好的表现。

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

Daniel James (left) and Aaron Wan-Bissaka (right) are two 21-year old Man Utd Summer signings

除此之外,数据显示排名前 25 的球队正在招募的球员平均比他们释放的球员年轻大约 2 岁!

摘要

本教程展示了熊猫在数据分析和解释方面的一个用例。样式化和创建分类列可以简化数据解释,而在查询字符串中引用变量可以为任何调查的数据集增加有价值的洞察力。

探索 R 中的高图表

原文:https://towardsdatascience.com/exploring-highcharts-in-r-f754143efda7?source=collection_archive---------9-----------------------

使用《我如何遇见你的母亲》中的数据可视化趋势和模式

这篇文章最初是作为探索性的探索开始的,目的是为了理解 r 语言中的可视化数据。随后是一系列的实验、测试和探索。在此期间,我还重新观看了我最喜欢的节目《我是如何遇见你母亲的》,这次是看一些重复出现的模式&它留下的数据集。在这两种相似性之间建立联系的需要促使我记录并分享这种学习,这本身仍然是这篇文章的灵感来源。

一般的 R viz 空间目前是相当令人兴奋的,g gplot2 主宰了与 Hadley Wickham 的商标学校的游戏,使复杂的操作非常轻盈。它能够快速可视化趋势,并定制您想要的任何东西,这使得它成为一个可靠的工具。 Plotly 另一方面,让你建立非常美丽的 D3 情节,特别是网站,仪表板。它允许您灵活地悬停键盘或鼠标并查看数据标签,并允许您自定义缩放以查看特定细节,使其成为 R shiny apps & markdown 文档的典范。

2009 年进入数据 viz 空间的是 D3JS 模块“Highcharts ”,其目前的客户吹嘘脸书、微软和 Stack Overflow。

Highcharts 的故事也许是一个时代的故事。它的制造商 Torstein hnsi 位于一个被峡湾、山脉和溪流环绕的挪威小镇,他正在寻找一个适中的制图工具,以更新他的主页,其中包括他家在当地山区 Vikjafjellet 的积雪深度测量结果。由于对不断遇到的插件感到厌烦,他采取了启动 Highcharts 的飞跃。自 2009 年以来,它一直是该公司 Highsoft 最畅销的产品&它作为一种主要的图表工具而闻名于世。

Joshua Kunst 在 R 中的 Highcharter 包是原始 Highcharts Java Script 库的包装函数。本文利用一档以图表和 viz- 《我是如何遇见你的母亲》著称的节目的相关数据,探索了它的一些视觉功能。

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

HIMYM features makes use of many aesthetic charts

软件包中有两个主要功能,即 hcharts()和 highcharts(),类似于 Ggplot2 的 qplot()和 Ggplot()。前者是单键快捷方式,而后者利用 html 小工具和动画。由于本文绘制了一些非常简单的图表,hcharts()函数足以满足大多数图表的需求。我在最终的图表中使用了更复杂的 highcharts()函数来组合极坐标图和折线图。

让我们跳进来吧!-

分组柱形图

很好的老式柱形图可能是显示分类数据的最佳图表选择,理由很充分。它以一种易于阅读的方式有效地比较和对比数据。

下面我画出了 HIMYM 一伙在这个系列中喝的酒的数量。

该语法很容易导航,使用 hcharts()快捷方式,第一个命令本身就足以完成创建原始柱形图的任务,而随后的命令行增加了美观和信息的层次。这里-标题,副标题,学分&一个自定义主题。

这里要注意的另一个方面是广泛使用了马格里特的(它的共同开发者 Stefan Bache 在短片中坚持说它应该用复杂的法国口音发音)% > %,即“管道”,使得语法对 tidyverse 用户友好。

Number_of_drinks %>% 

  hchart(type = 'column', hcaes(x = `HIMYM Character`, y = `Number of Drinks`, group = Type)) %>%

  hc_title(text = "How much did the gang really drink?",
           style = list(fontWeight = "bold", fontSize = "30px"),
           align = "center") %>% 

  hc_subtitle(text = 
                    "'All I want was to have a regular beer at my            regular bar with my regular friends in my regular city.'-Ted Mosby", 
              style = list(fontWeight = "bold"),
              align = "center") %>% 

  hc_credits(enabled = TRUE, 
             text = "Data Source: HIMYM;[https://imgur.com/user/haaaaaaaveyoumetted](https://imgur.com/user/haaaaaaaveyoumetted)",
             style = list(fontSize = "10px")) %>% 

  hc_add_theme(hc_theme_ffx())

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

Number of drinks by types of drinks & show characters.

饼状图&彩色面积图

幸运的是,highcharter 包的作者可能是该节目的粉丝,并在包中包含了一些基于该节目的数据集。对于这两个图表,我使用了那些数据集——马歇尔最喜欢的条形图和馅饼。在节目中,Marshall 以饼状图和条形图的形式向大家展示了他对自己喜欢的棒饼的偏好。在这里,他的偏好以饼状图的形式显现出来&彩色区域图。使用的语法与创建的第一个图表非常相似。我已经根据十六进制代码给这些图表添加了定制的颜色。尽管可以将自定义主题编码到图表中,但软件包本身有一个巨大的迷人主题库。在整篇文章中,我使用了“ffx”主题,灵感来自 Mozilla Firefox 浏览器。

#pie chartfavorite_bars %>%  hchart(type = ‘pie’, hcaes(bars, percent)) %>%  hc_title(text = “Marshall’s Favorite bars”,
 align = “center”,
 style = list(fontWeight = “bold”, fontSize = “30px”)) %>% 
 hc_tooltip(enabled = T) %>%  hc_subtitle(text = “In Percentage of Awesomness!”,
 align = “center”,
 style = list(fontWeight = “bold”)) %>%  hc_add_theme(hc_theme_ffx()) %>%  hc_credits(enabled = T,text = “Data source:HIMYM”)#colored area graph

  favorite_pies %>%   mutate( segmentColor = c("#000004", "#3B0F70", "#8C2981",  "#DE4968", "#FE9F6D"))%>%   hchart(type = 'coloredarea', hcaes(x = pies, y = percent))%>% 
  hc_title(text = "Marshall's favorite pies",
           style = list(fontWeight = "bold", fontSize = "30px"),
           align = "center") %>%   hc_subtitle(text = "In Percentage Of Tastiness!",
              style = list(fontWeight = "bold"),
              align = "center") %>%   hc_add_theme(hc_theme_ffx())

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

Marshall’s favorite bars & pies- in a pie chart & colored area graph respectively

气泡图

倒数第二个图表是一个气泡图,直观地显示了收视率最高的剧集。与散点图不同,气泡图允许绘制 3 D 数据——气泡的大小增加了数据的维度。这里-X 轴代表剧集的名称,Y 轴代表剧集的评分,而气泡代表 IMDB 上的投票数。这有助于我们推断,尽管《三天法则》被评为十大剧集之一,但它的票数很少,因此必须谨慎解读。像这样的标注和注释也可以添加到图表中来指出某些事实——HC _ annotation()函数也允许这样做。

HighestRated %>%  hchart(type = “bubble”, hcaes(x = ‘Episode’, y = Rating, size = Votes, color = 
 Votes), maxSize = “20%”) %>%  hc_title(text = “Top Rated Episodes of HIMYM”,
 style =list(fontWeight = “bold”, fontSize = “30px”),
 align = “center”) %>%  hc_subtitle(text = “What was your favorite episode?”, 
 align = “center”,
 style =list(fontWeight = “bold”)) %>%  hc_credits(enabled = T, text = “Size by Number of Votes,
 Colored by Rating.
 | Data Source- IMDB”) %>%  hc_add_theme(hc_theme_ffx())

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

Top Rated episodes of the series, by Ratings & Votes on IMDB

极线图

最后,极线图被用来衡量人们对备受争议的 HIMYM 大结局的反应。

这个数据集有一个有趣的旋转。《HIMYM》的大结局播出后遭到了一些严重的嘲笑(这里读,这里读,这里读&这里读)。事实上,即使是为这篇文章做研究,也激起了我在 5 年多前看完大结局后第一次感受到的愤怒。但是这些数据,就像人们有时知道的那样,告诉我们一个惊人的变化的故事。

社交分析平台 Canvs 研究的大多数人对结局感到乐观。Canvs 算法利用人们对 twitter 反应的情感分析来计算人们对娱乐形式的感受。

下面的图表以极坐标图的形式显示了这一数据集,将最常分享的“观点”用粉红色着色,即高于反应平均阈值的反应,而其余的用黄色突出显示。

highchart() %>%  hc_chart(polar = TRUE) %>%  hc_title(text = “HIMYM Finale Reactions”,
 style = list(fontWeight = “bold”, fontSize = “30px”),
 align = “center”) %>%  hc_subtitle(text = “‘And that kids is the story of how I met your mother’”,
 style = list(fontWeight = “bold”),
 align = “center”) %>% hc_xAxis(categories = fans_react$Fans,
 style = list(fontWeight = “bold”)) %>% hc_credits(enabled = TRUE,
 text = “Data Source:Based on a study done by Canvs as reported by The Atlantic”) %>% hc_add_theme(hc_theme_ffx()) %>% hc_legend(enabled = FALSE) %>% hc_series(
 list(
 name = “Bars”,
 data = fans_react$Contribution,
 colorByPoint = TRUE,
 type = “column”,
 colors = ifelse(fans_react$Contribution < mean(fans_react$Contribution),”#ffeda0",”#c51b8a”)
 ),
 list(
 name = “line”,
 data = fans_react$Contribution,
 pointPlacement = “on”,
 type = “line”))

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

HIMYM Finale reactions on twitter bucketed and visualized

关键要点-

  1. R 中的 Highcharter 包具有可导航的特性、可抓取的语法和高级 D3JS 视觉效果,是对 R viz 空间的一个很好的补充,目前由 graphics Ggolot2 包的语法所主导。
  2. 它可以使用相似的语法和参数创建各种各样的图表,如气泡图、柱形图、树状图、时序图等。
  3. 它不仅支持 R 对象,还使用了广受欢迎的%>% '管道’操作符,让 tidyverse 用户对它非常熟悉。这种简单的语法加上令人惊叹的视觉效果使它成为 R 闪亮应用程序和 R markdown 文档的首选工具。

代码和所有使用的数据集可以在 github 这里找到。

感谢阅读!你可以在这里联系我。

探索神经网络的工作方式并将其可视化

原文:https://towardsdatascience.com/exploring-how-neural-networks-work-and-making-them-interactive-ed67adbf9283?source=collection_archive---------27-----------------------

部署一个可以识别 Excel 手写数字的神经网络,以便所有的计算和交互都可以可视化和检查

在本文中,我们将使用一个 Excel 文件,可以通过点击此处找到。尽管您应该能够在没有该文件的情况下继续学习,但我还是强烈建议您下载它,以便更深入地探索。

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

Preview of the Excel file | Mikkel Duif (2019)

你有没有想过神经网络背后的数学是如何工作的?数学通常以向量和矩阵的形式出现,尽管这使学习变得更加简单,但有时很难理解你只是在数百、数千或数百万个数字上做同样的计算。我破坏了一个有 30 个神经元的单层神经网络,这样你就可以从头到尾看到所有的相互作用。你也可以看到它如何实时适应输入的变化,输入你自己的数字,看看它预测了什么。

注意:这是一个预先训练好的神经网络,所以我们现在不讨论实际训练它的所有数学问题(这要复杂得多),而只是看看如何使用训练好的神经网络的结果。此外,神经网络一直保持简单,在 1 层中有 30 个神经元,然而,对于更大的网络,它不会有很大的不同,可能只是更难跟上。我不记得这个网络的准确率,但我想象大约 90%(这对这个数据集来说不是很好)。我也没有加载实际的数字,但是你可以估计一下你自己会猜测的数字(有些数字甚至对人类来说也很难估计)。最后,本文也假设对神经网络有一些基本的了解,但是,大多数人应该能够理解。

理解数据

在我们深入研究计算之前,让我们先了解我们将使用的数据,以及神经网络的架构。

我们将使用的数据集是 MNIST 手写数字数据集,它基本上只是由人类书写的数字,然后扫描并转换为 28x28 像素的图像。我们使用的数据是基于每个像素的亮度,所以如果一个区域非常暗,它的值接近 1,没有任何墨水的区域的值接近 0。

在这里,您可以看到一个数字是什么样子,以及它对应的四舍五入到一位小数的值:

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

Visualizing the data | Mikkel Duif (2019)

因为我们总共有 28x28 个像素,所以总共有 784 个输入像素,这基本上就是我们的数据点。对于我们的神经网络,我们不会在矩阵中处理这些数据,而是展平图像(即,将其转换为向量),我在上面记录了四个不同输入(像素)的数量,以便您可以跟随。左上角基本上是我们向量中的第一个数,右下角是我们向量中的最后一个数。

理解模型的架构

现在我们知道了我们的数据是什么样的,让我们看看神经网络是如何对这些手写数字进行分类的。一个神经网络基本上由一个输入层(即我们的像素),一个隐藏层(这只是这个模型的一个)和一个输出层(这是模型从 0 到 9 分类的数字)组成。此外,它由权重和偏差组成,我将在图片下面简要解释。

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

Visualisation of Neural Network | Mikkel Duif (2019)

权重:由于每幅图像总共有 784 个像素,我们的模型中也将有 784 个输入神经元。由于 784 个神经元太多,无法在这里显示,我跳过了大部分神经元,只显示了中间的一些不只是零的输入神经元(尝试在 GIF 中找到它们)。在隐藏层,我选择了 30 个隐藏的神经元(为了简单起见,上面的图片中跳过了 20 个)。最后,我们的输出层有 10 个神经元,对应从 0 到 9 的数字。所有的神经元通过从第一个输入神经元到隐藏层中的每个神经元的权重连接。即,i nput 神经元 1 通过权重连接到隐藏层中 30 个神经元中的每一个——Input 神经元 2、等也是如此。,一直到 i nput 神经元 784 。做一些简单的数学计算,这给了我们从输入层隐藏层总共 30 x 784 = 23,520 个权重。这些权重中的每一个都分配有一个值,它们共同决定隐藏层中的每个值。重量可以在 A1:AB870 区域的参数选项卡的 excel 文件中找到。

从隐藏层到输出层也是如此。然而,这一次我们在隐藏层中只有 30 个神经元,每个神经元只连接到 10 个输出神经元,这一次我们只有 30 x 10 = 300 个权重。少得多,但仍然太多,无法显示每一个重量。如果你还不明白这一切是如何相互联系的,不要担心,在下一节中,我将解释这一切是如何组合在一起的——但首先,我们只需要理解偏差。重量可以在 A871:A1180 区域的参数选项卡的 excel 文件中找到。

术语:从第 1 层中的神经元 1 到第 2 层中的神经元 1 的权重可以写在第一个权重的正上方,这对应于 Excel 文件的参数选项卡上的单元格 A2 的值。从最后一个输入神经元到隐藏层中最后一个神经元的权重,即权重左下方的 w(2–1,784)可以在 AB870 单元格中找到。单元格 A872 中的重量 w(3–1,1)和单元格 A1180 中的重量 w(30–10,30)。每个权重的位置并不重要,只是让您知道如何在 Excel 表格中导航。

偏差:除了权重之外,神经网络也有偏差,这是添加到每个隐藏层和外部层的值中的东西。这些偏差在上图中没有显示,但是可以在 A1181:A1222 区域的参数选项卡的 excel 文件中找到。

你可能会想,这些权重和偏差的值是从哪里来的呢?请记住,这是一个经过训练的神经网络,这意味着我们不会经历如何获得这些权重,而只是如何使用它们。如果你很想知道如何训练一个神经网络,我建议你研究一下迈克尔·尼尔森的资源,他使用了相同的数据集——他给了我很多学习人工智能的灵感。

理解计算

现在我们已经有了权重和偏好,让我们试着弄清楚如何计算我们需要什么。它实际上并不复杂,我们只需要计算 40 个不同的数字(30 个用于隐藏层,10 个用于输出层)。然而,输出层依赖于隐藏层中的计算(如果我们有更多的隐藏层,每一层将总是依赖于它前面的层)。为了保持数学符号简单,让我们将隐藏神经元的值写成这样:

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

Activation function for first neuron in hidden layer

注意:上标 2 并不意味着我们正在平方这个值,它仅仅意味着从第一层(下标 1)到第二层(上标 2)。

对于那些熟悉乙状结肠功能的人来说,基本上就是这样了。然而,在神经网络中,它通常被称为激活函数。让我们快速澄清一下上面等式中的字母是什么意思。

  • e (简单地说就是欧拉数,一个大约等于 2.71828 的常数)
  • I (输入神经元,即 784 个像素中每个像素的值——每个隐藏神经元的值相同)
  • W (从每个输入像素到隐藏层的第一个神经元的权重——也是 784 个值,但是每个隐藏神经元的新值,即总共 23,520 个不同的值)
  • B (属于隐藏层的第一个神经元的偏置项——对于第一个隐藏神经元,这对应于值为 0.43 的单元格 A1182)

请注意,我们取输入神经元和权重之间的点积。记住,我们有 784 个输入神经元和 784 个相应的权重(对于隐藏层中的每个神经元,权重是变化的)。输入神经元 1 的值和从输入神经元 1 到隐藏层中的神经元的权重相乘——我们对它们中的每一个都这样做,并取乘积的和,再加上偏置项。这个的负值作为欧拉数的幂,我们加 1。然后我们最后用 1 除以这些数字的和。如果我们必须提供一个包含所有数字的示例,那么这个示例会很长,但是请检查包含该数字最终值的单元格 AD2,在 Excel 中可以写成:

= 1/(1+EXP(-(sum product(number;weight _ 1 _ 1)+INDEX(bias _ 1;1)))),其中“数字”是该数字的像素值的数组,而“权重 _1_1”表示从输入层到隐藏层中的第一个神经元的权重。我给数组命名是为了让公式更有意义——如果你想研究数组,去“公式”->“在 Excel 中定义名称”,看看数组代表什么。

第一个隐藏神经元的值在图像中显示为 1.00,但这只是由于四舍五入。真的是 0.99676789。那么这到底意味着什么呢?没有任何简单的方法来解释这一点——好的一面是它确实有效。

回到等式,我们基本上只需要对隐藏层中的每个神经元(总共 30 个)应用这个,这样我们就有了隐藏层的值。对于最终的输出层来说,这样做实际上没有太大的不同,唯一的区别只是我们不再使用 784 像素作为输入——我们使用隐藏层中每个神经元的值,即我们刚刚计算的值。隐藏层中的每一个神经元都有自己的权重(A871:A1180)分配给它们(就像图中一样),输出层中的每一个神经元都有自己的偏置 (A1212:A1222) 。您可以在单元格 AE1:AE11 中找到输出图层的最终计算结果。

画你自己的数字

试着去 Excel 文件的‘Draw’选项卡画出自己的数字,看看神经网络是如何对自己的数字进行分类的。希望它应该做得更好一点,但仍然很有挑战性,试着画一个 7。

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

Preview of the Excel file | Mikkel Duif (2019)

我希望这篇短文和 Excel 文件对你更好地理解神经网络有所帮助。请随意留下您的评论或问题。也许将来我会写一篇关于如何训练一个神经网络并得出权重和偏差的新文章。

使用 Keras 和 TensorFlow 探索数据扩充

原文:https://towardsdatascience.com/exploring-image-data-augmentation-with-keras-and-tensorflow-a8162d89b844?source=collection_archive---------2-----------------------

在下一个深度学习项目中使用数据增强的指南!

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

Photo by Jon Tyson on Unsplash

数据扩充是一种用于通过使用裁剪、填充、翻转等技术来增加数据量的策略。

数据扩充使得模型对于微小的变化更加健壮,因此防止模型过度拟合

将增加的数据存储在内存中既不实际也没有效率,这就是 Keras 的ImageDataGenerator类(也包含在 TensorFlow 的高级 api 中:tensorflow.keras)发挥作用的地方。ImageDataGenerator通过实时数据增强生成批张量图像数据。最棒的是。只是一行代码!

生成器生成的输出图像将具有与输入图像相同的输出尺寸。

下面是一个辅助脚本,我们将使用它来直观地展示使用ImageDataGenerator类所能实现的一切。

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

1.旋转

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

通过指定rotation_range,生成的数据被随机旋转+rotation_range-rotation_range范围内的一个角度(以度为单位)。

2.宽度移动

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

width_shift_range是一个介于0.01.0之间的浮点数,它指定了图像随机向左或向右移动的总宽度分数的上限。

3.高度移动

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

除了图像是垂直移动而不是水平移动之外,与宽度移动完全一样。

4.聪明

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

brightness_range指定随机选择亮度偏移值的范围。0.0的亮度对应绝对无亮度,1.0对应最大亮度。

5.剪切强度

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

剪切变换会倾斜图像的形状。这不同于旋转,因为在剪切变换中,我们固定一个轴,并以某个角度(称为剪切角)拉伸图像。这在图像中产生了一种“拉伸”,这在旋转中是看不到的。shear_range以度为单位指定倾斜的角度。

6.一款云视频会议软件

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

通过zoom_range参数获得随机缩放。小于1.0的缩放会放大图像,而大于1.0的缩放会缩小图像。

7.频道转换

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

信道偏移通过从channel_shift_range指定的范围中选择一个随机值来随机偏移信道值。

8.水平翻转

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

生成器将生成图像,图像将随机水平翻转。

9.垂直翻转

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

除了水平翻转,我们还可以应用垂直翻转。

但是那些我们没有任何价值的点呢?

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

我们有几个选项,从中我们可以选择我们希望如何填充这些区域。

1.最近的

这是默认选项,选择最接近的像素值,并对所有空值重复使用。(例如 aaaaaaaa | abcd | dddddddd)

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

2.显示

该模式创建一个“反射”,并以已知值的相反顺序填充空值。(例如 abcddcba|abcd|dcbaabcd)

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

3.包装

除了反射效果,我们还可以通过将已知点的值复制到未知点来创建“包裹”效果,同时保持顺序不变。(例如 abcdabcd|abcd|abcdabcd)

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

4.常数

如果我们想用一个常数值填充位于输入边界之外的所有点,这种模式可以帮助我们实现这一点。常量值由cval参数指定。

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

但还有更多!

您可以直接从该课程中获得一些额外的好处。一些例子包括将数据归零(featurewise_center samplewise_center)和归一化(*featurewise_std_normalization* *samplewise_std_normalization*)。这些变量可以通过将它们的布尔值传递给ImageDataGenerator类来设置。我们还可以通过指定rescale参数来重新调整这些值,它会乘以所有的值。

此外,还有一个参数preprocessing_function,使用它您可以指定自己的自定义函数来执行图像处理。多酷啊!

如果你喜欢这篇文章,你可能也会喜欢 VGGNet vs ResNet:消失渐变问题的清晰答案!

参考

[1] Keras 文档

[2] 张量流文档

[3] 剪切变换

用交互式可视化探索印度超级联赛

原文:https://towardsdatascience.com/exploring-indian-premier-league-with-interactive-visualizations-7a6ae053449?source=collection_archive---------11-----------------------

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

Photo by AaDil on Unsplash

可视化数据的艺术和实践在弥合人机差距以有意义的方式传递分析洞察力方面变得越来越重要。
——艾德·邓比尔

介绍

I 印度超级联赛(IPL) ,印度职业二十强(T20)板球联赛成立于 2008 年。该联盟以循环小组和淘汰制为基础,在印度主要城市都有球队。

这是在machinehack.com举办的 IPL 数据可视化挑战赛(2008–2018)的探索。我用 Tableau 做了可视化。

关于数据

该数据集包含 2008 年至 2018 年的以下信息。

  1. 匹配日期—匹配的日期和年份
  2. Match_number —每个赛季的比赛号码
  3. Macth_venue —体育场名称和位置
  4. 匹配时间—晚上或白天/晚上
  5. Toss_winner —赢得投掷的团队名称
  6. 决定是击球还是投球
  7. 第一队——先击球的队
  8. 团队 1 得分—团队 1 得分
  9. 第二队——第二个击球的队
  10. 团队 2 得分—团队 2 得分
  11. Winning_team —赢得比赛的团队
  12. winning _ margin——每个队赢了多少分?

在这篇文章中,我们试图通过可视化来理解 IPL 球队,比赛和获胜模式。我已经用这个数据集做了初步的分析,但是还有很多工作要做。

以下是分析所遵循的步骤:

Python 中的数据读取、数据预处理和数据清理。完整的源代码在 这里有 ,万一你想看的话。

我制作了大量可视化的工作表,探索 Tableau 中数据的各个方面。Medium 没有给我们嵌入 HTML 或 javascript 代码的选项,因此你在这个博客中看到的是一个截图。然而,我所有的可视化和仪表板都可以在这里看到

交互式可视化和分析

谁是最有胜算的 IPL 队伍?

从这个圆形的条形图中,我们可以看到孟买印度人队和钦奈超级国王队是 IPL 历史上最成功的球队,其次是加尔各答夜骑队。从 2008 年到 2018 年,孟买印度人赢得了 97 场比赛,钦奈超级国王队赢得了 90 场比赛,加尔各答骑士队赢得了 86 场比赛。

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

IPL 赛季 Top Toss 赢家?

从这个包装好的泡泡中,可以看出孟买的印度人赢得了 IPL 中最高的投掷数,其次是加尔各答的夜间骑手和德里的夜魔侠。

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

在印度各地举行的多场比赛?

下面的地图显示了印度各地的比赛。最多的比赛在孟买、加尔各答、班加罗尔和德里举行。此外,2009 和 2014 赛季发生在南非和阿联酋,同样没有显示在下面的地图。

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

IPL 冠军?

钦奈超级国王队和孟买印度队三次赢得 IPL 冠军。加尔各答骑士骑手两次获得冠军。数据集中有 12 支球队。12 支队伍中,只有 6 支队伍获得了冠军。皇家挑战者、德里夜魔侠、XI 旁遮普国王、浦那勇士、古吉拉特雄狮和高知塔斯克从未获得过冠军。

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

每个体育场打了多少场比赛?

根据下面的棒棒糖图,M Chinnaswamy 体育场举办了最多的比赛(76 场),其次是伊甸园花园、Feroz 体育场和 Wankhede 体育场。

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

每个城市的平均分是多少?

下面的蝴蝶图显示,班加卢鲁的得分最高,其次是达兰萨拉和拉杰科特。这显然显示出对这些城市的偏爱。

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

平均团队 1_ 分是多少?

根据甜甜圈图表,钦奈超级国王和孟买印度人在第一次击球时获得了高分。

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

IPL 总决赛——击球第一的团队成绩是多少?

Sunrisers Hyderabad 在 IPL 决赛中得分最高,其次是 Chennai Super Kings 和孟买印度人。孟买印度人在两个赛季的 IPL 决赛中得分最低,其次是德干充电器。

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

每个赛季进行多少场比赛?

棒棒糖图显示了 2012 和 2013 赛季的最高比赛次数,随后是 2011 赛季。

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

球队每个赛季的最低和最高分是多少?

以下两张图表显示了一支球队在 IPL 历史上的最低和最高得分。德里夜魔侠在 2008 年和 2011 年两个赛季中得分最低(56 分)。加尔各答夜骑士在 2008 年举办了 67 场,皇家挑战者在 2011 年举办了 56 场。

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

皇家挑战者队在 2013 年和 2016 年获得了 IPL 历史上最高的 263 分和 248 分。

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

最成功的 IPL 团队?

钦奈超级国王队是 IPL 历史上最成功的球队。尽管停赛两年,但他们三次获得冠军,五次获得亚军,两次获得季后赛资格。

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

上述可视化是在 Tableau 中创建的,只是一个初步的。然而,还可以做得更多。你可以在这里找到所有的可视化

探索用于机器学习的 JetBrains 数据仓库

原文:https://towardsdatascience.com/exploring-jetbrains-datalore-for-machine-learning-7377797ca4e5?source=collection_archive---------25-----------------------

Datalore 是一款来自 JetBrains 的数据探索工具!

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

Photo by Luke Chesser on Unsplash

JetBrains Datalore 可能是你的下一个 Google Colab 或 Jupyter 的替代品😌。目前,处于测试阶段的 Datalore 是 JetBrains 提供的一个数据分析 web 应用程序。今天,我们将讨论 Datalore 的一些特性,并探索它的功能。

1.设置 Datalore.io

转到 Datalore.io 并完成注册过程。接下来,您将看到一个主页,我们可以在上面保存我们的工作簿(笔记本😕 ).

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

Datalore’s Home page

通过上面的三个按钮,我们可以为我们的项目创建、导入工作簿。

2.工作簿环境

我们将创建一个简单的工作簿来测试数据知识。我们将写下一段张量流代码✌️来检查工作。

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

Datalore workbook

我们可以为我们的工作簿选择不同的内核。这就是 Datalore 与 Jupyter 不同的地方。我们可以有一个 Datalore 内核,它能够实时执行我们的代码😳。

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

The IPython Kernel works like Jupyter. The Datalore kernel has something different for us.

您可能会发现我们在 Datalore 内核特性方面的问题。对于我们的讨论,我们将使用 IPython 内核。如上图所示,我们有多个基于 RAM 大小的实例。

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

Managing libraries

我们可以管理 Datalore 中所有可用的各种包。要安装一个新的软件包,我们可以按照我们为 Jupyter 笔记本所做的正常程序。喜欢!pip install pillow

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

File Uploader

对于任何机器学习项目,我们的下一个要求是将文件上传到工作簿的能力。这可以通过选择 【工具】- >文件上传选项 来完成。上传您的所有文件,我们可以在工作簿中访问它们。

3.发布我们的工作簿

这是 Datalore 的一个很好的特性。转到 文件- >发布 。Datalore 为您的工作簿创建了一个整洁的演示文稿,您可以与他人共享😎。我们可以在 view.datalore.io 上查看我们发布的工作簿。如果您使用过 Kaggle 内核,那么您可能会注意到一些相似之处。

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

Published Workbook

你可以包括图表,可视化,然后发布笔记本。开发人员可以轻松地将自己与工作簿和数据可视化连接起来。

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

A Published workbook with a plot

等等,还有…

希望你喜欢 Datalore!

Datalore’s Live kernel execution.

Datalore 是我们数据科学项目的一个很好的工具。如果你能花💰在他们提供的各种实例(GPU)上,你可以充分利用它。感谢阅读,机器学习快乐!

探索学习率以提高 Keras 中的模型性能

原文:https://towardsdatascience.com/exploring-learning-rates-to-improve-model-performance-in-keras-e37f5e63f16c?source=collection_archive---------18-----------------------

学习率是一个超参数,它控制每次更新模型权重时响应估计误差而改变模型的程度。选择学习率是具有挑战性的,因为非常小的值可能会导致长时间的训练过程而停滞不前,而非常大的值可能会导致过快地学习一组次优权重或不稳定的训练过程。

迁移学习

我们使用迁移学习将经过训练的机器学习模型应用于不同但相关的任务。这在深度学习中工作得很好,深度学习使用由层组成的神经网络。特别是在计算机视觉中,这些网络中的早期层倾向于学习识别更一般的特征。例如,它们检测边缘、梯度等。

这是一种经过验证的方法,可以在计算机视觉任务中产生更好的结果。大多数预先训练好的架构(Resnet、VGG、inception 等。)是在 ImageNet 上训练的,根据您的数据与 ImageNet 上的图像的相似性,这些权重将需要或多或少地进行大的改变。

在 fast.ai 课程中,杰瑞米·霍华德探索了迁移学习的不同学习速率策略,以提高速度和准确性方面的模型性能。

1.差异学习

差分学习背后的直觉来自于这样一个事实,即在微调预训练模型时,更接近输入的层更有可能已经学习了更多的一般特征。因此,我们不想改变他们太多。然而,随着我们向模型的更深处移动,我们会想要更大程度地修改权重,以便适应手边的任务/数据。

短语“不同的学习速率”意味着在网络的不同部分使用不同的学习速率,在初始层中学习速率较低,在后面的层中逐渐增加学习速率。

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

Sample CNN with Differential Learning Rate

在 Keras 中实施差异学习率

为了在 Keras 中实现差分学习,我们需要修改优化器源代码。

Adam Optimizer source code in Keras

我们修改了上面的源代码,加入了以下内容—

  • init 函数被修改为包括:
  1. 分割层: split_1split_2 分别是第一次和第二次分割的层的名称
  2. 修改参数 lr 以接受学习率列表——接受 3 个学习率的列表(因为架构分为 3 个不同的部分)
  • 在更新每一层的学习速率时,初始代码遍历所有层,并为其分配一个学习速率。我们对此进行了修改,以包含不同层的不同学习速率

Updated Optimizer Code with Differential Learning Rate

2.重启随机梯度下降(SGDR)

随着每一批随机梯度下降(SGD),理想情况下,网络应该越来越接近损耗的全局最小值。因此,随着训练的进行,降低学习率是有意义的,使得算法不会超调,并且尽可能接近最小值。利用余弦退火,我们可以按照余弦函数降低学习速率。

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

Decreasing learning rate across an epoch containing 200 iterations

SGDR 是学习率退火的一个最新变体,由 Loshchilov 和 Hutter [5]在他们的论文“Sgdr:带重启的随机梯度下降”中引入。在这项技术中,我们不时地突然提高学习率。下面是一个用余弦退火重置三个均匀间隔的学习率的例子。

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

Increasing the learning rate to its max value after every 100 iterations

突然增加学习率背后的基本原理是,这样做时,梯度下降不会卡在任何局部最小值处,并且可以在朝向全局最小值的途中跳出它。

每次学习率下降到它的最低点(上图中每 100 次迭代),我们称之为一个周期。作者还建议用某个常数因子使下一个周期比前一个周期长。

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

Each cycle taking twice as many epochs to complete as the prior cycle

在 Keras 中实施 SGDR

使用 Keras 回调,我们可以更新学习率以遵循特定的函数。我们可以参考 这个已经实施循环学习的回购

请查看 github 库 了解差分学习和 SGDR 的完整代码。它还包含一个测试文件,用于在一个样本数据集上使用这些技术。

用 Kotlin 元编程探索神经网络:深度学习的更廉价选择?

原文:https://towardsdatascience.com/exploring-neural-networking-with-kotlin-metaprogramming-a-cheaper-alternative-for-deep-learning-99c416eb7d16?source=collection_archive---------21-----------------------

使用抽象组合契约改进传统机器学习模型的案例研究

在科特林公司的会议上,我就龙卷风-套件进行了发言,这是一个几乎无法实现的开源项目,旨在允许用户将龙卷风项目的源代码上传到应用程序中,应用程序将解析和分析随后的代码以生成简单的用户界面测试。

我刚刚在科特林会议上透露了初步的发现和建议,但是在我的神经紧张和等待公开分享这些发现之间,我很确定我只是兴奋地吐出了一大堆单词。

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

我希望有机会跟进并放慢速度,以便真正强调我们在使用 TornadoFX-Suite 时偶然发现的东西的重要性。

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

Most recent branch: https://github.com/ahinchman1/TornadoFX-Suite/tree/mapping-nodes-to-functions

龙卷风套件:通过分析外部代码生成用户界面测试

到目前为止,我们已经成功地创建了一个元编程定位机制,该机制将递归读取从 KastreeGson 解析的抽象语法树(AST ),定位相关的节点层次结构,并保存用户交互的相关控件(文本字段、按钮等)的结果,并从中生成测试。

什么是元编程定位器机制?它是如何工作的?

元编程定位机制是我命名的术语,用于描述 TornadoFX-Suite 使用 AST 解析分析外部代码的能力,以检测所述代码中的特定问题。

在我们的例子中,我们的元编程定位机制负责在视图中定位用户界面节点。一旦 AST 解析识别出一个项目中的一个视图,这些节点就会出现在一个有向图中,或者一个Digraph中,以保留一个计算机程序很容易理解的层次结构。

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

Sample TornadoFX view code (left) and the corresponding digraph (right) AST parsing builds out.

有了龙卷风配置指示我们可能关心的元素(按钮、文本字段、表单等),我们可以从保存的用户界面层次结构中拉出我们认为用户可能与之交互的节点。

现有人工智能定位器机制的缺点

生成 UI 测试的想法远非原创。有许多现有的产品是由来自 test.aiTestComplete 这样的地方的大型代码库和团队组成的,它们通过以多种方式解决案例中的问题来工作。同样,也有学术论文旨在检测 Android 应用程序中的 UI 元素,更多的是在机器学习中使用图像分类。

不幸的是,当前的人工智能图像分类定位器机制受到部分视图渲染识别以及检测通常不考虑用户输入的自定义对象交互的影响,正如在关于使用神经网络创建 GUI 骨架的研究中所展示的

此外,许多基于人工智能的测试解决方案在资源和处理能力方面极其密集,这些资源和处理能力是由幕后存在的算法计算的。这个算法会消耗数据。往往是很多很多的数据。

出于这些原因,我认为元编程定位器机制本质上比他们的“基于训练的”定位器机制要好。

好的,我们检测到了这些视图。可以做什么样的测试?

目前,buttonstextfields生成的测试如下:

**@Test**
fun testwuwp0yiTextField() {
    assertNotNull(wuwp0yiTextField.text)
    assertTrue(!wuwp0yiTextField.text.isNullOrEmpty())
    clickOn(wuwp0yiTextField).write("Something")
    assertEquals("Something", wuwp0yiTextField.text)
}**@Test** fun testvoVuVUjButton() {
    clickOn(voVuVUjButton)
}

他们并不复杂。目前,对这些生成的测试所能做的最好的事情就是与这些单独的节点以及分组节点的排列进行交互。

走到这一步本身就是一个壮举,但是产生的测试充其量也只是愚蠢的。UI 测试是这样的:

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

Sure, we’ve grabbed a view and we perform an action on that view. But what about the last step?

我需要更智能的测试。我研究了为 TornadoFX-Suite 实现 Tensorflow 的可能性,但是在深入研究机器学习之后,我意识到我现在必须把机器学习放在一边。

传统机器学习模型的缺点

与测试相关的人工智能技巧是围绕理解错误理论而发展的;理解当我们处理空间和时间的复杂性时,我们是如何以及在哪里犯认知错误的。

但是 AI 并不聪明。事实上,深度学习中仍然存在很多人类因素。

在我对机器学习和计算思维的研究中,杰夫·尼曼在测试和机器学习方面的广泛工作和研究被证明是改变这个项目方向的更有影响力的作品之一,因为我不得不暂时搁置应用机器学习的想法。

这是我抛开机器学习的原因吗?

  1. 在某些方面,overfitting / underfitting的概念只是我们想出来的一个术语,本质上是“机器学习实际上不能处理很多层/每层的张量”的翻译。当您的特征集严重不足或者当您的数据“太”嘈杂时,偏见可能会悄然而至。(“太吵”意味着它的证明价值被它的偏见价值压倒了。)
  2. 如果正则化不充分或太强,这可能是有害的。在这种情况下,“太强”意味着你的训练数据中的任何复杂性都会被扣分;因此,为了避免overfitting,你应用了太多的数据正则化,这就是引入偏差的原因。

杰夫·尼曼在他的 Pacument 项目中展示了这种偏差-方差的区别,在该项目中,Pacman 展示了神经网络的权重如何被“调整”到足以提供一个偏向于一个方向而不是另一个方向的偏差因子。

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

https://github.com/jeffnyman/pacumen

因此,以《吃豆人》为例,尼曼表明,对能量丸的偏好会导致吃豆人到处追逐鬼魂,试图杀死它们,代价是完成游戏并获胜。

在这里,我们进入了以短期回报为代价的长期回报的概念,这是影响我们今天看到的许多机器学习的因素。

机器学习的传统模型似乎有严重的局限性,尤其是在现实生活问题中。我脑海中不断闪现的问题是“我们如何知道什么是相关的,什么是不相关的?”

我不知道什么是好的 UI 测试。我不知道是什么导致了糟糕的 UI 测试。当我不知道什么是 UI 测试的相关和不相关因素时,我如何知道我应该考虑什么权重,以及我如何能够计算偏差?

如果我不知道哪些因素是相关的或不相关的,运行这些模型所需的资源成本可能会变得很高,并且损失函数变得很难尝试和最小化。我只是没有资源或专业知识来独自处理这件事…但也许,只是也许,传统的机器学习模型不适合这个项目。

转向元编程来创建神经网络关系

我们可以抓取这些节点并生成可以在运行时附加的随机 id,但是我们如何知道一个节点看起来是否像它应该的样子呢?这是一个很难回答的问题。我们需要很多交织的信息来回答这样的问题。

让我们重新审视一下**短期奖励与长期奖励的对比,**短期奖励通常是在机器学习中实现的。

机器学习是在预定义的可能性空间内搜索一些输入数据的有用表示,使用来自反馈的指导,告诉我们这些表示有多好或多坏。

Machine Learning is so “smart” it can be explained with Family Guy

深度学习模型是由不同层组成的引擎,我们可以将其视为数据处理单元。每个单元都包含数据过滤器。这些单元一个接一个地堆叠起来。

重要的是模型通过数据堆栈传递输入。神经网络本身被称为模型,但也可以被认为是算法。

从概念上讲,神经网络正在搜索成形数据的转换,并试图将其展平成可以处理的东西。

本质上,我们已经通过 AST 解析实现了数据的扁平化,并且将这些字面上的三维形状分解成类分解,这使得我们很容易在解析后进行有组织的分析。元编程如何将这种扁平化的数据提供给更具体的层?

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

我们点击一个按钮。接下来会发生什么?嗯,那要看情况。在这个例子中,编辑器对话框中的保存button直到模型被弄脏后才被激活(修改了textfields的内容)。

所以我们现在甚至不能点击我们的按钮!我们如何预测我们与节点交互的能力?这个问题可以比作复杂的游戏系统,如 Skyrim 或 Mass Effect。如果你与一个群体结盟,你就不能加入另一个群体(同样,如果你选择成为吸血鬼,你也不能成为狼人)。这种形式规范系统也称为有限状态机,这是一种通用的 ui 形式化策略。

形式化 UI 系统规范的一个好处是,正式的思想和清晰的结构使我们能够创建一个元编程可以使用的系统。

正式规范的另一个更明显的好处是允许我们检查 UI 节点的属性;是否有任何转换未明确说明?有可能被锁在互动之外吗?

You can reference a Kotlin FSM implementation of this problem in this blurb.

更重要的是,元编程如何创建自己的有限自动机来预测与模型绑定时的状态,如按钮启用和禁用?

在每个 UI 节点中,都有可能存储以下信息:

UINode(
    **nodeType**: String,
    **uiLevel**: Int,
    **nodeChildren:** JsonObject,
    **valueAssignment**: String,
    **functionComposition:** Digraph<UIFunctionComposition>,
    **associatedFunctions:** ArrayList<String>()
)

有了元编程,我意外地意识到— 也许我们不必猜测来自数据过滤器的结果的好坏。

在这种情况下,我们可以使用 TornadoFX-Suite 的类分解和定位的 UI 节点,并重新分析我们的代码分析以创建新的图形关系,这可以消除一些猜测,从而能够预测来自“黑盒”测试的行为。

也就是说,在创建 UINode 时,我们创建一个空的有向图来存储节点的functionCompositionassociateFunctions,这是从我们在 AST 解析中实现的初始类分解中检索的。

Will likely clean up this idea later the more I think about the definition of an associated function.

一个associatedFunction是一个负责影响节点属性或状态的函数。可以通过扫描具有值的节点来发现相关联的函数,这些值可以被识别为可能存在于任何其他类中的任何View类型成员的成员变量。只要在函数中存在对分配的节点值的引用,该函数就有可能影响节点的状态。

functionalComposition可以被认为是被拒绝与特定节点交互的功能。幸运的是,我们可以重用用于创建 UI 层次结构的有向图结构。

更重要的是,我们可以映射这些functionalCompositionassociatedFunctions,以便元编程创建 Kotlin 状态机来帮助预测与节点的某些交互的预期状态,这是元编程定位器机制的另一个版本(只是不太明显)。处理是密集的,但是当我们继续映射这些关系时,有更少但更多的相关信息可以处理,因为我们以非常非常愚蠢的方式创建了更聪明的关系。这个想法是下一阶段实施的重点。

深度学习算法是神经网络;元编程创建了神经网络

什么是神经网络?按照机器学习的说法,是算法。但是神经网络通过模拟大量类似神经元抽象版本的互连处理单元来工作。

在元编程中,神经网络是一个名词,而在机器学习中,神经网络是一个动作。在这两种情况下,都有 一组对事物的操作,随着神经网络的进化,更多的新操作被添加。然而,当那些操作是有限的,并且那些操作需要如何工作的定义不一定被编辑时,命令式世界工作得最好(因为试图通过调整权重来最小化损失函数往往发生在机器学习中)。

我提出的答案远没有传统机器学习模型通过隐藏层输入数据来提供的答案那么不透明。我提到人工智能并不聪明——嗯,元编程也不聪明。然而,在给定我们已经拥有的信息的情况下,使用元编程计算和创建进一步的图形关系所需的操作似乎成比例地和指数地减少,而机器学习似乎相反。

我真的觉得我找到了一些东西。

参考资料:

  • 从 UI 设计图像到 GUI 骨架:一个引导移动 GUI 实现的神经机器翻译器。2018 年 5 月 27 日,chunyang-chen.github.io/publication/ui2code.pdf. ICSE 18 日,Github
  • 尼曼杰夫。"揭开机器学习的神秘面纱,第二部分."来自一个软件测试人员的故事,2018 年 9 月 9 日,Tester Stories . com/2018/09/demysiting-machine-learning-part-2/。
  • 尼曼杰夫。“测试 AI …在用 AI 测试之前。”来自一个软件测试人员的故事,2018 年 5 月 30 日,Tester Stories . com/2018/05/testing-ai-before-testing-with-ai/。
  • 韦恩,希勒尔。"正式指定用户界面."希勒尔·韦恩,2018 年 6 月 11 日www.hillelwayne.com/post/formally-specifying-uis/.

探索纽约市水箱检查数据。

原文:https://towardsdatascience.com/exploring-new-york-city-water-tank-inspection-data-855c5776c566?source=collection_archive---------20-----------------------

我使用 Python 和 Plotly 探索、分析和可视化房地产数据的方法。

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

Typical water tank. Photo by author.

在过去的几年里,我一直在探索纽约市的房地产数据,并尝试各种数据分析和可视化方法。一路上,我学到了很多关于纽约市房地产数据的知识,尤其是如何获取、清理、分析和可视化/绘制这些数据。我花了大量时间学习数据和各种编程语言和技术,搜索 Stackoverflow 上的问答、关于媒体的文章和各种数据教程。我希望通过总结我一直在做的一个项目,并概述我探索数据驱动的房地产问题的过程、房地产数据的来源和数据分析工具,我将说明洞察力可以通过数据分析获得,并对那些探索自己的数据驱动问题的人有所帮助。

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

I spy over 12 water tanks in this photo. Photo by author.

我一直对建造水箱感兴趣。尽管科学有了很大的进步,但这些装着建筑物供水的木桶在上个世纪基本上没有变化。在纽约市,它们是维持超过 6 层的建筑的水压所必需的。

第一步——确定你的问题和数据来源

我很好奇水箱有多干净,是否有可识别的模式。通过一些研究,我了解到纽约市行政法规第 31 章于 2015 年 5 月生效,该法规要求业主对他们的水箱进行年度检查,并将结果报告给纽约市卫生局。第 31 章要求每栋建筑在下一年的 1 月 15 日前完成这项工作,并且所有的结果都要公之于众。纽约市卫生局有一个在线工具,可以查询纽约市任何一栋建筑的检查结果。

当城市数据在基于在线的工具中可用时,很有可能基础数据也可以通过纽约市开放数据门户获得(如果不能,就应该这样)。这是因为纽约市认识到数据是有价值的,应该让每个人都可以访问,并在 2012 年通过了当地法律 11,要求在 2018 年前识别和汇总全市数据。搜索这个庞大数据资源的入口是https://opendata.cityofnewyork.us/

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

Various ways to search for datasets on https://opendata.cityofnewyork.us/

只需简单搜索水箱,您就能快速找到我们正在寻找的数据,这些数据可以作为.csv文件下载。

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

步骤 2 —清理并浏览数据

我一般用 Python 分析数据。我喜欢 Python 的原因(也是它非常受欢迎的原因)是它在不断地被开发和添加新的库,有大量的学习资源,并且对于你试图完成的任何事情,都有机会在 StackOverflow 上有多个讨论来指导你。

如果你打算跟着做,我建议你安装Anaconda,它是一个非常流行的 Python 包,包括许多必须预装的 Python 库。一个这样的库是Jupyter,它允许你通过笔记本在浏览器中运行 Python 命令,这使得实验和与他人分享你的笔记本变得容易。与本文对应的 Jupyter 笔记本可以在这里通过 nb viewer查看,所有文件(包括底层数据)都可以在这个 GitHub 资源库中找到。

另一个流行的库(也是 Jupyter 包的一部分)是Pandas,它简化了组织、搜索和修改表格数据的方式。加载完库后,数据(之前下载的)可以读入 Panda 的数据帧。

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

Created a dataframe called data with the tank inspection results

命令shape告诉我们数据由 19,752 行 48 列组成,我们可以了解下面包含的数据(和数据类型)。

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

Python 的优势之一是可以快速汇总数据,下面的代码循环遍历特定的数据列,以确定每个类别中的结果数。由此我们得知,在检查计划的历史上,曼哈顿进行了 17,002 次检查,2018 年进行了 5,461 次检查,对生物生长和鸟类/昆虫残骸的观察比我希望看到的更多(尽管从百分比来看,这是非常低的)。

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

使用 Python 可视化数据也相当简单。当我们这样做时,一些观察结果就很突出,例如在过去四年中检查的增加(最大的增加是在 2017 年和 2018 年之间,大多数检查发生在曼哈顿,以及少数公司在进行检查中的主导地位。

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

当我最初在 2019 年 5 月开始这项分析时,数据最后一次更新是在 2018 年 10 月,因此不包括 2018 年最后三个月的报告。我希望这些报告已经完成并归档,并联系纽约市开放数据中心,要求更新这些数据(纽约市开放数据中心有一个程序,要求提供关于其数据集的额外信息)。六月初,数据被更新(截止到 6 月 5 日),现在似乎每周都在更新!

在浏览数据时,除了识别丢失的数据之外,您还经常会遇到需要清理的数据。例如,当我处理 2018 年 10 月的数据时,我注意到没有纬度列的数据,这使我意识到纬度数据被错误地标记为经度,右侧的每一列都倾斜了一列。这随后在 2019 年 6 月的数据发布中得到纠正。

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

此外,检验公司的名称也不尽相同,“伊塞克斯兄弟公司”也被称为“伊塞克斯兄弟公司”**“伊塞克斯”。如果分析这一点对你的研究很重要,你会想要使数据一致。

第三步——分析并可视化数据

由于我对数据的初步研究,我决定将我的分析重点从检查结果转移到水箱不符合年度报告义务的问题上。

分组数据 — Python 有一个强大的功能GROUPBY,它允许你按照某些属性有效地分组数据,并对结果进行各种计算(比如求和、平均和计数)。由于我们的调查仅限于建筑物是否进行了年度检查,我们将首先选择我们需要的数据。由于每个报告都有一行数据,因此我们将筛选出具有相同 BBL 的同一年的多个报告(保留最后一个)。

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

组合数据 —当您组合多个数据集来寻找模式时,数据分析通常会变得更有趣。为了说明这一点,我将介绍冥王星数据集,它结合了地理数据和每座建筑物的信息。在这个分析中,我将把重点放在曼哈顿的住宅合作和共管建筑上。我创建了一个.csv文件,其中包含了曼哈顿所有 6065 栋合作和共管建筑的地理编码和经纬度信息。基于我们对水箱必不可少的情况的理解,我过滤了这个数据集,只包括六层以上的建筑——共有 2919 栋。

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

我的计划是将水箱检查的数据框架与合作公寓建筑的数据框架结合起来,创建一个数据框架。为了做到这一点,我们需要在每个数据帧中有一个键或唯一的标识符来匹配数据。在我们的例子中,我们有 BBL,它是每栋建筑的唯一标识符(基于每栋建筑的区/块/地段)。然后,我们可以使用 Pandas 合并df_cc数据帧和df_summary数据帧。

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

然后,我们可以确定在曼哈顿有多少本应该有水塔的合作公寓/共管公寓建筑在过去 5 年中没有被检查——其中有 1232 栋!

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

最后,使用Plotly express我们可以创建一个交互式地图(只用一行代码!)标识曼哈顿的合作公寓和共管公寓建筑,并将过去 5 年中未被检查的建筑标为红色。px.scatter_mapbox(dfnew, lat=”Latitude”, lon=”Longitude”, color=”Reported”, hover_name=”Address”, hover_data=a, color_discrete_map = {“Never”: “red”, “Yes”: “green”}, zoom=14)

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

结论/后续步骤

根据我们的初步分析,曼哈顿有 2,919 栋带有水箱的合作公寓/共管公寓建筑,其中 1,232 栋从未进行过水箱检查— 42.2% 。这是一个非常重要的数字,希望是夸大其词!

我的下一步是测试建筑物的样本,以(I)确认水箱的存在(可以使用谷歌地图的卫星视图或类似服务),我怀疑六层以上的建筑物需要水箱的前提过于简化,以及(ii)将我的结果与通过纽约市健康建筑水箱搜索工具提供的信息进行比较,以确认调查结果。

我欢迎反馈和建议,并且特别想知道其他人如何在此基础上发展。你可以在推特上找到我

使用 Apache OpenNLP 探索 NLP 概念

原文:https://towardsdatascience.com/exploring-nlp-concepts-using-apache-opennlp-4d59c3cac8?source=collection_archive---------39-----------------------

介绍

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

Open-source image widely used

在查看了 Awesome AI/ML/DL 上列出的许多基于 Java/JVM 的 NLP 库之后,我决定选择 Apache OpenNLP 库。其中一个原因是另一个开发者(之前看过)推荐了它。此外,这是一个 Apache 项目,在过去二十年左右的时间里,他们一直是 F/OSS Java 项目的大力支持者。不言而喻, Apache OpenNLPApache 2.0 许可证支持。

此外,来自 NLP 研究人员的这条推文对此事增加了一些信心:

在我目前的研究项目中,我用@ apacheopenlp进行了实验,很高兴看到这是一个有价值的 nlp 工具包,它有一个用户友好的 API。把@ apacheopenlp@ stanfordnlp做个比较还为时过早。我先看看它们在命名实体识别中的表现。

- Linda(夏)刘(@ DrLiuBigData)2019 年 3 月 2 日

我想说的是,到目前为止,我的个人体验与 Apache OpenNLP 很相似,我赞同它的简单性和用户友好的 API 和设计。当我们进一步探索时,你会发现事实就是如此。

使用 Apache OpenNLP 探索 NLP

Java 绑定

在这篇文章中,我们不会涉及 Java API 到 Apache OpenNLP 工具,但是你可以在他们的文档中找到一些例子。过一会儿,为了更进一步,你还需要这篇文章底部的资源部分的一些资源。

命令行界面

我被可用的 CLI 的简单性所吸引,它只是开箱即用,例如在需要模型的情况下,以及当它被提供时。它不需要额外的配置就可以工作。

为了使它更容易使用,也不必记住它支持的所有 CLI 参数,我整理了一些 shell 脚本。看看 README 来更深入地了解它们是什么以及如何使用它们。

入门指南

从现在开始,您将需要以下内容:

  • Git client 2.x 或更高版本(GitHub 上用于派生回购的帐户)
  • Java 8 或更高版本(建议安装 GraalVM CE 19.x 或更高版本)
  • Docker CE 19.x 或更高版本,并在继续操作之前检查它是否正在运行
  • 能够从 CLI 运行 shell 脚本
  • 了解读/写 shell 脚本(可选)

注意:在撰写本文时,Apache OpenNLP 的 1.9.1 版本已经发布。

我们已经将的脚本放在一起,让每个人都可以轻松完成这些步骤:

这将引导我们找到包含以下文件的文件夹:

注意:已经提供了一个 docker 映像 来运行一个 docker 容器,该容器将包含您进一步需要的所有工具。您可以看到已经创建了 *shared* 文件夹,这是一个挂载到您的容器中的卷,但它实际上是在您的本地计算机上创建的目录,并映射到该卷。因此,在那里创建或下载的任何东西即使在您退出容器后也仍然可用!

*快速阅读主 README 文件,了解如何使用 docker-runner.sh shell 脚本,并快速浏览用法部分 *。此后,还可以查看一下 Apache OpenNLP README 文件,查看其中提供的脚本用法

运行 NLP Java/JVM docker 容器

在项目的根目录下,在本地计算机命令提示符下,执行以下操作:

在得到提示之前,您有可能首先看到以下内容:

然后您将看到容器内的提示:

该容器中包含了开始探索各种 NLP 解决方案所需的所有 Apache OpenNLP 脚本/工具。

在容器中安装 Apache OpenNLP

当您在容器内部时,在容器命令提示符下,我们将进一步了解以下内容:

您将看到apache-opennlp-1.9.1-bin.tar.gz工件被下载并展开到shared文件夹中:

查看和访问共享文件夹

就像你运行容器一样,一个共享的文件夹被创建,开始的时候它可能是空的,但是随着时间的推移,我们会发现它被不同的文件和文件夹填满了。

你也可以在这里找到下载的模型,Apache OpenNLP 二进制文件被展开到它自己的目录中(名为apache-opennlp-1.9.1)。

您也可以从命令提示符(在容器外部)访问并查看它的内容:

从容器内部看,这是您所看到的:

在容器内执行 NLP 操作

好的一面是,你无需离开当前文件夹就可以执行这些 NLP 操作(查看自述中的探索 NLP 概念部分):

任何脚本的使用帮助:在任何时候,您都可以通过以下方式查询脚本:

例如

给我们这个用法文本作为输出:

更多示例和详细输出见自述文件中的检测语言部分。

  • 检测单行文本或文章中的句子。

更多示例和详细输出见自述文件中的检测句子部分。

  • 在单行文本或文章中查找人名、组织名、日期、时间、金钱、位置、百分比信息。

更多示例和详细输出见自述文件中的查找名称部分。本节中有许多类型的名称查找器示例。

  • 将一行文本或一篇文章标记成更小的组成部分(如单词、标点、数字)。

更多示例和详细输出见自述文件中的符号化部分。

  • 解析一行文本或一篇文章,识别组合在一起的单词或短语(参见 Penn Treebank 标签集了解令牌类型的图例),也参见【https://nlp.stanford.edu/software/lex-parser.shtml.】T2

更多例子和详细输出见自述文件中的解析器部分。

有关更多示例和详细输出,请参见自述文件中的标记词性部分。

  • 文本分块通过将文本或文章分成单词的句法相关部分,如名词组、动词组。您可以将此功能应用于已标记的词性文本或文章。对已经由 PoS tagger 标记的文本应用分块(参见 Penn Treebank tag set 了解标记类型的图例,也参见https://nlpforhackers.io/text-chunking/

更多示例和详细输出见自述文件中的分块部分。

退出 NLP Java/JVM docker 容器

事情就是这么简单:

您将返回到本地计算机提示符。

标杆管理

该工具的一个显著特点是,它记录和报告其在不同执行点的操作的指标—在微观和宏观级别所用的时间,这里有一个示例输出来说明这一特点:

从以上内容中,我发现了对我作为科学家、分析师甚至工程师都有用的 5 个指标:

在进行性能比较时,像这样的信息是非常宝贵的,例如:

  • 在两个或多个模型之间(加载时和运行时性能)
  • 在两个或多个环境或配置之间
  • 在执行相同 NLP 的应用程序之间,使用不同的技术栈将动作放在一起
  • 还包括不同的语言
  • 寻找不同文本数据语料库之间的相互关系(定量和定性比较)

经验例子

BetterNLP 用 python 写的库也在做类似的事情,参见Kagglekernel:Better NLP 笔记本 Better NLP 总结者笔记本 (搜索 time_in_secs 这两个笔记本里面都有

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

就个人而言,这非常鼓舞人心,也证明了这是一个提供给最终用户的有用特性(或行为)。

其他概念、库和工具

在下面的参考资料部分中提到了其他的基于 Java/JVM 的 NLP 库,为了简洁起见,我们不会涉及它们。所提供的链接将为你自己的追求带来进一步的信息。

Apache OpenNLP 工具本身中,我们只讨论了它的命令行访问部分,而没有讨论 Java 绑定。此外,我们并没有再次介绍该工具的所有 NLP 概念或特性,因为简洁起见,我们只介绍了其中的一小部分。但是文档资源GitHub repo 上应该有助于进一步的探索。

你也可以通过检查 docker-runner 脚本来找出如何为自己构建 docker 形象

结论

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

Image source by Simon Ray

在经历了以上内容之后,我们可以通过探究其优缺点来总结以下关于 Apache OpenNLP 工具的内容:

优点

  • 这是一个易于使用和理解的 API
  • 浅显的学习曲线和包含大量示例的详细文档
  • 涵盖了许多 NLP 功能,在文档中有比我们上面所做的更多的内容要探索
  • 简单的外壳脚本Apache OpenNLP 脚本已经被提供来使用这个工具
  • 下面有很多资源可以用来了解关于 NLP 的更多信息(参见下面的资源部分)
  • 为快速入门和探索 Apache OpenNLP 工具而提供的资源

缺点

  • 查看 GitHub 回购,似乎进展缓慢或停滞不前(最近两次提交有很大差距,即 2019 年 5 月和 2019 年 10 月 15 日)
  • 浏览文档(手册)中的示例时,遗漏了一些型号
  • 根据您的使用案例,当前提供的模型可能需要进一步培训,请参见此推文:

资源

Apache OpenNLP

其他相关员额

关于我

Mani Sarkar 是一名主要在 Java/JVM 领域充满激情的开发人员,目前在与小团队和初创公司合作时加强团队并帮助他们加速,作为一名自由软件工程师/数据/ml 工程师,更多…

推特:@ theneomatrix 369|GitHub:@ neomatrix 369

最初发表于https://blog.valohai.com**

在支持 Java 的 Jupyter 笔记本中使用 Apache OpenNLP 探索 NLP 概念

原文:https://towardsdatascience.com/exploring-nlp-concepts-using-apache-opennlp-inside-a-jupyter-notebook-e53489ba2bd8?source=collection_archive---------39-----------------------

介绍

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

Image source (unsplash) via Daniel Olah

经过一番说服之后,我一直在探索和使用 Apache OpenNLP 库。对于那些不知道它的人来说,这是一个 Apache 项目,过去二十年左右 F/OSS Java 项目的支持者(见维基百科)。我发现他们的命令行界面使用起来非常简单,对于学习和理解自然语言处理(NLP)来说,这是一个非常好的学习工具。独立于这篇文章,你可以找到使用 Apache OpenNLP 的另一种视角,所有这些都直接来自你的命令提示符。

我可以说,这个领域的几乎每个人都知道并熟悉 Jupyter 笔记本(如果你不是,可以看看这个视频【1】【2】)。从现在开始,我们将会在笔记本的领域内做和你自己的实验一样的事情。

使用 Apache OpenNLP 探索 NLP

命令行界面

我会让你参考贴子,在那里我们讲述了关于 Apache OpenNLP 的命令行体验,这是让你熟悉这个 NLP 库的一个很好的方法。

Jupyter 笔记本:入门

在继续下一步之前,请执行以下操作:

$ git clone git@github.com:neomatrix369/nlp-java-jvm-example.gitor$ git clone https://github.com/neomatrix369/nlp-java-jvm-example.git$ cd nlp-java-jvm-example

然后是 请参阅 README 的 部分中的 入门 一节,从基于 Java 的 Jupyter 笔记本 内部探索 NLP 概念,然后再继续。

此外,默认情况下,我们将 JDK 选择为 GraalVM ,您可以从控制台消息中的这些行看到这一点:

<---snipped-->JDK_TO_USE=GRAALVMopenjdk version "11.0.5" 2019-10-15OpenJDK Runtime Environment (build 11.0.5+10-jvmci-19.3-b05-LTS)OpenJDK 64-Bit GraalVM CE 19.3.0 (build 11.0.5+10-jvmci-19.3-b05-LTS, mixed mode, sharing)<---snipped-->

注意 :已经提供了一个 docker 镜像 来运行一个 docker 容器,它将包含您需要的所有工具。您可以看到已经创建了共享文件夹,它链接到装入容器的卷,从本地机器映射您的文件夹。因此,任何创建或下载到共享文件夹中的内容,即使在您退出容器后也仍然可用!

快速阅读主 README 文件,了解如何使用 docker-runner.sh shell 脚本,并快速浏览脚本用法部分

运行 Jupyter 笔记本容器

请参阅 README 的 部分中的 运行 Jupyter 笔记本容器 部分,从基于 Java 的 Jupyter 笔记本 内部探索 NLP 概念。

您所需要做的就是在克隆上面链接中提到的 repo 之后运行此命令:

$ ./docker-runner.sh --notebookMode --runContainer

一旦你运行了上面的操作,这个操作将会自动打开并加载 Jupyter 笔记本界面到一个浏览器窗口中。您将有几个 Java 笔记本可供选择(放在本地机器上的 shared/notebooks 文件夹中):

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

在容器中安装 Apache OpenNLP

当处于笔记本模式的容器中时,有两种方法可以安装 Apache OpenNLP :

查看和访问共享文件夹

请参阅自述文件 中的 查看和访问共享文件夹 部分,从基于 Java 的 Jupyter 笔记本 内部探索 NLP 概念。

这也将在下一节的 Jupyter 笔记本中有所涉及。您可以通过%system Java cell magic 看到目录内容,然后从命令提示符看到类似的文件/文件夹布局。

在 Jupyter 笔记本中执行 NLP 操作

当您运行笔记本电脑服务器时,笔记本电脑服务器一启动,您就会看到此启动器窗口,其中包含笔记本电脑和其他支持文件的列表:

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

上面的每个笔记本都有一个用途,myfirstjupyternlp javanotebook . ipynb展示了如何在 IPython 笔记本中编写 Java,并使用调用 Apache OpenNLP 库功能的 Java 代码片段执行 NLP 操作(参见文档了解关于类和方法的更多细节,以及 Java 文档了解关于 Java API 用法的更多细节)。

另一个笔记本mynextjupyternlpjavanotebook . ipynb在一个远程云实例上运行相同的 Java 代码片段(在 Valohai CLI 客户端的帮助下)并返回单元格中的结果,只需一个命令。创建账户并在自由层计划内使用快速且免费。

我们能够从两个基于 Java 的笔记本内部检查以下 Java API 与 Apache OpenNLP 库的绑定:

直接通过笔记本探索上述 Apache OpenNLP Java APIs】

我们能够在笔记本内部完成这项工作,运行 IJava Jupyter 解释器,它允许在典型的笔记本中编写 Java。我们将使用 Java 代码的小片段探索上述命名的 Java APIs,并在笔记本中看到结果:

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

因此,回到您的浏览器,寻找myfirstjupyternlpjavanotebook . ipynb笔记本,用它玩一玩,读取并执行每个单元格,观察响应。

借助远程云服务,通过笔记本探索上述 Apache OpenNLP Java APIs】

我们能够在笔记本内部完成这项工作,运行 IJava Jupyter 解释器,它允许在典型的笔记本中编写 Java。但是在这本笔记本中,我们更进一步,使用了%system Java cell magicValohai CLI magic,而不是像以前的笔记本那样在各个单元格中运行 Java 代码片段。

这样,模型的下载和使用模型的文本处理就不会在本地机器上进行,而是在云中一个更复杂的远程服务器上进行。你可以从笔记本电脑内部控制这个过程。当要处理的模型和数据集很大,而您的本地实例没有必要的资源来支持长期的 NLP 过程时,这一点更为重要。我看到 NLP 培训和评估需要很长时间才能完成,因此高规格的资源是必须的。

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

再次回到你的浏览器,寻找mynextjupyternlpjavanotebook . ipynb笔记本,用它玩一玩,读取并执行每个单元格。所有必要的细节都在那里,包括文档和支持页面的链接。

为了更深入地了解这两个笔记本是如何组装在一起的,以及它们是如何操作的,请查看所有的源文件

合上 Jupyter 笔记本

在执行此操作之前,请确保您已经保存了笔记本。切换到运行 docker-runner shell 脚本的控制台窗口。在运行 Docker 容器的控制台中按下 Ctrl-C ,您会看到:

*<---snipped--->[I 21:13:16.253 NotebookApp] Saving file at /MyFirstJupyterJavaNotebook.ipynb^C[I 21:13:22.953 NotebookApp] interruptedServing notebooks from local directory: /home/jovyan/work1 active kernelThe Jupyter Notebook is running at:[http://1e2b8182be38:8888/](http://1e2b8182be38:8888/)Shutdown this notebook server (y/[n])? y[C 21:14:05.035 NotebookApp] Shutdown confirmed[I 21:14:05.036 NotebookApp] Shutting down 1 kernelNov 15, 2019 9:14:05 PM io.github.spencerpark.jupyter.channels.Loop shutdownINFO: Loop shutdown.<--snipped-->[I 21:14:05.441 NotebookApp] Kernel shutdown: 448d46f0-1bde-461b-be60-e248c6342f69*

这将关闭容器,您将返回到本地机器的命令提示符下。您的笔记本会保留在本地计算机上的“共享/笔记本”文件夹中,前提是您在不断更改它们时已经保存了它们。

其他概念、库和工具

下面的参考资料部分提到了其他基于 Java/JVM 的 NLP 库,为了简洁起见,我们就不一一赘述了。所提供的链接将为你自己的追求带来进一步的信息。

在 Apache OpenNLP 工具本身中,我们只讨论了它的命令行访问部分,而没有讨论 Java 绑定。此外,我们并没有再次介绍该工具的所有 NLP 概念或特性,因为简洁起见,我们只介绍了其中的一小部分。但是文档资源GitHub repo 上应该有助于进一步的探索。

您还可以通过检查 docker-runner 脚本来了解如何为自己构建 docker 映像

限制

尽管 Java cell magic 确实有所不同,并有助于运行命令。即使它不是基于 Python 的笔记本,我们仍然可以在我们的单元中运行 shell 命令和执行 Java 代码,并在 Jupyter 笔记本中做一些不错的 NLP 工作。

如果你有一个基于 python 的笔记本,那么 Valohai 的扩展 Jupyhai 就足够了。看看本帖资源版块的聚居地子版块(在帖子末尾)。事实上,我们一直在 Jupyhai 笔记本中运行我们的所有操作,尽管我一直称它为 Jupyter Notebook,看看浏览器中面板中间部分工具栏上的图标):

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

结论

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

Image source (unsplash) via Aaron Burden

这是一种与大多数其他探索和学习方式非常不同的体验,你可以看到为什么整个行业,特别是涵盖学术界、研究、数据科学和机器学习的领域,都像风暴一样采用这种方法。我们仍然有局限性,但是随着时间的推移,它们会被克服,让我们的经历变得更顺利。

在你的代码所在的同一个页面上看到你的结果是一个很大的保证,给了我们一个简短快速的反馈循环。尤其是能够看到可视化并动态地改变它们并获得即时结果,这可以为每个领域的忙碌和渴望的学生、科学家、数学家、工程师和分析师开辟道路,而不仅仅是计算或数据科学或机器学习。

资源

ijjava(Jupyter 解释程序)

朱皮海

Apache OpenNLP

其他相关员额

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值