TowardsDataScience 博客中文翻译 2016~2018(九十七)
使用决策树的离散化
从连续到离散
Photo by Alua Magzumova on Unsplash
1.介绍
离散化是通过创建一组跨越变量值范围的连续区间,将连续变量转化为离散变量的过程。
1.1 离散化有助于处理异常值和高度偏斜的变量
离散化有助于处理异常值,方法是将这些值与分布的剩余内层值一起放入较低或较高的区间。因此,这些异常值不再与分布尾部的其余值不同,因为它们现在都在同一区间/时段中。此外,通过创建适当的箱或区间,离散化可以帮助将偏斜变量的值分散到一组具有相同数量观察值的箱中。
1.2 离散化方法
有几种方法可以将连续变量转化为离散变量。这个过程也被称为宁滨,每个面元就是每个区间。离散化方法分为两类:监督的和非监督的。
无监督方法 除了变量分布之外,不使用任何信息来创建将放置值的连续箱。
监督方法 通常使用目标信息来创建仓或区间。
在本文中,我们将只讨论使用决策树的监督离散化方法
但是在进入下一步之前,让我们加载一个数据集,我们将在其上执行离散化。
决策树离散化
决策树离散化包括使用决策树来确定最佳分裂点,这些分裂点将决定仓或连续区间:
第一步 :首先它使用我们要离散化的变量训练一个有限深度(2、3 或 4)的决策树来预测目标。
第二步: 原来的变量值然后被树返回的概率代替。对于单个仓内的所有观察值,概率是相同的,因此用概率替换等同于在由决策树决定的截止范围内对观察值进行分组。
优点:
- 决策树返回的概率预测与目标单调相关。
- 新的箱显示出降低的熵,这是因为每个桶/箱内的观察结果与其自身比与其他桶/箱的观察结果更相似。
- 该树会自动找到垃圾箱。
缺点:
- 这可能会导致过度拟合
- 更重要的是,可能需要对树参数进行一些调整,以获得最佳分割(例如,深度、一个分区中样本的最小数量、分区的最大数量以及最小信息增益)。这很费时间。
让我们看看如何使用 Titanic 数据集对决策树执行离散化。
- 导入有用的库
IN[1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
- 加载数据集
IN[2]:
data = pd.read_csv('titanic.csv',usecols =['Age','Fare','Survived'])
data.head()
3。 将数据分成训练集和测试集
IN[3]:
X_train, X_test, y_train, y_test = train_test_split(data[['Age', 'Fare', 'Survived']],data.Survived , test_size = 0.3)
因此,假设我们在数据集中没有缺失值(或者即使我们在数据集中有缺失数据,我们也对它们进行了估算)。我离开这一部分是因为我的主要目标是展示离散化是如何工作的。
那么,现在让我们将数据可视化,以便从中获得一些见解并理解变量
4。让我们使用 ***age*** 构建一个分类树来预测 ***Survived*** ,以便离散化 ***age*** 变量。
IN[4]:
tree_model = DecisionTreeClassifier(max_depth=2)tree_model.fit(X_train.Age.to_frame(), X_train.Survived)X_train['Age_tree']=tree_model.predict_proba(X_train.Age.to_frame())[:,1] X_train.head(10)
现在我们有了一个使用age变量预测Survived变量的分类模型。
新创建的变量Age_tree包含数据点属于相应类别的概率
5。检查 ***Age_tree*** 变量 中唯一值的数量
IN[5]:
X_train.Age_tree.unique()
为什么只有四种概率正确?
在上面的输入 4 中,我们提到了 *max_depth = 2.* 一个深度为 2 的树,进行了 2 次拆分,因此生成了 4 个桶,这就是为什么我们在上面的输出中看到 4 个不同的概率。
66。检查离散变量 ***Age_tree*** 和目标 ***Survived*** 之间的关系。
IN[6]:
fig = plt.figure()
fig = X_train.groupby(['Age_tree'])['Survived'].mean().plot()
fig.set_title('Monotonic relationship between discretised Age and target')
fig.set_ylabel('Survived')
这里,我们可以看到离散变量Age_tree和目标变量Survived之间的单调关系。该图表明Age_tree似乎是目标变量Survived的一个良好预测器。
7。检查每个概率桶/箱的乘客数量是否低于离散变量的分布。
IN[7]:
X_train.groupby(['Age_tree'])['Survived'].count().plot.bar()
让我们通过捕获每个概率桶的最小和最大年龄来检查由树生成的年龄限制桶,以了解桶的界限。
8。检查树 生成的年龄限制桶
IN[7]:
pd.concat( [X_train.groupby(['Age_tree'])['Age'].min(),
X_train.groupby(['Age_tree'])['Age'].max()], axis=1)
于是,决策树生成了桶:0–11、12–15、16–63 、
、46–80,生存概率分别为0.51、0.81、0.37和0.10。
9。想象这棵树。
IN[8]:
with open("tree_model.txt", "w") as f:
f = export_graphviz(tree_model, out_file=f)from IPython.display import Image
from IPython.core.display import HTML
PATH = "tree_visualisation.png"
Image(filename = PATH , width=1000, height=1000)
Tree Visualisation
从图中可以看出,我们为max_depth=2获得了 4 个箱。
正如我前面提到的,我们可以使用决策树优化许多参数,以获得最佳的 bin 分裂。下面我将为演示优化树的深度。但是请记住,您还可以优化决策树的其余参数。访问 sklearn 网站查看还有哪些参数可以优化。
10。选择树的最佳深度
我将构建不同深度的树,并将计算为每棵树的变量和目标确定的 roc-auc ,然后我将选择产生最佳 roc-auc 的深度
IN[9]:
score_ls = [] # here I will store the roc auc
score_std_ls = [] # here I will store the standard deviation of the roc_aucfor tree_depth in [1,2,3,4]:
tree_model = DecisionTreeClassifier(max_depth=tree_depth)
scores = cross_val_score(tree_model, X_train.Age.to_frame(),
y_train, cv=3, scoring='roc_auc')
score_ls.append(np.mean(scores))
score_std_ls.append(np.std(scores))
temp = pd.concat([pd.Series([1,2,3,4]), pd.Series(score_ls), pd.Series(score_std_ls)], axis=1)temp.columns = ['depth', 'roc_auc_mean', 'roc_auc_std']print(temp)
在这里,我们可以很容易地观察到,我们使用深度 1 或 2 获得了最佳的 roc-auc。我将选择 2 的深度继续。
11。使用 树变换 ***Age*** 变量
IN[10]:
tree_model = DecisionTreeClassifier(max_depth=2)tree_model.fit(X_train.Age.to_frame(), X_train.Survived)X_train['Age_tree'] = tree_model.predict_proba(X_train.Age.to_frame())[:,1]X_test['Age_tree'] = tree_model.predict_proba(X_test.Age.to_frame())[:,1]
12。检查火车集合 中转换后的 ***age*** 变量
IN[11]:
X_train.head()
13。检查列车组 中每个箱的唯一值
IN[12]:
X_train.Age_tree.unique()
14。检查测试集 中转换后的 ***age*** 变量
IN[13]:
X_test.head()
15。检查列车组** 中每个箱的唯一值
IN[14]:
X_test.Age_tree.unique()
现在,我们已经成功地将Age变量离散为四个离散值,这可能有助于我们的模型做出更好的预测。
如果我们想要像Fare一样离散化剩余的变量,我们也可以执行相同的程序。
变分自动编码器的解惑:综述
可解释的因子分解表示的学习在机器学习中已经存在了很长时间。但是随着最近像变分自动编码器(VAE)这样的深度生成模型的进步,对学习这种解开的表示的兴趣出现了爆炸。由于任何生成模型的目标本质上都是捕捉潜在的数据生成因素,因此解开的表示将意味着单个潜在单元对单个生成因素的变化敏感。
由于香草 VAE 鼓励生成因子上的后验分布 q(z|x) 更接近各向同性高斯 N(0,I) ,它促进了潜在生成因子的解开。这是因为各向同性高斯的协方差∑等于单位矩阵 I,这意味着所有维度都是独立的。在 ELBO 中,这是由第二个术语推动的:
然而,有效解纠缠所需的学习压力可能还不够,因为在 VAE,我们还想对输入信号进行适当的自动编码(或重建),而重建损失(第一项)与第二项相比可能太大。受此启发,[β-VAE通过赋予第二项β > 1 权重,对潜在瓶颈产生了更强的约束。因此,他们的目标函数是这样的:
由于增加了第二项的权重,重建精度开始下降。这给许多研究者带来了重要的研究问题:“如何在不损失重构能力的情况下实现更好的解纠缠?“ELBO 的[ 手术极大地帮助了寻找这个答案的道路,其中第二个术语被分解为:
这里,第一项是索引码互信息(MI ),第二项是对先验的边际 KL。这种分解提供了一种观点,即实际上第二项对学习解纠缠表示更重要,惩罚 MI(比常规 ELBO 更多)可能是重建不佳的原因。此外,[ InfoGAN ](不是基于 VAE 的模型)最大化了相同的 MI 以实现更好的解缠。
有了这个理论基础,本文[ link ]在正则 ELBO 上增加了(-1) λ 加权 KL(q(z)||p(z)) 。但是,由于 KL(q(z)||p(z)) 已经存在于 ELBO 中,它们实际上是最小化( λ + 1)加权 KL(q(z)||p(z)) 以鼓励解纠缠。注意[ adversarialAE ]也使用对抗性损失最小化这个 KL(不是 KL(q(z|x)||p(z)))。
更深入地说,【 TC-βVAE 】进一步将这个边际 KL 分解为总相关性(TC) *【第一项】*和维度 KL 【第二项】:
通过这种分解,他们认为 TC (Watanabe 1960)是一种流行的多随机变量相关性度量,是学习解纠缠表示的最重要的术语,因此用一些β权重惩罚 TC,因此他们的总体目标看起来像:
与此同时,[dfactoring]论文也承认了 TC 对于解纠缠的重要性,并在 ELBO 中增加了这个术语的权重(- λ) 。同样,由于 TC 已经存在于 ELBO 中,他们实际上是最小化( λ + 1)加权 TC 以鼓励解开。
然而,根本的挑战在于对 q(z) (聚合后验分布)的估计,这取决于整个数据集(不仅仅是一个小批量)。这导致所有这些工作在估计 q(z) 或任何涉及它的项时采取不同的方法。例如,[dfactoring]使用了带有独立鉴别器的密度比技巧。
总的来说,我相信,在不久的将来,解开与 VAE 的纠葛会变得更加有趣。(更新)针对这一点,在[ IBP-VAE ]上,我们认为,随着生成因素复杂性的增加,这些讨论过的方法中的一些方法的解开能力下降,并提出 VAE 与非参数潜在因素模型(IBP-VAE),潜在密度可以随着数据复杂性的增加而增加,表明解开能力提高。
微型自主车辆中深度学习特征地图的可视化
我们开始制造 Axionaut 已经有几个月了,这是一辆迷你自主无线电控制(RC)汽车,并在巴黎的一些比赛中进行了比赛。到目前为止一切顺利,我们设法获得了好职位。然而,人们总是对控制车辆的卷积神经网络内部的实际情况感到好奇。
有一些关于如何显示特征地图和过滤器的很棒的文章,在试图理解和编码 ConvNet 的特征地图时都很有帮助。我们还看到一些很酷的 Nvidia 视频展示了自动驾驶汽车上的实时 ConvNet 神经元激活(但是,他们是如何做到的?).
所以,我们决定经历一遍,并尝试在我们的原型中复制这种体验。为此,我们使用了我们已经拥有的预训练的 Keras ConvNet 自动驾驶模型,以及在训练和比赛时从车上拍摄的一些视频。
以此为起点,我们花了几天时间寻找经典问题的答案,如“网络如何看待世界”和“网络实际关注什么”。
体验的结果如下所示:
履行
如果你对我们如何做到这一点感到好奇,你首先需要了解的是,当在卷积层的视野中检测到相关特征时,卷积层的特征图是如何“触发”的。一个非常好的解释可以在 Harsh Pokharna 的文章中找到。
在这种情况下,我们的车就成了检测车道的‘专家’了!
但是,它是怎么做到的呢?其实背后并没有显式的编程。在训练期间,我们提供了所需的输出(左转、右转或直行)和示例道路图像,因此网络会自动“学习”车道是关键。
正如人类所做的那样,在不考虑任何其他因素(其他车辆、路标、行人或目的地)的情况下,车道为我们提供了关于正确决策的相关信息。我们向左转好吗?对吗?继续直走?
好吧,让我们回到正题上来。我们应该做的第一件事是访问感兴趣的卷积层,并绘制激活的热图。为此,我们使用了这个伟大的库的稍微修改版本。
激活的完整重建必然意味着考虑“深”和“浅”卷积层的贡献,如这里的所解释的。
为了简化,我们决定从单个卷积层估计激活,执行三次插值上采样而不是去卷积。在对整个网络的所有特征地图进行视觉检查之后,我们选择了第二个卷积层。
结果如下所示:
Input image
Feature map of the second convolutive layer
在这一点上,很明显网络主要是响应车道。下一步是重叠原始输入图像和激活,以一种干净地重叠具有高响应的区域而不损害原始图像的形状或颜色的方式。
OpenCV 来救援了!第一步是创建一个二元掩模,允许我们分割最高的激活,同时排除其余的。由于激活图的尺寸较小,还需要进行上采样。在此之后,我们将应用一些位运算来获得最终的合并图像。
第一个位运算是二进制掩码和激活映射之间的“与”。这个操作可以很容易地使用 OpenCV 实现,并允许分割最高地图的激活。
Binary mask
Bitwise “and” operation between mask and feature map
正如所料,我们获得了一个干净的车道分割完全由卷积神经网络。
在这一点上,我猜你可以想象得到最终图像所需的第二个位运算:加法。冷蓝色的出现是由于 Matplotlib (RGB)和 OpenCV (BGR)颜色格式之间的差异。你可以玩这个改变 Matplotlib 的颜色图来得到不同的颜色!
瞧,我们通过对网络激活的合理估计,获得了输入图像和特征图之间的最终合并。
Final merged image
现在,让我们呈现一个。avi 视频与结果。
问题
如果你有任何问题,我很乐意在评论中回答。包括所有代码和数据库在内的公共知识库的链接在这里可以找到。别忘了在推特上关注我们。
破坏性机器学习
在过去的二十年里,当我们一直在学习如何互相学习——并且做得非常出色的时候,我们也在学习一些更基本的东西。
我们一直在学习如何学习。
这听起来很明显,毕竟,我们一直都在学习。人类就是这样,对吧?
但实际情况远不止如此。我们知道我们在学习,但实际上我们绝对知道我们如何学习。
直到我们试着教计算机任何东西,我们才明白这一点。
Dr. Marvin Minsky demonstrates an early AI system.
50 年前,“人工智能”的概念似乎不像是一个白日梦——在那些知道内情的人看来——而是我们在几年内就能完全解决的东西。我们有快速的计算机和聪明的计算机科学家,我们肯定会让所有这一切马上开始运行。
具有讽刺意味的是,直到我们试图让计算机学习时,我们才发现我们对自己如何学习知之甚少。
在过去五十年的大部分时间里,我们试图用我们在教室里使用的相同技术来“教”一台计算机。那根本不管用。
早在我们走进教室之前,我们就是海绵,吸收我们能找到的每一个经验,从中学习。没有教室,没有老师,只有一颗乐于接受、渴望的心。
小孩子实际上是最专注的科学家,进行实验,测试假设,发现世界规律。
我们知道这一点已经有一百年了,但是直到几年前,我们才把这个过程应用到机器上。
直到几年前,计算机还不够小或不够快,不太擅长这种学习。但是在过去的 20 年里,计算机的发展速度平均快了 1000 倍,所以我们现在有足够快的计算机,可以用类似于我们学习的方式来学习。
让我们来看两个例子——都是澳大利亚的科技初创公司。
其中的第一个,位于悉尼的prediction,提供了一个非常简单的价值主张:它们提高了车队的效率。
预感可以做到这一点,因为车队中的每辆车都有一个带智能手机的司机,而智能手机连接到非常快速的移动宽带网络,将连续的位置信息输入预感。
Premonition 知道每辆车的位置,了解实时交通和天气状况,了解拟议的车队调度,然后提出建议,优化每辆车的路线——至少在理论上是这样。
路线优化是一个众所周知的难题,在数学上被称为“旅行推销员问题”。再加上现实世界的所有额外复杂性、实时数据和路线的实时变化,这就成了一个非常困难的问题。
因此,Premonition 建立了一个机器学习系统,它可以听取所有这些信息,并提出建议。但这只是开始。预感提出建议,然后听取建议的结果。这是一个好的建议吗?很糟糕吗?预感反馈其建议的结果——它从成功和错误中学习。
这是关键点:这种不断优化和改进的过程意味着使用预感服务的公司看到车队运营成本下降了 10%或 15%——仅仅通过与预感共享他们的数据。它不会在第一天就发生,但随着预感的学习,随着它对自己提出的建议变得更聪明,这些建议会得到改善,运营效率也会提高。
预感抓住了机器学习和 21 世纪商业之间交集的本质。它无缝地滑入,倾听,学习和提高。
对于像车队这样平淡无奇的事情来说,这已经足够令人惊讶了。但是另一家初创公司——Maxwell MRI(——正朝着一个更有趣的方向发展。
Maxwell MRI 将机器学习引入医学放射学,建立了一个能够提供早期可靠的前列腺癌检测的系统。这是一件大事,因为早期前列腺癌通常很难检测出来,如果像年轻人一样具有侵略性,可能会很快导致致命的诊断。
通过数以千计的病历和扫描,Maxwell MRI 学会了如何检测前列腺癌的症状,这是一项放射科医生觉得很难——而且往往不可能——的工作。麦克斯韦核磁共振成像填补了早期诊断和早期治疗的领先优势,这应该导致更好的结果,在癌症变得致命之前抓住它。
放射科医生应该受到麦克斯韦核磁共振的威胁吗?我们经常读到这些智能机器将如何让我们所有人失业,但如果你看看麦克斯韦尔 MRI 是如何工作的——以及预感是如何工作的——你会发现它非常适合组织的工作流程。Maxwell MRI 让放射科医生的工作变得更好,但它不会取代他们。
这也意味着,在训练有素的放射科医生有限的地区,如澳大利亚地区,Maxwell MRI 提供了否则根本不会出现的诊断能力。它成倍提高了放射科医生的效率。
当 IBM 在 2014 年来到澳大利亚推销他们的用于肿瘤学的沃森(Watson for Oncology )时,他们非常小心地强调他们的产品不会取代肿瘤学家,而是“肿瘤学家耳边的安静声音”,提供尽可能好的建议,以指导实现尽可能好的结果。
有时这比任何人预测的都有效:肿瘤学沃森最近诊断了一种癌症,这种癌症难倒了日本的每一位肿瘤学家——因为它有更多的知识可以利用,成千上万的病历,远远超过任何从业者所能看到的。
很难想象,在十年左右的时间里,任何大规模运营的组织都不会有几个机器学习系统在其中运行,帮助该组织生存和发展。
这就是事情开始变得非常有趣和具有破坏性的地方。机器学习不是单行道。它不仅仅属于组织。个人也会有这些系统。
大约二十年前,Furby 成为世界上最热门的玩具。孩子们喜欢 Furby,因为当他们和它玩耍时,它似乎在学习和成长。早在 1998 年,那只不过是聪明的剧院。
今天,我们定期与苹果的 Siri 和亚马逊的 Alexa 和谷歌助手进行对话。所有这些对话都提供给庞大的机器学习系统,帮助这些系统更好地理解我们对它们说的话。
在接下来的几年里,我们会看到学习变得更加具体,更加关注我们自己的个人需求。
毕竟,如果预感可以使用机器学习来提高车队的效率,麦克斯韦尔 MRI 可以使用机器学习来提高诊断的准确性,那么我们为什么不想使用机器学习来帮助提高我们的生活质量或谋生能力呢?
我们将使用机器学习来帮助我们利用机会。
这很快就引出了一些有趣的路径,因为我们正在走进的世界在组织中有许多机器学习系统,这些系统将很快开始与个人使用的许多机器学习系统进行交互。这些系统将开始互相学习。
当预感和你的个人机器学习系统研究出如何合作,以便你可以达到你的目标,那将是一个非常不同的世界。这个世界变得非常聪明,非常快。
我们刚刚通过万维网经历的那种转变——我们变得非常聪明,非常快,因为我们都在分享我们知道的东西——即将再次发生,但这一次是机器学习。
这将是我们和我们所知道的,以及机器和它们所知道的,所有人都在以每一个可以想象的有意义的方向相互交流。
我们将被所有这些智能引导着穿越那个世界——有些是我们的,有些是其他的,有些是机器。这对我们今天来说听起来很奇怪,但我认为这只是因为这是一个非常新的想法,我们对那个世界的样子没有一个完整的概念。
但你可以把它想象成一个真正的好朋友或值得信赖的知己,他不断给你提供一些小信息,总是帮助你在任何情况下都做到最好。
过了一会儿,有了这样的东西,我们会发现很难想象没有它我们怎么生活。
这就是我们对智能手机的感觉,仅仅在 iPhone 发布十年后。
这种容量的持续提高,才是真正的颠覆。这就是改变一切的改变。这就是组织需要准备和建设的目标。
我们已经走了很远了。我们已经有了这个分享和学习的巨大结构——尽管我们主要用它来记录我们的社会生活。但是分享比脸书更有意义,事实比维基百科更有用。
我们需要学会分享,我们今天就需要这样做,因为这是开启一切的钥匙。如果你自己做不到这一点,可以与其他擅长数字化转型的企业合作。数字化转型的基石是学习如何分享。
考虑如何与不断变得更聪明、更有能力、同样渴望分享和学习并使用分享和学习工具的客户合作。
在一个地方呆得太久,你会发现你的顾客已经跑在你前面,投入到另一家企业的怀抱。
接受这个事实,这个更聪明的未来伴随着一定程度的不确定性。
我们最近才知道,我们可以获得擅长做某些事情的机器学习系统——进行诊断,或安排交付,等等——但不能告诉我们为什么他们会做出这样的决定。
几乎可以说,这些机器学习系统已经变得如此“人性化”,它们是凭直觉工作的。我们有点怀疑地捍卫这一点是对的,但仅凭这一点就拒绝它是愚蠢的。在某些方面,一个更智能的世界对我们来说有点太智能了。许多事情将会“起作用”——但是在我们理解它们为什么起作用之前,还需要相当长的时间。
这有点怪异,几乎感觉有点不可思议。所以让我用一个故事来总结这一切:
nVidia CEO Jen-Hsun Huang reveals the hardware for autonomous automobiles.
在最近的消费电子展上,我看到了一辆配备了非常强大的机器学习系统的奥迪——它安装在一块与 iPad 大小相同的电路板上。
然后,汽车被编程为向人类司机学习,后者在一周内驾驶汽车 48 小时。48 小时后,机器学会了如何驾驶。
它开起来完美吗?大概不会。但它肯定行驶得足够稳定,以至于奥迪毫不犹豫地驾驶一辆已经学会如何自动驾驶的汽车带着人们去兜风。
他们将这款车战略性地放置在展会入口的正对面,这是奥迪承诺将在不到四年内交付的未来的指针。
这就是我们善于学习的地方,也是我们善于创造学习的东西的地方。我们才刚刚开始。
Here’s the full talk given at Computershare Innovation Day, May 2017.
剖析算法
算法是计算机科学的基石,因为我们对世界的理解需要复制成机器可读的代码,以便可以执行。
尽管人脑如此先进,但人们开始意识到机器可以更快(随着时间的推移,这令人难以置信)并且没有错误。人类会犯错,但机器不会,除非这些错误是程序的一部分。
因此,我们对现实世界问题的理解直接关系到我们能让一台机器多好地解决它,或者让一台机器解决它!
数学是人类用来解决问题的语言。
对数学概念的基本理解对于理解世界和与世界互动是必不可少的,对吗?!
一公斤芒果要 60 美元。那么 2.5 公斤你出多少钱?
以上相对容易。现在想想你每周在超市购物的情况。如此多不同数量的不同东西。有很多人和你一起在那里购物。收银员是否开始写下所有内容,然后开始计算每一项的费用?不,他或她扫描条形码,瞧,你的账单准备好了。刷卡,拿着购物袋退出!
有相当多的工作是在幕后完成的。每件商品的库存和当前价格都保存在商店的计算机上。条形码扫描仪也与电脑相连。也是支付网关。一切都是相互联系的,因此交易是自动进行的。
但是当你想到这一点的时候,你会发现这些都是由人类完成的。条形码扫描仪取代了店主对库存中所有商品及其价格的记忆。支付网关取代了人工计算的现金交易,并倾向于精确的变化。
在大学里,我们学习简单的程序。理解递归的斐波那契数列。用 2 个数字交换临时变量。一摞。一个队列。用于排序技术的数组。就其本身而言,这些只是部分。它们没有任何意义。教育给你工具,而不是如何应用工具的知识。
如果你写一个模拟现实世界问题并解决它的程序,这些部分的总和才是最重要的。这是你必须自己去发现的事情!
一开始,程序员试图解决更简单的问题。喜欢游戏:)我个人有兴趣为我玩过的所有游戏写一个程序..四连冠,数独,象棋,瓷砖,井字游戏,河内塔。除了象棋,我什么都写。象棋属于' 现实世界问题 '范畴,因为它相当复杂!
一旦你开始编写这样的程序,你就会明白为什么你需要每一部分——输入、数据结构、迭代器、循环语句。你倾向于看到“需求”并搜索相关的“部分”。我用什么来保存这个 3x3 网格的数据?我如何计算这个结果?它是整数还是分数?
一旦你通过反复试验学会了这些,你就进入了有趣的部分——算法!我如何解决游戏的这个位置?我如何移动和保持得分?我如何评估一个成功的职位?
您将理解深度优先搜索和广度优先搜索之间的区别,以及为什么您需要为您的特定场景选择其中一个,因为您尝试将这些技术应用到您的场景中,并发现其中一个不起作用。
L 赚到代码,很好玩。并发展到所使用的不同算法。了解为什么使用每一个。
而现在我们正处于神经网络和机器学习的时代。我们把一个普通的场景扔给一台计算机,它试图用我们开发的其他程序来解决这个问题。我们投入的数据越多,效果就越好。
维基百科称,神经网络是一种模仿人脑和神经系统的计算机系统。明白我之前说的将我们的理解复制到代码中的意思了吗?!
**算法是通用场景的一套基本准则。**如果您有这些输入,请这样做。它们令人兴奋,因为它们帮助我们理解一个给定问题的“如何”解决。我们如何解决?
拿一个你喜欢的游戏,开始用你喜欢的语言编码。那是学习算法的最好方法。
沿着这条路,你会创造出一些有价值的东西!
感谢您的阅读!
如果您喜欢,请点击💚所以其他人会在媒体上看到这个。
我很想听听你对这个问题的看法,请留下你的评论,这样我们就可以继续对话了 ☺
顶部的图片来自我的收藏!其中一个变种是在我的 Instagram 上 :)
剖析 NBA 选秀
Photo by JC Gellidon on Unsplash
NBA 总决赛后,NBA 总经理和体育迷都期待着这个夏天唯一的篮球赛事——NBA 选秀。该草案是臭名昭著的,因为它创造了总经理的职业生涯,粉碎了球迷的希望,并创造了联盟的未来之星。
每个人都在挠头,波特兰是如何选中格雷德·奥登而不是凯文·杜兰特的,或者伊塞亚·托马斯,2017 年 NBA 季后赛的宠儿,是如何滑落到选秀的最后一个选秀权的。马后炮当然是 20–20;当时,除了第二轮,没有一个头脑正常的人会选一个 5 英尺 9 的控卫,也许开拓者真的需要一个中锋。
像奥登和托马斯的故事,典型的“破产”和“盗窃”草案,是 GMs 必须能够预测的。能够区分潜在的 NBA 成功和大学生涯对于建立一个稳固的 NBA 球队至关重要。对于挣扎着与 NBA 精英竞争的小市场球队来说,这种能力更为重要。
NBA 选秀历史
在深入分析之前,我想看看选秀权是如何产生的。
Figure 1
对于国内,在 2003 年到 2012 年之间被选中的球员,我们没有看到任何令人惊讶的事情。大多数第一年和第二年的选手都是在第一轮中被选中的。这些球员通常表现出很高的能力增长潜力,并被描述为有很高的上限。第三年的球员被分开,而大学老兵大多在第二轮。这些球员在大学里已经展示了他们的极限;他们通常会在每轮比赛的最后阶段落败,并被那些寻找角色球员而非明星的老牌球队拿下。
Figure 2
在这里,我把选秀分成了 6 个部分(也就是说,第 1-10 号选秀权是第 1 部分,依此类推),并且查看了每个部分中被选中的球员的身高。
最有趣的细胞是第一个,我们看到了高度的双峰分布。似乎在前 10 个选秀权中,球队要么选择控卫,要么选择中锋。前十个选秀权通常是抽签中的球队;这些球队挣扎了相当一段时间,急需重要的位置球员。这些球队正在寻找能给他们的球队带来价值和得分的中锋和控卫。
检查草稿结果:查看 Win Share
教师通常很难单独给小组项目的成员打分。他们通常必须回答“每个学生对成绩贡献了多少?”。幸运的是,我们不是老师,而 NBA 已经提出了胜利份额,一种确定个人对团队成功贡献的方法。此处对赢得份额的定义更加明确。
让我们来看看大学经历和选秀位置是如何与 NBA 胜率相关联的。
Figure 3
我们看到,一年球员在他们未来的 NBA 赢球份额中有更多的方差,而 4 年球员的方差较小。这一数据有力地表明,年龄较大的大学生球员确实比年轻球员有一个较低的上限,但不像年轻球员那样有风险。当总经理挑选第一年或第二年的球员来提升他们的特权时,他们是在正确的轨道上(尽管相关性并不意味着因果关系)
现在让我们来看看选秀位置与未来 NBA 胜率的关系。
Figure 4
看起来好像在草稿位置和赢股之间有负相关。在大约第 30 次选秀权之后,未来的 NBA 赢球份额似乎没有变化。然而,这张图表还有很多需要解释的地方。事实上,未来 NBA 赢球份额的最大预测因素是什么?为了理解这一点,我绘制了每所大学的统计数据与未来 NBA 胜率的对比图。让我们来看看结果。
Figure 5
快速浏览一下,我们可以看到失误,抢断,3 分率和 2 分率并没有转化为 NBA 赢球份额。但是分,助攻,篮板,盖帽之间是正相关的。这确实表明这些统计数据可能会转化为 NBA 水平,这让我们深入了解某个球员将如何在 NBA 做出贡献。
预测成功份额:实现神经网络
对于 GMs 来说,获取一名大学生球员的数据,并预测该球员在 NBA 职业生涯中的贡献将是非常有用的。我已经建立并训练了一个神经网络来做到这一点。*以下是 2017 年 NBA 选秀参与成员的预计获胜份额结果,按降序排列。请注意,成功份额高度依赖于团队。这些预期的成功份额可以被认为是职业生涯的平均值。
Figure 6
我们立即注意到,富尔茨、鲍尔、塔图姆和约什·杰克逊排在前 10 名,德阿龙·福克斯和马利克·蒙克排在前 15 名。我们确实有一些有趣的发现。T.J .利夫、卡梅隆·奥利弗和其他几位大人物也跻身前 20 名。这种方法并不意味着这些球员应该按照这个顺序被选中;这仅仅表明,这些球员在他们的 NBA 职业生涯中预计会有这些赢球份额。
识别盗窃和抢劫:SoftMax(多项式)回归
使用经过训练的神经网络*将选秀权分为第一轮、第二轮或介于两者之间的某个阶段,我们可以确定 2017 年选秀中的哪些球员属于哪一轮。结果如下:
Figure 7
我们可以很快识别出“偷东西”的人。这些玩家属于第 2 级或第 1.5 级玩家,但他们的获胜份额高于第 50 个百分点。这些球员包括弗兰克·梅森、奈杰尔·海耶斯、约什·哈特和马尔科姆·希尔。有趣的是,该算法将贾文·埃文斯和卡梅隆·奥利弗归类为一级球员,尽管许多选秀网站都预测他们将在第二轮比赛中进入球队。
我将半身像定义为被归类为 1 级玩家,但没有表现出高获胜份额潜力的玩家。使用这个定义,我可以确定奈杰尔威廉姆斯戈斯,贾斯廷·杰克逊,狄龙布鲁克斯,丹尼斯史密斯小几个。
值得注意的是,球员在选秀中的位置高度依赖于球队及其未来的具体需求。这个工具主要用于识别在大学篮球世界中可能被忽视的离群值。
方法
数据抓取
*使用 Python 的 BeautifulSoup 包,我能够从这个网站抓取到 2003 年至 2012 年期间每个国内大学生球员的以下统计数据:
- 名字
- 在校时间
- 上过的大学
- 投篮命中率(2 分和 3 分投篮)
- 助攻/比赛
- 篮板/比赛
- 积木/游戏
- 点数/游戏
- 抢断/比赛
- 以英寸表示的高度
- 以磅为单位的重量
- 赢得股份/游戏(仅限 NBA 职业生涯)
回归神经网络
使用 Python 的 Keras 包,这里是具有以下结构的全连接深度网络:
- 具有 11 个节点的输入层
- 具有 8 个节点的隐藏层,重新激活
- 具有 16 个节点的隐藏层,ReLU 激活
- 丢失 0.5 的丢失层
- 具有 1 个节点的输出层,线性激活
模型参数
- 纪元:1000,提前停止
- 损失:均方误差
- 优化器:Adam
用于分类的神经网络
使用 Keras 库,所使用的网络具有以下结构:
- 输入层:11 个节点
- 隐藏层:1 个节点,重新激活
- 隐藏层:100 个节点,重新激活
- 输出层:2 个节点,SoftMax 激活
模型参数:
- 损失:二元交叉熵
- 优化器:Adam
- 纪元:40,提前停止
- 模型达到了 66%的准确率
****这篇文章的创意归功于我的好朋友 Brian Wahlig ****
剖析 NBA 选秀:第二部分
Photo by Ramiro Pianarosa on Unsplash
NBA 总决赛后,NBA 总经理和体育迷都期待着这个夏天唯一的篮球赛事——NBA 选秀。该草案是臭名昭著的,因为它创造了总经理的职业生涯,粉碎了球迷的希望,并创造了联盟的未来之星。
每个人都在挠头,波特兰是如何选中格雷格·奥登而不是凯文·杜兰特的,或者 2017 年 NBA 季后赛的宠儿伊塞亚·托马斯是如何溜到最后一个选秀权的。马后炮当然是 20–20;当时,除了第二轮,没有一个头脑正常的人会选一个 5 英尺 9 的控卫,也许开拓者真的需要一个中锋。
像奥登和托马斯的故事,典型的“破产”和“盗窃”草案,是 GMs 必须能够预测的。能够区分潜在的 NBA 成功和大学生涯对于建立一个稳固的 NBA 球队至关重要。对于挣扎着与 NBA 精英竞争的小市场球队来说,这种能力更为重要。
动机
典型的选秀模式只会使用进入联盟的球员来决定被选中候选人的成功与否。这很好,但是这个模型假设这个球员会在 NBA 打球。这种类型的模型有助于确定可以成为可靠贡献者的玩家。此外,它可以量化当前大学球员的选秀“股票”
NBA 选秀数据
NylonCalculus 的合著者安德鲁·约翰逊对的伟大的威尔·施里弗提供的数据做了最好的描述。简而言之,每个大学球员都有一个条目,包含该球员在校期间每年的年度总数、高级统计数据和每 40 分钟的数据。每个条目都与个人大学毕业后的最高水平相关联。标签包括以下:NBA,国际,夏季联赛,G 联赛。
为了这个分析的目的,根据安德鲁·约翰逊的建议,我用国际标签代替了夏季联赛和 G 联赛的标签,因为这些区别在决定 NBA 的潜力时并不太相关。因此,这个问题变成了一个不平衡的二分类任务。
我还选择了只使用每个球员大学生涯的最后一个条目。对我来说,这是最合理的,因为每个潜在客户都是根据他们的最终状态进行评估的。当一个高年级学生宣布参加选秀时,他在第一年的表现没有得到评估;相反,当他准备好宣布时,他是由谁来评价的。在我的下一篇文章中,我会改变这个假设,但是现在让我们继续下去。
最后,我按职位和年份对每个特征进行了百分位数排名。通过这种方式,人们可以知道与其他竞争者相比,一个人的表现如何。
数据探索和可视化
-
-
- TL 结果在底部***
-
在深入模型构建过程之前,让我们先看看所使用的特性集。
Features to consider for Classifier
这些统计数据的解释可以在这里找到。在这里,我们可以包括一个球员的翼展和三分球命中率,因为这些品质通常决定了防守潜力和得分能力(这两种品质对 NBA 前端办公室都有吸引力)。
在创建模型之前,我们可以看看是否可以通过降低维度来分离出我们感兴趣的类别。
This graph shows how much variance in the data is explained by each principal component
为了做到这一点,我们采用了一种常见的方法叫做 PCA 。我们可以从右侧的解释方差图中看到,约 12 个分量解释了数据中约 80%的方差。利用这些信息,我们可以将数据转换到低维空间。在二维和三维空间中,我们真的看不到任何阶级的分离。
PCA/TSNE visualization of the Centers (pink and blue represent NBA players)
为了可能在另一个特征空间中得到分离,我们对数据的前 12 个 PCA 分量实施 t-sne 特征变换。然而,我们可以看到,在这种情况下,这些类也没有明显的区别。
模型构建方法
由于数据集中 NBA 实例的数量非常少,我无法使用精确度这样的指标来确定模型的有效性。在我们的情况下,我们不希望假阳性(将平庸的球员归类为 NBA 值得的球员),我们也不希望假阴性(将 NBA 口径的球员误归类为国际球员)。在我们的例子中,两者都一样糟糕(尽管其中一个可以为另一个辩护)。为了评估模型性能,我将使用 F1 分数。
最近邻方法
由于我们有一个高维数据集,k-NN 方法并不真正有效。相反,我按位置将数据分段,并将数据转换成其前两个主成分,因为似乎有一点分离(如前所示)。我本可以对 2 种成分的 231 种可能的组合进行彻底的搜索,但是那太费时间和计算量了。在对几个 k 值、加权方法和核方法(用于 PCA)进行网格搜索后,对于每个位置,我绘制了 ROC/AUC 曲线。
The area under the curve represents the model’s ability to discriminate between classes. The closer the area to 1, the better!
OOS Confusion Matrix for Guards
从上面来看,这个模型似乎有最成功的区分警卫。
尽管相当成功,这里的模型不是很好解释。我们想知道哪些特征与 NBA 潜力相关。
逻辑回归(按位置分段)方法
对于这种方法,我按照位置对数据进行分段,并利用前面描述的特征为每个位置创建一个单独的模型。我对损失函数进行加权,使其与类别频率的倒数成比例(即 NBA 标记的样本具有较高的权重,因为它们出现的频率较低)。
与 k-NN 方法相比,这里的模型稍差一些。看一看警卫的分类矩阵,我们可以看到一些有趣的东西。
OOS Confusion Matrix for Guards
与 k-NN 方法相比,该模型倾向于低估 NBA 人才。这里假阳性率低,假阴性率高。
因为我们想要可解释的特征,我们可以查看每个位置的每个模型的系数。请记住,增加对应于正系数值的特征值会将赔率推向 1,而增加对应于负系数值的特征值会将赔率推向 0。
我们可以立即注意到一些趋势。毫不奇怪,进攻/防守赢球份额、PER、使用率%、每场比赛分钟数和身高是最大的影响因素。然而,在组内,我们可以看到 PPR(纯得分率)和 PPS(每次投篮得分)是 NBA 后卫潜力的预测。对于大个子来说,翼展和防守数据,比如 BLK%和 STL%是很重要的。
有些系数很奇怪(例如,更高的 TOV%对守卫有利),但这是由于混杂效应。例如,高 TOV%可能意味着该球员经常拿球,并有望得分(即有价值的球员)。此外,高 TOV%预计来自新生的现象,因为他们正在适应大学比赛的严酷。在这种情况下,模型可能会收到一次性信号。
随机森林分类器方法
考虑到分类任务的难度,我认为利用非线性模型是有益的。在这个方法中,我没有按照位置进行分离,而是按照顺序对分类位置进行编码。该方法比一次热编码(减少的特征空间)执行得更好。我再次使用了同样的加权损失函数。
这里,曲线下的区域看起来很有希望。如果我们看一下混淆矩阵,我们会发现我们实际上做得很好。
OOS RFC Conf. Matrix
我们可以在这里进行同样的系数分析。对于决策树来说,由于涉及到非线性,所以有些不同。在这里,特征重要性表明模型认为分割特定特征有多重要。
与我们在逻辑回归模型中看到的类似,DWS/OWS、PER 和使用百分比主导着决策过程。也像逻辑回归系数的解释一样,我们可能会看到共线性的影响。例如,TOV%可能被低估,因为它包含在 PPR。
逻辑回归(再次!)方法
这里,我实现了位置的一次性编码,而不是分割数据。使用了相同的加权损失函数。
与 RandomForest 相比,这里的逻辑回归虽然不太成功,但也不错!再一次,这个模型很有可能会错过相当多的 NBA 天才球员。
讨论
对于这些 NBA 球员来说,很容易检测出正负方向的异常值。我认为困难在于对其余的人进行细微的区分。令我印象深刻的是,在只有二维数据的情况下,k-NN 分段分类器能够与逻辑(分段)分类器一样好,如果不是更好的话。我最初认为,按职位对数据进行细分可以更精确地对各组进行分类,因为职位之间的区别更容易界定。然而,这种分割方法并没有证明比简单的 RandomForestClassifier 更有效。
结果!
上述模型的应用是所有这些中最令人兴奋的部分。
识别过去的成功和失败
就像安德鲁在他的帖子里做的一样,我填充了给定的数据,并寻找最大的抢断(进入 NBA 的赔率非常低的家伙)和破产(没有进入联盟的赔率很高的家伙)。
Biggests Busts (left) and Biggest Steals (Right)
其中有些是不公平的。比如奈杰尔-威廉姆斯·戈斯,大学毕业才一年,我们就真的给他贴上国际的标签是不公平的。未来的改进可能是只关注那些离开大学时代至少 3-4 年的球员。
值得注意的缺席者包括威尔·拜纳姆、布里安特·韦伯和特洛伊·威廉姆斯,他们都为 NBA 球队做出了不可忽视的贡献。此外,有趣的是,该模型对马库斯·斯劳特、诺亚·哈特索克和艾克·奥福格布这样的多面手过于乐观。
去年的班级
出于好奇,我想知道我们是否能预测到凯尔·库兹马、塔图姆或米切尔会像他们一样出现在新秀舞台上。
这一模式在塔图姆和库兹马的评分较低,而在扮演马里克·蒙克的评分较高。这个模型并没有预测 NBA 的成功,所以重要的是要有所保留。
分析草稿库存
有了这样的模型,看看今年选秀班的股票(进入 NBA 的概率)在他们的大学生涯中是如何上升和下降的会很有用。此外,该模型可以用来预测一个球员是否应该在他职业生涯的某个特定阶段参加选秀。
回顾今年的课程,一些非一蹴而就的前景:
从左至右,我们有格雷森艾伦,彭江雨布伦森,杰冯卡特,兰德里沙梅特,米卡勒布里奇斯和迈尔斯·布里奇斯。
显而易见,一个玩家的股票可能会暴涨暴跌。以杰冯·卡特为例。大三是他最成功的一年,他有 80%的机会进入 NBA。然而,今年,他的表现使他降到了 50%以下。
格雷森·艾伦在 2017 年做出了正确的决定,回来参加高年级赛季,因为他的股票相当低。今年被大多数球探喜欢的沙梅特,预计在 NBA 的投篮命中率很低。然而,这可能是因为他的受伤限制了他的上场时间。
按职位排列今年的潜在客户
我们看到像迈尔斯·布里奇斯、艾顿、杰克森和巴格利这样的球员出现在顶级前锋中。当然,邦巴是中心班的佼佼者。有趣的是,被球探高度看好的特蕾·杨和科林·塞克斯顿并没有出现在顶级后卫中。两人都有望进入 NBA(分别为 58%和 54%)。
最近的发展
一些运动员从选秀中退出了他们的名字,而另一些则使他们自己有资格。退出选秀的几个著名的名字是 Tyus Battle(锡拉丘兹)、Jontay Porter(米佐)、Jaylen Hands(加州大学洛杉矶分校)和卢克马耶(北卡罗来纳大学)。让我们看看他们的决定是否正确。
从模型来看,最值得质疑的退出决定似乎是 Jontay Porter 的。他的股票不太可能上涨更多(统计数据)。4 个决定中最聪明的是 Hands,他今年对布鲁因斯有点失望。
选秀中最有趣的是唐特·迪文森佐,一个新诞生的比利亚诺瓦英雄。该模型预测他在 NBA 的命中率约为 50.2 %。希望一切顺利。
未来的工作
由于我们本质上是在处理多维时间序列数据,我想使用动态时间扭曲来对这些参与者进行分类。它将给出一个更全面的球员在大学时代的观点,希望它能够更好地预测 NBA 的机会。
承认
密码
代码可以在 Github 上的一系列 IPython 笔记本中找到。
用种族扭曲数据…
我在 JAMA 上读到一篇有趣的禁运文章。最初,我只是打算在今天上午 11 点等待禁运解除,并在几个平台上分享,但我有几天时间来思考这些发现。为了消磨时间,我读了一些引文。
从 DeSantis CE 和他的同事那里引用的话无意中非常简洁地描述了这种紧张。我们知道我们所报道的是低价值的,因为差异的真正原因是社会和政治结构,但是——管它呢——其他人都在这么做。
我们认识到种族是一种社会建构;然而,由于美国的许多健康数据是按种族报告的,种族分类对于描述国内健康的一般模式仍然有用。尽管我们可以互换使用非裔美国人和黑人这两个术语,但这里提供的数据是针对黑人的,并尽可能排除西班牙裔 人。—2016 年非裔美国人癌症统计:减少种族差异的进展和机遇
我们对“黑人”的癌症发病率了解多少?
在美国,非裔美国人承担了不成比例的癌症负担,在大多数癌症中,其死亡率最高,存活时间最短。这些不平等的原因很复杂,反映的是社会和经济差异,而不是生理差异。
例如,2014 年,26%的黑人生活在联邦贫困线以下,而非西班牙裔白人的这一比例为 10 %, 22%的黑人完成了 4 年大学教育,而非西班牙裔白人的这一比例为 36%。1,2 社会经济地位较低的人更有可能从事增加癌症风险的行为,部分原因是针对这些人群的营销策略以及环境和社区因素,如体育活动机会较少和新鲜水果和蔬菜较少。—
癌症趋势图中的数据有点过时。我正在从我的数据源更新数据,但我在这里的观点是,我们有足够的数据开始以更深的粒度寻找。种族数据告诉我们的很少。理解我们的基因是基于地理起源而不是我们的肤色分类的,是我们理解的一个重要支点。
当我们根据肤色进行聚合时,我们遗漏了什么?
最近的研究信(美国东部时间上午 11:00 前禁止发布)解释了为什么社会和生物代理(不存在)的假设和持续误解对任何人都没有好处…
上述数据在报告黑人男性前列腺癌发病率方面是明确的。Vastola,Yang 等人在 JAMA oncology 中报告了可能存在的潜在障碍,这些障碍不成比例地阻止了黑人患者参与临床试验。研究信中写道:
我们研究了单独使用血清肌酐(sCr)代替肾功能的种族校正测量,以及使用绝对中性粒细胞计数(ANC)阈值排除良性种族中性粒细胞减少症患者。对于任何给定的肾功能,黑人患者都有较高的 sCr,使用这种测量方法可能会错误地低估他们的肾功能。同样,6.7%至 8.0%的黑人患者患有良性种族中性粒细胞减少症,这种疾病被定义为中性粒细胞减少症(ANC<1.5 Å~ 109 cells/L)without attributable cause, may be excluded despite healthy immune systems.
JAMA Oncology 2018 年 2 月 8 日在线发表 实验室资格标准作为黑人男性参与前列腺癌临床试验的潜在障碍
有一场比赛。如果你正在读这篇文章,你就在其中。
实验室测量存在差异和变化,但我们肯定无法仅根据血清肌酐(sCr)准确地按种族对参与者进行分类。识别实际的生物差异,而不是仅仅根据肤色来聚集患者,这与不使用种族作为识别和测量健康的社会决定因素的替代物一样重要。
虽然在试验标准中采用基于种族的差异可能会在确保患者符合试验资格时增加轻微的后勤挑战,但这些调整将防止健康个体 仅仅因为其 种族 *造成的良性实验室差异而被排除在外。 [我会用血统代替种族——BMcc]——*实验室资格标准作为黑人男性参与前列腺癌临床试验的潜在障碍
最初发表于【www.dataanddonuts.org】。
任何事物的分布式表示
Photo by Riho Kroll on Unsplash
在这篇综述中,我们探索了我们在互联网上发现的任何东西的各种分布式表示——单词、段落、人物、照片。如下所示,这些表示可用于各种目的。我们试图选择看似不同的主题,而不是提供分布式表示的所有应用的全面回顾。
输入:模型目的 单词向量:情感分析 段落向量:聚类段落 人物向量(维基文章):比较 照片和单词向量:照片检索
激动吗?我是!让我们跳进来。
单词的分布式表示
这就是故事开始的地方:用定量的方式来表示一些定性的概念(例如单词)的想法。如果我们在字典中查找一个单词,我们会根据其他定性单词获得它的定义,这对人类有帮助,但对计算机没有真正的帮助(除非我们做额外的后处理,例如将定义单词的单词向量输入到另一个神经网络中)。在之前的文章中,我们介绍了单词向量的概念——定性单词的数字表示。
总之,当前的 NLP 实践经常将单词替换成固定长度的数字向量,使得相似含义的单词具有相似的数字向量。值得重新强调的训练概念是,在训练一个词的数值向量(姑且称之为中心词)时,优化中心词的向量来预测周围的上下文词。正如我们将在下面看到的,这种训练概念被扩展到新的应用中。
段落的分布式表示
word2vec 的一个有趣的扩展是段落的分布式表示,就像固定长度的向量可以表示一个单词一样,一个单独的固定长度的向量可以表示整个段落。
简单地对整个段落的单词向量求和是一种合理的方法:“当单词向量被训练来预测句子中的周围单词时,这些向量表示单词出现的上下文的分布。这些值与输出层计算的概率成对数关系,因此两个词向量的和与两个上下文分布的乘积相关。[1]" 由于字向量的求和是可交换的——求和的顺序无关紧要——这种方法不保留字的顺序。下面,我们回顾两种训练段落向量的方法。
[2]提出了两种训练段落向量的方法,这两种方法的相似之处在于,这两种表示都被学习来从段落中预测单词。
第一种方法是 PV-DM(段落向量:分布式内存)。这从上下文窗口中采样一个固定长度(比如说 3)。这三个单词中的每一个都由一个 7 维向量表示。段落向量也由 7 维向量表示。4 (3+1)个向量被连接(成为 28 维向量)或平均(成为 7 维向量)以用作预测下一个单词的输入。在小的上下文窗口中单词向量的连接考虑了单词顺序。
PV-DM illustration. Source: [2]
第二种方法是 PV-DBOW(段落向量:分布式单词包)。这从段落中随机抽取 4 个单词,并且只使用段落向量作为输入。
差异:
- PV-DM 从 4 个输入中预测 1 个字;PV-DBOW 从 1 个输入中预测 4 个单词。
- PV-DM 从目标单词的周围单词中抽取单词;从段落中画出单词。
- PV-DBOW 存储的数据较少,仅存储 softmax 权重,而 PV-DM 中同时存储 softmax 权重和字向量。
PV-DBOW illustration. Source: [2]
现在我们有了段落向量,我们可以使用这些高维向量来执行聚类。段落嵌入,无论是使用上述两种方法还是简单求和来训练,都能够使文本文章(例如医学笔记[3])被聚类。
分布式人物再现:滨崎步 vs Lady Gaga
[4]研究使用维基百科文章训练段落向量:一个段落向量代表一篇维基文章。通过将单词向量与段落向量联合训练,作者表明找到“Lady Gaga”的日语对等词可以通过向量运算来实现:
paragraph vector(" Lady Gaga ")-word vector("美国")+WordVector("日本") ≈ ParagraphVector("滨崎步")
单词向量和段落向量的混合使用是强大的:它可以用一个单词解释两篇文章的区别,也可以用一篇文章解释两个单词的区别。例如,我们可以找到近似“唐纳德·特朗普”和“巴拉克·奥巴马”的段落向量之间的差异的单词向量。
令人兴奋,不是吗?还有,Stitch Fix 已经表明我们可以对图片进行这些操作。
图像检索的分布式表示
作者已经发布了一个很棒的帖子,所以请访问了解更多关于这个迷人作品的细节。总之,如果有人喜欢服装的孕妇版本,我们可以将孕妇添加到当前服装中,并检索类似风格的孕妇版本。
Source: Stitch Fix
结论
这篇文章回顾了主题周围单词的概念是如何定义主题的,在表示单词、段落、人物甚至图片时是有用的。可以对这些向量执行数学运算,以获得洞察力和/或检索信息。
我错过了其他有趣的应用吗?请在下面的评论中让我知道!
参考文献
- Mikolov T、Sutskever I、Chen K、Corrado GS、Dean J、miko lov T、Sutskever I、Chen K、Corrado、G. S .、Dean J。伯格·CJC、博图·L、韦林·M、格拉马尼·Z、温伯格·KQ,编辑。神经信息处理系统进展。柯伦联合公司;2013;3111–3119.PMID: 903 人
- 句子和文件的分布式表示。2014;PMID: 9377276
- 从医学笔记中学习有效的嵌入[互联网]。2017.
- 用段落向量嵌入文档。2015;
发表于2017 年 12 月 7 日
原载于 2017 年 12 月 7 日joshuakyh.wordpress.com。
使用 Horovod(和估计器)的分布式张量流
通过使用许多 GPU 来减少深度神经网络的训练时间
你可以在这里阅读这篇文章的更新版本:
使用 Horovod 在超级计算机上扩展深度学习
towardsdatascience.com](/distributed-deep-learning-with-horovod-2d1eea004cb2)
云中的分布式训练:云机器学习引擎
在我关于在云中训练大模型的集的这个激动人心的结论中,我将向您展示如何为机器学习扩展您的计算能力,甚至召集一些 GPU!
我们的培训会有足够的资源吗?观看视频(或阅读下文)了解详情!
在上一集中,我们讨论了当数据集太大而不适合本地机器时会遇到的问题,我们还讨论了如何通过可扩展的存储将数据转移到云中。
机器学习中的并行训练
今天,我们继续这个问题的第二部分——将这些计算资源放在一起。当训练更大的模型时,当前的方法包括并行进行训练*。我们的数据被分割并发送到许多工作机器,然后模型必须将从每台机器获得的信息和信号重新组合在一起,以创建完全训练的模型。*
你爱配置吗?
如果你愿意,你可以启动一些虚拟机,安装必要的库,将它们联网,并配置它们运行分布式机器学习。当你完成后,你一定要把那些机器拿下来。**
虽然对于一些人来说,这表面上看起来很容易,但如果你不熟悉安装 GPU 驱动程序、不同版本的底层库之间的兼容性问题,这可能是一个挑战。
云机器学习引擎
幸运的是,我们将使用云机器学习引擎的训练功能,从 Python 代码到训练好的模型,不需要任何基础设施工作!该服务根据需要自动获取和配置资源,并在完成训练后关闭系统。
使用云 ML 引擎有 3 个主要步骤:
1)打包您的 Python 代码 2)创建一个描述您想要的机器类型的配置文件 3)将您的培训作业提交到云
让我们看看如何设置我们的培训来利用这项服务。
步骤 1:打包您的 Python 代码
我们已经将我们的 Python 代码从 Jupyter 笔记本中转移到一个独立的脚本中。让我们把那个文件叫做task.py。这将作为我们的 Python 模块,然后可以从其他文件中调用它。
现在我们将task.py包装在一个 Python 包中。Python 包的制作方法是将模块放在另一个文件夹中,姑且称之为“trainer”,并将一个空文件__init__.py放在task.py旁边。
我们最终的文件结构由一个名为 trainer 的文件夹组成,包含两个文件:__init__.py和task.py。我们的包叫做 trainer ,我们的模块路径是 trainer.task 。如果您想将代码分解成更多的组件,您也可以将这些组件包含在这个文件夹中。例如,您可能在trainer文件夹中有一个util.py。
步骤 2:配置文件:config.yaml
一旦我们的代码被打包到一个 Python 包中,就该创建一个配置文件来指定您希望在什么机器上运行您的培训了。您可以选择在少量机器(少至一台)上运行培训,也可以在多台机器上运行,并附带 GPU。
Using a predefined scale tier is as simple as it gets
有几个预定义的规范使入门变得格外容易,一旦你不再需要这些规范,你就可以随心所欲地配置一个定制架构。
For a custom cluster, all you need to do is specify the machine types you want
现在,我们已经打包好 python 代码,并写出了配置文件。让我们进入你们期待已久的一步,训练!
步骤 3:提交您的培训工作
为了提交一个培训作业,我们将使用gcloud命令行工具并运行gcloud ml-engine jobs submit training。这个调用还有一个 REST API 等价物。
我们指定一个惟一的作业名、包路径和模块名、运行作业的区域以及存放培训输出的云存储目录。确保使用与存储数据相同的区域,以获得最佳性能。
gcloud ml-engine jobs submit training \ job-id $JOB_ID \ package-path=trainer \ module-path=trainer.task \ region=us-central-1 \ job_dir=gs://cloudml-demo/widendeep
一旦您运行这个命令,您的 python 包将被压缩并上传到我们刚刚指定的目录中。从那里,包将在云中运行,在我们在配置中指定的机器上运行。
看着训练进行!
您可以在云控制台中通过进入 ML 引擎并选择作业来监控您的培训作业。
在那里,我们将看到我们曾经运行过的所有作业的列表,包括当前作业。右边是一个计时器,显示了作业所用的时间,还有一个链接指向来自模型的日志信息。
Some models take a bit longer to train than others ;-)
预测呢?
我们的代码将训练好的模型导出到我们在作业目录中提供的云存储路径,因此从这里我们可以轻松地将预测服务直接指向输出,并创建一个预测服务,正如我们在第 4 集中讨论的无服务器大规模预测。
后续步骤
使用云机器学习引擎,我们可以实现分布式训练,而不用自己处理基础设施。因此,我们可以花更多时间处理数据!只需打包代码,添加一个配置文件,然后提交培训作业。如果你想看更完整的例子,你可以查看云机器学习入门指南。
如果你想知道 TensorFlow 的分布式培训模式是如何工作的,请查看来自 TensorFlow 发展峰会的深度演讲:【youtu.be/la_M6bCV91M
感谢阅读本集云 AI 冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注 Medium 上的me或订阅 YouTube 频道以捕捉未来的剧集。更多剧集即将推出!
分布语义学——从字里行间解读
人类的语言在不断进化,但是这些变化在发生的时候经常被忽视。然而,如果你拿一篇几十年或几个世纪前的文章或文学作品,你肯定会注意到所用语言的变化。如果语言是这样进化的,你怎么理解一个词的定义?
模式匹配和从句子中的周围词中破译一个词的意思是理解石刻的常用方法。具有分布式相似性模型的深度学习使得机器在自然语言处理(NLP)领域做同样的事情变得可行。
J.R.Firth 的名言很好地总结了这一概念,“你应该通过它所交往的人来了解一个词!”
“透明”、“打击”和“监督”是几个词的例子,根据它们的使用方式,可能意味着完全不同的事情。一般来说,语言中有丰富的自动反义词(也可以表示相反事物的单词)和多义词(也可以表示相似事物的单词)。没有人确切知道为什么我们出于不同的目的使用同一个单词,但是我们都同意这使语言变得有趣。
通过使用正确的词语,一个人可以更好地表达,并让他人感兴趣地倾听。几个世纪以来,单词能力在世界范围内已经被很好地理解,因此,仅仅拥有一个简单的词义词典并不能帮助 NLP 中的机器。
courtesy @data_monsters
孩子们很早就开始学习语言,而不是等到学校教语法。即使是成年人。寻求词汇发展,往往被规定要在一个句子中使用他们所学的单词,并记住这种用法,而不仅仅是记忆单词及其含义。twitter、短信和 Whatsapp 的日益流行正在将人类交流浓缩成短句、首字母缩略词和表情符号。因此,用法设置、谈话时间和其他视觉线索在理解单词的意思时都起着重要的作用。
在一头扎进所有的数学之前,斯坦福 NLP 与深度学习讲座视频很好地介绍了这个话题。“向量”这个词似乎很好地捕捉了深度学习的句法和语义关系,在它的帮助下,很快,你应该能够使用 NLP 或 TLP(技术或 twitter 语言处理)预测答案😊)
西雅图-HQ1+HQ2 =?
用 Python 理解 PCA(主成分分析)
陷入变量的海洋来分析你的数据?感觉迷失在决定选择哪些功能,使您的模型是安全的,从过度拟合?有什么方法可以降低特征空间的维数?
嗯,PCA 肯定能帮到你。
在这个冥想中,我们将对癌症数据集的主成分分析进行简单的解释,并看到特征空间降维到数据可视化的例子。
不再拖延,让我们开始导入癌症数据集。
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
有时候,了解你正在使用的数据会更好,我们可以使用DESCR来了解数据集的基本描述。
print cancer.DESCR
由此你现在知道这个数据集有 30 个特征,如平滑度、半径等。病例数为 569 例,其中 212 例为恶性,其余为良性。目标变量列为 0 和 1,只是为了确保 0 代表恶性肿瘤,反之亦然,可以检查-
print len(cancer.data[cancer.target==1])>> 357
为了更多地了解特征如何影响目标,我们可以绘制恶性和良性类别的直方图。如果这两个直方图是基于特征分开的,那么我们可以说该特征对于辨别实例是重要的。
import numpy as np
import matplotlib.pyplot as plt
# from matplotlib.pyplot import matplotlibfig,axes =plt.subplots(10,3, figsize=(12, 9)) # 3 columns each containing 10 figures, total 30 featuresmalignant=cancer.data[cancer.target==0] # define malignant
benign=cancer.data[cancer.target==1] # define benignax=axes.ravel()# flat axes with numpy ravelfor i in range(30):
_,bins=np.histogram(cancer.data[:,i],bins=40)
ax[i].hist(malignant[:,i],bins=bins,color='r',alpha=.5)# red color for malignant class
ax[i].hist(benign[:,i],bins=bins,color='g',alpha=0.3)# alpha is for transparency in the overlapped region
ax[i].set_title(cancer.feature_names[i],fontsize=9)
ax[i].axes.get_xaxis().set_visible(False) # the x-axis co-ordinates are not so useful, as we just want to look how well separated the histograms are
ax[i].set_yticks(())ax[0].legend(['malignant','benign'],loc='best',fontsize=8)
plt.tight_layout()# let's make good plots
plt.show()
如下图所示
Histogram of malignant and benign classes based on the 30 features of cancer data-set
现在,从这些直方图中我们看到,像-平均分形维数这样的特征在区分恶性和良性方面所起的作用很小,但最差凹点或最差周长是有用的特征,可以给我们关于癌症数据集类别的强烈提示。直方图在我们的天体物理学研究中是必不可少的,因为它们经常被用来分离模型。我无法抗拒把它带到这里的诱惑。因此,如果您的数据只有一个特征,例如最差周长,则足以区分恶性和良性病例。
在对这些癌症数据集使用主成分分析之前,让我们简单地了解一下主成分分析实际上是做什么的。我们知道,在一个数据集中,一些特征很有可能是相关的。让我们看一些癌症数据集中的例子——
Scatter plots with few features of cancer data set
现在,希望您已经理解了哪个图显示了特征之间的强相关性。下面是我用来绘制这些图表的代码。
imoprt pandas as pd
cancer_df=pd.DataFrame(cancer.data,columns=cancer.feature_names)# just convert the scikit learn data-set to pandas data-frame.
plt.subplot(1,2,1)#fisrt plot
plt.scatter(cancer_df['worst symmetry'], cancer_df['worst texture'], s=cancer_df['worst area']*0.05, color='magenta', label='check', alpha=0.3)
plt.xlabel('Worst Symmetry',fontsize=12)
plt.ylabel('Worst Texture',fontsize=12)
plt.subplot(1,2,2)# 2nd plot
plt.scatter(cancer_df['mean radius'], cancer_df['mean concave points'], s=cancer_df['mean area']*0.05, color='purple', label='check', alpha=0.3)
plt.xlabel('Mean Radius',fontsize=12)
plt.ylabel('Mean Concave Points',fontsize=12)
plt.tight_layout()
plt.show()
**PCA 本质上是一种以新变量相互正交(即它们是独立的或不相关的)的方式降低特征空间的维度的方法。**我在这篇文章的末尾放了一些参考资料,这样感兴趣的人可以真正钻研 PCA 的数学。
无论如何,从癌症数据集我们看到它有 30 个特征,所以让我们将其减少到只有 3 个主要特征,然后我们可以可视化这些新的独立变量的散点图。
在应用 PCA 之前,我们对数据进行缩放,使得每个特征都有单位方差。这是必要的,因为拟合算法高度依赖于特征的缩放。这里我们使用StandardScaler模块来单独缩放特征。StandardScaler从每个特征中减去平均值,然后缩放到单位方差。
我们首先实例化模块,然后适应数据。
scaler=StandardScaler()#instantiate
scaler.fit(cancer.data) # compute the mean and standard which will be used in the next command
X_scaled=scaler.transform(cancer.data)# fit and transform can be applied together and I leave that for simple exercise
# we can check the minimum and maximum of the scaled features which we expect to be 0 and 1
print "after scaling minimum", X_scaled.min(axis=0)
现在,我们准备对这个缩放数据集应用 PCA。我们像以前一样从StandardScaler开始,在那里我们实例化,然后拟合,最后转换缩放的数据。在应用主成分分析时,你可以提出你想保留多少个主成分。
pca=PCA(n_components=3) pca.fit(X_scaled) X_pca=pca.transform(X_scaled) #let's check the shape of X_pca arrayprint "shape of X_pca", X_pca.shape
现在我们已经看到数据只有 3 个特征。*PCA 的缺点是几乎不可能说出初始特征(这里是 30 个特征)是如何组合形成主成分的。*现在需要注意的重要一点是,我选择了 3 个组件,而不是 2 个,这可能会进一步降低数据集的维度。可以选择n_components=2吗?[考虑一段时间,作为一个迷你练习。你能想出一些方法来测试这个吗?]
可以通过测量主成分的方差比来检查。
ex_variance=np.var(X_pca,axis=0)
ex_variance_ratio = ex_variance/np.sum(ex_variance)
print ex_variance_ratio
>> [0.60950217 0.2611802 0.12931763]
这里可以看到,前两个因素占总方差的 87%。所以只选择 2 个组件就足够了。好了,现在有了前两个组件,我们可以跳到 PCA 最重要的应用之一,即数据可视化。**现在,由于 PCA 成分彼此正交且不相关,我们可以预期恶性和良性类别是不同的。**让我们根据前两个主要成分来划分恶性和良性类别
Xax=X_pca[:,0]
Yax=X_pca[:,1]labels=cancer.targetcdict={0:'red',1:'green'}labl={0:'Malignant',1:'Benign'}marker={0:'*',1:'o'}alpha={0:.3, 1:.5}fig,ax=plt.subplots(figsize=(7,5))
fig.patch.set_facecolor('white')for l in np.unique(labels):
ix=np.where(labels==l)
ax.scatter(Xax[ix],Yax[ix],c=cdict[l],s=40,
label=labl[l],marker=marker[l],alpha=alpha[l])# for loop endsplt.xlabel("First Principal Component",fontsize=14)
plt.ylabel("Second Principal Component",fontsize=14)
plt.legend()
plt.show()# please check the scatter plot of the remaining component and you will understand the difference
使用上面的代码,绘图如下所示
Plot of breast cancer classes based on the first 2 principal components of the cancer features.
看起来很棒,不是吗?这两个类别被很好地分开,前两个主成分作为新特征。尽管看起来很好,但即使是线性分类器也能很好地从测试集中识别出一个类。在另一篇文章中,我已经讨论了如何应用由 PCA 和支持向量分类器组成的流水线,并为相同的数据集绘制决策函数。一个重要的特征是恶性类别与良性类别相比是如何分布的,并回顾那些直方图。你能找到一些相似之处吗?
**这些主成分仅根据特征计算,不考虑来自类别的信息。因此,主成分分析是一种无监督的方法,很难解释这两个轴,因为它们是原始特征的复杂混合物。**我们可以做一个热图,看看这些特性是如何混合在一起形成组件的。
plt.matshow(pca.components_,cmap='viridis')
plt.yticks([0,1,2],['1st Comp','2nd Comp','3rd Comp'],fontsize=10)
plt.colorbar()
plt.xticks(range(len(cancer.feature_names)),cancer.feature_names,rotation=65,ha='left')
plt.tight_layout()
plt.show()#
3 PCs and dependencies on original features
实际上很难从该图中理解原始特征的相关性,但是我们总是可以使用seaborn热图来绘制特征的相关性。但是,检查之前的相关图,看看第一主成分是如何受到平均凹点和最差纹理的影响的。您能说出哪个特性对第一台电脑的贡献更大吗?
这里我展示了这些特性的“最差”值的相关图。
feature_worst=list(cancer_df.columns[20:31]) # select the 'worst' featuresimport seaborn as snss=sns.heatmap(cancer_df[feature_worst].corr(),cmap='coolwarm')
s.set_yticklabels(s.get_yticklabels(),rotation=30,fontsize=7)
s.set_xticklabels(s.get_xticklabels(),rotation=30,fontsize=7)
plt.show()
Correlation plot of the ‘worst’ features of cancer data-set
所以,为了结束这次冥想,让我们总结一下我们所做的和所学的
- 为什么是 PCA 而不仅仅是特征分析?(回答提示:大数据集,多特征,让我们降低特征空间的维度)
- 我们从癌症数据集开始我们的例子,发现 30 个特征有 2 类。
- 为了对该数据集应用 PCA,首先我们缩放所有特征,然后对缩放后的特征应用 PCA 的
fit_transform方法(具有 3 个主成分)。 - 我们表明,在这 3 个主成分中,有 2 个成分贡献了总方差的 87%。
- 基于这两个主要成分,我们将数据可视化,并看到“恶性”和“良性”类别之间非常清晰的区分。
希望这将有助于你掌握一些概念,并指导你有效地应用主成分分析你的数据集。作为练习,您可以立即尝试波士顿房屋数据(13 个特征)并查看结果。再次仔细阅读并记住关于最初相关特征到最终独立主成分的基本概念。
这篇文章受穆勒的书的影响,是我尝试用 CALET 探测器测量的宇宙射线来分离两种天体物理场景(脉冲星和暗物质)的垫脚石。你可以在我的 github 简介中找到所有细节。如果你对参数和详细描述感兴趣,请告诉我。使用 Akaike 标准对我们的工作进行的单独分析被选发表在国际现代物理学杂志 D 上。
关注即将到来的帖子,保持坚强,快乐!
如果你对更深入的基础机器学习概念感兴趣,可以考虑加盟 Medium 使用 我的链接 。你不用额外付钱,但我会得到一点佣金。感谢大家!!
进一步阅读的参考资料:
潜入无人驾驶汽车的世界
一年前,我辞去了四大会计师事务所之一的工作,搬到了湾区,开始向我真正想进入的行业转移:技术。在我工作的最后几个月,我列出了所有我想涉足的潜在技术领域,排在首位的是自动驾驶汽车。当然,当时只有会计背景,这似乎是一个遥远的目标。
搬到旧金山湾区后,我仍然坚持做会计工作,但我特意选择了一家更注重工作与生活平衡的公司,因为我知道学习编程每周会占用大量时间。但是从哪里开始呢?起初,我还不知道自动驾驶汽车肯定会是我此后不久的目标,实际上我通过 Code Academy 开始了一些基本的网页设计(想想 HTML 和 CSS)。然后,我拿起了一本关于 Ruby 的书,这本书让我更热衷于编写真正的程序。
寻找 Udacity
正是在 2016 年年中的这个时候,我开始阅读越来越多关于自动驾驶汽车的文章,同时继续相信这对我来说是多年以后的事情。我看到 Python 编程语言在该领域非常受欢迎,并且很快阅读到 Udacity 有一个很棒的学习 Python 的编程课程(“计算机科学入门”给那些感兴趣的人——如果你想学习 Python 基础,我强烈推荐它;您将创建一个像谷歌一样的基本搜索引擎!).当我接近这门课程的尾声时,Udacity 宣布了我能想到的最令人兴奋的事情之一:无人驾驶汽车纳米学位项目。
对于那些从未听说过 Udacity 纳米学位项目的人来说,他们会教你特定领域工作所需的技能,以及有助于增强你的投资组合的项目——例如,许多招聘人员会将个人的 Github 知识库视为其能力的证据。这些纳米学位项目包括数据分析、机器学习、iOS 和 Android 开发等领域。该计划还包括各种职业研讨会,以帮助改善你的简历,面试技巧等。
机器学习
尽管我很兴奋有一个纳米学位项目完全专注于让某人做好成为自动驾驶工程师的准备,但我肯定还没有准备好。幸运的是,Udacity 对一些对该项目很重要的课程和纳米学位相当开放,该项目在 2016 年 10 月宣布后几个月就有了第一批学生。其中之一是机器学习纳米学位。虽然当我第一次开始的时候,我可能有点不知所措,但那个项目确实帮助了我最终获得了 SDC 纳米学位的第一个学期,因为它主要专注于各种机器学习技术。
如果你对这个领域感兴趣,机器学习纳米学位有一些很棒的项目。我使用监督学习来预测这样的事情,比如某个人是否会在泰坦尼克号上幸存下来,或者在学校需要 T2 的额外帮助,无监督学习来将不同的客户群分成不同的组,强化学习来教会智能出租车安全有效地到达目的地。有大量的资源可以更好地解释这些技术,而我在这里没有足够的空间。MLND 以一个顶点项目结束,专注于对深度学习等领域的深入研究——我仍在与 SDCND 合作完成我的项目,但如果你想预览,请参见我的提案或我的正在进行的顶点知识库。我正在采用基于深度学习的方法来检测道路车道。
自动驾驶汽车纳米度
与机器学习纳米学位不同,Udacity 决定限制自动驾驶汽车纳米学位的入学人数。2016 年 10 月的第一批学生将只接受大约 500 名学生(我认为这实际上比最初的人数有所增加)。成千上万的人申请了,包括我,尽管我仍然只是通过 MLND 的几个项目。我被录取了(!)—但不是到十月。从 12 月开始,我将加入第三批。这实际上非常完美,因为我只完成了 MLND 的最后一个预顶点项目,就在 12 月份的队列即将开始的时候。我非常兴奋,同时也担心我会被弄得不知所措。我不仅真正接触到了一些高级材料,而且我的会计旺季即将到来(在会计行业,一月到四月并不是很有趣)。
Project 1
所以,我一头扎了进去,希望能赶在 Udacity 为我的团队安排的时间之前。在第一个项目中,我们学习了如何使用各种计算机视觉技术,包括 canny 边缘检测、掩蔽和 Hough 变换,以便检测道路上的车道线。虽然我的项目在直线道路上看起来很棒,但我使用的方法太简单了,无法在曲线上工作,这是我很快就会学会纠正的。
Project 2’s unbalanced traffic sign data
下一个项目,分类交通标志,是我第一次真正接触到建立深度学习模型。在这里,我学会了如何使用 TensorFlow 创建一个深度神经网络,经过训练后能够对路标进行高度准确的分类。这个项目的一个有趣的挑战是,给我们的数据非常不平衡,这意味着某些标志有数千幅训练图像,而其他标志只有几百幅。这给神经网络带来了一个问题——鉴于它们试图将损失最小化,不平衡的训练集可能意味着神经网络通过简单地总是弄错某些符号来学习将损失最小化。因此,如果您不检查您的数据,您可以看到您的模型实现了 90%的验证准确性(从表面上看相当稳健),同时它仍然可能得到一些信号,即每个信号只占训练图像的百分之几,100%错误。使用来自原始训练数据的增强图像,但只针对那些低于每个交通标志平均图像数量的图像,我创建了补充的交通标志图像来帮助平衡影响,并最终获得了一个在它从未见过的图像上更加准确的模型。
Smooth sailing in Project 3
第一学期的第三个项目增加了酷的因素,特别是因为 Udacity 专门为它设计了一个模拟器。这个项目使用 Keras 深度学习框架(建立在 TensorFlow 之上),以行为克隆的概念为中心。通过行为克隆,再次使用深度学习,你可以向深度神经网络教授某种行为。在这种情况下,这意味着神经网络从模拟汽车的摄像头获得图像(类似于上图),并带有标签(即神经网络最大限度地减少损失,因此将预测汽车转向角度的图像)。虽然 Udacity 最终发布了一些他们自己的训练数据,但我选择了收集自己的数据,这产生了一些有趣的问题。在赛道上,当你直线行驶时,大部分时间转向角是零度。根据我在上面提到的项目 2,你可能已经猜到了,这会产生不平衡数据的问题。因此,我必须小心地收集足够的数据,转向角不为零,否则汽车可能总是直线行驶。另一个问题是,数据不能只从车道中心收集——否则,当汽车不可避免地发现自己稍微偏向一侧时,它可能会默认回到最有可能的结果——直行。再次,我必须确保我有足够的恢复数据,包括从奇怪的地方几乎偏离路边的非常尖锐的转弯角度。也许整个第一学期最有收获的经历是看着我的模拟汽车,根据我训练过的神经网络驾驶,独自在整条赛道上行驶。
幸运的是,我已经在第一学期的第一个月左右完成了前三个项目——我已经实现了在旺季到来之前提前完成的目标!我在学期的最后两个月完成了最后两个项目。
Project 4 — Advanced Lane Detection
还记得项目一中曲线的问题吗?项目四,高级车道线,展示了更深入的技术。再次使用计算机视觉,这次学会了如何使用不同的梯度和颜色阈值来创建二进制激活图像,其中只有道路视频图像的特定区域会被激活。然后使用技术使图像不失真(所有相机都会自然产生一定量的失真),然后对其进行透视变换(想象一下道路的鸟瞰图,然后我的模型会计算一个多项式函数来拟合这条线。给定这些多项式函数,检测到的车道以及某些信息,如道路曲率和车辆相对于车道中心的位置,可以放回到原始图像上,如上所示。看到我的最终项目视频与车道检测这里。
Car detection heatmaps for Project 5
第一学期的期末项目集中在车辆检测。我从机器学习 Nanodegree 项目中学到的知识在这里派上了用场,因为我们使用了支持向量机的算法来帮助确定汽车出现在图像的哪个位置。我之前已经用过 SVM 很多次了!当然,还有一些重要的概念需要学习。定向梯度直方图(简称为 HOGs)通过显示有汽车的图像与无汽车的图像之间的梯度差异(即,图像中像素值的变化,以进行某种程度的简化)来帮助训练 SVM。接下来,训练过的 SVM 在给定的道路图像上运行——但是他们不是 100%准确。因此,我需要消除误报,同时还要考虑到汽车可能出现的距离所导致的潜在失误。上面的热图显示了解决方案的一部分——通过移除检测次数少于一定数量的检测点,生成了上面的热图,然后用边界框标记,以显示检测到的真实车辆。看我的成品这里。
下一步是什么?
因此,我完成了自动驾驶汽车纳米学位项目的第一学期,学习了一年前我做梦都想不到的技能。如果有人真的对这个领域感兴趣,我强烈鼓励他们申请(群体规模一直在持续增加)。这确实要花很多时间——考虑到我的日常工作,我仍然很惊讶我能在学期正式结束前完成它。大多数人可能每周需要 20 个小时来做这件事。这当然比大学教育便宜,尽管每学期仍要花费你 800 美元(一共有三个学期)。
但是我该何去何从呢?我的第一个目标是在这个领域找到一份工作。在这个快速扩张的领域有很多工作机会,既有老牌汽车制造商,也有大型科技公司,还有在湾区如此普遍的初创公司。当然,其中大多数仍然需要在机器人或深度学习等各个领域的多年经验。因此,虽然我仍然缺乏许多公司想要的经验,但我会继续努力,希望做出一个能让别人刮目相看的模型。这里是我在基于深度学习的车道检测模型上的预览,它可以跳过我在上面学到的大多数基于计算机视觉的技术;我希望这是个开始。幸运的是,在硅谷,许多人更关注你能做什么,而不仅仅是你做了多少年。对 Udacity 来说,他们为我提供了一位导师和大量的职业内容,以及与一些优秀的招聘合作伙伴一起参加活动的机会,这也给了我很大的希望,我将能够直接在自动驾驶汽车上工作。
不过现在,我进入了 SDCND 的第二阶段。学期 1 是计算机视觉和深度学习,学期 2 是关于传感器融合(使用雷达和激光雷达数据来跟踪你周围的物体)、定位和控制。鉴于我在这些领域都缺乏经验,我预计这将是一个艰难的任期,但我也很高兴能在这条路上向前迈进一步。在一天结束时,虽然我的第一个目标是找到一份工作,但真正的最终目标是真正看到一辆自动驾驶汽车在路上行驶,完全可供所有想骑的人使用。这才是真正的下一步。
DIY AI:一个老学校矩阵 NN
NN 如何运作,如何像多年前一样创建和训练 NN。部分 DIY AI 系列。
先决条件和代码
你需要 Python 和 Python IDE。如果你需要安装,请查阅 DIY AI 安装手册(这个故事你需要 Python 和控制台部件)。
你可以从 Github 这里下载完整的源代码。
此处可访问 draw.io 图。
那么,神经网络究竟是如何工作的呢?
正如我在上一篇文章中提到的,自 50 年代初以来,我们就试图模仿人脑及其最小的部分——神经元——本身。
最接近神经元的是一个感知器——它由多个输入、求和引擎、单个输出和一个激活函数组成。像这样:
Fig. 1. A perceptron
这东西是怎么工作的?它接受大量输入(输入实际上是一个数字,如 0.33,-13.7 等等),将它们乘以它们的权重(图中的 w1…wn)并求和。总和然后被馈送到激活函数,并传递到输出。
为什么我们需要一个激活函数?大多数情况下,我们需要介于 0…1 之间的输出值,如“是”或“否”。很难调整权重,使其对任何带有 1 和 0 的输入做出响应,但是,幸运的是,我们有一个逻辑函数,可以将任何数值映射到 0 和 1 之间的值(向该函数输入非常大的负数,如-10000,将返回接近于 0 的值,输入非常大的正数,将导致接近于 1 的值,如 0.99……)。
当然,我们可以将感知器连接成层,并形成网络,就像这样:
Fig. 2. Simple, feed-forward, fully connected neural network
输入被馈送到第一层上每个感知器的每个输入,然后第一层的输出被馈送到下一层的所有输入,对所有后续层重复相同的过程。最后一层的输出实际上是神经网络的输出。这种网络被称为前馈网络,因为数据只向前流动,没有反馈回路,而且这种网络是完全连接的,因为每个神经元接收来自前一层的所有神经元的输出。
为了保持广泛使用的术语,输入和输出层之间的层称为隐藏层。
如果输入是特征向量(比如:它有翅膀吗?它生活在水里吗?它有毛吗?它吃肉吗?)并且输出是向量,表示例如“它”的可能类别(像:动物-0.87,鱼-0.12),这种类型的网络可以用于动物园居民的分类。
那么,你可能会问,神奇的是什么?重量是。NN 的实际圣杯是调整和计算权重的方法,称为训练一个神经网络。我将在本文中介绍一种最简单的方法——反向传播。
我们如何编码神经网络?
每个开发人员都把神经网络想象成一组神经元,可以这样编码:
class Neuron
array Neuron weights[]
float output
function compute_output()
…等等,但这是过度工程化,因为我们可以用一个简单的东西来抽象整个层:矩阵。
在上面的例子中,第一层有 4 个输入,产生 3 个输出。输入是 4 个数字。
如果我们将输入表示为 1x4 矩阵,第一层为包含所有第一层权重的 4x3 矩阵,我们可以通过将输入矩阵(1x4)乘以第一层矩阵(4x3)得到第一层,从而创建 1x3 矩阵。这个矩阵乘以 3x6 层二矩阵,再乘以 6x2 层三矩阵,得到 1x2 结果矩阵。当然,在将结果矩阵传递给下一层之前,我们必须对结果矩阵的每个成员应用一个激活函数。
从视觉上讲,NN 来自图 2。是这样处理的:
Fig. 3. Example NN from Fig. 2 represented as matrixes, sigma represents activation function
因此,基本上,在神经网络中,整个层被抽象为矩阵,并且模拟神经网络最常用的函数是矩阵乘法。这实际上解释了为什么神经网络系统很容易被 GPU 加速——3D 可视化也大量基于矩阵代数!
我们如何训练他们?
在多层神经网络中,我们基本上只有输入和输出矩阵。然而,我们可以计算预期结果和实际结果之间的差异,但是我们如何调整具有不同神经元数量的许多层上的权重呢?
这个想法很简单,我们可以回到输入层,逐层比较层输入和层误差。每一层,不管有多深,都会造成下一层的误差;因此,我们可以通过将前一层输出乘以输出误差再乘以当前层输出得到的值来调整权重。这被称为反向传播,正式化时听起来非常糟糕和复杂,但是实现起来非常简单。
所以,让我们举一些经典的例子,比如手写数字识别。
首先,数据集
请看,我们的第一个数据集,著名的 Semeion 数据集:http://archive . ics . UCI . edu/ml/datasets/Semeion+手写+数字
数据集文件包含 1593 位数字,手写,扫描,适合 256 像素(16x16 像素见方)的黑白盒子。
像素(一行 256 个)放在数据集文件的单独行中,并附加 10 位表示实际结果(例如,0 0 0 1 0 0 0 0 0 0 表示 3)。
我们可以举一个数据集行的例子,看起来像这样:
0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 0.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1 0 0 0 0 0 0 0 0 0
如果我们删除数字的.0000部分,并删除多余的空格,示例将如下所示:
000111111111100001111100000111000111000000001110111000000000011111000000000000111101110000000011011100000000001111100000000000111100000000000110110000000000111011000000000111001100000000111000110000011111000001111111100000000111111100000000000111000000000 1 0 0 0 0 0 0 0 0 0
如果我们将它分成 16 个字符行,我们将得到实际绘制的零:
0001111111111000
0111110000011100
0111000000001110
1110000000000111
1100000000000011
1101110000000011
0111000000000011
1110000000000011
1100000000000110
1100000000001110
1100000000011100
1100000000111000
1100000111110000
0111111110000000
0111111100000000
00011100000000001 0 0 0 0 0 0 0 0 0
理解数据集对于成功的训练至关重要。干净而精确的数据集是你的模型中最重要的部分。
好了,理论的时间结束了,我们来编点代码吧。首先,我们需要将数据集加载到 python 代码中。我会用优秀的 numpy 库进行矩阵处理。为了存储数据,我们需要定义两个 numpy 数组(samples 和 results ),并逐行读取数据集,将每行的前 256 个数字添加到 samples 数组中,将后 10 个数字添加到 results 数组中:
Em. 1. Reading Semeion dataset with Python / numpy
很棒,是吧?现在,让我们建立一个神经网络,并确保我们可以通过它运行样本!
然后,向前传球
对于这个例子,我将使用两层神经网络,其中第一层是 256x256 矩阵,第二层是 256x10。整体架构看起来是这样的(注意当数据流经神经网络时矩阵的形状是如何变化的):
图层将由 numpy 数组表示,并预先填充相对较小的随机值(范围从-0.01 到 0.01):
上面的代码实际上展示了你如何使用训练过的神经网络。由于灭的小网还没有准备好,second_output将包含完全随机的数据。让我们修复它,训练网络!
第三,反向传播(或训练)
训练一个神经网络是一个迭代过程——我们取数据集的某一部分(我将从 100 个随机记录开始),通过神经网络传递数据集的所有样本,计算误差并反向传播误差。训练数据集的一遍被称为一个时期。
训练 NN,直到它很好或者被卡住——这意味着我们需要限制一些时期(以防止无限训练),并定义一些标准来定义 NN“足够好”。
我将使用样本误差的绝对值之和作为样本误差,使用历元的最大误差作为历元误差。当历元误差小于 0.1 时,我会认为 NN 已经完成(例如,当正确答案为0 0 1 0时,-1 0 1 0.5的误差为 1.5)。
同样,让我们记住我们的 NN 将如何被处理:
支持主训练循环的代码如下所示:
如你所见,我还定义了一个速率,它代表 NN 对变化的反应有多快;在大多数情况下,网络越大,它应该越小——这使得训练更慢但更精确。
获得输出矩阵后,我们需要计算输出误差(并将该值与当前历元误差相加):
正如您所记得的,所有的输出都是通过sigmoid函数处理的,我们需要反向传递数据。因此,我们创建了一个dsigmoid函数,它是一个sigmoid的导数:
目前,我们有 1x10 的误差矩阵,还有 256x10 的矩阵需要调整。因此,我们必须通过将第二层误差乘以经 dsigmoid 处理的第二层输出,找出第二层上的每个重量对误差的影响程度:
现在我们需要创建一个 256x10 的矩阵来调整第二层的权重。为此,我们采用先前的(第一层)输出(1x256),将其转置为 256x1,并将其乘以新找到的第二层增量。将得到的 256×10 矩阵(乘以速率)加到第二层权重将得到新的权重,有望产生更好的结果:
我们可以对第一层重复同样的过程,但是什么是第一层错误呢?这其实很容易找到——我们通过转置的第二层矩阵传递第二层增量;抽象地说,我们发现每个第一层输出值对第二层误差有多大影响。找到误差矩阵后,我们可以重复上述相同的过程来调整第一层的权重:
我们还需要一些控制,所以在每个时期结束时,让我们计算误差并打印结果:
请下载并在进入下一章之前研究实际代码!
最后,测试
好,让我们运行模型(同样,您可以从 Github 下载完整的模型)。为了方便起见,我添加了一段简单的代码,它随机抽取 12 个样本,并根据这些样本测试神经网络:
所以…让我们针对数据集的一小部分(100 条记录)运行网络:
成功!经过 40 个时期后,神经网络收敛,并且能够从样本中正确地检测数字!
好的,让我们测试一下完整的数据集(大约 1500 个样本)。运行它(如果你从 Github 下载了代码,它已经包含了完整的数据集),aaaaand 和…
而 NN 会很惨的无限挂,误差值在~1 左右。
发生了什么事?这是过度拟合的常见情况——我们一次又一次地在同一个数据集周围拖动神经网络,神经网络变得很好,但还不够好——不足以最小化误差。它也是不变的——无论我们在同一个数据集上循环多少次,误差都不会减少。
过度拟合的模型仍然可用,例如,您可以将历元计数限制为 50,并获得可接受的结果:
…但这个例子说明了第一个故事中提到的第一个人工智能冬天的许多原因之一——例如,令人震惊的发现,你不能只给 NN 提供 10 倍多的数据,并期望它变得更精确 10 倍。你需要适应、改变你的网络结构、训练模式,并进行大量的全面实验,以使这项技术变得可用。实际的方法将在以后的文章中介绍)。
这很简单。为什么我们不能用它来造一个人工智能呢?
因为事情没那么简单。你可以从大量的数据中看出神经网络的行为是如何变化的,它还取决于训练方法、时期数和网络结构。
在 DIY AI 系列的未来故事中,我将讲述更多关于架构、方法和——最重要的——*框架——*的故事,它们极大地减少了您必须编写的代码量,并允许您专注于实际的数据和架构,而不是矩阵。
敬请期待!
感谢 特拉斯克 提供初始想法 UCI 机器学习知识库 提供数据集。
DIY 深度学习项目
受阿克谢·巴哈杜尔伟大作品的启发,在这篇文章中,你将看到一些应用计算机视觉和深度学习的项目,以及实现和细节,这样你就可以在你的计算机上重现它们。
LinkedIn 数据科学社区
阿克谢·巴哈杜尔是 LinkedIn 数据科学社区给出的一个很好的例子。在 Quora、StackOverflow、Youtube、here 以及许多论坛和平台上,有很多优秀的人在科学、哲学、数学、语言,当然还有数据科学及其同伴的许多领域互相帮助。
Akshay Bahadur.
但我认为在过去的 3 年里,LinkedIn 社区在分享数据科学领域的伟大内容方面表现出色,从分享经验到关于如何在现实世界中进行机器学习或深度学习的详细帖子。我总是向进入这个领域的人推荐成为一个社区的一部分,LinkedIn 是最好的,你会发现我一直在那里:)。
从深度学习和计算机视觉开始
深度学习领域的研究对图像中的事物进行分类,检测它们并在它们“看到”某些东西时采取行动,这十年来一直非常重要,取得了惊人的成果,例如在一些问题上超越了人类水平的表现。
在这篇文章中,我将向你展示阿克谢·巴哈杜尔在计算机视觉(CV)和深度学习(DL)领域所做的每一篇文章。如果您不熟悉这些术语,您可以在此处了解更多信息:
有关于深度学习的惊人介绍、课程和博文。但这是一种不同的介绍。
towardsdatascience.com](/a-weird-introduction-to-deep-learning-7828803693b0) [## 两个月探索深度学习和计算机视觉
我决定熟悉计算机视觉和机器学习技术。作为一名 web 开发人员,我发现…
towardsdatascience.com](/two-months-exploring-deep-learning-and-computer-vision-3dcc84b2457f) [## 从神经科学到计算机视觉
人类和计算机视觉 50 年回顾
towardsdatascience.com](/from-neuroscience-to-computer-vision-e86a4dea3574) [## 吴恩达的计算机视觉——11 个教训
我最近在 Coursera 上完成了吴恩达的计算机视觉课程。Ng 很好地解释了许多…
towardsdatascience.com](/computer-vision-by-andrew-ng-11-lessons-learned-7d05c18a6999)
1.使用 OpenCV 的手部运动
[## akshaybahadur 21/hand movement tracking
在 GitHub 上创建一个帐户,为 HandMovementTracking 开发做出贡献。
github.com](github.com/akshaybahad…)
来自阿克谢:
为了执行视频跟踪,算法分析连续的视频帧并输出帧之间的目标运动。算法多种多样,各有优缺点。在选择使用哪种算法时,考虑预期用途很重要。视觉跟踪系统有两个主要组成部分:目标表示和定位,以及过滤和数据关联。
视频跟踪是使用摄像机在一段时间内定位一个移动对象(或多个对象)的过程。它有多种用途,其中一些是:人机交互、安全和监控、视频通信和压缩、增强现实、交通控制、医学成像和视频编辑。
这是复制它所需的所有代码:
import numpy as np
import cv2
import argparse
from collections import deque
cap=cv2.VideoCapture(0)
pts = deque(maxlen=64)
Lower_green = np.array([110,50,50])
Upper_green = np.array([130,255,255])
while True:
ret, img=cap.read()
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
kernel=np.ones((5,5),np.uint8)
mask=cv2.inRange(hsv,Lower_green,Upper_green)
mask = cv2.erode(mask, kernel, iterations=2)
mask=cv2.morphologyEx(mask,cv2.MORPH_OPEN,kernel)
#mask=cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel)
mask = cv2.dilate(mask, kernel, iterations=1)
res=cv2.bitwise_and(img,img,mask=mask)
cnts,heir=cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2:]
center = None
if len(cnts) > 0:
c = max(cnts, key=cv2.contourArea)
((x, y), radius) = cv2.minEnclosingCircle(c)
M = cv2.moments(c)
center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
if radius > 5:
cv2.circle(img, (int(x), int(y)), int(radius),(0, 255, 255), 2)
cv2.circle(img, center, 5, (0, 0, 255), -1)
pts.appendleft(center)
for i in xrange (1,len(pts)):
if pts[i-1]is None or pts[i] is None:
continue
thick = int(np.sqrt(len(pts) / float(i + 1)) * 2.5)
cv2.line(img, pts[i-1],pts[i],(0,0,225),thick)
cv2.imshow("Frame", img)
cv2.imshow("mask",mask)
cv2.imshow("res",res)
k=cv2.waitKey(30) & 0xFF
if k==32:
break
# cleanup the camera and close any open windows
cap.release()
cv2.destroyAllWindows()
是的,54 行代码。很简单吧?你需要在你的电脑上安装 OpenCV,如果你有 Mac 来检查这个:
在本帖中,我们将提供在 MacOS 和 OSX 上安装 OpenCV 3.3.0 (C++和 Python)的逐步说明…
www.learnopencv.com](www.learnopencv.com/install-ope…)
如果你有 Ubuntu:
[## OpenCV:在 Ubuntu 中安装 OpenCV-Python
现在我们有了所有需要的依赖项,让我们安装 OpenCV。安装必须使用 CMake 进行配置。它…
docs.opencv.org](docs.opencv.org/3.4.1/d2/de…)
如果你有窗户:
[## 在 Windows - OpenCV 3.0.0-dev 文档中安装 OpenCV-Python
在本教程中,我们将学习在您的 Windows 系统中设置 OpenCV-Python。以下步骤是在 Windows 7-64 中测试的…
docs.opencv.org](docs.opencv.org/3.0-beta/do…)
2.睡意检测 OpenCV
在 GitHub 上创建一个帐户,为睡意检测的发展做出贡献。
github.com](github.com/akshaybahad…)
这可以被倾向于长时间驾驶可能导致事故的骑手使用。这个代码可以检测你的眼睛,并在用户昏昏欲睡时发出警报。
属国
- cv2
- 免疫系统
- dlib
- scipy
算法
每只眼睛由 6 个(x,y)坐标表示,从眼睛的左上角开始(就好像你正看着这个人一样),然后围绕眼睛顺时针旋转:。
情况
它检查 20 个连续帧,如果眼睛纵横比小于 0.25,则生成警报。
关系
总结
3.使用 Softmax 回归的数字识别
用于识别数字的数字识别器机器学习分类器。
github.com](github.com/akshaybahad…)
此代码帮助您使用 softmax 回归对不同的数字进行分类。您可以安装 Conda for python,它可以解决机器学习的所有依赖性。
描述
Softmax Regression(同义词:多项式逻辑回归、最大熵分类器或多类逻辑回归)是逻辑回归的推广,可用于多类分类(假设类是互斥的)。相比之下,我们在二元分类任务中使用(标准)逻辑回归模型。
Python 实现
使用的数据集是 MNIST,图像大小为 28 X 28,这里的计划是使用逻辑回归、浅层网络和深层神经网络对 0 到 9 的数字进行分类。
这里最好的部分之一是他使用 Numpy 编码了三个模型,包括优化、前向和后向传播以及所有的东西。
对于逻辑回归:
对于浅层神经网络:
最后是深度神经网络:
通过网络摄像头执行写作
要运行代码,请键入python Dig-Rec.py
python Dig-Rec.py
通过网络摄像头显示图像的执行
要运行代码,请键入python Digit-Recognizer.py
python Digit-Recognizer.py
Devanagiri 识别
[## akshaybahadur 21/Devanagiri-识别器
使用 convnet 的 Devanagiri-Recognizer -印地语字母分类器
github.com](github.com/akshaybahad…)
这个代码帮助你使用 Convnets 对不同的印地语字母进行分类。您可以安装 Conda for python,它可以解决机器学习的所有依赖性。
使用的技术
我用过卷积神经网络。我使用 Tensorflow 作为框架,使用 Keras API 提供高级别的抽象。
体系结构
conv 2d→max pool→conv 2d→max pool→FC→soft max→分类
其他几点
- 你可以去额外的 conv 层。
- 添加正则化以防止过度拟合。
- 您可以向训练集中添加额外的图像以提高准确性。
Python 实现
数据集- DHCD (Devnagari 字符数据集),图像大小为 32 X 32,使用卷积网络。
要运行代码,键入python Dev-Rec.py
python Dev-Rec.py
4.使用 FaceNet 进行面部识别
[## akshaybahadur 21/使用 Facenet 进行面部识别
使用 Facenet 实现面部识别。
github.com](github.com/akshaybahad…)
这个代码有助于使用 face nets(【arxiv.org/pdf/1503.03… inception network 和取自 deeplearning.ai 的 fr_utils.py 作为参考。为了提供稳定性和更好的检测,我自己增加了几个功能。
代码要求
您可以安装 Conda for python,它可以解决机器学习的所有依赖性,您将需要:
numpy
matplotlib
cv2
keras
dlib
h5py
scipy
描述
面部识别系统是一种能够从来自视频源的数字图像或视频帧中识别或验证人的技术。面部识别系统有多种工作方法,但一般来说,它们通过将从给定图像中选择的面部特征与数据库中的面部进行比较来工作。
添加的功能
- 只有当你睁开眼睛的时候才能识别人脸。(安全措施)。
- 使用 dlib 的 face align 功能在直播时进行有效预测。
Python 实现
- 使用的网络-初始网络
- 原创论文 Google 的 Facenet
程序
- 如果你想训练网络,运行
Train-inception.py,但是你不需要这样做,因为我已经训练了模型,并保存为face-rec_Google.h5文件,在运行时加载。 - 现在,您需要在数据库中有图像。代码检查
/images文件夹。你可以把你的照片粘贴在那里,也可以用网络摄像头点击它。要做到这一点,运行create-face.py图像被存储在/incept文件夹中。您必须手动将它们粘贴到/images folder中 - 运行
rec-feat.py来运行应用程序。
5.表情符号
[## akshaybahadur21/Emojinator
一个简单的人类表情分类器。
github.com](github.com/akshaybahad…)
这个代码可以帮助你识别和分类不同的表情符号。截至目前,我们只支持手部表情符号。
代码要求
您可以安装 Conda for python,它可以解决机器学习的所有依赖性,您将需要:
numpy
matplotlib
cv2
keras
dlib
h5py
scipy
描述
表情符号是在电子信息和网页中使用的表意文字和表情符号。表情符号存在于各种类型中,包括面部表情、常见物体、天气的地点和类型以及动物。它们很像表情符号,但表情符号是实际的图片,而不是印刷字体。
功能
- 检测手的过滤器。
- CNN 训练模型。
Python 实现
- 使用的网络-卷积神经网络
程序
- 首先,你必须创建一个手势数据库。为此,运行
CreateGest.py。输入手势名称,你将得到 2 帧显示。看轮廓框,调整手,确保捕捉到手的特征。按“c”键捕捉图像。一个手势需要 1200 张照片。尝试在框架内移动您的手一点,以确保您的模型在训练时不会过度配合。 - 对您想要的所有功能重复此操作。
- 运行
CreateCSV.py将图像转换为 CSV 文件 - 如果要训练模型,请运行“TrainEmojinator.py”
- 最后,运行
Emojinator.py通过网络摄像头测试你的模型。
贡献者
阿克谢·巴哈杜尔和拉格夫·帕特内恰。
最后的话
我只能说这些项目给我留下了难以置信的印象,所有这些你都可以在你的电脑上运行,或者如果你不想安装任何东西,在 Deep Cognition 的平台上运行更容易,它可以在线运行。
我要感谢阿克谢和他的朋友们为开源做出的巨大贡献,以及即将到来的所有其他贡献。尝试它们,运行它们,并获得灵感。这仅仅是 DL 和 CV 所能做的令人惊奇的事情的一个小例子,并且取决于你是否能把它变成能帮助世界变得更好的东西。
永不放弃,我们需要每个人都对许多不同的事情感兴趣。我认为我们可以让世界变得更好,改善我们的生活,改善我们工作、思考和解决问题的方式,如果我们现在就调动我们所有的资源,让这些知识领域为更大的利益而共同努力,我们就可以对世界和我们的生活产生巨大的积极影响。
我们需要更多感兴趣的人,更多的课程,更多的专业,更多的热情。我们需要你:)
感谢你阅读这篇文章。希望你在这里发现了一些有趣的东西:)
如果您有任何问题,请在 twitter 上添加我:
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](twitter.com/FavioVaz)
和 LinkedIn:
[## Favio Vázquez —首席数据科学家— OXXO | LinkedIn
查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 15 个工作职位列在…
linkedin.com](linkedin.com/in/faviovaz…)
那里见:)
我是一名物理学家和计算机工程师,研究大数据、数据科学和计算宇宙学。我热爱科学、哲学、编程和数据科学。现在,我作为 Oxxo 的首席数据科学家,正在研究数据科学、机器学习和深度学习。我喜欢新的挑战,和优秀的团队一起工作,解决有趣的问题。我是 Apache Spark collaboration 的一员,在 MLLib、Core 和文档方面提供帮助。我喜欢运用我在科学、数据分析、可视化和数据处理方面的知识和专长来帮助世界变得更美好。
DIY(第 1 部分):如何创建自己的。网络机器人
你已经听到了很多关于机器人、人工智能和机器学习的嗡嗡声。也许,你想知道一个. NET 机器人有多实用,你是否应该采用这种新的、流行的技术。总而言之,关于机器人和所有支持它们的技术,你应该知道一件事。机器人技术将会继续存在!主要原因:他们比你当地的工人便宜。如果你需要证据,可以看看我们精彩的博客帖子——人工智能机器人正在为你的测试工作而来或者只是浏览网页。
机器人会帮你省钱。尽管媒体上充斥着各种高科技,但它们的制作并不复杂。我们会告诉你如何创造你自己的。NET bot 的 6 个简单步骤和 2 篇简短博文:
DIY(第一部分)
- 的 Bot 框架介绍。网
- 创造你的第一个。网络机器人
- 让机器人更聪明
DIY(第二部分)
- 让你的机器人活起来
- 将机器人连接到频道
- 给你的机器人一个声音
的 Bot 框架介绍。网
让我们从一开始就把一切说清楚。当我们使用“机器人”这个词时,我们指的是用户以对话方式与之交互的应用程序。你总是可以从头开始创建一个合适的机器人,但是让我们把它留给数字穴居人吧。现在所有的软件都有一个框架,尤其是机器人。而且,这个。NET bot 框架将通过提供来解决一些基本问题:
- 基本输入输出(输入输出处理)
- 语言和对话技巧
- 与用户的连接
- 语言支持
这个。NET bot 框架本身包含以下工具和功能:
- Bot Builder(带 SDK。网)
- Bot 框架仿真器
- 开发者门户
- Bot 连接器服务
- 渠道 API
这一切是如何运作的?简单到你都不会相信。首先,你已经有了用于实际编码的 Bot Builder SDK,以及用于 API、数据库、Azure、机器学习等附加服务的开发者门户。此外,还有一个用于测试代码的 Bot 框架模拟器。
其次,您有一个用于管理输入输出消息传递的 Bot 连接器服务
第三,有一整套渠道 API,包括社交媒体。如果你想把机器人添加到没有提供的通道中(下图),记住这里有一个自定义的 API 构建器。换句话说,你已经得到了你第一次所需要的一切。网络机器人。
创造你的第一个。网络机器人
好了,理论说够了!让我们进入正题。遵循以下步骤:
第一步。通过 Nuget 包管理器安装 Bot Builder SDK
第二步。将 Bot 应用程序模板安装到您的 Visual Studio 中
第三步。使用 GitHub 的源代码获得一个现成的机器人
第四步。使用机器人框架模拟器,以测试你的机器人
最后一步是保护你新造的机器人。这将需要一些额外的措施。然而,获得一个好的软件总是有回报的。
有几条规则可以保证你的机器人安全:
- 仅使用 HTTPS 端点
- 通过注册您的 bot 以获取 Microsoft 应用 ID 和密码来启用 Bot 框架身份验证
- 在你的 bot 的 web.config 文件中指定它的应用 ID 和密码(寻找提示)
- 使用 Bot Builder SDK 时,使用[BotAuthentication]属性指定身份验证凭据。网
提示:身份认证是这样的。您可以在适当的字段中添加 Microsoft App ID。等待初始身份验证。将新生成的 BotID 添加到适当的字段和配置(Bot 句柄)中。就是这样!
此外,在其 Bot 框架中,微软提供了一个精彩的词汇表,其中包含了所有可能不熟悉的概念:https://docs . Microsoft . com/en-us/Bot-Framework/dot net/Bot-builder-dot net-concepts。
希望在本章结束时,你已经准备好创建你的第一个机器人了。如果不是这样,请联系我——这篇文章的作者——奥莱赫·罗曼纽克@ Linkedin 点击这里。我会确保你有一个合适的。NET bot 已创建!
让你的机器人更聪明
祝贺你——你已经走到这一步了。你的机器人还活着,你是一个骄傲的机器人父亲。然而,该机器人仍然是原始的,几乎没有用。在这一点上,微软提供了一整套解决方案来增强你的机器人的大脑,特别是用于语言理解的 5 种不同的 API。
不知道选哪个?不要惊慌。第一个是最有用的。我叫路易斯。【LUIS(语言理解智能服务) 能够使用预先构建或定制训练的语言模型来处理自然语言。它有一堆非常适合你的优点(如下图)。
没有任何进一步的介绍,让我们开始计划你的 LUIS 应用程序。你的机器人和你的生意的目的是什么?你如何看待你的机器人帮助你的客户?
对于教导机器人的聪明计划,让我们经历以下步骤:
第一步。确定你的领域——LUIS 的工作方式通常围绕特定领域的主题展开。比如你有一个卖票的 app,或者一个追踪你健身情况的 app。它们都将是不同领域的应用程序,它们需要不同的 LUIS 设置。此外,还有 20 个为您提供便利的预建域名,您可以在这里找到。
第二步。确定你的意图——意图是解释你的客户想要什么的关键词。如果你的顾客写“买票”,显然这就是他想要的。如果健身机器人在对话中看到“脉搏”这个词,很可能客户需要了解他或她的脉搏。简单明了地说,列出你的客户在与你的机器人对话时可以使用的所有关键词,并从机器人方面将它们与适当的动作联系起来。
第三步。识别你的实体——为了预订你的航班,你需要一些信息,比如目的地、日期、航空公司、机票类别和舱位等级——这就是实体。你必须添加它们,才能真正实现一个意图。
所以,这就是所有乐趣的开始。您可以创建多种类型的实体:
- 简单实体— 简单实体描述一个概念。
- 分层实体— 分层实体代表一个类别及其成员。
- 复合实体— 复合实体由构成整体一部分的其他实体组成。
- 预建实体— LUIS 为 Number 等常见类型提供了预建实体,您可以使用它们来表示门票订单中的门票数量。
- 列表实体— 列表实体是明确指定的值列表。每个值由一个或多个同义词组成。在旅游应用程序中,您可以选择创建一个列表实体来表示机场名称。
规划你的 LUIS 应用程序?确定你将使用什么意图和实体?完美!不要担心,如果你不确定所有的事情,你可以在事后改变设置。现在是时候创建一个真正的路易斯应用程序,让你的机器人更聪明!
要直接为机器人创建 LUIS 应用程序,请点击这里的按照微软手册一步一步来。
如果你已经对你的路易斯有了一个清晰的计划,创作部分不会很复杂,最多需要 10 分钟。
祝你在创建和使用你的机器人上好运。如果您在上面写的任何内容或。NET Bot Framework,你可以在 Linkedin 上随意称呼我— 奥勒赫·罗曼纽克,营销经理@ DevCom 。此外,如果上面写的一切对你来说似乎是一门火箭科学,或者你只是没有时间自己做,你总是可以在这里 用请求 寻址 DevCom。哦,别忘了看看我们的,这是一个精彩的娱乐。具有机器学习能力的网络机器人。最后,感谢访问 DevCom 博客并保持安全!
链接到原博文 。随意订阅。
作者: 奥莱赫·罗曼纽克 ,营销经理@ DevCom
用 DIY Pokedex!
随着职业和生活方式的发展,我们越来越依赖软件开发。几十年前,联合国和世界各国政府试图让所有人都能读、写和进行算术运算。将来,孩子们需要学习如何阅读、写作、数学和编码!
到目前为止,我们已经有人在麻省理工学院的刮刮乐和 T2 的代码拼写领域工作。就我个人而言,我认为 Python 是一门很棒的初级语言,特别是因为它简单的语法。这使得孩子们不用担心 main()函数和类型转换的复杂性,就像我们在 C/C++/Java 中看到的那样。
从小到大,我一直是一个超级口袋妖怪迷,并意识到我可以用它来开发一些孩子们喜欢的东西。有了这些,我就有了下面的口袋妖怪系列的 Python 编程,它的一些方面对孩子们来说足够简单,而其他部分可能会让大学生挠头。总的来说,这是一个有趣的教程。完整的 ipython 笔记本,点击这里:https://github . com/snaz rul 1/PyRevolution/blob/master/Puzzles/pokescraper . ipynb
首先,为你的 Pokedex 清理网上信息
接下来,分析数据集,寻找有用的信息
最后,构建 Pokedex 的 GUI
用于具有交互式代码的机器学习任务的 DNA /蛋白质表示
Image from pixabay
所以在今天的帖子中,我不打算执行任何机器学习任务,而是它是 DNA 和蛋白质数据的预处理步骤。
请注意,我从这篇博文和这篇博文中截取了部分代码。所以,如果你想了解更多关于生物信息学或热门编码的知识,去看看那些博客吧。
第 0 步——获取 DNA 和蛋白质表
所以上面的字典代码直接来自 Vijini Mallawaarachchi 的开始于生物信息学——将 DNA 序列转化为蛋白质序列,做了一些小的改变。没有终端信号,这是因为在我要执行的机器学习任务中不需要它。
步骤 1——生成 DNA 序列和蛋白质序列
如上所述,我们已经声明了一些超参数,表示训练数据的数量或蛋白质序列的长度。我们将从步骤 0 中声明的字典中随机选择一对 DNA 序列和蛋白质。
步骤 1.5——使用 1–4 法则对 DNA 进行编码
Image from Paper
因此,有几个 DNA 映射规则来编码 DNA,然而在这篇文章中,我将使用 1-4 规则。这里我们给每一个 DNA 序列分配(1*4)个向量。下面是生成的 DNA 序列,以及编码的数据。
步骤 2——验证生成的蛋白质序列
Genetic Code Chart for DNA (www.geneinfinity.org/sp/sp_genco…)
我们可以通过查看上图来验证生成的蛋白质序列是正确的。
步骤 3——蛋白质序列的一次热编码
红框→ 重复蛋白 A 绿框→ 重复蛋白 T
因此,由于我们有两个重复的蛋白质,我们只需要(1*8)个向量来表示每个蛋白质。
这就是了!非常简单,但对于机器学习来说是完美的。
交互代码
为了交互代码,我搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问代码,请点击此处。
最后的话
由于期中考试,我不能写机器学习的帖子。然而,一旦这结束了,我会回去写那些!
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 从生物信息学开始——将 DNA 序列转化为蛋白质序列。(2017).走向数据科学。检索于 2018 年 3 月 9 日,来自https://towards data science . com/starting-off-in-bio informatics-turning-DNA-sequences-into-protein-sequences-c 771 DC 20 b 89 f
- 不平衡 DNA 序列中启动子识别的二元特征映射规则分析。(2018).中等。检索于 2018 年 3 月 9 日,来自https://medium . com/@ SeoJaeDuk/analysis-of-binary-feature-mapping-rules-for-promoter-recognition-in-balanced-DNA-sequence-C4 b 557 FB 3105
- j . brown lee(2017 年)。如何在 Python 中对序列数据进行热编码-机器学习掌握?机器学习精通。检索于 2018 年 3 月 9 日,来自https://machine learning mastery . com/how-to-one-hot-encode-sequence-data-in-python/
- [1]2018.【在线】。可用:https://www . research gate . net/publication/224347982 _ Analysis _ of _ binary _ feature _ mapping _ rules _ for _ promoter _ recognition _ in _ unbalanced _ DNA _ sequence _ datasets _ using _ Support _ Vector _ Machine。【访问时间:2018 年 3 月 7 日】。
- 遗传密码。(2018).Geneinfinity.org。检索于 2018 年 3 月 9 日,来自 www.geneinfinity.org/sp/sp_genco…
DNA 序列数据分析——从生物信息学开始
在我的上一篇文章中,我已经介绍了 DNA、核苷酸及其排列的基础知识。你可能想知道我们如何确定 DNA 分子核苷酸的精确顺序。这就是 DNA 测序发挥作用的地方。
什么是 DNA 测序?
测序是确定给定 DNA 分子核苷酸精确顺序的操作。用于确定一条 DNA 中四个碱基 ***【腺嘌呤(A)******鸟嘌呤(G)******胞嘧啶(C)******胸腺嘧啶(T)***的顺序。
DNA 测序用于确定生物体的单个基因、完整染色体或完整基因组的序列。DNA 测序也成为测定 RNA 或蛋白质序列的最有效方法。
DNA Molecule (Image Source: pixabay.com)
测序的历史
英国生物化学家弗雷德里克·桑格完成的工作为蛋白质测序奠定了基础。1955 年,桑格完成了胰岛素中所有氨基酸的测序。他的工作提供了证据,证明蛋白质由具有特定模式的化学实体组成,而不是物质的混合物。
Frederick Sanger (Image Source: en.wikipedia.org/wiki/DNA_se…)
后来,弗雷德里克·桑格和他的同事在 1977 年发明了一种叫做桑格测序的方法,这种方法可以通过产生片段来对 DNA 进行测序。这是大约 40 年来最广泛使用的测序方法。
全基因组测序和序列组装
DNA 测序反应产生一个几百个碱基长的序列。基因序列通常有数千个碱基长。已知最大的基因是与杜氏肌营养不良相关的基因。长度大约为240 万碱基*。为了研究一个完整的基因,科学家们使用了一种简单的策略,称为鸟枪测序。长 DNA 序列由一系列较短的重叠序列组装而成。让我们看看鸟枪测序法会发生什么。*
猎枪测序
Shotgun Sequencing
被称为测序机器的特殊机器被用来从我们希望确定的特定基因组中提取短随机 DNA 序列(目标基因组)。目前的 DNA 测序技术不能一次读取一个完整的基因组。它能读取 20 到 30000 个碱基的小片段,这取决于所用的技术。这些小片段被称为读作。特殊的软件被用来根据它们如何重叠来组合这些读数,以产生被称为重叠群的连续串。这些重叠群可以是整个目标基因组本身,也可以是基因组的一部分(如上图所示)。
为了重建原始序列,排列和合并较长 DNA 序列片段的过程被称为序列组装。
为了获得整个基因组序列,我们可能需要产生越来越多的随机读数,直到重叠群与靶基因组匹配。
序列装配问题
顺序装配问题可以描述如下。
给定一组序列,找出包含该组所有成员的最小长度字符串作为子字符串。
Image Source: www.homolog.us/Tutorials/i…
由于基因组中重复序列的存在以及它们之间的替换或突变,这个问题变得更加复杂。
序列组装问题可以与现实生活场景进行比较,如下所示。
假设你拿了一本书的许多副本,用不同的刀具将每一份通过碎纸机,然后你试图通过将碎片粘在一起将书的文本重新组合在一起。很明显,这项任务相当困难。此外,还有一些额外的实际问题。原文可能会有很多重复的段落,碎纸过程中可能会修改一些碎纸出现错别字。另一本书的部分内容可能也加入了进去,有些碎片可能完全无法辨认。
这听起来很令人困惑,而且很难实现。这个问题被称为 NP 完全。NP 完全问题是状态未知的问题。对于任何 NP 完全问题,还没有发现多项式时间算法,也没有人能够证明对于它们中的任何一个都不存在多项式时间算法。然而,有贪婪算法来解决序列组装问题,其中实验已经证明在实践中表现相当好。
解决序列拼接问题和进行序列数据分析的一种常用方法是序列比对。
序列对比
序列比对是一种排列 DNA、RNA 或蛋白质序列以识别相似区域的方法。被鉴定的相似性可能是序列之间的功能、结构或进化关系的结果。
如果我们比较两个序列,它被称为成对序列比对。如果我们比较两个以上的序列,这被称为多序列比对。
下一代测序
下一代测序(NGS) ,也称为高通量测序,是用于描述许多不同现代测序技术的统称,例如,
这些最新技术使我们能够比以前使用的桑格测序更快更便宜地对 DNA 和 RNA 进行测序,并彻底改变了基因组学的研究。
最后的想法
序列数据分析已经成为基因组学领域中一个非常重要的方面。生物信息学通过提供不同的软件解决方案和省去所有繁琐的手工工作,使生物学家的分析任务变得更加容易。
你可以从 这里 找到用于 DNA 测序的软件工具列表。此外,你可以在 这里找到 的序列比对软件列表。
希望你对序列数据分析有了一个基本的概念。
在我的下一篇文章中,我将带你浏览双序列比对的细节和一些在该领域使用的常见算法。
因为我对这个领域还很陌生,所以我想听听你的建议。😇
感谢阅读…😃
机器人会看到电蓝色吗?—视觉化色彩感知的潜在空间
Visualization of the learned color space
TL;速度三角形定位法(dead reckoning)
我想更好地理解使用神经网络将数据映射到潜在向量空间的过程。我记得这个调查要求人们说出随机呈现的颜色。因为颜色能产生引人注目的视觉效果,而且我以前没见过这样的效果,所以我认为这是一个很好的训练范例。神经网络的任务是将具有相同名称的颜色分组到新颜色空间的相似区域中。通过在学习的颜色空间中绘制每种颜色的新位置来可视化结果。
介绍
在机器学习中,向量空间可以用于对语义相似的项目进行分组。例子包括人脸识别、句子相似度和内容创建。其思想是获取可变的输入数据,例如不同光照条件下同一张脸的照片,并将其映射到向量空间中相同或相似的区域。我将使用颜色感知调查的数据来说明这个概念。以前没见过这样做的,真的很兴奋的跟大家分享。
那么,什么是潜向量空间呢?
本质上,潜在向量空间是一种输入的表示,它被编码成语义上有意义的。语义相似的条目应该被映射到相似的空间区域,即使原始输入数据非常不同。
让我们把定义分解一下:向量就是一组数字。在向量空间中,每个数字代表一个独立轴上的位置。你可以想象一个指向一个位置的向量,或者一个点,在多维空间里。潜在的被定义为“(指某种品质或状态)存在但尚未发展或显现;隐藏的或隐蔽的”。在潜在向量空间中,轴的含义是通过训练过程发现的,而不是事先确定的。
一个常见的例子是 word2vec ,其中单词被编码成一个向量。一个词的意思完全由句子中与其相邻的词来决定。这个新向量空间的轴编码了有趣的语义属性。下图显示了性别轴。
有了潜在的向量空间,我们希望发现一些隐藏的,但却存在的数据的形状或顺序。
映射颜色
理解发现这些隐藏性质的过程的一种方式是从我们已经知道的向量空间开始。这就是颜色的由来。颜色通常用 3 个数字的向量来表示,分别代表红、绿、蓝(RGB)的值。其他常见的颜色空间有 HSV、YUV、CIE 等。
训练网络需要执行一项任务,比如给一张照片贴标签,或者预测句子中的下一个单词。Word2Vec 和句子向量就是这样构造的。在单词袋模型中,一个句子片段被呈现,其中一个单词被移除。网络试图根据相邻的单词来猜测丢失的单词。
数据清理和数据集创建
网络漫画 XKCD 进行了一项调查,参与者被要求说出展示的颜色。原始调查数据由每种呈现的颜色和参与者输入的姓名组成。在使用这些数据之前,需要进行一些清理。我冒昧地组合了我认为明显是相同颜色名称的条目。例如,我组合了蓝色和浅蓝色、砖红色和砖红色、褐色和紫红色的条目。有兴趣的可以看看这个笔记本看看我到底做了什么。
Sample of the colors labeled “red”
Plot of the input colors from the survey
训练神经网络
我使用的网络是一个完全连接的网络,有一个输入,两个隐藏层和一个输出。输入层采用 3 个浮点数,对应于我们原始的 RGB 颜色值,输出 50 个值。两个隐藏层的宽度也是 50 个值。输出层将从第三层获取 50 个隐藏值,并输出 3 个浮点数。输出将是我们新的颜色空间。
当训练神经网络时,对输出进行评分,看它根据输入预测正确结果的程度。这个分数叫做损失函数。最简单的损失函数是 L1 损失,它是输出和期望值之差的绝对值。你可以在这里阅读更多关于损失函数的内容。在这种情况下,损失函数更有趣一些。我们不能使用通常的猜测游戏,因为我们要求网络创建一个新的向量,而不是对已经标记的数据进行分类。任务是为相似的输入创建彼此靠近的向量,为不相似的输入创建彼此远离的向量。实现这一点的一种方法是使用三重边际损失函数。
Sample of the triplet dataset colors. The top, middle and bottom are the anchor, positive and negative colors respectively
三重损失以三个值作为输入,输出一个分数。这三个值是锚值、正值和负值。锚色是有问题的颜色,正片是与锚色同名的颜色,底片是不同名称的颜色。训练网络时,这三个值在网络中运行,一次一个,并保存输出。然后将这三个值提供给损失函数,该函数根据锚色和正色的距离以及负色的距离产生一个分数。然后这被用作反向传播中的误差值。在每批颜色通过网络后,相似的颜色将具有彼此更接近的矢量,而不相似的颜色将相距更远。
一旦这个过程完成,我们应该有一个新的彩色地图。
但是什么地图?
在培训之前,我看到了以下几种可能性:
1)网络不训练,也就是说损失值永远不下去,网络没有学到什么有用的东西。
2)网络训练并且损失函数减小,但是结果是无意义的。这将是过度拟合的结果。
3)网络训练并产生可理解的感知色彩空间。
4)网络训练并产生颜色空间,该颜色空间对颜色进行分组,但在其他方面是独特的。
5)网络训练并产生与原始颜色值相似的 RGB 值。
在训练开始前,我的猜测是第四名。
培训结果
在训练网络和绘制颜色之后,我会说结果是#3 和#4 的混合。绿色和红色相距甚远,正如你对人类色觉所知的那样。似乎也有一个暖/冷轴以及一个亮/暗轴。绿色似乎比其他颜色占据更大的体积。一点绿色偏见也是有道理的。我不知道角落里的绿点是怎么回事。
One view of the 3D color space
结论
这就是,一台机器从调查数据中学习色彩空间。我认为这说明了机器学习系统从大量数据中提取意义的能力。这里的信号很小,只是单独的颜色/名称对,但有了如此大量的数据,就可以学习更大的结构。从头再来一次训练,看看结果会有多大的不同,这将会很有趣。如果结果非常相似,那么在给定输入和网络拓扑的情况下,最终结构不可避免地会有一些问题。
请鼓掌👏如果你喜欢这篇文章,并希望看到更多类似的。
更快地做数据科学
人工智能是许多企业的目标。但是,为了做人工智能,一个组织需要机器学习。而且,没有分析,机器学习是不可能的。没有简单、优雅的数据基础设施,分析是不可能的。简单来说,正如已经说过的,没有 IA(信息架构)就没有 AI。这两个领域的成功更多的是文化,而不是技术。
文化要么是一家公司最强大的资产之一,要么是一种障碍。大多数企业没有数据文化。许多人甚至不知道他们需要它。具有讽刺意味的是,组织的当前文化经常阻止企业知道他们需要一个新的文化(即由于树木而看不到森林)。
我认为数据文化的最大障碍是对复杂性的恐惧。本·汤普森曾写道:“文化不是导致成功的东西,而是成功的产物。”如果一个企业在数据方面没有取得可见的/实质性的成功,人们怎么可能期望它形成一种数据文化?
为了将数据转化为竞争优势,公司必须播下数据文化的种子,用切实可行的方法取得成功。换句话说,他们必须让他们的组织能够更快地进行数据科学研究。
我曾经听说数据科学项目和软件工程项目的区别在于,对于前者,你不知道它是否真的能工作。即使你是一个坚定的“快速失败”支持者,对许多人来说这也是一个太多的未知数。大多数进行投资的组织都希望了解他们将如何获得投资回报。我知道这不是硅谷的口头禅,但大多数企业的投资回报率标准与硅谷不同。没有对错,只是不同而已。许多企业更喜欢高确定性和适度回报,而不是更激进的方法。在经济学中,我们称之为对风险调整回报的容忍度。
我的观察是,大部分投入到构建和部署机器学习的时间,并没有花在算法和模型上。相反,它被花费在最平凡的任务上:数据准备、数据移动、特征提取等。这是不可避免的,也是数据科学项目中风险最大的地方;垃圾输入/垃圾输出导致低确定性。
我在每个组织中都发现了两个问题:
1)渴望大规模应用数据科学和机器学习。现在可以肯定的是。
2)迁移到云的意图,以加速数字化转型。
我们从大型数据集的假设开始。无论是在公共云、私有云、Hadoop、数据仓库还是其他环境中,理想的解决方案都支持跨所有数据类型和位置的联合。我们正在进入一个多云世界。使用一个分布式的通用 SQL 引擎,这很容易做到:多个云就像一个云一样。
一旦您可以轻松访问所有数据,下一个挑战就是应用数据科学和机器学习:构建、训练和部署模型。然后,通过反馈循环,利用这些模型进行预测,并自动执行以前的手动任务。从根本上说,这是关注数据科学的两个原因:预测和自动化。
最后,迁移到云现在就像点击一个按钮一样简单。有了私有云和公共云的通用代码库,就可以轻松地在任何需要的地方移动数据和运行应用程序。借助数据科学经验,您可以根据需要构建模型(私有云或公共云)并部署到任一环境。你的数据受限于你的想象力,而不是你的防火墙。
人工智能从根本上讲是使用机器学习和深度学习技术来实现基于数据的应用。每个渴望数据文化的组织都必须选择一个起点。深度学习将使以前无法访问的数据变得可访问;如果这会创造动力,成功的可能性很高,那就是你应该开始的地方。对于其他组织来说,更好的预测和自动化将催生一种数据文化。不管你选择哪条路,目标都是一样的:更快地研究数据科学。
— — — — —
GANs 真的模拟了真实的数据分布吗,或者他们只是在巧妙地愚弄我们?
自 2014 年引入以来,生成对抗网络(GANs)已经成为密度估计任务的流行选择。方法很简单:GAN 框架由两个网络组成,一个用于生成新样本,另一个用于区分真实样本(来自真实数据分布)和生成的样本。使用敌对一词是因为他们有相互竞争的目标,所以一方试图“智胜”另一方。这些网络被联合训练,使得来自一个网络的梯度反馈改善了另一个网络,直到(希望)生成器能够生成好的鉴别器不能辨别是否是真实图像的图像。
GANs 背后的理论是有希望的。事实上,如果在训练过程的每个步骤中,每个网络都被训练完成,则 GAN 目标可以被示为等效于最小化真实数据密度和模型数据密度之间的 Jensen-Shannon 散度。然而,在实践中,这些分析的假设并不成立。事实上,成功地训练 GANs 是一项众所周知的艰巨任务,在过去的两年中已经取得了许多进展。无论如何,在实践中,GANs 在多大程度上能够忠实地模拟真实的数据分布仍然是一个未决的问题。
最近的一项工作显示了非常有希望的结果,这就是 NVIDIA 著名的“GANs 渐进增长”,,其中鉴别器和生成器都在渐进增长,直到生成 1024x1024 的高质量图像。“伪名人”生成的面孔似乎暗示了对上述问题的肯定回答。是这样吗?
我们如何知道 gan 是否成功?
评估 GANs 性能的主要挑战是,没有对分布拟合程度的内在评估,这使得研究人员(在很大程度上)承担了对结果进行定性评估的任务。
仅仅查看生成的输出并惊叹人脸看起来有多逼真是不够的。众所周知,GANs 易受模式崩溃的影响,在这种情况下,目标分布没有完全建模,生成器往往会产生非常相似的图像(指真实分布的“模式”)。当训练集由成千上万的图像组成时,我们如何确定 generator 不仅仅是在训练图像之间进行平滑插值(或者在最坏的情况下,仅仅是记忆数据集)?
模式崩溃没有发生的一个很好的指示是产生的输出中的多样性。对多样性的简单检查如下:
选择两个产生真实图像的随机噪声向量,并通过从位于连接两个向量的线上的种子生成图像来生成“插值”图像。如果这些图像中有许多是合理的,那么我们就有充分的证据证明生成的分布能够产生各种各样的图像。
来自尼维迪亚的人们非常友好地提供了整整一个小时这样的插值供你欣赏:
然而,这仍然没有解决原创性的问题:如果 GAN 设法真实地模拟了数据分布,那么它生成类似于训练图像的图像的可能性很小,甚至不存在。虽然 youtube 视频显示了许多高质量生成的人脸,但 GAN 会不会只是在它收到的训练图像之间做了聪明且视觉上有吸引力的插值?它真的创造了新的名人,还是仅仅在现有名人之间创造了巧妙的融合?
关键是证明样本多样性(例如,显示生成的分布的支持是大的)是不够的。需要确定生成的输出与训练示例有显著差异。
为此,NVIDIA 论文的作者使用了最简单的方法,即显示训练集中生成的人脸的最近邻,其中使用的度量是像素空间中的 L1 距离(图像的中心裁剪)。
top: generated outputs, bottom: nearest neighbor in training set, as calculated using L1 distance in the pixel space of the center crop
我猜这里的假设是,因为人脸是归一化的(对齐的和正面的),所以在像素空间中测量距离是真实相似性的良好代理,但结果有时很差,如最右边的一对所示。
这感觉像是少了什么。一些生成的图像看起来有点眼熟,我就是想不出真实的名字。如果在训练集中真的有这些名人的图像,而比较 L1 像素强度没有发现,那会怎么样?
为了获得一些灵感,我想出了自己的测试:我向我的(不了解人工智能的)家庭成员展示生成的输出,并问他们是否认识这些图像中的任何一个。这些回答非常有趣。我得到的答案包括碧昂斯(左二)、“头发怪异的克里斯·洛克”(左四)和“女版迈克尔·道格拉斯”(最右边),这其实是一个相当不错的猜测。
left: generated image from GAN; right: Michael Douglas
除了笑,这让我想到那里可能有什么东西。我只需要一个更有条理的方法。
人脸识别救场!
如果我们用语义损失函数代替朴素的 L1 损失,在数据集中寻找最相似的人,会怎么样?这其实很简单。事实证明,在人脸识别任务中训练的网络最后一层的特征对于计算两个人之间的语义相似度是有用的(事实上,这就是脸书如何知道在你上传的图像中标记谁)。在这种情况下,我很懒,使用了 dlib ,这是一个用于面部检测和面部标志检测的长期工具。他们最近增加了预训练的人脸识别模型,让你只用几行代码就能计算出人的“语义特征”。这实际上对于大量涉及人物图像的下游任务非常有用,所以这是一个很好的工具。
我使用这种方法在 celebA 的非 HQ 版本(我唯一可以访问的版本)中搜索语义相似的图像,这是用于训练 NVIDIA 的 GAN 的数据集。下面是我找到的一些“最近邻”对。在下面的所有例子中,左边是高质量生成的图像,右边是来自 celebA 的“语义”邻居。肯定比 L1 的邻居好得多,一些相似之处也很明显。(请注意,这些不是“精选的”,我只为从他们的文章中提取的大约 10 个生成的人脸做了这件事)。
总结
- 对 GANs 的评估迫使我们求助于“适合度”的定性测量。
- 当在大数据集上训练 GAN 时,视觉上引人注目的多样化输出本身并不能证明 GAN 训练成功恢复了真实的数据分布。需要更严格的证据来证明 GANs 不仅仅是训练集的“智能记忆”。
- 如果可能的话,选择语义相似性,而不是简单地使用原始数据的欧几里德距离(特别是当你试图提出一个有意义的观点时)
- 具体到人脸,你可以非常容易地获得“现成的”高质量语义特征。对于这个项目,我使用了 dlib 的预训练人脸识别网络。再简单不过了!
人类有交配季节吗?这张热图揭示了生日和季节之间惊人的联系
动物本质上是季节性动物:鹿在秋天交配,所以它们的幼鹿正好在食物变得更加丰富的春天出生。北极熊在春末夏初寻找配偶,并在 12 月至 1 月间产下幼崽。
但是人类呢?我们是唯一没有真正交配季节的动物吗?毕竟,人类全年都有性生活,不用担心他们的婴儿是否有足够的食物过冬。
看起来我们有——某种程度上。
这张由 Visme 基于最新的联合国活产数据绘制的热图不仅揭示了出生高峰月份和季节之间令人惊讶的联系,还揭示了出生高峰月份和纬度之间令人惊讶的联系(纬度是赤道以北或以南的距离,以度为单位):
你注意到北半球高纬度国家的一致模式了吗?平均每天出生人数最多的月份是七月、八月和九月。
当你向下移动国家列表,从最高纬度到最低纬度排序,你可以清楚地观察到出生高峰期越来越向右移动,发生在一年的晚些时候。
一旦你进入中纬度地区,或热带地区,9 月和 10 月就成为平均每天活产婴儿数量排名最高的月份,其次是 11 月和 12 月,有些会延续到下一年。
排名垫底的是南半球的国家,这些国家在 3 月至 5 月期间每天平均出生人数最高。
当这些数据转化为受孕日期时,使用 40 周的妊娠期,我们还可以看到,在俄罗斯、挪威、芬兰和丹麦等高纬度国家,制造婴儿的高峰时间是 10 月,如下面用 Visme 制作的图所示。
根据同样的数据,在很多国家,12 月是另一个受孕高峰月,包括美国、英国、澳大利亚、加拿大、墨西哥和日本。
使用这个 DIY 工具,在几分钟内创建您自己的令人难忘的信息图表。免费试用
这些趋势意味着什么?
虽然这很容易归因于长期以来的假设,即较冷的温度会让我们在身体亲密关系中找到温暖,但可能的科学解释要复杂一些。
根据发表在《生殖节律杂志》上的一项研究,一年中受孕的理想时间是当太阳出来 12 个小时,温度在 50 到 70 华氏度之间。出于不完全清楚的原因,这些是受孕的完美条件,要么因为它们刺激精子生成或排卵——要么两者兼而有之。
其他研究的发现也与从这张热图中获得的见解一致。例如,发表在《英国皇家学会学报 B》上的对人类出生季节性的综合分析得出结论,出生高峰期出现在一年中你越往南走的晚些时候,如下图所示。
邓波儿在她为 Slate 撰写的文章中也做了计算,并得出结论,北纬度国家在秋季怀孕的频率更高,而更靠南的国家则在冬季怀孕,这也在一定程度上与我们的研究结果一致。
其他研究,比如这项关于性活动季节性变化的研究,得出的结论是,事实上“在圣诞节前后,性活动和不安全性行为有所增加。”甚至对谷歌搜索的分析,作为性活动的替代指标,也表明与性和交配行为相关的查询在冬季和初夏达到高峰。
所有这一切似乎表明,这里有环境和生物两方面的因素在起作用,而且最终,我们可能无法精确地找到这些模式存在的确切原因。
我们可以肯定的是,尽管人类似乎有一个准交配季节,但这并不是一个真正的季节,因为女性全年都容易接受性行为,每 28 天排卵一次,而不是每年。与其他动物不同,人类隐瞒了排卵,因为他们没有表现出任何生物生育的外在迹象,这对科学家来说仍然是一个谜。
方法学
为了创建上面的热图,我们按月份过滤了最新的联合国活产数据,以获得 2000 年至 2015 年之间的数据(这是列出的所有国家中数据量最大的时期)。
为了说明每个日历月天数的差异,我们计算了每个月每天活产婴儿的平均数量,并对一年中的每个月进行了排名。
例如,对于美国,计算每个月每天的平均活产数。然后根据每天活产婴儿的平均数量,从最高到最低对每个月进行排名。由于 9 月份是这一时期每天平均出生人数最多的月份,因此该月份的排名为 1;八月展示了第二高的总数,因此获得了 2 的排名;诸如此类。
然后,使用与每个月的等级值(从 1 到 12)相对应的色标创建热图。通过这种方式,彩色编码的可视化将使得国家和半球之间的比较变得容易。否则,一个国家与另一个国家之间的活产婴儿数量的巨大差异将产生一个范围太广的色阶,使观众无法进行快速的视觉比较。
轮到你了
你对这些受孕和生育趋势有什么看法?你认为除了气候和季节之外还有其他外部因素吗?请在下面的评论区告诉我!