重叠向量和向量投影
寻找共线向量并解决向量重叠(如果有的话)
向量是表示方向大小的非常强大的方法。它们是几何学的组成部分,广泛应用于各种学科,如物理学、计算机视觉和机器学习。有多种方法可以利用向量的不同性质得到重要的结果,在本文中,我们将介绍三个这样的结果。
1)确定两个向量是否面向同一方向。
2)检查投影到向量上的 3D 空间中的点是否位于向量内部。
3)检查两个向量是否相互重叠,如果是,是否有方法消除重叠?
以上所有的观察都是相互联系的,它们在最后一个观察中结合得很好。
在我们开始之前,让我们快速看一下向量点和叉积。
D **ot 乘积:**是指向同一方向的两个向量的大小的乘积或乘积。因为它是量值的乘积,所以得到的答案是标量。可以考虑用相同方向的矢量。
a . b = | a | * | b | * cos(θ)=(| a | * cos(θ)) | b | = ax * bx+ay * by*
表示点积的不同方法。(来源:mathisfun)
所有不同形式的写同一个点积表示沿同一方向的向量相乘。这里一个重要的观察是,对于垂直矢量,点积为零。
a . b = 0as cos(90)= 0。
它可以被认为是相同方向上的矢量幅度的乘法。
C **罗斯乘积:**是两个矢量 a 和 b 的乘积,使得合成矢量垂直于 a 和 b 。从另一个角度来看,合成向量是由两个输入向量 a 和 b 定义的平面的法线。合成向量的大小将给出由 a 和 b 形成的平行四边形的面积。
a x b = | a | * | b | * sin(θ)=(| a | * sin(θ)) | b |)*
叉积的不同表示方法。(来源:mathisfun)
这里一个重要的观察是,对于面向相同方向的向量,叉积为零。
a×b = 0as sin(0)= 0。
C 罗斯乘积是两个矢量 a 和 b 的乘积,使得合成矢量垂直于 a 和b
现在我们有了矢量交叉和点积的基本知识,我们可以开始推导这些强大的结果。
1。确定两个向量是否面向同一个方向。
G 给定两个向量 a 和 b,如下图所示,用红色和蓝色表示,如果向量尾部之间的角度是锐角或在[0,90]或[0,-90]之间,则称向量方向相同。
这可以通过使用矢量点积很容易地找到。计算点积的角度是通过连接两个向量的尾部并取它们之间的角度得出的,如下图所示。
如前所见,矢量点积由 *a.b = |a| |b| * cos(θ)给出。 现在由于矢量的幅度总是正的,点积的符号由 *cos(θ)控制。*我们知道,在坐标系的第一或第四象限中,任何一个角度的余弦值在[0,90]或[0,-90]的范围内总是正的,因此,如果点积是 正的 ,我们可以说这些矢量都朝向 同一个方向 。同样,如果点积是 负 ,我们可以确凿地说,这些向量是朝向 相反方向 。
面向相反方向的向量,a)180°角 b)135°角。面向相似方向的向量,c)角度为 0,d)角度为 30。(来源:作者)
因此,
a . b ≥ 0:向量面向同一个方向。
a . b < 0:矢量朝向相反方向。
2)检查投影到向量上的 3D 空间中的点是否位于向量内部。
我们可以使用向量投影来检查一个点在投影到向量上时是否在向量内部。问题清楚的显示在下图中。我们将在后面讨论的一个非常有用的应用是寻找两个向量是否相互重叠。
a,b)投影点位于矢量内部。c,d)投影点位于向量之外。(来源:作者)
我们将使用矢量投影来解决这个问题。请看下图,我们可以看到点 P1 投影到矢量 BA 上形成矢量 P1’A。如果我们能找到|P1’A|的大小,我们就能找到矢量 P1’A,因为它的方向就是矢量 BA 的方向。现在:
BA = B-A; P1A = P1- A; cos(θ1) = |P1'A|/|P1A|;
P1A.BA = |P1A|*|BA|*cos(θ1); Hence **|P1'A| = P1A.BA / |BA|
P1'A = |P1'A| * BA / |BA|**(unit vector along BA)
描绘矢量投影(来源:作者)
现在我们有了大小|P1’A|我们可以简单地使用下面的条件来检查投影点 P1 '是否位于向量 BA 内。
投影点位于向量内部,如果:0 ≤ |P1’A| ≤ |BA|
上面的等式是正确的,因为如果投影长度|P1’A|大于向量|BA|本身的长度,则该点必须位于远离右侧的点 B 处,因此在向量之外。另一方面,如果投影长度小于零,则该点必须远离左侧的点 A。
我们知道 P1A。BA > 0 因为 P1A 和 BA 都面向同一个方向,所以我们可以肯定地说,点 P1 的投影落在向量 BA 上。
同样为点 P2, P2A。巴< 0 ,因为和巴面向相反的方向。因此,点 P2 将不能够满足 0 ≤ |P2’A| ≤ |BA|的条件,因此,点 P2 的投影将不位于向量 BA 内。
3.检查两个向量是否相互重叠,如果是,有没有办法消除重叠?
重叠向量可能有三种情况:
- B1F1 和 B2F2 部分重叠。图的 a 和 b 部分。
- B1F1 与 B2F2 完全重叠,反之亦然。图的 c 部分。
- B1F1 和 B2F2 不重叠。图的 d 部分。
a),b)部分重叠的向量,c)完全重叠的向量,d)不重叠的向量(来源:作者)
让我们把蓝色向量看作根向量,红色向量看作邻居向量。同样,由 F 表示的点是矢量的前端,B 中的点是后端。O1 和 O2 是投影到相邻向量上的根向量的前后点。
现在,为了检查重叠,我们可以使用我们在*“检查投影到矢量上的 3D 空间中的点是否位于矢量内部”*中导出的公式来检查根矢量的投影前点或后点是否位于相邻矢量上。利用这些信息,我们可以得出三个观察结果:
从投影点 O1 和 O2,
1.如果任一点位于相邻向量上,而另一点不在,则向量部分重叠。
2.如果点 O1 和 O2 都位于相邻向量上,则相邻线与根线完全重叠。
3.如果点 O1 和 O2 都不在相邻向量上,则向量不重叠。
因此,通过上面的观察,我们可以检查两个向量是否相互重叠。
既然我们知道了如何检查重叠向量,那么让我们来讨论一下是否有消除重叠的方法。
(来源:作者)
如果两个几乎共线的向量重叠,并且我们想要将它们合并成一个向量,这可能是有用的。这个过程的第一步是估计根向量和相邻向量上的重叠区域。两条红色虚线描绘了上图中的重叠区域。现在我们已经有了相邻线的重叠区域 O1F1,因为我们之前已经计算了点 O1。我们同样可以得到 O3,它是邻线的前点在根线上的投影。这样,我们已经隔离了两条线的重叠区域 O1F1 和 O3B2。
最后一步是将重叠的向量合并成一个向量。这里有两种可能的解决方案:
- 修剪根向量和相邻向量的重叠区域,并完整连接另一个向量。
- 将根向量和相邻向量分解成多个等距点,并在重叠区域上找到对应点的平均值。
我们总共涵盖了三个重要的观察结果:
1。使用矢量点积检查矢量是否面向同一方向。
2。求一个点在向量上的投影,看投影点是否在向量内。
3。检查重叠向量和消除重叠的方法。
如果你有任何问题,请联系我。
参考资料:
- https://www.quora.com/Why-do-we-sine-for-cross-products
- https://www.mathsisfun.com/algebra/vectors.html
向量空间模型
自然语言处理笔记
自然语言处理专业课程 1 第 3 周笔记
继续我们的自然语言处理笔记系列,你可能已经注意到我跳过了第 2 周。这不是偶然的,我意识到我已经对贝叶斯定理和朴素贝叶斯(下面的链接)做了相当多的笔记,因为这是从第 1 周到第 2 周所发生的所有变化(我们用来预测推文情绪的算法)。
以数据科学的方式学习概率
towardsdatascience.com](/marginal-joint-and-conditional-probabilities-explained-by-data-scientist-4225b28907a4) [## 从零开始的算法:朴素贝叶斯分类器
从头开始详述和构建朴素贝叶斯分类器
towardsdatascience.com](/algorithms-from-scratch-naive-bayes-classifier-8006cc691493)
什么是向量空间模型?
向量空间模型是代数模型,通常用于将文本(尽管它们可以表示任何对象)表示为标识符的向量。有了这些模型,我们能够识别各种文本在意义上是否相似,不管它们是否共享相同的单词。
图 1 :单词如何共享相似的单词但有不同的意思,反之亦然的例子(图片由作者提供)
这个想法是基于一位名叫约翰·鲁珀特·弗斯的英国语言学家(也是 20 世纪 50 年代英国语言学的领军人物)的名言…
“看一个人交什么样的朋友,你就可以知道一个字”——J·r·弗斯
在许多情况下,我们可能会决定采用矢量空间模型,例如:
- 信息过滤
- 信息检索
- 机器翻译
- 聊天机器人
还有更多!
一般来说,向量空间模型允许我们将单词和文档表示为向量。
逐字逐句&逐字逐句
为了用向量来表示我们的文本,我们可以决定使用逐词或逐文档的设计。执行这个任务包括首先创建一个共生矩阵。
虽然我们执行每项任务的方式非常相似,但我们将一次讨论一个设计,尽管如此,目标是相同的。我们想从我们的共生矩阵到一个向量表示。
图 2 :我们的共现矩阵到向量表示的映射(图片由作者提供)
逐字:此设计统计单词在一定距离内出现的次数 k.
图 3:k = 2 的逐字共现矩阵示例(作者提供的图片)
在逐字设计中,共现矩阵在 1 到 N 个条目之间。
Word By Doc :词汇中的单词在属于特定类别的文档中出现的次数。
图 4 :文档共现矩阵单词示例(图片由作者提供)
使用这些向量表示,我们现在可以在向量空间中表示我们的文本或文档。这是完美的,因为在向量空间中,我们可以确定文档类型之间的关系,比如它们的相似性。
图 5 :在向量空间中用 doc 表示单词(图片由作者提供)
欧几里得距离
我们可以用来确定两个向量彼此相距多远的相似性度量是欧几里德距离,它仅仅是连接两个向量的直线的长度。
图 6 :欧几里德距离公式(图片由作者提供)
让我们使用图 6 中的公式,使用来自图 5 的矢量表示来计算更相似的文档。
图 7:计算欧几里得距离(图片由作者提供)
结果告诉我们,经济和机器学习文档更相似,因为基于距离的度量优先考虑具有较低值的对象来检测相似性。也就是说,需要注意的是欧几里德距离不是比例不变的,通常建议对数据进行缩放。
余弦相似性
欧几里得距离的问题在于它会因表示中的大小差异而有偏差。因此,我们可以决定使用余弦相似度,这将确定使用内角的文本有多相似。
图 8 :余弦相似度公式(图片作者提供)
余弦相似性是自然语言处理中最常用的相似性度量之一。为了计算相似性,我们取两个向量之间的夹角的余弦相似性。
图 9 :计算余弦相似度(图片由作者提供)
当余弦值等于 0 时,这意味着两个向量彼此正交,并且不匹配。反之,余弦值越接近 1,则意味着这两个值之间的匹配度越高(因为角度越小)。因此,从我们的结果来看,经济和机器学习是最相似的——在维基百科上阅读更多关于余弦相似性度量的信息。
在向量空间中操纵单词
通过执行一些简单的矢量运算,我们能够推断出单词之间的未知表示。
例如,如果我们知道两个相似者如国王和人之间的关系。为了找到单词“Queen”的向量表示,我们可以将我们从确定 King 和 Man 之间的关系中检索到的向量表示(我们通过减去向量即 King - Man 来检索该向量)添加到 Woman 的向量表示,并且推断最相似的向量表示(在该实例中是 Queen)是我们想要找到的向量。
图 10 :视觉呈现(图片作者)
包裹
总之,我们可以使用向量空间模型来表示向量空间中的文本或文档,当我们的数据在向量空间中时,我们可以使用向量来确定文本(或文档)之间的关系。
让我们在 LinkedIn 上继续对话…
[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
Python 中的矢量化
PyTrix 系列
PyTrix#1:加速我们的 Python 代码
Python 是一种流行的数据科学语言。它的语法很容易学习(和阅读),这使得新手更容易掌握和使用这种语言。然而,不涉及细节,Python 是一种解释语言,这意味着它运行起来比像 c 这样的编译语言慢得多
当我们执行深度学习时,我们可能会使用大量数据,因为这是深度学习蓬勃发展的时候。
图 Coursera 上吴恩达深度学习专业化的照片
为什么我要说这些?很棒的问题!
如果我们有大量的数据和缓慢的 python 代码,我们很可能最终得到一个以蜗牛速度运行的模型,因为我们的代码在计算上不是最优的…人类对这场大灾难的解决方案是什么?矢量化!😎
什么是矢量化?
通俗地说,它加快了 Python 代码的速度,而不需要循环、索引等。在数据科学中,我们使用 Numpy 来完成这项工作——Numpy 是科学编程的事实框架。从技术上来说,当我们在 Numpy 中实现矢量化形式时,我们仍然执行这些操作,但不在 Python 中——在幕后。相反,这些操作是在优化的预编译 C 代码中完成的——参见文档了解更多信息。
这种用数组表达式替换显式循环的做法通常被称为向量化。一般来说,矢量化数组运算通常比纯 python 运算快一两个(或更多)数量级,在任何类型的数值计算中都有最大的影响”——McKinney,2012 年,第 97 页
纯 Python vs Numpy 示例
在这一节中,我将用 python 实现一些例子,然后用 numpy 实现相同的代码,并比较两者的计算时间,这样我们可以对矢量化有一个直观的了解。下面是我的 Github 库的代码链接。
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/kurtispykes/demo/tree/master/pytrix)
外部产品
两个向量的外积将产生一个矩阵。例如,如果我们有两个维度为n
和m
的向量,那么这两个向量的外积——见图 2。
图 2:外积公式【来源】
import numpy as np
import timea = np.arange(10000)
b = np.arange(10000)# pure Python outer product implementation
tic = time.process_time()outer_product = np.zeros((10000, 10000))
for i in range(len(a)):
for j in range(len(b)):
outer_product[i][j]= a[i] * b[j]toc = time.process_time()print("python_outer_product = "+ str(outer_product))
print("Time = "+str(1000*(toc - tic ))+"ms\n")# Numpy outer product implementation
n_tic = time.process_time()outer_product = np.outer(a, b)n_toc = time.process_time()print("numpy_outer_product = "+str(outer_product));
print("Time = "+str(1000*(n_toc - n_tic ))+"ms")
这个细胞输出…
图 3:上面代码块的输出
点积
也称为内积,点积接受两个长度相等的数字序列,并返回一个标量—参见图 4。
图 4:点积公式
import numpy as np
import timea = np.arange(10000000)
b = np.arange(10000000)# pure Python outer product implementation
tic = time.process_time()dot_product = 0
for i in range(len(a)):
dot_product += a[i] * b[i]toc = time.process_time()print("python_dot_product = "+ str(dot_product))
print("Time = "+str(1000*(toc - tic ))+"ms\n")# Numpy outer product implementation
n_tic = time.process_time()dot_product = np.dot(a, b)n_toc = time.process_time()print("numpy_dot_product = "+str(dot_product))
print("Time = "+str(1000*(n_toc - n_tic ))+"ms")
这个代码块的输出…
图 5:上面代码块的结果。
最终,矢量化不仅使我们的代码更快、更容易阅读,还减少了我们必须编写的代码量,这通常意味着我们得到的 bug 更少。最重要的是,我们编写的代码看起来更“Pythonic 化”,因为我们去掉了代码库中所有低效的、难以阅读的 for 循环。
注:如果这对你来说是全新的,我建议你观看下面链接的来自吴恩达的视频,这些视频来自 Coursera 上的深度学习专业,并开始掌握 Numpy 文档
图 6:深度学习专业化课程 1 中关于矢量化的吴恩达。
如果您看到此消息,这意味着我们在网站上加载外部资源时遇到了问题。如果你是…
www.khanacademy.org](https://www.khanacademy.org/math/linear-algebra/vectors-and-spaces)
向量化朱莉娅的一切
告别 for loops,广播所有的东西
你有没有过这样的感觉:for loops 正在接管你的生活,你无法逃离它们?你是否觉得被这些循环困住了?别害怕!有出路!我将向你展示如何在没有任何 for 循环的情况下完成 FizzBuzz 挑战**。**
向量化所有的东西!— 来源
FizzBuzz 的任务是打印 100 以内的每一个数字,但是要把能被 3 整除的数字换成“Fizz”,能被 5 整除的数字换成“Buzz”,能被 3 和 5 都整除的数字要换成“FizzBuzz”。
用 for 循环解决 FizzBuzz 很容易,你甚至可以在 BigQuery 中做这件事。在这里,我将向您展示另一种实现方式——没有任何 for 循环。解决方案是矢量化函数。
如果你已经有了一些 R 和 Python 的经验,你可能已经在标准 R 中或者通过 Python 的numpy
库遇到了矢量化函数。让我们看看如何在 Julia 中类似地使用它们。
矢量化函数非常有用,因为它们减少了与 for 循环相关的混乱。
矢量化函数的第一步
在我们开始解决 FizzBuzz 之前,让我们看看如何在 Julia 中用矢量化替代方法替换非常简单的 for 循环。
让我们从一个琐碎的任务开始:给定一个向量 *a*
给它的每个元素加 1。
对于循环版本:
julia> print(a)[2, 3, 4]
矢量化版本:
上面的代码完成了工作,但是它占用了 3 行代码和很多多余的字符。如果a
是 Python 中的一个numpy
数组🐍,你只需要做a + 1
,工作就完成了。但是首先,您必须将您的普通旧数组转换成一个numpy
数组。
朱莉娅有一个聪明的解决办法。您可以使用广播操作符.
对一个对象的所有元素应用一个操作——在本例中是加法。这就是它的作用:
这与上面的 for 循环给出了相同的答案。并且不需要转换你的数组。
更棒的是,你可以播放任何你喜欢的功能,甚至是你自己的。在这里,我们计算一个圆的面积,然后在我们的阵列中传播它:
是的,pi 是 Julia 中的内置常量!
julia> area_of_circle.(a)3-element Array{Float64,1}:
3.141592653589793
12.566370614359172
28.274333882308138
循环再见
回环拜拜!— 来源
现在我们知道了基本知识,让我们做 FizzBuzz 吧!但是记住,不允许 for 循环。
我们将稍微重新表述一下我们的问题。代替打印数字、嘶嘶声和嗡嗡声,我们将把它们作为一个向量一起返回。我将以与 for 循环文章[链接]中相同的方式分解解决方案,因此如果您还没有看到以前的帖子,现在将是查看它的好时机!
首先,让返回数字直到n
作为一个向量:
在这里,collect 只是接受我们的 range 操作符,并对它进行数组求值。
julia> fizzbuzz(5)5-element Array{Int64,1}:
1
2
3
4
5
添加气泡
这个管用。让我们看看能否打印出每个能被 3 整除的数字的嘶嘶声。我们可以用 Fizz 字符串替换所有能被 3 整除的数字。
julia> fizzbuzz(7)7-element Array{String,1}:
"1"
"2"
"Fizz"
"4"
"5"
"Fizz"
"7"
让我们一步一步地分解它:
- 为什么我们把所有东西都换成了
string
?这个数组就是一个数组。我们不希望数字和字符串混杂在一个对象中。 - 我们广播
rem.(numbers, 3
来寻找所有数字的余数**。** - 然后我们将这个余数数组与 0 (
.== 0
)进行元素比较。 - 最后,我们用布尔掩码索引我们的字符串数组,并将“Fizz”赋给掩码为
true
的每个元素。
请随意分解这些步骤,在你自己的朱莉娅·REPL 身上试试吧!
我知道使用.=
将单个元素分配给多个元素可能有点争议,但我实际上很喜欢它。通过显式地指定赋值的广播,你强迫自己去思考这些对象的区别,然后每个阅读你的代码的人将会看到一个是向量,另一个是标量。
添加蜂鸣器
添加蜂鸣器的方法完全相同:
对此不予置评。😃
将这一切结合在一起
我们所缺少的是能被 3 和 5 整除的数字的嘶嘶声元素。
我们使用.*
来“乘”两个布尔数组。在这种情况下,您可以将*视为布尔值and
。所以这个给了我们一个真值,其中的数字可以被 3 和 5 整除。
让我们看看这一切是否行得通:
julia> fizzbuzz(16)16-element Array{String,1}:
"1"
"2"
"Fizz"
"4"
"Buzz"
"Fizz"
"7"
"8"
"Fizz"
"Buzz"
"11"
"Fizz"
"13"
"14"
"FizzBuzz"
"16"
该打扫了
稍微无关,但请永远清理你的狗了!—照片由哈里·格劳特在 Unsplash 拍摄
以上当然是我们想要的,但它并不是最漂亮的。是时候整理和让我们的代码变得漂亮和像样了。
这与上面的实现完全一样,但是它更容易阅读。我们找到想要替换的索引,然后在需要的地方替换数组元素。我们还使用了%
而不是rem
函数,因为如果你的函数有一个操作符,那么你应该使用它!
结论
读完这篇文章后,你现在知道如何使用.
在 Julia 中传播任何函数,并通过删除一些不必要的 for 循环使你的代码更具可读性。
要获得所有媒体文章的完整访问权限,包括我的文章,请考虑在此订阅。
如何使用 FizzBuzz 执行循环和条件函数
towardsdatascience.com](/learning-julia-the-simplest-of-beginnings-464f590e5665) [## BigQuery 中的循环
了解如何使用 BigQuery 脚本来计算斐波那契数
towardsdatascience.com](/loops-in-bigquery-db137e128d2d)
向量化代码很重要
我来自 MATLAB 和数值计算的世界,在那里,for 循环被删除,向量为王。在 UVM 攻读博士学位期间,拉科巴教授的数值分析课是我上过的最具挑战性的课程之一,对数值代码的深入了解至今仍让我记忆犹新。我最喜欢的矢量化例子是,一位同事在写了一篇非常酷的关于它的论文,并在脚注中提到了所涉及的大量计算之后,与我分享了他的 Lorenz 96 代码。内循环的矢量化速度快了 4 倍,所以现在脚注只是一个碳足迹。
如今,快速数字代码让机器学习成为可能,尽管我不确定现在有多少孩子能用 C 语言编写一个 QR 分解。我是在开玩笑,因为我没有做过,但是我确信我可以用 MATLAB(在某一点上)或者 Numpy 或者 Julia(我将坚持只使用 R 语言中的 magrittr 和 dplyr)来编写它。我在 MassMutual 做的很多工作基本上都是数值计算,耗时几小时甚至几分钟的管道与耗时几秒钟的管道之间的差别是很大的。几秒钟意味着我们可以迭代,尝试更多的选项,并且行动更快。尽管如此,很多数字代码还是用纯 Python 写的(没有 Cython,没有 Numba),为了的灵活性。我要说这是个坏主意!这是一封转述自同事的电子邮件:
在伪代码中,这是我几个月前遇到的‘精算’编码困境:
*EOM = 0 for months in years: PREM = 50 BOM = EOM + PREM WIT = 5 EOM = BOM – WIT*
一个简单的例子,但我认为显示了 BOM/EOM 的相互依赖性(还有一些其他变量具有类似的关系。)不了解 EOM 就无法矢量化 BOM,了解 BOM 就无法矢量化 EOM。那么你可能会遇到这样的情况,如果 WIT > 0,PREM = 0。基本上出现了许多相互依赖。现在很多函数都不容易向量化。
我可以把它矢量化,我做到了。以下是 Python 中的非矢量化版本:
import numpy as np
years = 10
bom = np.zeros(years*12)
eom = np.zeros(years*12)
for month in range(1, years*12):
prem = 50
bom[month] = eom[month-1] + prem
wit = 5
eom[month] = bom[month] - wit
这是矢量化版本:
import numpy as np
years = 10
prem = 50
wit = 5eom = np.arange(years*12)*prem - np.arange(years*12)*wit
# and if you still want bom as an array:
bom = eom + np.arange(years*12)*wit
我还通过使用一个字典列表更加灵活地编写了 for 循环:
years = 10
prem = 50
wit = 5
result = [{'bom': 0, 'eom': 0}]
for month in range(1, years*12):
inner = {}
inner.update({'bom': result[month-1]['eom'] + prem})
inner.update({'eom': inner['bom'] - wit})
result.append(inner)
上面这个返回一个不同类型的东西,一个字典列表…不是两个数组。
我们还可以导入 Pandas 来填充以上三个项目的结果(因此它们是一致的输出,我们可以保存到 excel,等等)。如果我们加载了 Pandas,我们可以使用一个空的数据帧进行迭代,因此多了一个选项:
import numpy as np
import pandas as pd
years = 10
prem = 50
wit = 5
df = pd.DataFrame(data={'bom': np.zeros(years*12), 'eom': np.zeros(years*12)})
for i, row in df.iterrows():
if i > 0:
row.bom = df.loc[i-1, 'eom']
row.eom = row.bom - wit
通过所有这些类型的迭代,以及返回数据帧作为结果的选项,我们得到了以下结果:
Cython 和 Numba
我还添加了几个 Cython 版本的代码,展示了通过使用 c,您可以在没有 numpy 的情况下获得矢量化的性能。)和速度。
Numba 也可以保持相同的加速比(它可能和 cy thon/矢量化 Numpy 一样快)。在这两种情况下(Cython/Numba ),您必须小心使用哪些数据类型(不要使用字典或熊猫!).我认为,如果你更聪明地知道如何整合它们,让 Cython + Numpy 循环和矢量化 Numpy 循环一样快是可能的。
最终,你可以鱼和熊掌兼得:可读的 for-loops(是的,矢量化版本可以变得更神秘),用 Python 编写,具有类似 C 语言的矢量化速度。
所有的代码,包括 Cython,都可以在这里找到:https://github.com/andyreagan/vectorizing-matters。
从卫星图像计算植被指数
利用卫星图像挖掘环境中的环境变化。
来源:谷歌地图
人工智能和机器学习彻底改变了我们今天的世界。从医疗保健到汽车,从体育到银行,几乎所有行业都意识到人工智能带来的力量,以提供更好的解决方案。卫星图像领域也在经历大规模发展,机器学习解决方案已经提供了一些积极的成果。ML 算法已经被证明是分析卫星图像的一个很好的工具。然而,访问数据有时会成为一个瓶颈。这主要是由于卫星图像的巨大规模,以及分析它们需要一些领域的专业知识。很多时候,来自其他领域的人也对访问和分析卫星数据感兴趣,特别是研究当地的模式,如一个国家的污染水平、洪水情况,甚至是森林火灾。这促使我寻找一些资源来简化这个过程,或者访问和分析卫星图像过程,这样我们就可以花更多的时间来理解结果并从中学习。
一年前,我写了一篇关于类似概念的文章,名为使用 Python 进行卫星图像分析,其中我们在卫星数据的帮助下检查了一个地区的植被覆盖。其目的是了解卫星图像数据的概念,以及如何对其进行分析以调查现实世界的环境和人道主义挑战。
然而,这个过程需要几个步骤,这一次我在寻找简化这个过程的方法。幸运的是,我遇到了一个名为 EarthAI Notebook 的平台,这是一个完全托管和管理的 JupyterLab 笔记本,专门用于分析栅格数据。它为我提供了使用熟悉的 Jupyter 实验室平台执行卫星图像分析的便利,完全加载了地理空间分析库和对地球按需目录的 API 访问。
在本文中,我将快速向您介绍计算该地区植被指数的步骤。该代码大量改编自 EarthAI 手册中的示例代码。
案例研究:计算孙德尔本斯的植被指数(NDVI)
孙德尔本斯是孟加拉湾的恒河、布拉马普特拉河和梅克纳河汇合形成的三角洲中的红树林区域。它的一部分位于孟加拉国(66%)和印度(34%),是世界上最大的单一潮汐盐生红树林。Sunderbans 具有巨大的经济和环境价值,已被联合国教科文组织宣布为世界遗产。
或归一化差异植被指数(NDVI)是最广泛使用的测量植被的指数之一。它是由美国宇航局科学家康普顿·塔克开发的,可以表达如下。****
其中 NIR 和 Red 分别代表来自植物的反射近红外光和反射可见红光。为什么只有这两种颜色?与其他波长相比,健康的植物会反射更多的近红外和绿光。然而,它吸收更多的红光。因此,NDVI 将植物反射的近红外光(NIR)与反射的可见红光(red)进行了比较。NDVI 值的范围从+1.0 到-1.0,其中 1 代表最健康的植被。
今天的孙德尔本斯已经受到环境干扰和人类活动的深刻影响,因此 NDVI 可以成为测量孙德尔本斯周围植被覆盖率并采取补救措施的有用工具。
设置系统
点击StartFree Trial
选项,接下来的屏幕会出现。启动地球笔记本。你将获得 14 天的试用期,这应该足以让你开始。这可能需要几分钟来脱离熟悉的 Jupyter 实验室环境。
接下来,您可以导航到 examples 文件夹,在那里使用用例以及快速参考指南。我将使用quick-example-1.ipynb
文件来熟悉这个平台。
导入库和创建火花会话
接下来,我们将从 EarthAI 导入必要的库和依赖项。这又创建了一个新的 SparkSession 。这包括earth_on_demand
、rasterframes
和pyspark
from earthai.init import *
import pyspark.sql.functions as F
import matplotlib.pyplot as plt
%matplotlib inline
RasterFrames 是一个地理空间开源栅格处理库,用于 Python、Scala 和 SQL ,可通过几种机制获得。RasterFrames 为任意地理空间栅格数据提供了以数据帧为中心的视图,支持时空查询、地图代数栅格操作以及与 Spark ML 的互操作性
查询和加载卫星影像
我们现在需要导入卫星图像数据。我们将使用earth_ondemand
模块来查询覆盖桑德邦斯国家公园特定区域的 MODIS 图像。在继续之前,我们先了解一下 MODIS 是什么。
MODIS 代表 中分辨率成像光谱仪(MODIS)。它是Terra(原名 EOS AM-1)和Aqua(原名 EOS PM-1)卫星上的关键仪器。Terra MODIS 和 Aqua MODIS 每 1 到 2 天观察一次整个地球表面,获取 36 个光谱带或波长组的数据(来源:https://modis.gsfc.nasa.gov/)**
变量 catalog 返回由指定时间和位置的卫星图像组成的数据帧。我们来看看目录的一些基本信息。
这里的B01
和B02
指的是红色和近红外(NIR)波段。
波段(也称为通道或层)可以被认为是在同一地点同时拍摄的图像的集合。这篇名为 遥感简介 的文章非常清晰地解释了波段的概念:
地球观测卫星上的许多传感器测量从地球表面反射或发射的电磁辐射(EMR)量。这些传感器被称为多光谱传感器,可以同时测量电磁波谱的多个区域的数据。传感器测量的波长范围称为波段,通常用名称(例如红光或近红外)和所记录能量的波长来描述。
这些列提供了到单波段地理 IFFs 的直接链接。地理信息系统使用 GeoTIFF 和其他格式来组织和存储栅格数据集,如卫星影像。
让我们看看上面目录中的一些关键列。
catalog[['id','eod_collection_attribution', 'datetime', 'eo_cloud_cover', 'proj_crs', 'B01', 'B02']].head(5)
从目录加载影像
现在,是时候加载实际的卫星图像了。我们将从上面指定的场景列表中读入红色(B0)** 和红外(B1) 波段。**
计算 NDVI
df = df.withColumn('ndvi', rf_normalized_difference('nir', 'red'))
计算每周整个图像的 NDVI 平均值
最后,我们将计算一个非常简单的解析。我们将计算数据帧中每周整个图像的 NDVI 平均值。time_series
是一个火花数据帧。toPandas
调用触发计算,结果在熊猫数据帧中返回。这使我们能够很容易地将时间序列可视化。
这里我们得到了特定时间段的 NDVI。我选择了一个非常小的时间窗口来加速这个过程,但是整个过程保持不变,即使我们需要计算更长时间的 NDVI。事实上,这将提供一个关于生态平衡和气候变化对一个地方的影响的更好的想法。
结论
卫星图像分析是数据科学家工具箱中的必备工具,挖掘出的信息可用于调查现实世界的环境和人道主义挑战。我希望这篇文章能给你一个良好的开端,让你开始用工具和卫星数据进行一些有价值的分析。
附注:这不是 EarthAI 的促销文章。还有其他几个工具可以做同样的分析,但是我对这个平台的体验是积极的,所以我想分享我的经验。
天啊!
深入了解不同 python 环境的初学者指南,每种环境的优点,以及如何开始使用它们
由 Oleksii Hlembotskyi 在 Unsplash 拍摄的照片
当开发人员开始研究 python 环境以及如何清理他们的工作流时,他们会受到各种不同选项的轰炸。如此庞大的菜单自然会导致开发人员不必要地筛选文章和文档,以找到“最好”的一个来使用。在本文中,我们将讨论每个主要虚拟环境选项之间的差异和优势,以便将所有这些参考整合到一篇文章中。最后,希望你能找到最适合你需求的环境!
在我们开始之前,如果您不知道什么是虚拟环境或者为什么您应该使用虚拟环境,请随意停下来看看我的上一篇文章强调了虚拟环境给您的整体工作流程带来的好处。
首先,我强烈建议用户在 Python 3.3+之后避免使用。正如您将看到的, venv 现在是一个标准的附带库,总体来说更不容易出错。
VENV
Venv 创建沙箱化的、全新的、用户可安装库的、多 python 安全的虚拟环境。
布莱恩·多在 Unsplash 上的照片
Fresh要求环境只从 python 附带的标准库开始;这意味着当环境处于活动状态时,您将不得不用pip install
重新安装您需要的其他库。
S 加框 表示环境中的任何安装或活动都不会影响基本系统。换句话说,你可以假设炸毁你的整个虚拟环境,放火烧了它,并最终把它扔进垃圾桶,删除整个东西,而不必担心弄乱你的基本 python 安装。
Thomas de LUZE 在 Unsplash 上拍摄的照片
U 如果这没有意义,这仅仅意味着您不需要sudo
许可就可以将库安装到虚拟 env 上。
Multi-python safe最后,是 venv 带到桌面上的另一大特色*。*当您激活虚拟环境时,外壳只能看到用于构建该环境的 python 版本。例如,对于使用 mac 和 python 2.7 并希望使用 python 3.5 运行程序的个人而言,不需要指定您希望运行特定文件/程序的 python 版本(即python3 *file.py*
与python *file.py*
),因为环境中只有一个安装。简单地做python *filename*
将运行虚拟 env python 版本的软件。
VENV 用法
为了使用 venv,您只需要在项目目录中输入这个简单的命令(假设您已经安装了 python):
$ python3 -m venv env
在本例中,我们刚刚在我们的项目文件夹中创建了一个名为“ env ”的 python 3 环境——您可以随意更改名称。这个新的 env 文件夹包含三个子文件夹;虽然这不重要,但出于好奇,这里列出了每一个包含的内容:
- bin :与虚拟环境交互的文件
- 包含编译 python 包的 : C 头文件
- lib:python 版本的副本,以及安装每个依赖项的 site-packages 文件夹
为了使用该环境的资源,您需要使用以下命令来“激活”它:
$ source env/bin/activate
您现在应该在命令行的开头看到一个 (env) 。还可以通过使用函数来确保您使用的 python 版本是环境的版本:
$ which python
并分析它提供的路径和 python 版本。在环境中完成后,您只需输入:
$ deactivate
回到您的“系统”并退出虚拟环境。就这样,简单!
每当您想要使用您的环境时,一直键入source …/activate
可能会很烦人,但是不要担心——阅读本文末尾的奖励部分以查看解决方案!
PYENV
兰迪·法特在 Unsplash 上拍摄的照片
Pyenv主要用于隔离你机器内的 python 版本。例如,如果您想在 Python 2.7、3.6、3.7 等版本上测试您的代码。pyenv 将提供一种跨所有版本测试你的软件的方法。
该环境通过在 PATH 环境变量前面加上~/.pyenv/shims
来工作。在高层次上,这几乎只是允许不同的“隧道”供您的代码通过,以便在特定的 python 版本上运行。
Pyenv 还使用命令pyenv install *version*
使多个 Python 版本的下载和安装变得更加容易。
Pyenv 与 venv 非常相似,它允许您管理机器中的多个 python 版本。然而,它不包括回滚库安装的能力,并且可能需要管理员权限来更新库。由于这些争论,我确实认为 venv 更好一点。同样,windows 用户也无法使用该选项。
下一个!
PIPENV
照片由 Cyril Saulnier 在 Unsplash 上拍摄
P ipenv 是一个类固醇上的venv
:它力求将pipfile
、pip
和venv
组合成一个单一的命令。
您可以简单地使用pip install pipenv
安装 pipenv,然后使用pipenv env
开始创建环境。但是,您必须使用命令pipenv
(而不是pip
)来安装您的所有软件包。pipenv
命令允许您:
- 指定将软件包安装到哪个环境中
- 直接与 PyPi 或本地存储库集成
- 为每个环境创建一个具有单独部分的 pipfile(这是每个环境需要的
requirements.txt
文件的替代文件,带有virtualenv
和venv
- 允许您
pipenv lock
您的虚拟环境;这创建了一个pipfile.lock
文件,它解决了构建所需的所有依赖关系
pipenv 带来的最大优势,在我看来,是与requirements.txt
和pip freeze
相比,它如何处理依赖管理。
Pipenv 由于上面列出的优点正被越来越多的开发人员所采用,并且正迅速获得关注,所以我确实建议看一看它。
然而,如果你不知道这意味着什么,并且上面的列表项目你都没有想到,我建议你坚持使用 venv 来获得一个更简单和更直接的环境。
DIRENV(奖金!!)
如果玩虚拟环境,我强烈建议你使用direnv
。当你cd
进入一个包含.env
的目录时,direnv 会自动激活环境。再也不需要处理那些烦人的source .../activate
事务了。
结论
由斯坦尼斯拉夫·康德拉蒂耶夫在 Unsplash 拍摄
总的来说,我们研究了开发人员在工作流程中使用的三种最流行的虚拟环境选项。根据你的项目范围,我最终建议两种选择: venv 和 pipenv 。如果你不需要 pipenv 带来的所有花哨功能,我建议你去看看 venv。另一方面,如果 pipenv 列表对你不利,那就继续使用它吧!
和往常一样,如果你想对一个话题有更多的澄清或者对任何事情感到困惑,请随时留下你的想法,我可以编辑甚至写一篇新文章!
验证和处理线性回归的假设
线性回归依赖于五个主要假设。能够核实并据此采取行动尤其重要。
线性回归可能是数据科学中最重要的模型。尽管表面上很简单,但它依赖于几个关键的假设(线性、同异方差、不存在多重共线性、误差的独立性和正态性)。对这些的良好了解对于创建和改进您的模型至关重要。在这篇文章中,我将回顾五个主要假设,并解释它们的重要性以及一些解决方案,以防它们得不到尊重。
1。线性关系
显而易见,线性回归假设因变量和预测变量之间存在线性关系。
怎么能验证呢?
成对散点图可能有助于验证线性假设,因为很容易在图上显示线性关系。
在上面的例子中,两个变量之间的关系显然不是线性的
此外,类似地,代表预测值和因变量之间关系的部分残差图,同时考虑所有其他变量,可能有助于可视化变量之间的“关系的真实性质”。
部分剩余图背后的公式
如果不被尊重,对模特来说意味着什么?
如果不考虑线性,回归将会不合适,并且不能准确地模拟因变量和自变量之间的关系。
有什么办法呢?
自变量和因变量可以转换,因此它们之间的关系是线性的。例如,您可能会发现因变量的对数和一些自变量的平方之间的关系是线性的(参见多项式回归和广义可加模型 (GAM)对此进行了有趣的概括)。
2。同质性
同方差意味着无论因变量的水平如何,残差都具有恒定的方差。
如何验证?
为了验证同方差性,可以查看残差图,并验证误差项的方差在因变量的值上是恒定的。
在上面的例子中,存在异方差,因为残差的方差不是常数
如果不被尊重,对模特来说意味着什么?
在异方差的情况下,模型将不会同样适合模型的所有部分,这将导致有偏差的预测。这也通常意味着混淆变量(重要的预测因素)被忽略了(这也可能是因为线性假设没有得到尊重)。虽然对于数据科学的预测环境,这可能不是最重要的,但异方差在推断环境中相对更重要,因为系数的可解释性。
能做些什么?
由于异方差通常反映了混杂变量的缺乏,因此可以通过检查预测值和提供额外的独立变量来解决(甚至可以检查线性假设是否得到了尊重)。
3.多重共线性缺失
多重共线性是指两个或两个以上的自变量高度相关(极端情况下甚至是冗余的)。虽然它对于非参数方法可能不重要,但对于线性回归等参数模型来说却是最基本的。
怎么能验证呢?
通常,多重共线性的一个明显迹象是,一些估计系数具有“错误”符号(即,在试图预测房价的模型中,与 a 的大小相关的系数为负)。
成对相关可能是识别各种独立变量之间潜在关系的第一步。
相关性热图可以允许快速注意到成对的相关性
然而,一个更彻底的方法是看看方差通货膨胀因素(VIF)。它的计算方法是将每个独立变量回归到所有其他变量上,并计算得分,如下所示:
计算独立变量 VIF 的公式
因此,如果自变量和其他变量之间存在线性关系,这将意味着回归的大的 R 平方,从而更大的 VIF。根据经验,VIFs 分数高于 5 通常是多重共线性的指标(高于 10 肯定会被认为是一个问题)。
如果不被尊重,对模特来说意味着什么?
该模型可能产生不准确的系数估计,因此无法解释。因此,这可能会损害推理能力和可能的预测性能。
在多重共线性存在的情况下,回归结果也可能变得不稳定,并且会因训练数据的不同而有很大差异。
有什么办法呢?
多重共线性可以通过执行特征选择来修复:删除一个或多个独立变量。
一种常见的方法是使用后向子集回归:首先用所有潜在的独立变量构建一个回归,并使用特定领域的知识迭代地删除具有高 VIF 的变量。
另一种方法可以是隔离并只保留多个独立变量之间的交互影响(通常使用直觉或正则化)。
随着多重共线性的减少,模型将变得更加稳定,系数的可解释性将得到改善。
4.残差的独立性(没有自相关)
自相关指的是观测误差相关的事实。
如何验证?
为了验证观察值不是自相关的,我们可以使用德宾-沃森测试。测试将输出 0 到 4 之间的值。越接近 2,各变量之间的自相关性越小(0–2:正自相关,2–4:负自相关)。
如果不被尊重,对模特来说意味着什么?
自相关可能意味着没有考虑关系的线性,或者变量可能被忽略。
自相关会导致自变量和因变量之间的虚假关系。
有什么办法呢?
对于时间序列,可以增加一个滞后变量。解决这一问题的另一个潜在方法是将变量从绝对值修改为相对变化(即,不是股票价格,而是从一个时期到下一个时期的变化百分比)。
更一般地说,变量应该进一步微调并添加到模型中。
5。误差的正态性
如果残差不是正态分布,普通最小二乘法(OLS)以及回归可能会有偏差。
如何验证?
要验证误差的正态性,一个简单的方法是绘制残差相对于因变量水平的分布。人们可以使用 QQ 图来测量残差与正态分布的偏差。如果生成的曲线不正常(即偏斜),可能会突出问题。
如果不被尊重,对模特来说意味着什么?
如果没有考虑到这一点,它可能会突出显示大的异常值的存在,或者突出显示违反的其他假设(即线性、同方差)。因此,用标准方法计算 t 统计量和置信区间会有偏差。
能做些什么?
在误差不是正态分布的情况下,可以验证是否考虑了其他假设(即同质性、线性),因为这通常是这种违规的迹象,并相应地微调模型。
否则,还应该尝试处理数据中的大异常值,并检查数据是否可能是使用不同模型的单独子集。
除了上面列举的众多假设之外,验证您的线性回归没有外推超出训练数据的范围,并且没有异常值或单个记录可能会扭曲回归或对回归产生太大影响(参见 Cook 的距离和检测异常值的经验法则)也非常重要
正如这篇文章所强调的,尽管线性回归看起来很简单,但它依赖于许多假设。在构建模型时,重要的是要验证它们是否得到遵守,并在出现潜在违规时加以解决。我希望本指南能帮助你更好地理解线性回归背后的各种假设,并为你提供解决使用时可能面临的潜在问题所需的工具。
PS:我现在是伯克利的工程硕士,我还在学习这方面的知识。如果有什么需要改正或不清楚的地方,请告诉我。你也可以发邮件给我 这里 。
用于语音助手和对话式人工智能的印度语堆栈
(图片由俚语实验室提供)
对话人工智能
巴拉特 Bhāṣā堆栈的案例
Bhārat Bhāṣā Stack 将像 India Stack 为 FinTech 所做的那样,为印度方言催化语音助手和对话式人工智能创新。
十年前,这是不可想象的。
在印度一个不起眼的小镇上,人们可以通过手机扫描挂在购物车上的二维码,向街头小贩付款。即使金额只有 50 卢比(不到一美元)。
将会有很多来自银行和非银行的移动应用和支付钱包。全部无缝互操作。任何两方将通过共享一个类似钱包地址的电子邮件进行交易。无需支付任何交易费用。
无数小企业会在 WhatsApp 上发送目录。送货上门。在家门口接受数字支付。而无需建立网站或支付网关。
十年前,现金是王道。
十年前,这是不可想象的。
但它发生了。感谢印栈。用于认证、支付和授权的数字基础设施。始于 2009 年。
India Stack 是一组 API,允许政府、企业、初创公司和开发者利用独特的数字基础设施来解决印度在无出席、无纸化和无现金服务交付方面的难题。
图片:合众国际社标志
统一支付接口 (UPI)是无现金即时支付的核心。UPI 成为小型企业的数字支付网关。它消除了一个只有大企业才能负担得起的进入壁垒。印度堆栈催化金融科技创新。
Bhārat Bhāṣā栈可以为 印度语 tech 做印度栈为 FinTech 做的事情。
现在,这可能是不可想象的。
印度任何角落的任何人都可以利用互联网的力量。跨语言和社会经济群体。即使他们不会读或写英语。通过与移动应用程序对话。用他们自己的语言。
任何企业都可以在应用程序中为大众烘焙语音助手。在所有印度语中。有负担得起的数据集、人工智能模型和服务。
现在,打字和触摸才是王道。但是巴拉特发现了自己的声音。印度语的语音搜索一直在增长。
所以这是有可能的。如果我们建造了巴拉特 Bhāṣā堆栈。印度语对话式人工智能的技术生态系统。
智能手机的普及率和语音的使用一直在增加。根据谷歌的报告,印度语的语音搜索也在增长。
Bhārat Bhāṣā堆栈可以成为小型企业的语音和语言 API。它可以消除另一个只有大企业才能承受的进入壁垒。它可以催化语音助手和对话式人工智能创新。
Bhārat Bhāṣā堆栈可以跨越印度的语言和社会经济界限,为超过 10 亿人带来难以想象的创新浪潮。
文章的其余部分:
- 地图对话式 AI 当前语音助手和应用的格局,
- 提出 Bhārat Bhāṣā栈和所需的技术和层用于构建这些应用的各种入口点,以及
- 讨论生态系统参与者如何帮助构建堆栈。
对话人工智能
对话式人工智能必不可少,但需要巨额投资。
对话式人工智能使机器像人类一样交流。从研究实验室到消费者手中。它最初是像 Siri 这样的独立语音助手。它正以多种形式出现在应用程序和设备中。
对话式人工智能将在所有应用和设备中普及。(图片由俚语实验室提供)
语音助手
语音助手是使用语音进行交互的智能虚拟助手。这些也被称为语音机器人,尤其是当通过纯语音界面传送时。例如,作为客户支持语音机器人的交互式语音应答(IVR)系统。
Siri 是第一个著名的语音助手。然后是亚马逊 Echo 设备中的 Alexa ,除了其他功能之外,它还使亚马逊购物成为可能。下一个参赛者是 谷歌助手 。它最初是作为谷歌家用设备出现的,后来出现在安卓手机中。
它从有趣发展到有用,即使是在一个封闭和有限的生态系统中。
语音操作
下一个合乎逻辑的进展是让它在应用程序中可用。允许程序员集成语音命令来触发特定的应用程序操作。亚马逊用 Alexa 的应用做到了这一点,谷歌用应用动作做到了这一点。
语音搜索 已经作为常见用例出现。几乎所有应用都有某种搜索功能:
- 搜索互联网
- 在地图应用程序中搜索路线
- 在音乐或视频应用程序中搜索歌曲
- 在购物应用程序中搜索商品
- 在旅行应用程序中搜索航班或火车
虽然所有的都是一种搜索,但每一种都涉及不同类别的世界知识。
应用程序中的语音助手
应用程序中的语音操作有严重的局限性。声音旅程开始就结束。一旦助手调用一个应用程序,用户只能通过触摸与应用程序进行交互。这阻碍了构建适合应用程序的丰富语音体验。
这就是为什么好几个应用在应用内部内置了语音助手**(而不是他们的应用藏在 Alexa 或者 Google Assistant 后面)。 Gaana , YouTube , Paytm Travel , My Jio , Jio Mart , Amazon ,Flipkartapp 针对各自领域优化了语音助手。**
构建这些优化的助手需要雄厚的资金。它需要大量的投资、努力和时间来构建。这些应用程序大多支持英语和印地语。缺少对大多数印度语的广泛支持。Bhārat Bhāṣā堆栈可以让小型企业家获得这些技术。
Bhārat Bhāṣā堆栈:印度语堆栈
一个开放的 Bhārat Bhāṣā栈可以降低 沟通 的壁垒,降低成本,刺激创新。
Bhārat Bhāṣā堆栈应该有一套模型、服务和 SDK 来构建印度语言的对话应用程序。它应该包括构建语音应用程序所需的语音、语言和视觉技术。堆栈层应该提供使用这些技术的方便入口点。这将使建立聊天机器人、语音机器人、语音助手和应用程序变得容易。
技术
语音助手模仿人类动作:
- 听:将语音音频转换成文字。叫做 自动语音识别 (ASR) 或者 语音转文字【STT】。
- 理解:理解文中意思或意图,提取重要实体。它叫做****【NLU】。
- 动作:基于这种理解,应用程序执行期望的动作。这就是 app 的业务逻辑。栈为应用程序提供钩子来插入它们的逻辑。
- 说:问问题来澄清、确认或从用户那里寻求所需的信息。它被称为语音合成或文本到语音(TTS) 。
语音助手的步骤。(图片由俚语实验室提供)
其他对话式人工智能任务包括:
- 人类说不同的语言。应用程序可能需要将文本从一种语言翻译成另一种语言。叫做机器翻译(MT)** 。**
- 许多人在罗马键盘上使用语音拼写来输入印度语。计算机可能需要将文本的语音翻译成印度语言文字。叫做音译**。**
- 参见/阅读:识别手写或印刷字符图像的能力。它叫做光学字符识别(OCR) 。
所有这些都需要一种叫做深度神经网络(DNN)的机器学习技术。建立和训练 DNN 是非常昂贵的,因为它需要大量的数据和计算时间。
总而言之,Bhārat Bhāṣā堆栈涵盖了 dnn 擅长解决的所有三种类型的问题:
- ****语音:自动语音识别,语音合成
- ****语言:自然语言理解,机器翻译,音译
- ****视觉:光学字符识别
层
应用程序开发人员应该能够只关注他们的业务逻辑。Bhārat Bhāṣā堆栈应该为语音助手的其余步骤提供对话式人工智能技术的挂钩。本节描述了应用程序可以挂接的各个层。
剧本
语言的脚本使用 Unicode 字符集进行编码。对话式人工智能技术之间的信息交换使用这些字符集进行。
印度语是语音语言,即单词的拼写与其发音相同。这一特性可能允许使用语音数据进行跨相似语言的训练。
堆栈应利用并解决印度语使用者的独特性:
- 许多印度语是低资源语言。可用的语音和语言数据不足以训练模型
- 来自英语和印地语的外来词在对话中很常见(被称为语码转换**)**
- 由于共同的语言起源,重要的共享词汇
- 许多印度人会说多种语言。他们会说 2 到 3 种语言,理解 4 到 5 种语言。
在 IIT 钦奈开发的印度文字是印度语言的通用文字。工作表明印度语可以使用一对一的字符集映射进行音译。
在 IIT 钦奈发明的印度文字是印度语的通用文字。(图片来自 Bharati 脚本项目)
数据
数据的可用性和成本是大多数企业家面临的最大障碍。语音和语言的精选数据集是堆栈中的最低层。
许多著名的机构一直在为他们的研究收集有关印度语的数据。这些机构拥有数百小时的数据。但是随着时间的推移,这些数据以及使用这些数据的方法都丢失了。
学生毕业后,论文资料就像祖母珍贵的首饰盒。很少有人知道它在哪里,也没有人打开过它。——一位教授@ IISc Bangalore
对于语音识别,一些可用的数据集:
- 印度语言语言数据联盟(LDC-IL) 可能拥有学术界最大的印度语言数据集。他们通过一个数据发布门户来收费。
- 微软为研究人员发布了一个小型的古吉拉特语、泰米尔语和泰卢固语的语音语料库。
- Mozilla 的 Common Voice 有阿萨姆语、旁遮普语、奥迪亚语和泰米尔语的语音数据。
对于自然语言,一些可用的数据集:
- 来自 LDC-IL 的文本数据语料库
- 来自 IIT 孟买的英语-印地语平行语料库
- 印度语多语言平行语料库孟加拉语、印地语、马拉雅拉姆语、泰米尔语、泰卢固语和乌尔都语
巩固和建立一个类似 LibriSpeech 的印度语研发数据集将会带来丰厚的回报。
模型
拥有数据是强制性的第一步。但是训练 DNN 模特需要高水平的专业知识。它也很昂贵。
合乎逻辑的下一步是为印度语提供预先训练好的现成模型。隐私敏感型应用程序可以在设备上使用这些模型,也可以将其作为服务托管在内部私有云上。
软件即服务(SaaS)
SaaS 将开发人员从托管模型和管理服务基础设施中解放出来。这使得开始构建应用程序变得更加容易。
所有主要的云基础设施都为语音识别、自然语言理解和一些印度语言的文本到语音转换提供了 SaaS。
这些服务相当昂贵(就像支付网关一样)。让更多的 SaaS 供应商使用这些预先训练好的模型可以降低成本。
软件开发工具包(SDK)
流行的编程语言和 OS 平台中的 SDK 构成了最后一层。SDK 可以使用模型或 SaaS。
为应用领域调优模型或服务需要一些 ASR 和 NLU 的专业知识。需要针对特定领域的 SDK(例如,针对银行、电子商务、农业)来进一步降低准入门槛。
我们俚语实验室已经从我们的客户那里了解到这一点。我们现在提供语音助手即服务(VaaS ),以提高客户对语音助手的采用。
****Bhārat Bhāṣā栈。技术:自动语音识别(ASR)、文本到语音(TTS)、自然语言理解(NLU)、机器翻译、音译和光学字符识别(OCR)。(图片由俚语实验室提供)
生态系统参与者
设计和建造 Bhārat Bhāṣā堆栈需要系统和持续的合作:
- ****学术界分享代码为的关于印度相关对话式人工智能问题的研究论文。
- ****行业为普通人打造语音产品和服务。
- ****政府在建设印度堆栈中扮演类似的角色。
- ****行业团体通过会议和联盟加快协作。
政府积极制定人工智能政策:
- Niti Ayog 发表了一篇关于人工智能国家战略(#AIforAll) 的讨论论文
- 印度语言的技术开发隶属电子部&信息技术促成了 IDC-IL 数据发布门户的创建。
NASSCOM 和 FICCI 一直在举办研讨会,将公司和大学聚集在一起。俚语实验室一直是积极的参与者。
摘要
支持语音的应用程序可以跨越不同语言和社会经济群体之间的互联网鸿沟。语音和自然语言技术正在成熟,但仍然非常昂贵。
对于企业家和小企业来说,数据和模型培训成本是巨大的障碍。本地印度语 Bhāṣā堆栈将消除进入障碍。
本文概述了堆栈,以及我们需要构建的组件。我们需要:
- 巩固各组织正在进行的努力
- 集中资源来建造它,和
- 使其以低成本可用。
FinTech 的 India Stack 之所以成功,是因为包括政府在内的所有人都走到了一起。根据印度的独特需求构建 Bhārat Bhāṣā堆栈是其成功和广泛采用的关键。
让我们开始吧!
一名家庭佣工努力在 SBI 应用程序中找到自己的账户余额。她犹豫地尝试了所有的东西,尽管“右”按钮在第一个屏幕上很突出。巴拉特·bhāṣā·斯塔克能让她的生活轻松一点。
如果你喜欢,请:
原载于 黑话实验室博客 。
版本控制 101:定义和好处
什么是版本控制,为什么它很重要?
图片由作者提供(使用 Canva 制作)
软件工程领域是一个快速变化的领域。说到软件,没有最终版本。所有的应用程序和代码总是在不断地发展。软件工程的一个重要方面是版本控制。
版本控制系统是一种特殊类型的软件开发工具,旨在帮助软件开发人员跟踪对任何特定应用程序的源代码所做的任何更改。
通常,任何软件项目都是由一个程序员/开发者团队来处理的。他们中的每一个人都致力于整个项目的一个特定方面。这些开发人员需要为他们分配的任务编写和测试代码,而不影响产品的工作版本。这就是版本控制的用武之地。
除了促进任何软件项目的并行开发之外,当代码中出现错误,导致它中断时,我们可以使用版本控制来跟踪错误,并返回到代码的最新工作版本。
随着我们构建的软件变得越来越大、越来越复杂、越来越通用,版本控制的知识以及如何有效地使用它是任何软件开发人员都需要获得和开发的基本技能之一。
在本文中,我们将深入了解版本控制的世界,它意味着什么,为什么使用它,以及如何开始使用它。
版本控制
如上所述,版本控制是一种帮助开发人员/程序员解决一些日常问题的工具,例如:跟踪代码中的更改,帮助维护代码,并允许他们在不影响彼此工作流的情况下处理相同的源代码文件。
版本控制的概念通常是通过称为版本控制系统(VCS)的特殊系统来实现的。近年来,这些系统经历了许多发展。有时,VCS 被称为源代码管理工具(SCM)或修订控制系统(RCS)。
也许当今世界上数百万开发人员和程序员使用的最流行的 VCS 是 Git。目前使用的其他 VCS 包括:
- 必须的。
- 豆茎。
- 阿帕奇颠覆。
- AWS 代码提交。
版本控制系统的类型
有两种主要类型的版本控制系统:集中式和分布式版本控制系统。
集中式版本控制系统
图片由作者提供(使用 Canva 制作)
集中式版本控制系统(CVCS)是一种版本控制系统,它有一台服务器,包含所有版本的代码文件(通常存储在存储库中)、一些贡献者(处理代码文件的程序员)以及主项目的备份文件。
这种设置允许代码的每个贡献者知道其他人在做什么,使得基于特定任务的人员交流和管理更加容易。
这种设置的主要缺点是,由于所有的代码文件和备份文件都存储在一个集中的服务器上,如果服务器发生了什么问题,那么一切都将丢失。颠覆和被迫是 CVCS 的例子。
分布式版本控制系统
图片由作者提供(使用 Canva 制作)
分布式版本控制系统(DVCS)如 Git、Mercurial 或 Bazaar 是版本控制系统,有一个或多个包含代码文件的主服务器。
然而,与 CVCS 不同的是,在 DVCS,代码文件被镜像到每个贡献者的计算机上,这意味着他们每个人都有自己的代码版本,包括在本地工作的完整历史。
因此,如果任何服务器停止运行,一旦服务器恢复运行,贡献者的任何存储库都可以复制到服务器上,并恢复代码文件的历史。这很容易做到,因为原始代码文件的每个克隆实际上都是所有项目数据的完整备份。
DVCS 允许不同物理位置的不同人群在同一项目中同时协作。这是在中央系统中不可能实现的优势。
版本控制的好处
使用版本控制系统对任何软件开发团队都有各种好处,包括:
1 生成备份
也许使用版本控制系统最重要的好处是,每次贡献者克隆一个存储库,从某种意义上说,他们是在创建该存储库当前版本的备份。在不同的机器上有多个备份是很有价值的,因此我们可以保护数据不会因为服务器故障而丢失。
2 测试和实验
当今世界,任何源代码总是在开发中。新的功能总是在增加,新的受众是目标,新的应用程序是要开发的。
当一个团队在一个软件项目上工作时,他们通常有不同的主项目克隆来开发新的特性,测试它们,并确保它们在这个新的特性可以被添加到主项目之前正常工作。这可以节省时间,因为代码的不同方面可以同时开发。
3 保存历史并跟踪变化
拥有特定代码文件中变更的记录可以帮助您和新的贡献者理解代码的特定部分是如何形成的。它是如何开始并随着时间的推移发展到现在的版本的。
此外,如果随着时间的推移,某个特性的添加给项目的扩展带来了困难,那么使用版本控制可以让开发人员跟踪出那个特定的特性,并在不影响项目功能的情况下更改或删除它。
4 协作和贡献
版本控制系统的主要好处之一,尤其是 DVCS,是它允许我们为我们喜欢的项目做贡献,尽管我们身处不同的国家。我认为 DVCS 的存在是开源技术取得目前成功的主要推动者之一。
外卖食品
充分理解版本控制系统,它们是如何工作的,并有效地使用它们,这是任何程序员或软件开发人员都需要掌握的基本技能之一,并在他们的职业生涯中取得成功。
版本控制系统可能是非常复杂和难以理解的话题之一。这就是为什么我决定撰写一系列文章来解决版本控制的不同方面。这些文章的目标是让您轻松舒适地开始版本控制。
本系列即将发布的文章将涵盖每个开发人员都应该知道的 Git 基本命令,一些让您脱颖而出的高级命令,以及如何有效地使用 Git 来使您的工作流程流畅愉快。
版本控制 101:Git 入门
Git 如何工作的简要概述
图片由作者提供(使用 Canva 制作)
假设你是一名软件开发人员、数据科学家或程序员。在这种情况下,您一定在旅途中的某个时候遇到过 Git。掌握版本控制是所有软件相关领域共有的基本技能之一。
版本控制系统是一种特殊类型的软件,旨在帮助程序员跟踪任何特定的应用程序源代码更改。
一般来说,版本控制系统有两种类型,集中式和分布式系统。这两种类型的主要区别在于,在集中式系统中,代码文件和关于贡献者的信息存储在一个服务器中。然而,在分布式系统中,代码文件被复制到每个贡献者的机器上。
Git 是一个常用的基于存储库的分布式版本控制系统。它是由 Linux 的创造者 Linus Torvalds 创建的。Torvalds 创建了 Git 来管理 Linux 内核源代码。Git 是 GitHub 和 GitLab 等许多服务的核心。
什么是版本控制,为什么它很重要?
towardsdatascience.com](/version-control-101-definition-and-benefits-6fd7ad49e5f1)
在本文中,我们将介绍 Git 的工作原理及其基本构件。
Git 是如何工作的?
Git 的算法被设计成利用真实源代码文件树的公共属性,以及它们通常如何随着时间的推移而被修改。
当处理代码文件时,Git 不关注文件名,而是跟踪其内容。Git 是这样设计的,因为大多数情况下,代码文件的名称是不固定的。
为了存储代码文件,Git 使用 delta 编码——保持文件内容的差异——来显式保存存储库内容和版本的元数据。
Git 处理内容变化的方式是存储不同的快照。每个快照都链接到源代码中的特定更改。Git 还被设计为可以很好地应用或回滚在两个快照之间执行的修改。
Git 基础
仓库
Git 的主要构件是存储库(repo)。将存储库想象成计算机内存中的一个文件夹,该文件夹包含不同的文件,具有不同的类型和不同的编辑日期。
这些文件及其信息和任何子文件夹称为回购的内容。内容的所有版本都存储在 repo 中。repo 是存储内容和修改内容的地方,称为工作目录。
例如,假设您在硬盘上的特定目录中有多个 doc 文件。在这种情况下,这个目录将是 repo,其中的文件就是内容。假设你打开了其中一个文件进行编辑——使用文字处理器——编辑文档的应用程序就是工作目录。
读取内容当前版本的过程称为签出,存储新版本的过程称为提交。回到我们的目录示例,在字处理器中打开 doc 文件就是签出它,而单击 save 按钮相当于提交文件。
图片由作者提供(使用 Canva 制作)
每次提交文件时,您都会在存储库中创建该文件的新版本—快照。一系列版本创建一个分支。在 Git 中,主分支过去被命名为 master。然而,最近 Git 把它改成了 main。分支的概念用于实现一个具有分布式开发人员基础的项目,并在开发新功能的同时提供代码的稳定版本。
在 Git 中,术语 commit 在创建版本时用作动词,并作为结果快照的名称。
Git 包含许多处理和操作回购的命令。init、add、commit、branch、log 等命令。这些命令中的每一个都可以帮助您执行特定的任务。
分支
正如我们刚才提到的,一组变更称为一个分支。repo 通常包含不同的分支,主要分支和用于开发附加功能的独立分支。
在 Git 中,分支由称为变更集的有序变更列表组成。这些更改在应用到版本或快照时进行排序。分支只是指向特定版本的命名指针。当开发人员使用这个分支时,它会记录下哪里发生了变化。
分支背后的思想是,每次提交变更时,都会为该变更集创建一个新的分支。
图片由作者提供(使用 Canva 制作)
合并
在一个分支上完成开发之后,是时候将这些变更添加到主分支中了。这样做的过程称为合并。合并将两个分支的内容合并为一个。
根据所做更改的类型和分支的内容,您可以执行三种类型的合并:
- **快速向前合并:**在这种类型中,自创建第二个分支以来,原始分支没有任何新的变化。在这种情况下,Git 在最后一次提交原始分支更新之后添加第二次分支更新。由于原始分支中没有更早的更改,这种类型被称为快进分支,因为它将原始分支向前移动到第二个分支所在的位置。
- **无冲突合并:**在两个分支都发生变化的情况下,这些变化是独立的,不会引起任何冲突,Git 可以自动将所有的变化应用到原来的分支,并创建一个新的提交。
- **冲突合并:**如果两个分支中的更改发生冲突,例如,它们是在同一个代码文件上完成的,Git 会留下结果,导致工作目录中的冲突。用户必须解决冲突或中止合并。
图片由作者提供(使用 Canva 制作)
Git 检查冲突的方式非常有趣。它主要试图找到内容中发生变化的位置;如果两个分支在相同的位置有内容,Git 将停止并产生一个冲突标志。如果修改了相同的内容,但修改是独立的,Git 可以检测到这一点并执行快速向前合并。
外卖食品
理解 Git 的内部工作可能不是开发人员或程序员需要了解的关键知识,但了解它如何工作以及如何有效使用它的高级部分是一项技能,如果不获得这项技能,你就无法在职业生涯中进步。
Git 由包含不同代码文件以及版本元数据的存储库组成。在本文中,我们介绍了 Git 基础知识,如何创建和处理回购。如何创建和合并分支以及 Git 提供的不同类型的合并。
本系列的下一篇文章将介绍更高级的 Git 概念,比如挑选和回滚。
使用 Git 进行版本控制:不到 15 分钟即可开始
完全初学者的循序渐进教程。
在 Unsplash 上由 Bernd Klutsch 拍摄的照片。
你是否经常听说 Git(或者 GitHub ),但是不知道它意味着什么,它有什么好处,或者它是如何工作的?你来对地方了。
在本教程中,您将学习如何使用最基本的 Git 命令——在使用 Git 时,您大部分时间都需要知道这些命令。更具体地说,在这里您将学习如何为您的项目创建一个 Git 存储库,以及如何使用它来记录项目中所有未来的变更。并且完成这个教程应该花费你不到十五分钟的时间,假设你在安装过程中不会有任何问题(我希望大多数人不会有)。所以让我们开始吧。
版本控制?饭桶?为什么?
简而言之,Git 是一个开源版本控制系统,它允许您随时跟踪项目的变化。例如,使用 Git,您可以很容易地检查项目中每个文件在给定时间的状态,如果您愿意,甚至可以将其恢复到那个状态。这也使得管理多人同时工作的项目变得更加容易,每个人都在自己的计算机上工作。
Git 不是唯一可用的版本控制系统(其他例子: SVN 、 CVS 、 Mercurial ),但它是现今使用最多的一个。如果你是一名软件开发人员、网页设计师、数据科学家,或者从事其他任何涉及文本文件的项目,学习如何使用 Git 对你来说肯定是一项非常有价值的技能。
安装和设置
在本教程中,我们将从命令行终端(在 Windows 中也称为命令提示符)运行 Git 命令,因此如果您已经有一些使用终端的经验,这会很有帮助。但是,如果您以前从未使用过它,也不用担心——您仍然可以遵循本教程。
打开终端/命令提示符
首先,让我们在您的计算机上打开一个命令行终端。根据您的操作系统,以下是一些快捷的方法:
- Windows:按下
[⊞ Win]+[R]
,然后键入cmd
并按回车键。 - Linux:按
[Ctrl]+[Alt]+[T]
。 - MacOS:按下
[Command]+[Space]
,然后输入terminal
并回车。
安装 Git
我们将首先检查您的计算机上是否已经安装了 Git 如果没有,我们将安装它。在终端上键入git --version
并按回车键。如果安装了 Git,您将看到当前安装的版本,如下图所示。如果您已经有了 Git,您可以直接跳到下一节“设置您的数据”。
如果你得到类似git: command not found
的东西,那么你需要安装 Git。在 MacOS 上,运行git --version
可能已经提示了一些安装说明,你只需要按照它们去做就可以了。如果不是这种情况,请根据您的操作系统遵循以下说明:
- Windows:为 Windows 安装 Git。
- Linux:在终端上运行
sudo apt-get install git
。 - MacOS:安装 Git for Mac 。
设置您的个人数据
安装后,您需要配置您的姓名和电子邮件——它们将用于在您的“提交”中识别您的身份(稍后我将解释它们是什么)。为此,请在终端中使用您的个人数据运行以下两个命令:
git config --global user.name "Your Name"git config --global user.email "your@email.com"
就是这样。现在您已经准备好开始使用 Git 了!
创建您的第一个 Git 存储库
虽然 Git 主要由程序员使用,但它实际上可以用于任何包含一个或多个计算机文件的项目。在本教程中,您将使用 Git 来管理包含两个简单文本文件的项目:一个包含购物清单,另一个包含待办事项清单。您将用于管理这个项目的命令与您用于编程项目的命令完全相同。
为项目创建一个目录和一些文件
让我们从创建项目目录和其中的两个文本文件开始。在硬盘中创建一个名为my_lists
的目录,并在其中创建两个文本文件,内容如下:
shopping_list.txt
:
- Toilet paper (10 rolls)
- Beer (12 bottles)
- Food
to-do_list.txt
:
- Meet friends
- Go shopping
- Learn Git
这将是我们项目的初始状态。
初始化 Git 储存库
使用终端,导航到刚刚创建的目录my_lists
。你可以用命令cd
来完成。如果你不知道如何使用终端导航,这里有一些说明:Windows 上的;Linux 或 MacOS 上的/。导航到my_lists
之后,如果你运行ls
(在 Linux/MacOS 上)或者dir
(在 Windows 上),你应该能看到你创建的两个文件。
现在,运行git init
使您的项目目录正式成为 Git 存储库。之后,你可以在任何时候从那个目录中运行git status
来检查里面发生了什么。如果您现在这样做,您将看到您的存储库“还没有提交”,并且这两个文件被标记为“未跟踪”:
添加新文件
要让这些文件开始被 Git 跟踪,您需要将它们“添加”到存储库中。为此,您将使用命令git add
。这些选项中的任何一个都可以达到目的:
- 运行
git add shopping_list.txt
,然后运行git add to-do_list.txt
,每次添加一个文件;或 - 运行
git add shopping_list.txt to-do_list.txt
用一个命令添加两个文件;或 - 运行
git add .
或git add -A
一次性添加当前目录下的所有文件。
添加文件后,再次运行git status
,您应该会看到如下内容:
现在,这两个文件位于所谓的“暂存区”中。这意味着这些文件将包含在您的下一次提交中。
你的第一次承诺
在 Git 中,提交是给定时间项目状态的快照。把它想象成一个将被永久保存的项目版本,这样将来你就可以很容易地看到从那时起发生了什么变化,如果你愿意,你甚至可以把项目恢复到那个状态。每次您在项目中进行重要的更改时,您都应该创建一个新的提交,这样您的工作就会记录在项目的历史记录中。
在将这两个文件添加到暂存区域之后,您可以使用命令git commit -m "Your commit message"
创建您的第一个提交。确保总是写一个有意义的提交消息来描述什么已经改变了,因为任何检查项目历史的人都会看到这个消息。
提交后,运行git log
。这将显示您的提交历史。此时,日志中应该只有一次提交,如下所示:
注意:您也可以在没有 *-m*
选项的情况下运行命令*git commit*
——这将打开一个文本编辑器,要求您输入提交消息。但是要小心,因为根据你的系统,这可能会打开一个命令行文本编辑器,如vim,如果你不知道如何使用它,那么 可能很难退出 。你也可以用 *git config --global core.editor <editor>*
命令 改变默认的文本编辑器 。
进行和提交更改
在为您的项目创建 Git 存储库之后,下一步是使用它来记录未来的变更。让我们回到我们的例子:假设您刚刚发现您所在的城市爆发了一场重大病毒,这迫使您修改了购物和待办事项列表,如下所示:
shopping_list.txt
:
- Toilet paper (100 rolls)
- Beer (120 bottles)
- Food
- Hand sanitizer
to-do_list.txt
:
- Go shopping
- Wash hands
- Learn Git
查看您的更改
和以前一样,您可以用命令git status
检查存储库的当前状态。这将显示 Git 已经检测到两个文件中的更改:
但是您也可以获得更多关于自从您最后一次使用git diff
提交以来发生了什么变化的细节。这将逐行显示所有文件中所有已更改的内容:
通常,未更改的行打印为白色,而新行打印为绿色,删除的行打印为红色。请注意,被修改的行实际上显示出来,就好像旧版本已被删除,新行已被添加。
创建新提交
要创建一个包含这些更改的新提交,过程与创建第一个提交的过程相同:首先使用git add
,然后使用git commit
。
虽然您可以为两个文件中的更改创建一个提交,但是让我们为每个文件创建一个提交。首先,运行git add shopping_list.txt
将这个文件添加到暂存区。之后,您可以使用git diff --staged
检查哪些变更已经被添加到了临时区域。如果您现在运行git commit
,这个命令将显示哪些更改将被提交。
如果一切都如预期的那样,那么现在通过运行git commit
创建一个包含这些阶段化更改的新提交,就像创建第一个提交时所做的那样。同样,确保包含有意义的提交消息。之后,作为练习,您可以使用文件list.txt
中的更改创建第三个提交。
全部完成!
如果您做的一切都正确,那么您的存储库中现在有三个提交。您可以使用git log
进行检查,您应该会看到类似这样的内容:
就是这样。现在您知道了如何为您的项目创建一个 Git 存储库,以及如何为您将来的所有更改进行新的提交。一般来说,在使用 Git 的大部分时间里,您将会用到刚刚学到的这几个命令。
你可以做的其他事情
当然,Git 还有更多的东西——本教程的目标只是让您开始上面描述的基本工作流程。下面是您可以用 Git 做的一些其他事情的列表(包括更详细信息的链接):
- 您可以通过
git show
查看特定提交引入了哪些更改。 - 你可以用
git reset
来撤销你所有未提交的修改(注意这一点)。 - 您可以使用
git revert
恢复由特定提交引入的所有更改。 - 你可以用
git stash
暂时“隐藏”你的改变。 - 您可以使用
git checkout
将项目恢复到旧的状态。 - 您可以使用 Git 分支管理同时实现的多个特性。
- 你可以使用像 GitHub 或 GitLab 这样的远程 Git 平台分享你的项目和/或与其他人合作。
一般来说,你可以在像 StackOverflow 这样的在线论坛上找到非常有用的关于如何使用 Git 的建议。所以如果你不知道如何用 Git 做一些事情,你通常可以通过简单地在网上搜索来学到很多。
进一步阅读
- Git:一个快速简单的版本控制指南,作者 Christian Leonardo。
- Git 和 GitHub 入门:新开发人员版本控制、项目管理和团队合作的综合指南,作者 Mariot Tsitoara。
- 对于一些其他有用的命令,查看你应该知道的 10 个 Git 命令。
- 如果你想学习如何使用 GitHub,请查看数据科学家 GitHub 简介。
更多由同一作者
这是一个简单的策略,可以让你在任何项目中更有效率。
medium.com](https://medium.com/swlh/do-this-before-you-start-working-on-any-project-14fd7bfa7327) [## “大 O”和其他渐近符号背后的数学
像“大 O”、“大ω”和“大θ”这样的符号的正式定义。
towardsdatascience.com](/the-math-behind-big-o-and-other-asymptotic-notations-64487889f33f) [## C/C++中测量执行时间的 8 种方法
不幸的是,没有放之四海而皆准的解决方案。在这里你会找到一些可用的选项。
levelup.gitconnected.com](https://levelup.gitconnected.com/8-ways-to-measure-execution-time-in-c-c-48634458d0f9)
披露:此帖子包含一个或多个来自亚马逊服务有限责任公司协会计划的链接。作为代销商,我从通过这些链接购买的商品中获得佣金,客户无需支付额外费用。
使用 Jupyter 笔记本进行版本控制
编程;编排
Jupytext 分步指南
**Table of Contents**[**Introduction**](#1cd1)1\. [Creating a demo repo](#a92d)
2\. [Jupytext setup](#9aab)
3\. [Converting to a python file](#b1b8)
4\. [Converting multiple files](#f3c3)
5\. [Converted file](#7ac3)
6\. [Adding ipynb to .gitignore](#3d3b)
7\. [Converting to ipynb files](#e9a8)
8\. [Other commands](#56e5)
9\. [Paired notebooks](#6b91)[**Conclusion**](#a9ad)
介绍
Jupyter notebook 生成包含元数据、源代码、格式化文本和富媒体的文件。[git diff](https://gist.github.com/shinokada/fa5c18b1ed26eb11344b5344dc1391ac)
中一个字的改变导致成千上万个字母。
Jupytext 可以将 Jupyter Notebook 保存为 git 友好和人类友好的文件格式,包括 Markdown、Python、Julia、Bash、Clojure、Matlab、TypeScript、Javascript 等。
它还将这些文档转换成 Jupyter 笔记本。在本文中,我将使用 Jupytext 一步步地介绍 Jupyter Notebook 的版本控制指南。
如果你用的不是 Github 的 ipynb 渲染、 Nbviewer 或者 Binder ,那么 Jupytext 应该是你版本控制的选择。
支持的扩展有:
Jupyter 笔记本 Diff 入门
levelup.gitconnected.com](https://levelup.gitconnected.com/a-painless-jupyter-notebook-code-review-and-diff-51d36d8cd20b) [## 如何在 Docker 上运行 Jupyter 笔记本
不再有 Python 环境和包更新
towardsdatascience.com](/how-to-run-jupyter-notebook-on-docker-7c9748ed209f) [## Jupyter 用户的生产力提示
使用 Jupyter 笔记本和 JupyterLab 让您的工作流程更加高效
towardsdatascience.com](/stepping-into-intermediate-with-jupyter-f6647aeb1184)
创建演示回购
首先,让我们用下面的代码创建一个新的 Jupyter 笔记本文件。
x = np.arange(-3, 3, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()
请创建一个 Github repo。
echo "# jupyter_notebook_version_control" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin [git@github.com](mailto:git@github.com):username/jupyter_notebook_version_control.git
git push -u origin master
我在 ipynb 文件中将“sin”改为“cos”。
y = np.cos(x)
该链接是“git diff”的结果。它为三封信生成了数千封信。
Jupytext 设置
让我们安装并设置 Jupytext 。
pip install jupytext --upgrade
或者对于康达用户
conda install -c conda-forge jupytext
重启 Jupyter 笔记本。
转换为 python 文件
您可以将 ipynb 文件转换为受支持的文件之一。我将在本文中使用一个 python 文件。
在你的终端里,你可以这样运行。
jupytext --to py <your-file-name>.ipynb
对于我的情况:
jupytext --to py Version_control.ipynb
产出:
[jupytext] Reading ./Version_control.ipynb
[jupytext] Writing ./Version_control.py
第一篇数据科学文章指南
towardsdatascience.com](/7-essential-tips-for-writing-with-jupyter-notebook-60972a1a8901)
转换多个文件
让我们一次转换所有的 ipynb 文件。请在您的目录中创建更多文件。
jupytext --to py *.ipynb
输出:
[jupytext] Reading Version_control.ipynb
[jupytext] Writing Version_control.py
[jupytext] Reading sine.ipynb
[jupytext] Writing sine.py
[jupytext] Reading tangent.ipynb
[jupytext] Writing tangent.py
您可以将文件转换成目录。如果不存在,Jupytext 将创建一个新目录。
jupytext --to destination_folder//py *.ipynb
注意事项:
如果您愿意,可以在其中一个单元格中运行 jupytext。但是这个单元格也会出现在转换后的文件中。
!jupytext --to py <your-file-name>.ipynb
转换文件
让我们在您的终端中查看转换后的文件。
cat Version_control.py
我的输出:
# ---
# jupyter:
# jupytext:
# text_representation:
# extension: .py
# format_name: light
# format_version: '1.5'
# jupytext_version: 1.3.3
# kernelspec:
# display_name: Python 3
# language: python
# name: python3
# ---
x = np.arange(-3, 3, 0.1)
y = np.cos(x)
plt.plot(x, y)
plt.show()
它非常紧凑,文件大小非常小。尼斯(法国城市名)😃 👏👏👏👏。
将 ipynb 添加到。gitignore
因为我们没有跟踪ipynb
文件,所以我们可以将它添加到.gitignore
文件中。请在您的项目根目录下创建一个.gitignore
。git 目录。
touch .gitignore
请加上*.ipynb
和。ipynb_checkpoints
忽略所有 Jupyter 笔记本文件。或者将这个完整的列表添加到你的 gitignore 中。
# for Jupytext ignoring ipynb files
*.ipynb
在这个阶段,git 仍然会跟踪.ipynb
文件中的变化。要解决这个问题,您需要删除 git 缓存并再次添加所有文件。
git rm -r --cached .
git add .
git commit -m "fixed untracked files"
在你的 Jupyter 笔记本上换了一行后,看看.gitignore
是否工作。
# change whatever you want
y = np.arange(-2,2,0.1)
在您的终端中检查它:
git status
它不应该返回修改过的文件。让我们再次运行 Jupytext 来思考我们的变化。请在您的终端中运行以下程序。
jupytext --to py Version_control.ipynb
转换后的文件将被替换。😃
[jupytext] Reading ./Version_control.ipynb
[jupytext] Writing ./Version_control.py (destination file replaced)
让我们检查一下 git 状态。
git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: Version_control.py
no changes added to commit (use "git add" and/or "git commit -a")
它只跟踪 python 文件,不跟踪 ipynb。请运行git diff
。
git diff
diff --git a/Version_control.py b/Version_control.py
index 02d91ea..6522717 100644
--- a/Version_control.py
+++ b/Version_control.py
@@ -14,6 +14,7 @@
# ---
x = np.arange(-3, 3, 0.1)
+y = np.arange(-2,2,0.1)
y = np.cos(x)
plt.plot(x, y)
plt.show()
请添加、提交并推送更改。
git add .
git commit -m "Update"
git push
转换为 ipynb 文件
我们将把这个 repo 克隆到另一个目录,并将其转换为 ipynb 文件。
cd ..
git clone git@github.com:shinokada/jupyter_notebook_version_control.git my-new-dir
我将我的 repo 克隆到一个名为 my-new-dir 的目录中。
cd my-new-dir
ls
README.md Version_control.py sine.py tangent.py
或者如果你有[tree](https://formulae.brew.sh/formula/tree)
。
tree
.
├── README.md
├── Version_control.py
├── sine.py
└── tangent.py
0 directories, 4 files
我们有我们需要的所有文件。我们把它转换成 ipynb 文件吧。
从您的终端:
jupytext --to ipynb *.py
输出:
[jupytext] Reading Version_control.py
[jupytext] Writing Version_control.ipynb
[jupytext] Sync timestamp of 'Version_control.py'
[jupytext] Reading sine.py
[jupytext] Writing sine.ipynb
[jupytext] Reading tangent.py
[jupytext] Writing tangent.ipynbls
README.md Version_control.py sine.py tangent.py. Version_control.ipynb sine.ipynb tangent.ipynb
其他命令
这些是您可以使用的其他命令。
# convert notebook.md to an .ipynb file and run it
jupytext --to notebook --execute notebook.md# update the input cells in the .ipynb file and preserve outputs and metadata
jupytext --update --to notebook notebook.py# Turn notebook.ipynb into a paired ipynb/py notebook
jupytext --set-formats ipynb,py notebook.ipynb # Update all paired representations of notebook.ipynb
jupytext --sync notebook.ipynb
配对笔记本
Jupytext 可以将一个给定的笔记本写入多个文件。除了原始的笔记本文件之外,Jupytext 还可以将输入单元格保存到文本文件中——脚本或 Markdown 文档。如有兴趣,请阅读更多详情。
结论
Jupytext 易于使用并创建友好的文件,您也可以在另一个编辑器中编辑这些文件。如果你正在使用git diff
,这是一个非常好的工具。我觉得这是目前用 Jupyter Notebook 做版本控制最完整的开源工具了。
通过 成为 会员,可以完全访问媒体上的每一个故事。
https://blog.codewithshin.com/subscribe
参考
[## IDE 中的 Jupyter 笔记本:Visual Studio 代码与 PyCharm
我每天都用 Jupyter 笔记本工作。每天我都在使用和编辑 Python 库。这两者都是我的…
towardsdatascience.com](/jupyter-notebooks-in-the-ide-visual-studio-code-versus-pycharm-5e72218eb3e8)
- https://github.com/mwouts/jupytext
- https://jupytext.readthedocs.io/en/latest/index.html
- https://jupytext . readthedocs . io/en/latest/introduction . html # demo-time
你好。你坚持到了最后。既然你来了,请帮我传播这篇文章。你也可以关注我,获取更多的 Jupyter、统计和技术文章。
Jupyter 技巧和提示的集合
medium.com](https://medium.com/series/jupyter-hacks-and-tips-1b1a3a10bc79)
垂直与水平人工智能初创公司
人工智能初创公司有两种截然不同的风格。无论选择哪一种,都要记住什么。
初创公司继续快速涌现。根据斯坦福人工智能指数,自 2014 年以来,超过 15798 家人工智能初创公司获得了至少 40 万美元的投资。根据 CB Insights 的说法,人工智能初创公司在 2019 年也吸引了创纪录的 266 亿美元投资。鉴于预计的数据指数级增长,投资者和企业家都渴望通过人工智能产生影响。
来源:斯坦福人工智能指数,第 88 页
然而,并不是所有的人工智能初创公司都是平等的。本文考察了垂直和水平人工智能创业公司之间的差异和共性。这些见解是基于与人工智能专家的讨论,他们来自一家总部位于硅谷的风投公司、一家总部位于柏林的人工智能风险工作室和一位人工智能企业家。
要了解垂直和水平的 AI 产品,我们先来深入 AI 产品开发的话题。
开发人工智能产品
每个基于人工智能的产品都遵循大致相同的工作流程。对于每个机器学习项目,团队必须收集和准备数据,开发模型,部署并监控其性能。 CRISP-DM 模型描述了下面的机器学习工作流程。
资料来源:德累斯顿大学
理解数据科学工作流程对于区分垂直和水平人工智能初创公司非常重要。垂直人工智能初创公司完成整个工作流程来交付产品,而水平人工智能初创公司则专注于实现一般的数据科学工作流程。
垂直人工智能初创公司
垂直人工智能初创公司提供基于人工智能的产品,拥有整个工作流程来解决非常有针对性的客户需求。这些初创公司从端到端开发一个完整的产品,从理解商业案例开始,到监控产品性能。
Vara 举例来说,它是一家垂直 AI 初创公司,可以在 x 光片上识别乳腺癌。Vara 是第一家获得联邦批准使用其人工智能解决方案来协助放射科医生的公司。该公司是垂直人工智能公司的一个主要例子,该公司完成了完整的数据科学工作流,以提供创新的人工智能产品。
人工智能是一种强大的工具,可以帮助公司在特定任务上实现超人的性能。人工智能为交付新产品、改进现有产品或自动化任务开辟了新的可能性。垂直人工智能初创公司针对特定的用例优化他们的预测。如果他们成功了,他们在这个用例中会比人类或竞争对手表现得更好。
垂直 AI 创业公司包括产品角色等关键岗位的领域专家。例如,制造自动化癌症检测产品的公司很可能拥有内部放射学家和/或肿瘤学家。——萨哈尔·莫尔,隐形模式下的企业家
然而,垂直人工智能初创公司更难调整他们的产品来服务于相邻的用例。对于擅长识别乳腺癌的 Vara 来说,将任务切换到检测脑癌并不是一件小事。人工智能模型在其狭窄的任务中表现良好。Vara 可以训练一个新的人工智能模型,从新的数据集中检测脑癌,但仍然可以重用他们现有的模型开发管道。
在 10 年内,垂直人工智能初创公司将极大地改变我们在某些职业中的工作方式。—Merantix 的联合创始人兼首席技术官 Rasmus Rothe
垂直人工智能初创公司的其他例子有无人驾驶汽车公司 Waymo 和金融犯罪预防公司 hawk.ai 。总而言之,对于垂直人工智能初创公司来说,最重要的是专注于解决一个足够大的用例,以确保增长。因为为新用例训练新模型需要时间和数据,所以最初的用例必须有足够的影响力来支持一个盈利的公司。
接下来我们来评价一下横向 AI 创业公司的具体情况。
横向 AI 公司
一个横向的 AI 公司使数据科学家能够更高效地完成数据科学工作流程。因此,横向 AI 创业公司的客户一般是数据科学家或开发团队。
横向 AI 公司挑选数据科学工作流程的特定或多个部分,并对其进行改进。例如,一家横向人工智能公司可以专注于帮助数据科学家监控他们的模型。横向 AI 产品是用例不可知的,用于开发任何基于 AI 的产品。
土星云是一家横向 AI 初创公司,旨在让数据科学家更加有效。它提供完全托管的服务,使数据科学家能够使用他们最熟悉的工具(Python、Jupyter 和 Dask)进行大规模工作。该工具是通用的,因此它可以用于任何基于人工智能的产品。
“在几十个行业中,我们听到自动化数据科学工作流如何为他们的最终客户带来更高效的团队和更好的体验。与此同时,Python 的使用正在飙升,并迅速主导了数据科学领域,因此采用一套 Python 原生工具进行分析和自动化对大多数数据团队来说是有意义的。”——Hugo Shi,土星云的联合创始人,也是 Anaconda 的前创始人。
根据 IDC 的预测,随着数据量的指数增长,横向人工智能解决方案有望在未来变得更加有用。数据是人工智能产品的燃料,因此可用的数据越多,创造有价值的数据产品的潜力就越大。此外,数据科学家市场继续稳步增长。根据 IBM 的一项研究,2020 年美国对数据科学家的需求将增长 28%,达到 270 万人。因此,目标客户群继续增长。
资料来源: IDC
但是,横向的 AI 产品也面临挑战。他们必须无缝集成到目标数据科学工作流和软件堆栈中。此外,“在开发横向人工智能产品时,争取市场领先地位很重要”,拉斯穆斯·罗斯说。对于横向人工智能初创公司来说,很难收集专有数据,从而建立数据防御。当定义数据科学工作流的哪个步骤要自动化时,记住不同的基于人工智能的模型的不同要求是很重要的。专注于对目标群体最有价值的功能,将使有志于成功的横向人工智能创业公司与众不同。
尽管横向人工智能公司通常面临更多竞争,但它们的产品通常更容易被收购,因为其技术可以被更广泛的收购者收购。— 杰森·里施
横向人工智能初创公司的其他例子有数据标签公司 understand.ai ,以及数据科学工作流管理初创公司 neptune.ai 。横向人工智能创业公司的潜力是巨大的。然而,构建一个超越竞争对手并达到市场领先地位的工具是具有挑战性的。一旦你给很多数据科学家提供了价值,你的横向 AI 创业就成功了。
垂直与水平人工智能初创公司
人工智能创业公司是不同的,理解他们独特的价值主张是建立一个成功的人工智能公司的核心。垂直 AI 创业公司交付产品,而水平 AI 创业公司则赋能 AI 产品创作。两种创业类型的 t 型组合也存在,但会在另一篇文章中讨论。
了解你正在建立的人工智能初创公司的类型很重要,因为这将最终影响你的产品路线图。
- 垂直人工智能初创公司需要专注于解决一个足够大的单一用例,以维持一个不断增长的公司
- 横向人工智能初创公司需要在他们选择的利基市场达到市场领先地位,为许多数据科学家提供价值
感谢您的关注!看完这篇帖子,你对垂直和水平 AI 创业公司的特点有了更深入的了解。如果你想听更多关于商业、项目管理和数据科学的交集,在 Medium 、 LinkedIn 或 Twitter 上关注 me。
Vespa.ai 和 CORD-19 公共 API
体验 Vespa 的功能
Vespa 团队一直在马不停蹄地工作,以由艾伦人工智能研究所发布的新冠肺炎开放研究数据集(CORD-19)为基础,组装 cord19.vespa.ai 搜索应用。前端的和后端的都是 100%开源的。后端基于 vespa.ai ,一个强大的开源计算引擎。由于一切都是开源的,你可以以多种方式为项目做贡献。
作为用户,您可以使用前端搜索文章,或者使用公共搜索 API 执行高级搜索。作为一名开发者,你可以通过向后端和前端发送请求来改进现有的应用程序,或者你可以派生并创建你自己的应用程序,无论是在本地还是通过 Vespa Cloud ,来试验不同的方式来匹配和排列 CORD-19 文章。我写这篇文章的目的是给你一个概述,通过使用 cord19 搜索应用程序公共 API,Vespa 可以完成什么。这只是皮毛,但我希望它能帮助你找到正确的地方,了解更多的可能性。
简单查询语言
cord19.vespa.ai 查询接口支持 Vespa 简单查询语言,允许您快速执行简单查询。示例:
- +新冠肺炎+温度对病毒传播的影响:如果你点击这个链接,你将会搜索到包含新冠肺炎、温度和短语对病毒传播的影响的文章。
- +title:" reproduction number "+abstract:MERS:该链接将返回标题中包含短语 reproduction number 和摘要中包含单词 MERS 的文章。
- +authors.last:knobel :返回至少有一个作者姓 knobel 的文章。
其他资源:
- 更多 cord19 的具体例子可以在 cord19 API 文档中找到。
- 简单查询语言文档是查询语法的地方。
Vespa 搜索 API
除了简单的查询语言,Vespa 还有一个更强大的搜索 API ,它通过名为 YQL 的 Vespa 查询语言来完全控制搜索体验。然后,我们可以通过向搜索端点 cord19.vespa.ai 发送 POST 请求来发送广泛的查询。以下是说明该 API 的 python 代码:
import requests # Install via 'pip install requests'endpoint = 'https://api.cord19.vespa.ai/search/'
response = requests.post(endpoint, json=**body**)
按查询术语搜索
让我们分解一个例子来提示您使用 Vespa 搜索 API 可以做些什么:
**body** = {
'yql': 'select title, abstract from sources * where userQuery() and has_full_text=true and timestamp > 1577836800;',
'hits': 5,
'query': 'coronavirus temperature sensitivity',
'type': 'any',
'ranking': 'bm25'
}
匹配阶段:上面的 body 参数将为所有匹配'query'
项中的任何一个('type': 'any'
)的文章选择标题和摘要字段,这些文章具有可用的全文(has_full_text=true
)和大于 1577836800 的时间戳。
排名阶段:根据上述标准匹配文章后,Vespa 将根据文章的 BM25 分数 ( 'ranking': 'bm25'
)对其进行排名,并根据该排名标准返回前 5 篇文章('hits': 5
)。
上面的例子仅仅给出了搜索 API 的一点尝试。我们可以根据自己的需要定制匹配阶段和排名阶段。例如,我们可以使用更复杂的匹配操作符,如 Vespa weakAND,我们可以通过在上面的正文中添加'default-index': 'abstract'
来限制搜索,只在摘要中查找匹配。我们可以通过将'ranking'
参数更改为搜索定义文件中可用的等级配置文件之一,在查询时试验不同的等级函数。
其他资源:
- Vespa 文本搜索教程展示了如何逐步创建文本搜索应用程序。第 1 部分展示了如何从头开始创建一个基本的应用程序。第 2 部分展示了如何从 Vespa 收集训练数据,并改进 ML 模型的应用。第 3 部分展示了如何通过使用预先训练的句子嵌入开始语义搜索。
- 更多特定于 cord19 应用的 YQL 示例可以在 cord19 API 文档中找到。
按语义相关性搜索
除了通过查询词进行搜索,Vespa 还支持语义搜索。
**body** = {
'yql': 'select * from sources * where ([{"targetNumHits":100}]nearestNeighbor(title_embedding, vector));',
'hits': 5,
'ranking.features.query(vector)': embedding.tolist(),
'ranking.profile': 'semantic-search-title',
}
匹配阶段:在上面的查询中,我们通过使用最近邻操作符来匹配至少 100 篇文章([{"targetNumHits":100}]
),这些文章在title_embedding
和查询嵌入vector
之间具有最小(欧几里德)距离。
排序阶段:匹配后我们可以用多种方式对文档进行排序。在这种情况下,我们使用一个名为'semantic-search-title'
的特定 rank-profile,它是预定义的,根据标题和查询嵌入之间的距离对匹配的文章进行排序。
标题嵌入是在将文档提供给 Vespa 时创建的,而查询嵌入是在查询时创建的,并通过ranking.features.query(vector)
参数发送给 Vespa。这个 Kaggle 笔记本演示了如何通过使用塞伯特-NLI 模型在 cord19 应用中执行语义搜索。
其他资源:
- 文本搜索教程的第 3 部分展示了如何通过使用预先训练的句子嵌入开始语义搜索。
- 进入排名页面了解更多关于排名的一般情况,以及如何在 Vespa 中部署 ML 模型(包括 TensorFlow、XGBoost 等)。
振动出张量流
为数据科学家设计的张量流。
我们都知道,业界对合格的数据科学家有着巨大的需求。那么,我们如何向学生展示数据科学的世界呢?
我认为对学生来说,从一开始就了解行业标准工具很重要,这有助于塑造他们学习和思考问题的方式。
考虑到这一点,我想考虑学生如何在没有动手机器学习经验的情况下开始学习这些工具,而在第一次遇到这些工具时,动手机器学习经验通常是假定的知识。
因此,我想写一个例子,说明一个学生如何在没有经验的情况下开始研究某些工具。
今天,我选择做一个高层次的,面向学生的概述…
让我们首先从理解名字开始: TensorFlow。
张量
为什么 TensorFlow 的名称中包含了“张量”?
简单来说,张量是一个 n 维物体。含糊不清?让我分享一个我在学习张量时发现很有帮助的形象化:
我想我们大多数人对标量是什么有一个相当直观的理解(一个数!)甚至向量和矩阵,但是从上面的图像看不清楚的是,所有这些东西都是不同维度的张量!
所以,一般来说,张量就像一个矩阵,但它不只是必须有行和列,它还可以有深度(通道)和更多深度(我们无法形象化)!
这意味着我们可以有一个对象存储对 n 特征的引用。这是机器学习中经常出现的东西,尤其是张量,在深度学习中具有重要作用。
有趣的是,TensorFlow 允许你以同步的方式处理机器学习和深度学习(神经网络)模型和算法,所以你可以开始看到这个名字的“张量”部分来自哪里。
流动
正如我稍后将触及的更多内容,TensorFlow 是一个工作流工具,它将一系列行业标准工具联系在一起,以便部署无缝的机器学习和深度学习项目。
简而言之,TensorFlow 给你你的机器学习流程。
“tensor flow 是机器学习的端到端开源平台。它有一个全面、灵活的工具生态系统、库和社区资源,让研究人员推动 ML 的最新发展,让开发人员轻松构建和部署 ML 驱动的应用。”
这是从 TensorFlow 网站复制粘贴的官方描述。
让我们打破这种描述,不要假设任何知识:
“TensorFlow 是一款端到端的开源软件—
等等——“开源”是什么意思??
好吧,既然这样,让我们磨练另一项关键的数据科学技能:
谷歌搜索是学生现在需要练习的技能。
感谢谷歌!所以“开源”是技术社区中广泛使用的一个短语,意思是让任何人都可以贡献和分发代码。
说到 Google,TensorFlow 是 Google Brain 团队打造的!
W 谷歌为什么要让 TensorFlow 开源?
嗯,与大多数开源项目一样,由于而不是是开源的,TensorFlow 将使自己处于巨大的劣势,因为竞争对手的深度学习框架,如 Theano、Keras 和 PyTorch 都是开源的。
它本质上允许 TensorFlow 从世界上一些最优秀的头脑中获得免费输入,以保持他们在最先进的技术上的竞争力。(不要担心,TensorFlow 对采用什么样的贡献有最终决定权,这样世界上最糟糕的想法也不能添加狗 sh * t——这就是开源项目的本质)。
就像我们描述的那样…
…用于机器学习的平台—
好吧,好吧,我知道我正在努力成为一名数据科学家,但是……实际上什么是机器学习?!
为了节省冗长的讨论…
具有讽刺意味的是,现在我已经向谷歌问了所有这些问题,我将在接下来的 4 周内看到机器学习课程的广告…机器学习(和 TensorFlow!!)在它最好的时候。
请注意机器学习和人工智能之间的区别。这两个术语经常互换使用,但正如你在这里看到的,机器学习实际上是人工智能的一个应用——但我们将在另一篇博客文章中讨论这个问题。
它[TensorFlow]拥有一个全面、灵活的工具生态系统、库和社区资源—
工具生态系统?图书馆?社区资源?
这有点像潘多拉的盒子,通常会突出更多需要学习的工具。但目前,我们可以理解为一个数据科学家使用了很多不同的软件工具,从清理和处理数据到开发和训练机器学习的模型。
TensorFlow 通过创建一个用户友好的框架来使用 Python、JavaScript 或 Swift 训练模型,从而帮助数据科学家导航这一工作流。然后,它让我们选择如何部署我们的工作——是在云中、在浏览器中还是在我们的设备上。点击查看更多相关信息。
社区资源符合开源环境的本质。TensorFlow 还通过 GitHub 和 Stack Overflow 提供大量关于如何最好地使用其平台的教程和资源,以及社区论坛和帮助请求。你可以在这里看到更多关于这个的内容。
图书馆。如果你以前没有遇到过图书馆或者从来不知道它们是什么—
所以简单地说,库只是一个函数的集合,这些函数做我们一直需要做的事情。
有一个编码原则,如果你一遍又一遍地写同样的代码,你可能需要把它放到一个函数中。记住这一点,把库想象成人们反复编写的所有函数,最后,有人想“如果我需要这个函数,其他人可能也需要这个函数”。
显然,数据科学家的工作中有非常重复的部分,因此有许多包含执行这项工作所需的所有功能的库。这里的是一些可以通过 TensorFlow 轻松访问的库和扩展。
…这使得研究人员可以推动 ML 的最新发展,开发人员可以轻松构建和部署 ML 支持的应用程序。"
虽然我们可能还没有任何机器学习的经验**,**但我们现在知道,当时机成熟时,我们有像 TensorFlow 这样的平台随时准备支持我们的努力。
随着你对这个行业和机器学习本身了解的越来越多,TensorFlow 的用途和应用会越来越明显。但总而言之,TensorFlow 是一个平台,它将许多其他行业标准工具联系在一起,创建一个工作流,使我们能够部署端到端的机器学习项目。
我鼓励你继续搜索并比较其他平台,如 PyTorch、Keras 和 Theano。最终,你将能够对你最喜欢使用哪些工具形成自己的看法。
快乐学习!
使用数据科学分析副总统和总统辩论
使用数据科学的辩论分析:使用 YouTube 评论发现选民的真实意图
I 简介
我相信数据科学让我以我从未想象过的方式表达我的好奇心。数据科学中最酷的事情是,我不是将数据视为数字,而是将数据视为机会(业务问题)洞察力(预测建模、统计和数据争论),以及改进(指标)。带着这个想法,我决定分析一下 VP 和总统辩论的 YouTube 评论。
在从新闻来源得到混杂的结果后,我想用数据科学来分析副总统和总统的辩论。
我们的想法是使用 YouTube 评论作为媒介,获取关于辩论的情绪,并从数据中获得见解。在这个分析中,我们绘制常用短语、常用词,我们还分析情绪,最后,我向我所有的数据科学从业者展示了一个完整的数据集,其中包含了 YouTube 上副总统的评论和总统辩论。
如何以及为什么
hy:在从新闻来源获得关于辩论结果的混合结果后,我决定使用数据科学来帮助我看到结果的结果。随着选举的临近,技术或者更准确地说是分析在塑造我们的思想和支持我们的假设方面发挥了关键作用。
为了分析 YouTube 评论,我们使用 Python 和其他各种 NLP 库,然后使用一些数据可视化工具。我们将使用被称为熊猫的令人敬畏的数据争论图书馆的奇迹,我们希望找到一些有趣的见解。
要求
对于这个项目,我们要求:
- Python 3.8
- 熊猫
- sci kit-学习
- Numpy
- 海生的
- NLTK
- Wordcloud
- 文本 Blob
数据集的创建
数据集包含 YouTube 上关于最受欢迎/最受关注的副总统和总统辩论的评论。我们使用 YouTube 数据 API 来获得所有评论(由于大小限制,我们每个视频只能获得 100 条评论)。这些视频是作者经过仔细审查挑选出来的,准确地说,我们关注的是最高浏览量和最高 YouTube 评论数。
def clean_text(string):
string = re.sub(r'[^\w\s]', '', string)
return ''.join(i for i in string if ord(i) < 128)def remove_stopwords(string):
stop_words = set(stopwords.words('english'))
word_tokens = word_tokenize(string)
filtered_sentence = [w for w in word_tokens if not w in stop_words]
filtered_sentence = []
for w in word_tokens:
if w not in stop_words:
filtered_sentence.append(w)return ' '.join(filtered_sentence)
这些函数定义了文本的清理和停用词的删除。
YouTube 评论提取
下面的函数定义了我们丢弃的 video _ ids 和一些基本的提取代码。我们以 JSON 的形式获取数据,然后执行预处理,最后将所有评论和情感评分(使用 TextBlob)组合成一个数据帧。
video_ids = {"vp_debate":['65twkjiwD90','t_G0ia3JOVs','xXE6I3gWiMc'], "prez_debate":[
'yW8nIA33-zY','wW1lY5jFNcQ','K8Z9Kqhrh5c']}video_id = "&videoId="
content = Nonedef extract_comments(resp):
"""
Get comments from the resp (json) yt comment
"""
com = []
for i in resp['items']:
com.append(i['snippet']['topLevelComment']['snippet']['textOriginal'].lower())
return comdef get_videos_comments():
"""
Extract video comments and store in the arrays
"""
vp_debate_data = []
prez_debate_data = []
for i,j in video_ids.items():
print("Getting for: ",i)
for id in j:
video_id = "&videoId=" + id
resp = requests.get(URL+video_id)
print("Length: ",len(resp.content))
content = resp.json()
comments = extract_comments(content)
if i == "vp_debate":
vp_debate_data.extend(comments)
else:
prez_debate_data.extend(comments)
return vp_debate_data, prez_debate_data
class Comment:
def __init__(self, text):
self.text = remove_stopwords(clean_text(text))
# set threshold as 0.5
self.sentiment = 0 if TextBlob(self.text).sentiment.subjectivity <= 0.5 else 1
def return_comment(self):
return selfclass DataGenerator:
def __init__(self, vp_debate_data, prez_debate_data):
self.vp_data = {"comments":[], "sentiment":[]}
self.prez_data = {"comments":[], "sentiment":[]}
for i in vp_debate_data:
c = Comment(i)
self.vp_data['comments'].append(c.text)
self.vp_data['sentiment'].append(c.sentiment)
for i in prez_debate_data:
c = Comment(i)
self.prez_data['comments'].append(c.text)
self.prez_data['sentiment'].append(c.sentiment)
self.df_vp = pd.DataFrame(self.vp_data)
self.df_prez = pd.DataFrame(self.prez_data)
def return_df(self):
print("Loaded dataframe.")
return self.df_vp, self.df_prez
# return corpus given the debate key
# to be used for getting the commonkeywords and plotting
def get_corpus(self, key="vp_debate"):
corpus = []
if key == "vp_debate":
corpus = [i for i in self.vp_data['comments']]
else:
corpus = [i for i in self.prez_data['comments']]
return corpus
我们数据的预览
分析
在检查数据时,我们首先将单词小写,然后去掉所有的标点符号,最后去掉所有的停用词。我们使用流行的文本块(【https://textblob.readthedocs.io/en/dev/】)来执行快速情感分析。
代表评论情感分析的条形图。
这些数据并没有提供太多的信息,但是如果我们试着用特定的词来分类或分组,那么我们可以得到更好的理解。
最常见的单词
我们找到每场辩论中最常见的单词(即 df_vp 和 df_prez)。我们使用称为 NLTK 的流行包来获取最常见的单词(经过预处理)
def most_common(corpus):
fd = nltk.FreqDist(corpus)
print(fd)
fd_t10=fd.most_common(10)
counter = dict(fd_t10)
# pd.Dataframe from dict to show bar plot
df = pd.DataFrame.from_dict(counter, orient='index')
names, values = zip(*fd_t10)
# plot method 1
fd.plot(10)
# plot method two
print("Bar Plot")
df.plot(kind='bar')
副总统辩论视频中的词频分布
总统辩论视频中的词频分布
正如你在总统辩论视频中看到的,最常见的词是“特朗普”和“拜登”。
WordCloud
词云或标签云是词频的图形表示,对在源文本中出现频率较高的词给予更大的重视。视觉效果中的单词越大,该单词在文档中就越常见。
def plot_wordcloud(kind="vp_debate"):
words = get_word_list(kind)
wordcloud = WordCloud(width = 800, height = 800,
background_color ='white',
min_font_size = 10).generate(' '.join(words))
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad = 0)
plt.show()
vp _ 辩论和 prez _ 辩论的词云表示
查找关键词:搜索特定单词的独特方式。
这个特性可以找到指定的关键字(最多前 10 个单词)。它作用于每个句子。
def find_keywords(word, df):
"""
Find the specified keyword (most prob top 10 words)
Acts on each sentence
Add to the corresponding dataframe
Returns: DataFrame
Used inconjunction with get_most_common_words()
"""
for i in df.comments:
if word in i.split():
c = Counter(i.split())
if c[word] >= 2:
print(f'Word is {word} that occured {c[word]} times where sentence is {i}\n')
[@interact](http://twitter.com/interact)(keyword="biden", debates=['vp_debate','prez_debate'])
def run(keyword, debates):
df = None
if debates == "vp_debate":
df = df_vp
else:
df = df_prez
find_keywords(keyword,df)
输出的一瞥。(提供演示)
结论
我们看到,通过使用数据科学,我们能够收集关于数据的有趣见解。我们当然可以通过使用更好的情感分类器和测试不同的假设来改进我们的工作。我们也可以使用 n-grams 并比较它们的频率。
试试这里:https://gesis . my binder . org/binder/v2/GH/aaditkapoor/debate analysis/main dataset 这里:http://www . ka ggle . com/dataset/43532333d 82042 a 1287 e 00672 b 86 a2 c 76 e 76 ffbc 4d 85569715309714635172 b 0