TowardsDataScience 博客中文翻译 2016~2018(一百八十五)
使用梯度下降的线性回归
在本教程中,你可以学习梯度下降算法的工作原理,并从头开始用 python 实现它。首先我们看看什么是线性回归,然后我们定义损失函数。我们学习梯度下降算法如何工作,最后我们将在给定的数据集上实现它并进行预测。
The values of m and c are updated at each iteration to get the optimal solution
这是这段视频的书面版本。如果你喜欢,就看着它!
线性回归
在统计学中,线性回归是一种对因变量和一个或多个自变量之间的关系进行建模的线性方法。设 X 为自变量, Y 为因变量。我们将定义这两个变量之间的线性关系如下:
Source: www.nabla.hr/SlopeInterc…
这是你在高中学过的一条线的方程。 m 是直线的斜率,c是 y 轴截距。今天,我们将使用这个等式用给定的数据集来训练我们的模型,并针对任何给定的 X 值来预测 Y 的值。我们今天的挑战是确定 m 和 c 的值,使得对应于这些值的线是最佳拟合线或给出最小误差。
损失函数
损失就是我们预测的 m 和 c 的误差。我们的目标是最小化这一误差,以获得最准确的 m和 c值。 我们将使用均方差函数来计算损失。该功能有三个步骤:
- 对于给定的 x,求实际 y 值和预测 y 值的差(y = mx + c)。
- 平方这个差值。
- 求 x 中每个值的平方的平均值。
Mean Squared Error Equation
这里 yᵢ是实际值,ȳᵢ是预测值。让我们用ȳᵢ:的值来代替
Substituting the value of ȳᵢ
所以我们求误差的平方,然后求平均值。因此得名均方误差。既然我们已经定义了损失函数,让我们进入有趣的部分——最小化它并找到 m 和 c.
梯度下降算法
梯度下降是一种寻找函数最小值的迭代优化算法。这个函数就是我们的损失函数。
了解梯度下降
Illustration of how the gradient descent algorithm works
想象一个山谷和一个没有方向感的人想要到达谷底。他走下斜坡,在斜坡陡的时候迈大步,在斜坡不那么陡的时候迈小步。他根据当前位置决定下一个位置,当他到达他的目标山谷底部时停下来。 让我们试着对 m 和 c 应用梯度下降,一步一步接近它;
- 最初设 m = 0,c = 0。设 L 为我们的学习率。这控制了 m 的值随着每一步变化的程度。l 可以是一个小值,如 0.0001,以获得良好的精度。
- 计算损失函数关于 m 的偏导数,将 x,y,m,c 的当前值代入其中,得到导数值 D 。
Derivative with respect to m
Dₘ是关于 m 的偏导数的值。类似地,让我们找到关于 c ,Dc 的偏导数:
Derivative with respect to c
3.现在,我们使用以下等式更新 m 和 c 的当前值:
4.我们重复这个过程,直到我们的损失函数是一个非常小的值或理想的 0(这意味着 0 误差或 100%的准确性)。我们现在剩下的 m 和 c 的值将是最佳值。
现在回到我们的类比, m 可以被认为是人的当前位置。 D 相当于斜坡的陡度 L 可以是他移动的速度。现在,我们使用上面的等式计算出的新值 m 将是他的下一个位置,而 L×D 将是他将要走的步数。坡度越陡( D 越大),他的步幅就越大,坡度越缓( D 越小),他的步幅就越小。最后,他到达了谷底,这相当于我们的损失= 0。 现在有了 mm和 cc的最佳值,我们的模型就可以进行预测了!
实施模型
现在让我们把上面的一切都转换成代码,看看我们的模型在运行!
1.4796491688889395 0.10148121494753726
梯度下降是机器学习中最简单也是最广泛使用的算法之一,主要是因为它可以应用于任何函数来优化它。学习它是掌握机器学习的基础。
有问题吗?需要帮助吗?联系我!
【adarsh1021@gmail.com】电子邮件:T4
领英:https://www.linkedin.com/in/adarsh-menon-739573146/
推特:https://twitter.com/adarsh_menon_
insta gram:【https://www.instagram.com/adarsh_menon_/】T21
参考文献:
优化是机器学习的一大部分。几乎每个机器学习算法都有一个优化算法…
machinelearningmastery.com](machinelearningmastery.com/gradient-de…) [## 梯度下降——初学者指南
简介:
towardsdatascience.com](/gradient-descent-a-beginners-guide-fa0b5d0a1db8)
在 10 行代码中使用梯度下降进行线性回归
我的目标是最终为其他优化技术写出这样的文章。让我们从梯度下降开始。注意:这不是一个全面的指南,因为我浏览了很多东西。
在我们学习机器学习和人工智能的旅程中,在深入之前了解基础知识很重要。基础知识是理解更复杂的架构形式所需的构建模块。例如,在没有首先理解导数是什么、如何以及为什么起作用之前,你不会想要学习常微分方程。机器学习也是如此。通过使用梯度下降作为我们的优化技术来理解线性回归将有助于我们在未来理解更复杂的模型。
我记得有一次向一群数据科学家解释我为这家公司创建的随机森林分类模型。我试着用逻辑回归做一个类比,因为我假设我在房间里的数据科学家同事会知道这件事。他们中的很多人说他们不熟悉它。我感到震惊,因为我们在这里谈论一个更先进的方法,但他们甚至不知道什么是逻辑回归模型。别这样。
线性回归、成本和梯度下降
线性回归是我们可以建立关系模型的最基本的方法之一。我们这里的模型可以描述为 y=mx+b,其中 m 是斜率(改变陡度), b 是偏差(在图中上下移动线条), x 是解释变量, y 是输出。如果我们认为有线性关系,我们就使用线性回归。比如说下面的 x 轴是学习 _ 时间而 y 轴是考试 _ 分数。
Source: i.imgur.com/oZ6CBpi.png
一条直线最好地描述了这种关系,因为学生学习得越多,他或她的考试分数就越高。使用指数、正弦或对数函数来模拟这种关系是没有意义的。线性模型为我们提供了简单性;线性关系很容易理解和解释。请注意,现实世界中的关系并不总是线性的,因此我们使用更高级的方法,如神经网络,这是通用的函数逼近器。更多关于神经网络的信息。
通过调整 m 和 b ,我们可以创建一条最佳描述关系的直线。我们怎么知道我们接近了?通过使用一个叫做成本函数的东西。它直接告诉我们成本。高成本值意味着它很贵——我们的近似值远远不能描述真实的关系。另一方面,低成本值意味着它很便宜——我们的近似值接近描述这种关系。
对于线性回归,我们使用一个被称为均方误差或 MSE 的成本函数。我们取实际数据点的平方值减去近似值。我们的近似值可以使用我们拥有的当前值 m 和 b 来计算:y _ approx = m _ current * x+b _ current。之后,我们将所有这些值相加,然后除以我们拥有的数据点数,实际上就是取平均值。现在你明白为什么它被称为均方误差了。
Source: i.stack.imgur.com/19Cmk.gif
你现在可能在想,“这听起来很棒,但是我们怎么才能发现mb??蛮力??"暴力是没有用的。更有效的方法是梯度下降。想象一下,蒙着眼睛试图找到最低点,如下图所示。你要做的是检查左右两边,然后感觉哪一个把你带到一个较低的点。你每走一步都这样做,直到检查左右两边把你带到一个更高的点。
Source: iamtrask.github.io/img/sgd_no_…
背后的数学并不像看起来那么复杂。我们在这里所做的是对成本函数应用关于 m和 b的偏导数,以将我们指向最低点。如果你记得你的数学,零的导数意味着你处于局部最小值或最大值。这意味着我们越接近零,越好。当我们的导数接近(如果不是)零时,我们也不可避免地会得到成本函数的最低值。
Source: spin.atomicobject.com/wp-content/…
寻找 m 和 b 的最佳值的过程就是最小化我们的导数。训练机器学习算法或神经网络实际上就是最小化成本函数的过程。
编程吧
在这里,我将使用 Python 来编写我们的线性回归模型。我使用 Python 是因为它是我从事数据科学的首选语言。此外,Python 对于专家和初学者来说都很棒。这种语言是为了可读性而设计的,所以无论你已经编程多年还是刚刚编程一天,浏览别人的代码仍然是相当容易的。
**def** *linear_regression*(X, y, m_current=0, b_current=0, epochs=1000, learning_rate=0.0001):
N = **float**(**len**(y))
**for** i **in** **range**(epochs):
y_current = (m_current * X) + b_current
cost = **sum**([data**2 **for** data **in** (y-y_current)]) / N
m_gradient = -(2/N) * **sum**(X * (y - y_current))
b_gradient = -(2/N) * **sum**(y - y_current)
m_current = m_current - (learning_rate * m_gradient)
b_current = b_current - (learning_rate * b_gradient)
**return** m_current, b_current, cost
X 和 y 是我们的输入参数。另一方面, m_current 和 b_current 分别是我们的斜率和偏置项,在我们试图找到最佳数值时,这两项都会更新,以便我们得到的方程最符合我们的数据。这里的时期指的是我们训练模型的次数,以找到模型拟合数据的最佳斜率和偏差。最后, learning_rate 这里指的是收敛的速度,意思是梯度下降找到最佳参数的速度。
为了进一步理解 learning_rate ,让我们回到我们蒙着眼睛寻找最低点的例子。大的学习率意味着我们迈出的步伐太大,你可能会完全错过最低点。然而,太小的学习率意味着我们将花费很长时间到达底部。试着在两者之间取得平衡。
重要的一点是 for 循环:
**for** i **in** **range**(epochs):
y_current = (m_current * X) + b_current
cost = **sum**([data**2 **for** data **in** (y-y_current)]) / N
m_gradient = -(2/N) * **sum**(X * (y - y_current))
b_gradient = -(2/N) * **sum**(y - y_current)
m_current = m_current - (learning_rate * m_gradient)
b_current = b_current - (learning_rate * b_gradient)
我们迭代 1000 次,因为 1000 听起来不错。真的取决于你想迭代多少。超参数微调是一项正在进行的研究,所以你可能想看看!
我们用上面看到的公式计算斜率和偏差的梯度。然后,我们通过减去学习率时间和各自的梯度值来更新斜率和偏差。学习速度将决定我们达到收敛的速度。经过 1000 次迭代后,我们返回 m_current 、 b_current 和 cost 。
**恭喜你!**那是你机器学习和人工智能旅程的第一步。获得梯度下降如何工作的直观感受,因为这实际上也用于更高级的模型。这里的目标是学习基础知识,而你我的朋友刚刚迈出了第一步。现在你可以去学更多的东西了!
使用最小二乘法的线性回归
线性回归是最简单的机器学习形式。在这篇文章中,我们将看到线性回归是如何工作的,并从头开始用 Python 实现它。这是上面视频的文字版。如果你喜欢的话,就看着吧。
线性回归
在统计学中,线性回归是一种对因变量和一个或多个自变量之间的关系进行建模的线性方法。在一个独立变量的情况下,它被称为简单线性回归。对于一个以上的独立变量,这个过程称为多元线性回归。我们将在本教程中处理简单的线性回归。 设 X 为自变量 Y 为因变量。我们将定义这两个变量之间的线性关系如下:
这是你在高中学过的一条线的方程。 m 是直线的斜率, c 是 y 轴截距。今天,我们将使用这个等式用给定的数据集来训练我们的模型,并针对任何给定的 X 值来预测 Y 的值。
我们今天的挑战是确定 m 和 c 的值,它给出了给定数据集的最小误差。我们将通过使用最小二乘法来实现这一点。
查找错误
因此,为了最小化误差,我们首先需要一种计算误差的方法。机器学习中的损失函数仅仅是预测值与实际值有多大差异的度量。 今天我们将使用二次损失函数来计算我们模型中的损失或误差。它可以定义为:
我们对它求平方是因为,对于回归线以下的点,y-p将为负,我们不希望总误差为负值。
最小二乘法
现在我们已经确定了损失函数,剩下唯一要做的就是最小化它。这是通过找到 L 的偏导数,使其等于 0,然后找到 m 和 c 的表达式来实现的。在我们完成数学计算后,我们只剩下这些等式:
这里,x̅是输入 X 中所有值的平均值,而ȳ是期望输出 Y 中所有值的平均值。这是最小二乘法。现在我们将在 python 中实现这个并进行预测。
实施模型
1.287357370010931 9.908606190326509
不会有太多的准确性,因为我们只是简单地取一条直线,并迫使它以最好的方式适应给定的数据。但是你可以用它来做简单的预测或者了解真实值的大小/范围。对于机器学习的初学者来说,这也是很好的第一步。
有问题吗?需要帮助吗?联系我!
电子邮件:adarsh1021@gmail.com
领英:https://www.linkedin.com/in/adarsh-menon-739573146/
推特:https://twitter.com/adarsh_menon_
insta gram:https://www.instagram.com/adarsh_menon_/
使用 Python 进行线性回归
线性回归通常是每个数据科学家遇到的第一个机器学习算法。这是一个简单的模型,但每个人都需要掌握它,因为它为其他机器学习算法奠定了基础。
线性回归可以用在哪里? 这是一种非常强大的技术,可以用来了解影响盈利能力的因素。它可以通过分析前几个月的销售数据来预测未来几个月的销售。它还可以用来获得关于客户行为的各种见解。在博客结束时,我们将建立一个类似下图的模型,即确定一条最符合数据的线。
这是我将要讲述的机器学习系列的第一篇博客。人们可能会被网络上大量关于机器学习算法的文章淹没。我写这篇博客的目的有两个。它可以作为进入机器学习领域的人的指南,也可以作为我的参考。
目录
- 什么是线性回归
- 线性回归假设
- 训练线性回归模型
- 评估模型
- scikit-learn 实现
什么是线性回归
线性回归模型的目标是找到一个或多个特征(自变量)和一个连续目标变量(因变量)之间的关系。当只有一个特征时,称为单变量线性回归,如果有多个特征,称为多元线性回归。
线性回归假设
线性回归模型可以由下面的等式表示
- Y 是预测值
- θ ₀是偏置项。
- θ ₁,…, θ ₙ为模型参数
- x ₁、 x ₂,…、 x ₙ为特征值。
上述假设也可以表示为
在哪里
- θ 是模型的参数向量,包括偏差项 θ ₀
- x 是 x ₀ =1 的特征向量
数据集
让我们创建一些随机数据集来训练我们的模型。
使用上述代码生成的数据集的曲线图如下所示:
训练一个线性回归模型
在这里,模型的训练意味着找到参数,以使模型最适合数据。
我们如何确定最佳拟合线? 预测值与观测值之间的误差最小的线称为最佳拟合线或回归线。这些误差也被称为 残差 。残差可以通过从观察数据值到回归线的垂直线来可视化。
Image Credits: wiki.engageeducation.org.au/further-mat…
为了定义和测量我们模型的误差,我们将成本函数定义为残差平方和。成本函数表示为
其中假设函数 h(x) 表示为
并且 m 是我们的数据集中训练样本的总数。
为什么我们取残差的平方而不是残差的绝对值? 我们更希望惩罚远离回归线的点,而不是靠近回归线的点。
我们的目标是找到模型参数,使成本函数最小。我们将使用梯度下降来找到这个。
梯度下降
梯度下降是许多机器学习算法中使用的通用优化算法。它反复调整模型的参数,以最小化成本函数。梯度下降的步骤概述如下。
- 我们首先用一些随机值初始化模型参数。这也被称为 随机初始化 。
- 现在我们需要测量成本函数如何随着参数的变化而变化。因此,我们计算成本函数 w.r.t 对参数 θ ₀、 θ ₁、…、 θ ₙ的偏导数
类似地,成本函数 w.r.t 对任何参数的偏导数可以表示为
我们可以立刻计算所有参数的偏导数,使用
其中 h(x) 为
3.计算导数后,我们更新参数如下
其中 α 是 学习参数 。
我们可以一次更新所有参数,
我们重复步骤 2、3,直到成本函数收敛到最小值。如果 α 的值太小,代价函数需要更大的时间收敛。如果 α 过大,梯度下降可能超过最小值,最终可能无法收敛。
Source: Andrew Ng’s course on Coursera
为了演示梯度下降算法,我们用 0 初始化模型参数。方程变成 *Y = 0。*梯度下降算法现在尝试更新参数的值,以便我们达到最佳拟合线。
当学习速度非常慢时,梯度下降需要更长的时间来找到最佳拟合线。
当学习率正常时
当学习率任意高时,梯度下降算法会超过最佳拟合线,甚至可能找不到最佳拟合线。
从头开始实施线性回归
下面给出了具有梯度下降的线性回归的完整实现。
模型参数如下所示
The coefficient is [2.89114079]
The intercept is [2.58109277]
最佳拟合线的绘图
下面给出了成本函数与迭代次数的关系图。我们可以观察到,成本函数最初随着每次迭代而降低,并且在近 100 次迭代之后最终收敛。
到目前为止,我们已经从头开始实施线性回归,并使用梯度下降来寻找模型参数。但是我们的模型有多好呢?我们需要一些方法来计算我们模型的准确性。让我们看看各种指标来评估我们上面构建的模型。
评估模型的性能
我们将使用均方根误差( RMSE )和决定系数( R 得分)来评估我们的模型。
RMSE 是残差平方和的平均值的平方根。
RMSE 的定义是
RMSE 的分数是 2.764182038967211。
R 得分或决定系数解释了通过使用最小二乘回归可以将因变量的总方差减少多少。
R 由
SSₜ 是我们把观测值的平均值作为预测值的误差总和。
是残差的平方和
*****SSₜ -*** 69.47588572871659
***SSᵣ -*** 7.64070234454893
**R²** score - 0.8900236785122296**
如果我们使用观察值的平均值作为预测值,方差是 69.47588572871659,如果我们使用回归,总方差是 7.6407023454893。通过回归分析,我们将预测误差降低了 89%。
现在让我们尝试使用流行的 scikit-learn 库来实现线性回归。
Scikit-learn 实现
sckit-learn 是一个非常强大的数据科学库。完整的代码如下所示
模型参数和模型的性能指标如下所示:
**The coefficient is [[2.93655106]]
The intercept is [2.55808002]
Root mean squared error of the model is 0.07623324582875013.
R-squared score is 0.9038655568672764.**
这几乎类似于我们从零开始实现线性回归时所获得的结果。
这个博客到此为止。完整的代码可以在这个 GitHub repo 中找到。
结论
我们已经学习了线性回归和梯度下降的概念。我们还使用 scikit-learn 库实现了该模型。
在本系列的下一篇博客中,我们将获取一些原始数据集并构建一个线性回归模型。
示例线性回归
对于外行来说什么是机器学习和线性回归
机器学习-虚构的故事。从前有一个医生。他会看着人,预测她/他是否缺乏血红蛋白(红细胞)。几乎所有的时候,他的预言都会在检验病人的血液时实现。
他会怎么预测?让我们假设脸色苍白,身体疲劳是低血红蛋白(血红蛋白)的症状。如果这个人的体重较轻,那么出现这种症状的可能性就更大,因为血红蛋白含量低。医生“根据他过去的经验”会在看完病人后“预测”。
如果我们能让计算机也学习这样的东西并做出这样的预测会怎么样。假设我们有量化的变量,比如苍白和疲劳。
线性回归
我们在数学课上见过如下方程。y 是我们想要的输出。x 是输入变量。c =常数,a 是直线的斜率。
y = c + axc = constant
a = slope
输出根据输入线性变化。
- y 是由输入 x 决定的输出。x 值对 y 的影响程度由“a”决定。在具有轴“x”和“y”的二维图形中,“a”是直线的斜率。
- c '是常数(x 为零时 y 的值)。
历史数据
假设我们有大量的历史数据,其中提供了输入值“x”和输出/结果值“y”。
我们也知道 x 的变化对 y 的影响是线性的。这意味着,如果我们取这些 x 和 y 的值,然后画出图表,我们会得到这样的图表。不完全相同,但有点像这样,其中似乎有一个线性方向的点杂乱。en.wikipedia.org/wiki/Linear…
我们想干什么
我们想看看历史数据,找出' c '和' a '的值。让我们称 c 为常数,a 为重量。如果我们能算出 c 和 a 的值,那么我们就能预测任何新 x 的 y 值。
怎么办
正如你从图表中看到的,虽然这些点形成了一条直线,但是它们并不在同一条直线上。所以我们无法知道 c 和 a 的 100%完美值,但是我们可以找到最佳拟合线,如上图红色所示。
这意味着我们的输出将是近似的。可能与实际值略有偏差。但是对于大多数商业应用程序来说,它工作得很好。
细节如何
看图表中的点。如果我们算出一条线,它到图中每个点的距离是最优的/最小的。这意味着“最佳拟合线”,如上图中红色所示。我们的目标是在上图中画出红线。
因此,我们在图上为 c 和 a 的某个随机值画一条随机线。假设我们保持 c 和 a 都是 1 (c=1,a=1),并在图上为每个(至少 2 个)x 画一条线。根据 x 的值,这条线可能会在以下位置之一结束
- 在点的左侧朝向 y 轴。更垂直。
- 在点朝向 x 轴的右侧。更横。
- 介于点之间,但仍不是最佳拟合线。
由于这是一条随机的线,我们需要一种机制将这条线反复缓慢地移动到最适合样本数据的地方(图中的点)。
所以,实际上我们需要
- 找出它的最佳拟合线
- 如果不是最佳拟合线,则将其移向最佳拟合线。这意味着我们必须改变 c 和 a 的值。
- 我们需要改变多少 c 和 a 的值,向哪个方向改变?我们将使用梯度下降和最小二乘法相结合的方法来实现这些目标。这些解释如下。
数学
对于样本数据中的每一项(也称为训练集),从我们的估计线(c=1,a=1)中获取 y 的值。姑且称之为 h(y)吧。
- 同样,我们有 y,它是每个样本数据的真实值。
- 我们将近似的 h(y)和 y 之差表示为 h(y) — y,将该差平方。所以对于一个样本,我们有(h(y)-y)^ 2
- 对所有样品都这样做。假设我们的样本量为“m”,我们得到每个样本量的差的平方,对其求和(从 1 到 m 求和),得到其平均值(即除以 m),使其减半(因为差的平方的一半提供更好的结果)。我们现在有了成本函数。我们需要最小化这个成本函数。这意味着我们需要最小化我们的线与样本数据(点)的距离,以获得最佳拟合线。
成本函数的更多解释在—https://www . coursera . org/learn/machine-learning/lecture/rktp 3/cost-function
- 但是我们有两个变量,c 和 a,我们需要不断改变,以得到最佳拟合线。
- 对于 c 和 a 的初始组合,我们需要找到移动多少,然后移动它。一旦我们有了 c 和 a 的新值的新线,然后再次计算每个点的距离,并继续这样做,直到我们发现我们没有移动太多,例如移动得很少。
这基本上意味着我们的线离图上的点还很远。
- 由于我们需要独立地改变 c 和 a,我们将使用偏导数。因此,我们将得到上述成本函数的导数 wrt c,然后是 wrt a。记住,我们有一个样本的 h(y )= c+ax
- 因此,成本函数 wrt 'c '的偏导数的结果将是
- 并且成本函数 wrt‘a’的偏导数的结果将是
- 现在我们决定步长,也就是在每次迭代中我们想要采取多大或多小的步长。让我们称之为阿尔法,我们设置这个值为 0.01。它可以是基于数据的任何合适的值。
- 所以 c 移动的距离是
- a 移动的距离是
- 上面的 farmulae 不仅会给出我们移动的距离,还会给出方向,例如,如果我们最初绘制的随机像更垂直,必须向下移动以达到最佳拟合,则新值将减少,例如 a 将从 1 变为 0.99。但是,如果我们最初的随机线是水平的,必须向上移动以达到最佳拟合,那么新值将会更多,例如,a 将从 1 变为 1.01。
- 如前所述,当我们意识到我们几乎不动了或者经过一定次数的迭代后,我们就停下来。这意味着我们已经达到了最佳拟合线,即红线。
例子
没有例题练习的学习是什么?
让我们以印度的乘用车销售数据为例。为了简单起见,我们假设只有一个变量,即该国的 GDP 对销售有影响。在现实中,有更多的因素,如汽车贷款利率等,但这是下一篇文章。为此,让我们把重点放在印度汽车销售量与 GDP 的线性方程上。
样本数据
我查看了过去几年印度乘用车的销售情况。还检查了每年的 GDP。看着这两个数据,我突然意识到“当前年度”GDP 的影响会对“下一年度”的汽车销售产生影响。因此,无论哪一年的国内生产总值减少,下一年的销售就会减少,当国内生产总值增加时,下一年的汽车销售也会增加。因此,他们说为 ML 分析准备数据更重要,这也是最需要花费时间的地方。
让我们用等式 y = c + ax。
y =当年售出的汽车数量
x =上一年的国内生产总值。
我们需要找到 c 和 a。
下面是数据表。我将这些数据保存在一个名为“vehicle_sale_data”的文件中。请注意,售出车辆的数量以 10 万卢比为单位(10 万卢比= 10 万卢比)。
year,GDP,4wheeler_passengar_vehicle_sale(in lakhs)
2011,6.2,26.3
2012,6.5,26.65
2013,5.48,25.03
2014,6.54,26.01
2015,7.18,27.9
2016,7.93,30.47
第一列=年份,这在下面的代码中没有多大用处
第二栏——上一年的 GDP。这是等式中的 x。
第三列——售出的车辆数量。如果我们知道今年的 GDP,这就是我们想要预测的明年的情况。
模型创建
我们将使用 python 来创建模型。下面是步骤。
- 阅读文件。“gdp_sale”字典将有关键字,因为 gdp 和值是销售额。
def read_data() :
data = open("vehicle_sale_data" , "r")
gdp_sale = collections.OrderedDict()
for line in data.readlines()[1:] :
record = line.split(",")
gdp_sale[float(record[1])] = float(record[2].replace('\n', "")) return gdp_sale
- 计算步骤,到达新的“c”和“a”。第一次,我们将传递初始值' c '和' a '。此函数将在移动一步后计算新 c 和新 a 的值。这个函数需要反复调用,直到它稳定下来。
def step_cost_function_for(gdp_sale, constant, slope) :
global stepSize
diff_sum_constant = 0 *# diff of sum for constant 'c' in "c + ax" equation*
diff_sum_slope = 0 *# diff of sum for 'a' in "c + ax" equation*
gdp_for_years = list(gdp_sale.keys()) for year_gdp in gdp_for_years: *# for each year's gdp in the sample data*
*# get the sale for given 'c' and 'a'by giving the GDP for this sample record*
trg_data_sale = sale_for_data(constant, slope, year_gdp) *# calculated sale for current 'c' and 'a'*
a_year_sale = gdp_sale.get(year_gdp) *# real sale for this record*
diff_sum_slope = diff_sum_slope + ((trg_data_sale - a_year_sale) * year_gdp) *# slope's (h(y) - y) * x*
diff_sum_constant = diff_sum_constant + (trg_data_sale - a_year_sale) *# consant's (h(y) - y)* step_for_constant = (stepSize / len(gdp_sale)) * diff_sum_constant *# distance to be moved by c*
step_for_slope = (stepSize / len(gdp_sale)) * diff_sum_slope *# distance to be moved by a*
new_constant = constant - step_for_constant *# new c*
new_slope = slope - step_for_slope *# new a* return new_constant, new_slope
- 用于获取汽车销售的函数,提供了 c、a 和 x 的值。上述函数用于每个样本数据(gdp)。
def sale_for_data(constant, slope, data):
return constant + slope * data *# y = c + ax format*
- 迭代以获得最佳权重,即 c 和 a 的最佳值。如果 c 和 a 在下一次迭代中的移动不超过 0.01,迭代将停止。
def get_weights(gdp_sale) :
constant = 1
slope = 1
accepted_diff = 0.01 while 1 == 1: *# continue till we reach local minimum*
new_constant, new_slope = step_cost_function_for(gdp_sale, constant, slope)
*# if the diff is too less then lets break*
if (abs(constant - new_constant) <= accepted_diff) and (abs(slope - new_slope) <= accepted_diff):
print "done. Diff is less than " + str(accepted_diff)
return new_constant, new_slope
else:
constant = new_constant
slope = new_slope
print "new values for constant and slope are " + str(new_constant) + ", " + \
str(new_slope)
- 当然还有主要的功能
def main() :
contant, slope = get_weights(read_data())
print "constant :" + contant + ", slope:" + slopeif __name__ == '__main__':
main()
我得到的等式是
y(汽车销量)= 1.43 + 3.84 * x
- x 是 GDP 的值
因此,如果我们今年的 GDP 为 7.5,那么我们明年的乘用车销量将为-1.43 7.5 * 3.84 = 30.23
完整的项目
完整的程序如下。它也在 github 的 https://github . com/skhurana 333/ml/blob/master/linearregsinglevariant . py 上
*# sales of vehicle as a function of GDP (for India)*import collectionsstepSize = 0.01 def read_data() :
data = open("vehicle_sale_data" , "r")
gdp_sale = collections.OrderedDict()
for line in data.readlines()[1:] :
record = line.split(",")
gdp_sale[float(record[1])] = float(record[2].replace('\n', "")) return gdp_sale def sale_for_data(constant, slope, data):
return constant + slope * data *# y = c + ax format* def step_cost_function_for(gdp_sale, constant, slope) :
global stepSize
diff_sum_constant = 0 *# diff of sum for constant 'c' in "c + ax" equation*
diff_sum_slope = 0 *# diff of sum for 'a' in "c + ax" equation*
gdp_for_years = list(gdp_sale.keys()) for year_gdp in gdp_for_years: *# for each year's gdp in the sample data*
*# get the sale for given 'c' and 'a'by giving the GDP for this sample record*
trg_data_sale = sale_for_data(constant, slope, year_gdp) *# calculated sale for current 'c' and 'a'*
a_year_sale = gdp_sale.get(year_gdp) *# real sale for this record*
diff_sum_slope = diff_sum_slope + ((trg_data_sale - a_year_sale) * year_gdp) *# slope's (h(y) - y) * x*
diff_sum_constant = diff_sum_constant + (trg_data_sale - a_year_sale) *# consant's (h(y) - y)* step_for_constant = (stepSize / len(gdp_sale)) * diff_sum_constant *# distance to be moved by c*
step_for_slope = (stepSize / len(gdp_sale)) * diff_sum_slope *# distance to be moved by a*
new_constant = constant - step_for_constant *# new c*
new_slope = slope - step_for_slope *# new a* return new_constant, new_slope def get_weights(gdp_sale) :
constant = 1
slope = 1
accepted_diff = 0.01 while 1 == 1: *# continue till we reach local minimum*
new_constant, new_slope = step_cost_function_for(gdp_sale, constant, slope)
*# if the diff is too less then lets break*
if (abs(constant - new_constant) <= accepted_diff) and (abs(slope - new_slope) <= accepted_diff):
print "done. Diff is less than " + str(accepted_diff)
return new_constant, new_slope
else:
constant = new_constant
slope = new_slope
print "new values for constant and slope are " + str(new_constant) + ", " + \
str(new_slope) def main() :
contant, slope = get_weights(read_data())
print "constant :" + contant + ", slope:" + slopeif __name__ == '__main__':
main()
线性回归:当你想在爱荷华州开一家新的酒店时该怎么做
你是说爱荷华州的一家酒店?多好的主意啊!你说你不知道你想在哪里打开它?好吧,让我帮你缩小范围!
你看,爱荷华州碰巧在 data.Iowa.gov 时间发布了他们所有的酒类销售数据。它实际上足够详细,我可以告诉你,托莱多的 Twin Town Liquor 在 2015 年购买了 16 瓶 Dekuyper Sour Apple Pucker Traveler,州政府从这笔交易中获得了 50.40 美元。
让我们来看看爱荷华州有多少钱在流动:
public.tableau.com/views/IowaL…
从技术上讲,我们谈论的是一个月内所有产品支付给州政府(爱荷华州唯一的酒类经销商)的成本。我们将不得不用这个来代表利润。我的目标是查看给定城市中每家商店的平均购买量,以及如果再增加一家商店会是什么样子。一旦你找到了价值最高的产品,你就必须做更多的市场调查,找出竞争对手,估计零售价格(利润率),并准确地计算出放在哪里。我们只关注第一部分:找到我们的目标城市。
游戏的名字叫“线性回归”。基本上,这是一种获取多种输入并预测一种结果的方法。需要大量的假设来确保这是正确的模型。我们将跳过这一步,讨论如何用 Python 实现它。
直接进入主题,我们可以看看清理后的数据是什么样的,以及我们必须处理哪些列。
Some of the features I narrowed down to. Let’s test them out.
上面你可以看到我的精炼数据集,我缩小到每月每个商店的购买总量。使用由 www.census.gov/[愉快地提供的一些额外…](www.census.gov/)
很好,现在有了我们的预测变量(特性),让我们建立模型,看看我们是否可以计算出我们的目标平均年商店销售额。
对我们有好处。我们的模型解释了平均年商店销售额变化的 91%!但是,我们还希望确保我们的误差尽可能低(这里显示的是均方根误差),这意味着我们需要确保我们用来预测的一切实际上都有助于模型。让我们引入套索正则化来告诉我们哪些变量是重要的。
好吧。看起来销量不如销量有预测性。它们实际上应该是相互作用的变量,因为它们关系非常密切(唯一的区别是单位体积的价格)。我们会去掉这些,还有城市中的平均商店,只保留每个商店的销售额和人口。
好东西!我们使用套索正则化来去除一些实际上损害我们模型的变量。精确度提高了,我们的误差降低了。但这还不是正式的。这些都是我们用来建立模型的数据。现在我们需要在模型从未见过的数据上测试它。
不错!干得好,先生们。剩下唯一要做的就是做我们 2016 年的预测!为此,您只需重新训练完整数据集上的数据(不要将其分为测试和训练),然后对 2016 年的变量使用 lm.predict(X_2016)。您应该会得到一个类似这样的列表:
我们开个酒铺吧!
你可以在这里查看我的代码:github.com/dale-wahl/I…我建议坚持写博客要点文件夹中的代码,但是如果你有点虐待狂,整本书都在那里。
线性时间与对数时间——大 O 符号
你好。在两个多月不写/不碰代码之后,我终于回来了。我被所有的婚礼准备和计划所困扰。没有婚礼策划人,很难举办一场海外婚礼。但是这一切都是值得的,因为我们的婚礼是值得的!结婚热已经过去了,现在是时候回忆我的想法,回到编码上来了。
在我开始找工作之前,很难决定先复习什么。我想我应该从经典开始——算法和数据结构,编程的核心。在任何系统中,随着数据的增长,如果使用了正确的算法,性能应该不是问题。
今天,我写了一篇关于两种大 O 符号的博客,线性和对数算法。
先介绍一下大 O 符号的背景。
渐近分析
渐近分析是基于数学计算的,基本上是随着输入数据集的增长来衡量算法的效率(感谢维基百科!).根据应用场合的不同,还有其他类型的渐近分析,但在计算机科学中,它通常被格式化为大 O 符号。
线性与对数
为了容易理解大 O 记数法,我们来比较一下这两种算法:线性 — O(n)和对数 — O(log n)。
作为一个例子,我们将尝试在一个排序的数组中寻找一个数字。
let numberList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
线性 O(n) —随着数据的增长,性能变得越来越低效。
在线性或“强力”技术中,性能取决于输入大小。对于我们的例子,我们将通读数组中的每一项,并搜索我们需要的数字。很简单!
*//Logarithmic Time - O(n)*func linear(key: Int) {
for (index, number) in numberList.enumerated() {
if number == key {
print("Value found in index \(index)")
break
}
}
}
当然,这对于我们的小数据集是可行的,但是一旦你有了成千上万甚至数百万的数据,这就不是很有效了。
对数 O(log N)-通过重复将数据集减半直到找到目标值来缩小搜索范围。
使用二分搜索法-这是一种对数算法,查找数组中的中值并将其与目标值进行比较。根据目标值高于、低于或等于中值,算法将向上或向下遍历。
func binarySearch(key: Int, iminIndex: Int, imaxIndex: Int) {let midIndex = round(Double(iminIndex + imaxIndex)/2)
let midNumber = numberList[Int(midIndex)]
var result = ""***//using recursion, we can go up or down the array and reduce the*** range
if midNumber > key { ***//target is less than the median so traverse downwards*** binarySearch(key: key, iminIndex: iminIndex, imaxIndex: Int(midIndex) - 1) } else if midNumber < key { ***//target is greater than the median so traverse upwards*** binarySearch(key: key, iminIndex: Int(midIndex) + 1, imaxIndex: imaxIndex) } else if midNumber == key { ***//Found it!***
print("Found it at index \(midIndex)")} else {
print("Value \(key) not found")
}
}
该算法的大部分是在开始,但是随着我们从数组中丢弃不相关的范围并继续减半直到我们找到目标值,它慢慢变平。
通过下面的图表,我们可以很容易地比较大多数算法如何在较小的数据集上具有相似的性能,但随着数据的增长而不断变化。
Excerpt from Swift Algorithms and Data Structures by Wayne Bishop
如你所见,还有其他类型的大 O 符号,我将在接下来的几天里讨论。再见了。
参考文献:
Wayne Bishop 的 Swift 算法和数据结构
维基百科:)
自然语言处理中的语言学知识
自从进入自然语言处理(NLP)以来,我一直想写一些关于它的高层次介绍,提供一些我理解的结构,并给出该领域的另一个视角——与使用深度学习进行 NLP 的流行形成对比。
NLP 中的分析阶段
NLP Pyramid — Coursera Natural Language Processing
给定一个句子,传统上,以下是如何分析一个句子以获得更深层次见解的不同阶段。
1.形态学
在这个阶段,我们关心的是组成句子的单词,它们是如何形成的,以及它们如何根据上下文而变化。其中的一些例子包括:
- 前缀/后缀
- 单一化/多元化
- 性别检测
- 单词变形(修饰单词以表达不同的语法类别,如时态、格、语态等..).其他形式的词形变化包括词形变化(动词的词形变化)和词形变化(名词、形容词、副词等的词形变化)。
- 词汇化(单词的基本形式,或词尾变化的反义词)
- 拼写检查
Morphological analysis of a sentence — Spacy.io
2.语法(解析)
在这个阶段,我们更关注句子中单词的关系——句子是如何构成的。
在某种程度上,语法就是我们通常所说的语法——黑客的 NLP
为了获得这种理解,句法分析通常是在句子层次上进行的,而词法分析是在单词层次上进行的。当我们建立依存关系树或处理词类时,我们基本上是在分析句子的句法。
Dependency tree of a sentence — Spacy.io
3.语义学
一旦我们理解了句法结构,我们就更有准备去理解句子的“含义”(有趣的是,NLP 中的实际含义是什么——点击这里进入关于这个主题的 Twitter 讨论)。
此阶段执行任务的一些示例包括:
- 命名实体识别(NER)
- 关系抽取
Named entity recognition of a sentence — Spacy.io
在上面的例子中,以 Spacy 为例;谷歌、苹果和亚马逊已经被标记为一个基于其 NER 注释者的组织。虽然谷歌和亚马逊是一个简单的例子,但苹果却相当不同,因为它可能是一种水果,也可能是一家公司——苹果。在这种情况下,给出的结果是基于基于来自训练数据集的统计分析的预测。
4.语用学
在这个层面上,我们试图从整体上理解文本。我们在此阶段试图解决的常见问题有:
- 主题建模
- 共指/回指
- 摘要
- 问答
摘要
自然语言处理作为一个研究领域实际上并不新鲜。如果一个人已经精通深度学习,那么认为传统的 NLP 方法(即将文本分解成更小的结构、解析、注释含义)不再需要。
然而,在标签数据很难获得,并且需要高精度的情况下(例如,当一个人在紧迫的截止日期内时间紧迫,结果确实需要准确,否则产品不会推出),传统的 NLP 真正发挥了作用。
理解上述主题并不是解决 NLP 相关任务所必需的。对我来说,这更像是一种审视我以前解决的不同问题的方式,以及我可以改进的其他差距或领域。
免责声明:在写这篇文章的时候,我读了很多 Coursera 的 NLP 课程,维基百科,还有我最近最喜欢的 NLP 材料网站——黑客的 NLP。很可能你在这里看到的一些东西是这些来源之间的大杂烩,所以预先警告我可能会忘记在需要的地方正确引用它们的内容。
参考资料:
[1] 自然语言处理| Coursera
[2] 维基百科,自由百科
[4] 语言特点,空间. io
LinkedIn 劳动力报告:各行各业都非常需要数据科学技能
LinkedIn 平台作为一个独特的信息来源,为员工和求职者面临的动态提供了有益的见解,从那些寻求学习新技能的人到那些转向新角色的人。
该平台拥有超过 5 亿名会员。仅在美国,LinkedIn 就拥有超过 1.5 亿会员。因此,它可以提供关于美国劳动力的有价值的趋势。
根据就业导向服务机构 2018 年 8 月的报告,美国各行业对数据科学技能的需求正在上升。
事实上,高需求导致全国缺乏 151,717 名具有数据科学技能的专业人员。
美国数据科学家 DevZero 热衷于向人们传授他的技能,他提到“今天的行业非常依赖数据,在很大程度上依赖于它们的战略决策过程,这使得对数据科学家的需求急剧增加。”
数据科学技能需求增加
数据科学涉及使用各种科学工具和流程来创造可用数据的价值。
科学方法、公式和算法通常用于从结构化和非结构化数据中获得全面的见解和提取有用的模式。
以前,数据科学领域不被认为是有利可图的,数据科学家过剩。
例如,2015 年,一家美国雇主想要雇用一名数据科学家,不必费力寻找有技能的人。
当地的人才短缺较少,雇主在雇用候选人时有很多选择。
然而,三年后的今天,情况不再相同:数据科学技能在美国几乎每个大城市都供不应求
事实上,据说这种短缺非常普遍,不仅限于科技和金融领域。
就业相关搜索引擎 Indeed.com 估计,美国数据科学家的平均年收入为 131,651 美元。
2018 年 8 月 LinkedIn 劳动力报告
LinkedIn 劳动力报告指出,在未来五年内,数据分析师和科学家将成为最受欢迎的专业人士。
IBM 和世界经济论坛的预测证实了这一点,这些预测认为,到 2020 年,每年对数据开发、数据科学和数据工程相关职位的需求将达到近 70 万个。
下表显示了从 2015 年 7 月到 2018 年 7 月,美国一些主要城市缺乏数据科学技能的加剧情况。技能短缺标有加号(+)而过剩标有减号(-)。
根据 LinkedIn 企业通信团队的说法,与数据科学领域相关的一些关键见解值得注意:
- 将 2018 年 7 月的夏季招聘与前一年相比,2018 年的招聘更加强劲,全国所有行业的总招聘人数增长了 4.6%。
- 2018 年 6 月至 7 月,经季节性调整的全国招聘人数也增长了 0.5%。农业、制造业和运输与物流被指定为 6 月份招聘人数同比增幅最大的行业,分别增长了 26%、12.3%和 12%。
- 数据科学领域的技能缺口是真实存在的。仅在三年前,整个国家的数据科学技能过剩,雇主有一系列专业人员可供选择,几乎不短缺。
- 今天的情况有很大不同,全国各地都经历着严重的短缺。例如,纽约市正面临 34,032 名数据科学家的严重短缺,洛杉矶需要大约 12,251 名数据科学专业人员,旧金山湾区估计短缺 31,798 人。
- 随着人们转向更强的就业市场,如德克萨斯州奥斯汀,移民现象十分猖獗。奥斯汀在美国排名第一。通过吸引更多工人,该市的招聘人数比去年增加了 14.3%。
- LinkedIn 已经证实,目前在奥斯汀的 10,000 名会员中,有 105 人是在过去 12 个月里迁移到这座城市的。其中,10.5%来自休斯顿,7.6%来自旧金山,4.8%来自纽约市。向奥斯汀的大规模迁移可以归因于它所标榜的蓬勃发展的技术中心,表现为数据存储技术的巨大技能缺口和对开发工具的迫切需求。
包扎
鉴于对不同领域和行业的见解,2018 年 8 月 LinkedIn 劳动力报告在帮助员工以最佳方式指导职业生涯方面大有作为。
正如该报告所指出的,数据科学在当今所有行业都非常重要,给自己定位可以帮助你做出人生中最大的职业转变。
由于该领域巨大的技能缺口,你可以学习数据科学,增加获得工作的机会;数据科学是未来最需要的技能。
那么,你对数据科学领域存在的技能差距有什么看法?
请在下面分享你的评论。
LISSA:基于现成高等教育数据的面向学生的学习分析仪表板
不是每个人都喜欢阅读冗长的科学论文,但是仍然有很多有趣的东西。所以我打算试着开始一个新习惯:把我冗长乏味的论文变成更容易消化的博文。如果大多数人都不读这些科学,那这些科学还有什么意义呢?为了让你开心,我会尽量简短,因此我会省略很多细节。但如果你真的渴望了解更多,你可以随时查看原始论文!
本文基于 2017 年 6 月发表在IEEE Transactions on Learning Technologies上的论文“Learning Analytics Dashboards to Support Adviser-Student Dialogue”。
在博士期间,我主要专注于学习仪表板。这些仪表板中的大部分仍然侧重于教师和研究人员作为用户,但我的目标是通过数据可视化让学生了解自己的过程,从而增强他们的能力。我设计并评估了许多仪表盘,但有一个很突出:LISSA,或“在学习期间接受我的指导和 T21 的支持的收入仪表盘”。LISSA 支持学习顾问和学生之间的对话,目前正在鲁汶大学的一系列学位中使用。
Setup of an advising session. LISSA is displayed on a screen visible to both study adviser and student.
在我们的研究中,我们涉及了一群研究顾问(同样,简单的版本:详见论文)。这些学习顾问负责为特定项目的一年级学生提供学习建议和与内容相关的支持。他们是第一年课程内容、当前项目组织和监管方面的专家,既有针对具体项目的,也有针对整个大学的。
研究顾问帮助我们深入了解他们是如何工作的,以及在这些咨询会议中他们的需求是什么。这些会议是在办公室环境中与学生(偶尔与家长)的私人谈话。这些学生通常没有完美的学习生涯:他们学习有困难,会受益于个性化的课程计划,一年中没有获得足够的学分,或者只是希望重新定位于新的课程。
研究顾问有多种工具和网站供他们使用。但是为每个特定的学生组合和解释这些多种渠道的信息需要努力和时间,并且容易出错。此外,数据往往不完整。
仪表板
使用以用户为中心的快速原型设计方法,我们从最初设计的草图和 D3.js / 流星开始创建我们最终的交互原型。这里有两张最终设计的截图(2017 年年中,今天我们的一个新博士生接手并做了一点重新设计):
From left to right: positioning test results for July and September (ijkingstoets), mid-term tests (tussentijdse toetsen), January and June exams. Above each period: histograms of peer performance for that period and an indicator of the student’s position in relation to grades of peers in the different test periods. Each course result is accompanied with a histogram of peer performance for that specific course. Failed courses can be planned for re-sits. Length of bachelor in years is predicted through historical data.
现在来看一些细节…
年度概览
LISSA 按时间顺序概述了每个关键时刻,直到举行咨询会议的时期:定位考试(一种无后果的入学考试)、期中考试、一月考试和六月考试的成绩。顶部显示了学生表现的总体趋势:学生路径由直方图组成,显示了每个关键时刻学生在同龄人中的位置。
每门课程都用它的名字和分数(满分 20 分)来表示。绿色、橙色和红色编码代表成功的考试、可接受的分数(学生可以要求通过有限的 8-9/20 的分数)和失败的课程。该课程附有一个柱状图,显示了同学的表现以及学生在其中的位置(黑色突出显示)。
规划
对于六月的课程,计划九月的重考是很重要的。考试太少会导致学分门槛问题,而考试太多很可能会导致失败。失败考试旁边的复选框让指导老师和学生选择几门课程。“重考成功率图表”使用历史数据来提供对过去成功通过所选数量的考试的学生人数的洞察。
预言;预测;预告
堆叠预测栏提供了与学生具有相似概况(基于通过或未通过考试的数量)的学生的历史数据:它显示了具有相似九月重考的学士课程持续时间的分布(三-四-五年或辍学/“NIET”)。
数据源
为了可视化关键时刻,需要关于学生成绩的数据。这包括本年度所有一年级学生填写课程和课程直方图、学生路径和课程直方图。关于一月、六月和九月期间的所有等级都可以在 KU Leuven 数据仓库中获得。
堆叠的预测条基于往年的一年级学生成绩。这提供了预测三年、四年、五年或更长时间的学士学位所需的数据。
我们使用 Python 脚本创建了一个数据处理管道,将不同的文件和格式转换成一个简单的表示,并导入到 MongoDB 中。
吸取的教训
学习分析数据的作用
LA 仪表板通常是为具有特定数据要求的特定机构开发的。部署 LISSA 所需的学习分析数据非常基本:学生在关键时刻的成绩和关于学生成功的数据(来自历史成绩数据)。大多数高等教育机构通常都有这种数据,但仅限于工作人员。然而,我们已经表明,将这些数据放在学生建议环境中,可以帮助支持学生,提供对他们进步的见解,并帮助规划他们的未来。
LISSA 是基于事实数据。考试成功率和学士持续时间显示了历史上发生的事实,并没有提供计算估计。这种可靠的数据可视化方式让研究顾问和学生对他们给出和接受的建议感到放心。
关于社会经济地位、父母教育、性别和高中成绩的个人背景数据可以提供进一步的见解,并帮助研究顾问更好地了解学生的情况。然而,这些不可改变的数据并没有给学生提供可操作的见解。因此,研究如何以道德的方式整合这些数据是很重要的。
学习顾问的角色
LISSA 有助于多层次的洞察力,但这些洞察力受益于研究顾问的指导。即使数据是客观的,仍然需要领域专家进行批判性和反思性的解释。过于自信的学生可能会把总体的负面结果解释为一个可以克服的问题,而学习顾问可以建议和计划一个更可行的计划,防止学生在错误的选择上浪费时间。LISSA 可能会以负面的方式描述学生,而与学生的讨论可能会揭示容易解决的问题,例如学习方法的改变、新计划或态度的改变。如果没有研究顾问的指导,这些学生可能会选择不继续他们的学士课程。
LISSA 仍然为个人意见和隐性经验留有余地,因为它们仍然在建议会议中发挥重要作用,允许研究顾问强调某些结果,以推动他们走上正确的道路。许多外部因素,如通过讨论收集的信息和以前学习顾问对学生的经验,会影响偏离事实数据或以不同方式解释数据的决定。
透明度
在半结构化的访谈和研讨会期间,出现了关于让学生面对数据的伦理问题。
一些学习顾问没有向有大量课程不及格的学生展示 LISSA。虽然一些学生可能会从“大开眼界”中受益,但学习顾问更喜欢将 LISSA 作为一种激励工具。
LISSA 的一个重要作用是能够在同龄人中定位学生。总的来说,直方图的使用被认为是非常有用的,并且定位具有积极的效果,例如当一个坏的分数在同龄人中仍然是好的,或者课程不及格率非常高时,激励学生。一些学习顾问担心会失去动力:一个处于直方图低端的学生可能会认为成功完成这门课程是一个无法实现的目标。
然而,学生们要求在会议之外接触 LISSA。但是研究顾问担心,如果没有他们的指导,可视化的数据可能会被严重误解:害怕失败的学生或过于自信的学生可能会错误地解释数据。父母可以扮演一个消极的角色,要么太努力,要么把平庸的结果解释为不可克服。没有学位的父母对高等教育缺乏了解可能会阻止学生追求一个可实现的学位。这些问题可能会导致关于考试和学习职业规划的错误决策。研究顾问确实看到了提供精简信息的潜力,但这种精简意味着什么,必须进一步讨论和评估。
希望你喜欢这个关于 LISSA 和我们发现的简短概述。它目前被部署在比利时最大的大学之一的鲁汶大学的多个校区。如果您想了解更多的经验教训,或者评估过程和结果的更多细节,请查看原始论文或者给我一个 ping!
深度学习云服务提供商列表
现在有很多地方可以租到你的 GPU。我列出了我能找到的所有拥有 GPU 的云提供商,因为我在任何地方都找不到完整的列表。
NVIDIA Tesla V100 for NVLINK
我计划比较一些供应商。如果你有兴趣看的话,请跟我来。
我把亚马逊和谷歌包括在内两次,因为它们都有两种截然不同的产品。
Medium 不便于插入带有可点击链接的表格。如果你想点击这些,请查看 GitHub repo 中的列表。
如果你对这个列表有任何补充,请在的 GitHub repo 上添加它们,这样我就不会错过它们。
希望这个小清单对你有帮助。如果你有,请鼓掌😃!
免费必读机器学习书籍列表
机器学习是人工智能的一种应用,它使系统能够自动学习并根据经验进行改进,而无需显式编程。在这篇文章中,我们列出了一些你应该考虑浏览的最好的免费机器学习书籍(没有特别的顺序)。
海量数据集的挖掘
作者: Jure Leskovec,Anand Rajaraman,Jeff Ullman
基于斯坦福计算机科学课程 CS246 和 CS35A,本书面向计算机科学本科生,不要求任何先决条件。这本书已经由剑桥大学出版社出版。
统计学习导论(R 中的应用)
作者:加雷斯·詹姆斯,丹妮拉·威滕,特雷弗·哈斯蒂和罗伯特·蒂布拉尼
这本书包含了统计学习方法的序言以及一些 R 实验室。
深度学习
**作者:**伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔
这本深度学习教材是为那些处于机器学习特别是深度学习初级阶段的人设计的。这本书的网络版现在可以免费获得。
黑客的贝叶斯方法
**作者:**卡姆·戴维森-皮隆
这本书从计算的角度向你介绍了贝叶斯方法和概率编程。这本书基本上是那些对数学不甚了解的人的天赐之物。
理解机器学习:从理论到算法
作者: 沙莱夫-施瓦茨和沙伊本-大卫
对于精通数学的人来说,这是理解机器学习背后的魔力的最值得推荐的书籍之一。
深度学习教程
作者:蒙特利尔大学丽莎实验室
使用 Theano 的深度学习教程,如果你愿意进入这个领域,是必读书,而且绝对免费。
Scikit-Learn 教程:科学数据处理的统计学习
**作者:**安德里亚斯·穆勒
探索统计学习,本教程解释了使用机器学习技术的目的是统计推断。该教程可以免费在线获得。
机器学习(算法视角)
**作者:**斯蒂芬·马斯兰德
这本书为学习机器学习和人工智能的工程和计算机科学学生提供了很多东西。不幸的是,这本书由 CRC 出版社出版,由 Stephen Marsland 撰写,并不是免费的。然而,我们强烈建议你投资这个。此外,所有的 python 代码都可以在线获得。这些代码是学习 python 的很好的参考资料。
用 Python 构建机器学习系统
**作者:**威利·里歇特和路易斯·佩德罗·科埃略
这本书也不是免费的,但包括它服务于我们的列表正义。这是一个最终的实践指南,以获得最大的机器学习与 python。
这些是我们推荐的一些最好的机器学习书籍。有别的想法吗?请在下面评论你的一些令人敬畏的机器学习书籍。
对使用人工智能感兴趣?你可以注册免费 ParallelDots 账号,使用触手可及的人工智能。
必读的免费数据科学书籍列表
数据科学是一个跨学科的领域,包含了统计学、机器学习、贝叶斯等领域的方法和技术。它们都旨在从数据中产生特定的见解。早些时候,我们列出了一些你应该考虑阅读的最好的机器学习书籍的清单。在本文中,我们列出了一些优秀的数据科学书籍,涵盖了数据科学领域的各种主题。
数据科学基础
**作者:**布鲁姆、霍普克罗夫特和坎南
这本书是数据科学的现代理论课程讲座的伟大融合。
UFLDL 教程
**供稿:**吉泉恩亚姆、传友富、麦一凡、孙嘉玲
本教程旨在让你熟悉无监督特征学习和深度学习的主要思想。
Python 数据科学手册
**作者:**杰克·范德普拉斯
这本书介绍了使用 Python 处理数据所必需的核心库:特别是 IPython、NumPy、Pandas、Matplotlib、Scikit-Learn 和相关的包。
动手机器学习和大数据
**作者:**卡里姆·阿尔卡西
这本书是学习机器学习和大数据概念的绝佳来源。
思考统计
**作者:**艾伦·唐尼
Think Stats 强调可以用来探索真实数据集和回答有趣问题的简单技术。这是最值得推荐的数据科学书籍之一。
想贝叶斯
**作者:**艾伦·唐尼
《思考贝叶斯》是使用计算方法对贝叶斯统计的介绍。这本书用 Python 代码代替数学,用离散逼近代替连续数学。
EE263:线性动力系统简介
**作者:**礼萨·纳西里·马哈拉蒂
桑杰教授的这份汇编强调了应用线性代数和线性动力系统在电路、信号处理、通信和控制系统中的应用。博伊德教授前几年课程笔记的链接可以在这里找到。
凸优化——博伊德和范登堡
**作者:**史蒂芬·博伊德和列文·范登堡
这本书提供了一个全面的主题介绍,并详细说明了如何解决这类问题的数字效率很高。
元启发式的本质
**作者:**肖恩·卢克
这是一套关于元启发式算法的开放式课堂讲稿,面向本科生、从业者、程序员和其他非专家。
CIML
**作者:**哈尔·多梅三世
CIML 是一套介绍性材料,涵盖了现代机器学习的大多数主要方面(监督学习,非监督学习,大幅度方法,概率建模,学习理论等)。).
这些是我们推荐的一些最好的数据科学书籍。有别的想法吗?请在下面评论您的一些令人敬畏的数据科学书籍列表。
强化学习入门🤖
这是对强化学习(RL)的简要介绍,用简单的术语讲述了基础知识。我们从 RL 的简要概述开始,然后进入一些解决 RL 问题的技术的实际例子。最后,你甚至会想到可以应用这些技术的地方。我想我们都同意建立我们自己的人工智能(AI)并让机器人为我们做家务是很酷的。
…让我们开始吧!
1)什么是 RL?🧐
“强化学习是机器学习(人工智能)的一个领域,起源于强化的心理学概念,涉及软件代理的决策,以最大化模型环境中期望的回报概念。”
如今,强化学习已经在人工智能和机器学习(ML)技术中找到了自己的路,然而它的起源来自行为心理学。美国心理学家 E. L .桑代克在 20 世纪中期引入了强化这个术语。然后,另一位名叫 B.F .斯金纳的美国心理学家跟进桑代克的研究,提出了一种新的学习过程,称为操作性条件反射 (OC)。也是在那个时候,一位美国应用数学家 R. E. Bellman 开发了动态编程,这有助于用计算机解决 RL 问题。从那时起,RL 已经大量转移到数字世界,这也许要归功于加拿大计算机科学家 R. S .萨顿在 20 世纪末开创了计算强化学习并出版了他有影响力的 RL 教科书。这让我们可以把机器学习作为最突出的领域来呈现,并投入到大规模实施的决策中。
…行为心理学的强化🐹
是一种效应 当一个有机体暴露在特定的刺激下,促使它执行习得的行为时,它会强化未来的行为。它被用在特定类型的条件作用中,这些条件作用使用刺激来表现作为学习的一部分的反应。在 OC 中,行为由环境中可察觉的变化控制,也称为环境刺激,它是影响活动的外部事物。例如,环境刺激是生物体可以检测到的不同表现形式,例如,我们的身体可以检测到触觉、声音、视觉等。为了把它带回到强化,OC 使用强化或惩罚来修改行为的可能性。同样,它也包括自愿行为,可以用下面的动物行为例子来描述。
- 一只狗可以被训练得在受到狗食奖励时跳得更高,这意味着它的行为被狗食强化以执行特定的动作
[Klein & Abbeel 2018]
…机器学习中的强化🤖
是对软件代理的后续动作的一种效果,即在给予奖励后探索模型环境以强化其未来行为。软件代理被发送到模型环境中,带着实现某些预期目标的意图采取行动。这种代理可以被认为是计算机程序,它们因执行正确的动作而受到奖励,或因执行错误的动作而受到惩罚,并从它们的经验中学习。什么是对什么是错一般取决于环境,但正确的行动通常是通向实现目标的最佳途径(不管是什么)的行动,如下例所示。
- 迷宫(环境)中的智能体可以被编程为自主地(通过奖励)找到最快的方式(行动)如何逃离它(目标)
- 海洋(环境)中的智能体可以被编程为自主地(通过奖励)寻找最长的方式(行动)如何在水下生存以恢复受损的珊瑚礁(目标)
…让我们看看如何通过数学模型来定义这样的理论 RL 示例!
2)如何定义 RL 问题?✍
“RL 任务的公式化可以通过结合马尔可夫决策过程和‘正确’策略来完成,当解决模型环境时,软件代理可以将它们用于自己的决策。”
马尔可夫决策过程(MDP)提供了一个简洁的数学框架来模拟 RL 中的决策。MDP 用于决策者(软件代理)部分控制结果而其余结果是随机的情况。它为代理配备了关于状态、动作、转移、概率、奖励和折扣因子的知识。这些属性以及其他一些常用术语将在下文中“简略”描述。
maze example — grid world [Klein & Abbeel 2018]
🐹代理人 - >为你干脏活的家伙!
🗺环境 - >一个宇宙/空间/世界,一个智能体在其中完成工作,例如,它可以是一个随机(随机生成的)网格世界,描述了上图中的迷宫
🏔状态 - >环境中代理的特定状态/位置
💃🕺action (a) - >可能导致新状态的代理行为
🤷转移概率(P) - >智能体在环境中如何移动的概率,即智能体在特定状态下的行为将/不会导致其他可能状态的可能性
💵奖励(R) - >从字面上看,一些钱作为奖励,或者一些化石燃料作为惩罚,也就是消极的奖励,因为一个代理人的决定进入了一个状态
⚖️折扣因子**【ɣ】**->帮助代理专注于其工作,不会因收到的奖励大小而分心,例如,它通过计算未来和当前奖励的重要性差异来衡量收到的奖励
👴🏻体验 - >代理通过进入一个环境并执行一些动作而获得的体验,例如观察新状态、奖励等习得的行为。
🔮策略****【π】->告诉代理如何在状态中行动,甚至如何从起点到目标,即它是从状态到选择每个可能行动的概率(转移概率)的映射……策略可以是对环境中每个状态给出一个行动的 MDPs 的解决方案,例如" π(s) - > a "
这一切都是为了获得长期回报!💰
M DPs 都是关于长期奖励,所谓延迟 奖励。这些奖励导致代理在环境中试图解决的任务(目标)的完成。例如,一个代理可以通过进入一个特定的状态获得一个重要的短期奖励,即所谓的即时奖励。然而,走这条立即获得回报的道路可能不是完成任务的最佳方式。这取决于在一个环境中如何设置奖励。
...是时候回答一些问题了!
…代理如何找到新的状态?👀
它是通过跃迁来完成的,即一些跃迁函数 T(s,a,r,s’)**。 它描述了一个过程中智能体如何发现一个新的状态。在一个模型环境中,一个代理处于某个状态(s),采取一个动作(a),然后为此获得一个奖励(r),并通过这个过程找到一个新的状态(s′)。
…代理商如何知道在美国有多好?👍
在 RL 中,决策是由一个代理人完成的,这个代理人通常需要知道处于一个给定的状态或执行他们给定的动作有多好。例如,一个代理人想知道预期的回报,也就是未来的回报,这取决于他将要采取的行动。许多 RL 算法通过估计状态或状态-动作对的函数,称为值函数来解决这种需求。这些功能是用特定的行为方式(策略)来定义的。价值函数用于组织和结构化策略的搜索,这是 RL 的关键思想之一!
Bellman equation — value function calculating values in states for MDPs
O 如何利用价值函数的一种方法是贝尔曼方程,它是基本 RL 方程之一,根据问题的不同可以采用多种形式。上面的等式是针对 MDP 的一个示例。它展示了如何获取处于特定状态的值(V)并在该状态下遵循策略(π)。具体来说,它使用该州的奖励和下一个州(sʹ).)的转移概率(P) &值的贴现和
MDPs 的最终目标是什么?🏒 🥅
MDPs 中的目标通常是找到最优策略。它是使长期预期报酬最大化的。正如下面的高级定义所示,最优策略返回在某些环境状态下要采取的特定操作。通过遵循策略(π)并在特定时间(t)经历一系列状态来计算折扣奖励的期望总和。
optimal policy (π*) — finding the right actions in states for MDPs
maze example — map [Klein & Abbeel 2018]
…现在想象一个代理人有一张如上图所示的迷宫地图,那么它将知道在每种情况下做什么才能得到钻石或不被杀死,因为每个州都有一个特定的行动(绿色箭头),这就是“有政策”的意思!
…那么,在这个迷宫示例中,RL 在哪里?🕵️
It 是有的,但这取决于我们对迷宫(环境)了解多少,以及我们试图完成什么。只有当一个主体采取行动寻找回报的迷宫的所有特征都已知时,它才能用 MDP 来完整地描述。然后,一个代理知道每个状态中的所有动作,并且新的状态和奖励这样的动作导致。然而,一个代理仍然需要找出哪一系列的行动能最佳地导致最终的回报/目标,即找出最佳策略。这有时被称为离线规划,可以通过使用 MDPs 的知识并找到策略来解决,这实际上不是 RL 问题。
然而,在这个“真实”的世界中,存在任意大小的环境,它们可以是巨大的和组合的。例如,一个迷宫可以有许多可能的动作和结果的状态。然后,不一定有任何关于转换或奖励的知识,直到代理实际尝试一些动作并弄清楚这一点!这有时被称为在线学习,它仍然假设 MDPs 并继续寻找策略,但它更具有“真正的”RL 性质。这意味着代理从数据中学习,这与仅使用静态数据的离线情况形成对比。总之,RL 问题可以用 MDP 来表示,就其主要性质而言,MDP 可能是复杂且不完整的。
…让我们看看如何利用引入的 MDP 定义来解决 RL 任务!
3)如何解决 RL 问题?🎮
RL 问题可以用动态规划、时间差异学习或策略梯度方法(T21)来解决。然而,通常有必要通过使用深度神经网络&来帮助在更复杂环境中运行的代理找到良好的近似解决方案,这些技术可以解决基本的探索-开发权衡。”
解决 RL 问题的方法因环境的性质而异,比如我们对环境了解多少,或者我们想在环境中解决什么任务。一般来说,RL 应用可以用 MDPs 来表示,用某种形式的动态规划 (DP)方法来解决。DP 是一种优化技术,它将问题分成更小的任务,并递归地解决它们。它们也可以用仅使用 DP 的某些方面的方法来解决,例如在时间差异 学习 (TD)方法中。在 TD 方法中,算法通过将蒙特卡罗方法的采样(估计期望值)与 DP 的自举(在其他估计的基础上更新估计)相结合来学习。现代 RL 解决方案之一是策略梯度** (PG)方法,它可以直接逼近最优策略,而无需使用任何近似值函数。PG 方法通常是通过深度神经网络实现的,深度神经网络是多层连接的人工神经网络(ann)。还有许多其他方法来解决 RL 问题,但它们都有一个相似的目的利用学习过程中的经验并以某种方式获得环境的未知属性,如 MDP 中的概率或奖励。**
RL 通过表格或近似解求解!🤖 🍽 📐
- 在 简单 MDPs 中,解决方案大多通过表格解决方案找到,其中表格(数组)表示近似值函数,因为这里的环境很小或很简单。他们经常可以找到精确的解决方案,例如找到精确的最优政策或最优价值函数[萨顿&巴尔托 2017]。换句话说,它是关于在完全描述的环境中,在可能无限的时间和数据上找到最优策略或最优价值函数。算法通过对环境的所有状态的值&策略的递归来计算这一点。这可以通过前一节中引入的策略和值的等式的递归的某种变体来完成,或者也可以通过它们的迭代的某种变体来完成,例如进行值迭代或策略迭代**。**
- 在复杂的 MDP中,解决方案大多是通过近似解找到的,这些近似解可以将以前在不同状态中遇到的情况推广到其他情况,因为这里的环境很大。换句话说,解决问题在很大程度上转变为寻找一个计算量不大的好的近似解决方案,因为我们不能指望在这样的环境中找到最优政策或最优价值函数【萨顿&巴尔托 2017】。此外,在这种情况下,通常有必要通过 ann 来帮助代理完成他们的工作。例如,人工神经网络可以通过充当非线性函数逼近器和学习价值函数或最大化预期回报来处理代理人的经验。
…现在似乎是再次回答一些问题的好时机!
…那么,代理解决任务的最佳方式是什么?🎢
It 通常是代理在完成环境中的任务时,能够在探索和利用之间找到正确平衡的一种方法。探索是从数据中学习的能力,而开发是使用你目前所知的能力。这两种能力对一个特工来说都很重要。然而,这在 RL 中实际上是一个困难的任务,因为当试图为一个环境提出策略时,这两者会发生冲突。
T 这种冲突可以通过寻找“好”策略的两种不同学习方法来处理,即策略上的学习和策略外的学习。他们都试图通过确保无限频繁地选择所有动作来评估或改进策略,这意味着代理只是继续选择它们。主要区别在于,政策上的学习为用于决策的政策做*,而政策外的学习为不同于用于生成数据的政策做*【萨顿&巴尔托 2017】。它们都可以通过一些函数逼近来解决,这在复杂环境中非常有用。然后,通常会有收敛或这种近似解的稳定性的挑战,但我们不会在本介绍材料中谈论这些:)**
…算法能区分代理的目标和习惯吗?☯
是的,算法可以做得很好,实际上在各个领域都有不同的术语来描述这种行为上的区别。在认知科学中,这是关于反思** 对 反思决策和选择。在 RL 中,如果我们考虑目标导向和习惯性行为之间的这种心理差异,它是关于基于模型的 与 无模型的算法。基于模型的方法通过代理环境的模型提前计划来选择动作。无模型算法通过访问存储在策略或行动值函数中的信息来做出决策【萨顿&巴尔托 2017】。**
让我们回到上一节介绍的 MDP 术语。无模型算法最有可能的工作,比如 TD 学习,将是 MDP 中并非所有属性都已知的工作。此外,关于计划的相当通俗的术语,无模型算法将解决在线学习的情况,而基于模型的算法将解决离线计划的情况。
…有哪些常见的 RL 算法?🔦
It 也许值得一提的是 RL 中的基本算法,它们在某种程度上可用于近似解,因为这就是 RL 实现的全部内容。有两种不同的算法称为 Q-learning 和 SARSA 属于 TD 方法。他们都需要一些行动价值评估来提出他们的政策,也就是说,他们必须首先了解行动的价值,以选择最佳行动。主要的区别也许是他们的政策学习类型;一个是非政策,另一个是政策。然后,有两个不同的算法叫做加强和演员评论家属于 PG 方法。他们可以学习一些参数化的政策,这些政策可以在不咨询价值函数的情况下选择行动(行动-价值估计)[萨顿&巴尔托 2017]。参数化策略是表示为称为参数的一些独立量的函数的策略,例如,参数可以是实现 PG 方法的神经网络的权重。
到总结, TD 算法可以学习行动值,然后使用它们来确定行动选择,而 PG 算法可以学习参数化策略,使行动能够在不咨询行动值估计的情况下采取【萨顿&巴尔托 2017】。换句话说,它是关于用值函数而不是参数来表示策略。
…这听起来可能有点令人困惑,所以让我们在 RL 介绍文本的其余部分只看 Q-learning!
…Q-learning 是如何工作的?🎛
Q-learning 是一种无模型算法,实现了属于 TD 方法的偏离策略学习。它通过状态-动作对将代理的学习建立在经验的基础上,而没有转移概率的明确说明。字母 Q 代表“质量”处于一种状态,用代表状态-动作对的 Q 值来表示。高 Q 值意味着与低 Q 值相比,在那里(在这种状态下)更好。****
0010Q 学习通常遵循某个勘探-开采策略并且学习与采取最优策略相关的 Q 值。它存储每个环境状态的 Q 值,并在学习时直接更新它们,即它使用自己的转换(存储的数据)来直接产生方程的解。目标是通过近似如下所示的 Q 函数来推断最优策略(π*)。
Q-learning — optimal policy
0100Q 学习可以通过计算为环境中的每个状态产生 Q 值的等式来解决,例如下面的等式。它包含了一个叫做学习率** (α)的东西,它决定了代理在探索和利用方面如何学习(代理什么都学,什么都不学)。还有贴现因子 (ɣ),它通过设立一个即时或延迟满足的代理(又名近视或远视代理)来决定未来奖励的重要性。通俗地说,这个等式产生的新 q 值粗略地证明了当一个代理处于状态(s)并试图做某事(a)时,某事已经发生(sʹ)。**
Q-learning — equation for Q values
Q-learning 可以使用一个表来存储数据,作为其最简单的实现版本。然而,对于大型问题(有许多状态或动作的环境),这可能不可行。这就是神经网络作为函数逼近器发挥作用的地方,它允许在表格做不到的地方扩大规模。它们为解决方案提供了更多的灵活性,但代价是牺牲了一点稳定性。不考虑具体的 Q-learning 实现,在选择动作的时候也需要有一个游戏计划。在我们下面的编码示例中,我们使用了一个带有ε贪婪策略的多臂强盗算法,用于决定关于勘探-开发困境的动作**。**
…所以让我们直接开始实施我们自己的 RL 示例吧!
4)编码示例:通过 Q 学习解决的迷宫💻
“我们将通过表格和神经网络实现对 Q 学习算法进行编码,尝试用 RL 解决一些众所周知的类似迷宫的环境。”
q-用表格学习🤖 🎛 🍽
用人工神经网络学习🤖 🎛 ☎️
结论
我们刚刚学习了学习过程的一些应用,这可能有助于读者开始思考 RL。我们看到,问题可以用 MDP 来定义,并用使代理能够在各种情况下工作的方法来解决。然后,我们编写了自己的 RL 解决方案,解决迷宫般环境中的一些情况。还有许多其他的计算方法来解决 RL 问题,但希望这篇文章只是简单地传达了 RL 的基本思想,并为那些寻找快速起点的人服务。
现在,我建议你亲自动手制作自己的 RL 应用程序!也许从探索更多强化学习过程的例子开始,但同时尝试用强化学习解决它们。这可能有助于你以后在 ML 空间创建独特的解决方案……这个空间现在充斥着大量可爱的图片🐱&🐶 :)
参考
- R.萨顿和巴尔托:《强化学习:导论》,第二版,布拉德福德出版社,2017 年
- D.Klein 和 p . abbe El:《cs 188 人工智能导论》,课程笔记,加州大学柏克莱分校,ai.berkeley.edu,2018(已下载)
收音机上的小盒子:现代流行音乐听起来都一样吗?
1965-2015 年公告牌热门 100 首歌曲分析
我对为我的下一个项目进行一些基本的音乐分析很感兴趣,所以我四处打探有希望的数据集。我最终选择了这个公告牌年终热门 100 首歌曲的数据阵列,它给出了 50 年间流行音乐的一个很好的快照(至少是在给定年份在电台播放的音乐)以及一个有前途的语言分析。虽然我最初只是打算探索这些数据(尤其是歌词),看看音乐是如何变化的,但我发现了一些证据,表明歌曲随着时间的推移变得越来越相似。
在检查了一些歌曲后,我发现并非所有的歌词都完全准确(或真实),所以我用 geniusR 从 genius.com 那里搜集歌词,并尽可能多地填补漏洞。此外,我利用了真正优秀的 spotifyR 包,从 Spotify 的海量数据库中获取了关于每首曲目的一些基本音乐参数(速度、音调等等)。
随着时间的推移,宋的情绪变得更加“消极”
对于抒情内容的分析,我选择通过 syuzhet 包使用逐行情感测量。我最初是一个词一个词地分析歌曲,但因为大多数词都是中性的,所以它没有像看一整行歌词(词与词的总和)那样有洞察力。从那以后,相对简单地考察作为年份函数的宋情绪:
虽然总体情绪仍然大于零,但随着时间的推移,情绪明显(几乎完全线性)下降(线性模型,p <0.0001). Digging a little deeper, I think we can attribute this decrease to multiple factors. First and foremost, curse words (from ‘ass’ and ‘damn’ on up) are all associated with negative sentiment, independent of their context (the sentence “he looked damn fine” is negative overall, even though contextually it could be interpreted as positive). It’s definitely an incredible understatement to say that hip hop has grown in popularity from 1965 to today ),所以我认为有理由将“负面情绪”的增加至少部分归因于热门 100 强中嘻哈和说唱歌曲数量的增加。此外,虽然,我想说的是,歌曲在其他流派中也多少有些消极/不太积极,与歌词的粗俗无关。例如,比较这四首几十年前的“积极”歌曲
对于这些更现代、总体上“消极”的歌曲(在这两种情况下,更积极的情绪→更红的文本和更消极的情绪→更蓝的文本):
我认为现在的乐观、快乐摇滚、流行和灵魂乐歌曲比过去少了(谢天谢地,这也意味着像“美味美味/我肚子里有爱”这样的歌词也少了)。如今,你也不太可能在流行电台上听到像凯特·斯蒂文斯这样的民谣诗人,或者像杰克逊五兄弟这样的放克/舞蹈/摩城乐队;这并不是说当前的音乐艺术家不再存在于这种类型的音乐中,这可能只是因为这种类型的音乐不再受欢迎/有利可图,以至于无法获得主流电台时间的很大一部分。
随着时间的推移,歌曲变得越来越罗嗦
进一步分析歌词,还有另一个明显的效果:现代歌曲比 20 世纪 60 年代的歌曲有更多的词。为了控制歌曲变得越来越长的事实(也许部分是由于技术的进步),我决定可视化这种效果的最好方法是每分钟字数(WPM)。
Words per minute (WPM) for each song. Red line represents the median WPM for each year. The most notable outlier from the oldies, ‘I Like it Like That’ by the Dave Clark Five (1965) squeezes nearly 300 words into a 90 second song (annotated at far left). Even so, it’s still in a completely different league from rap songs like Ice Cube’s ‘Bop Gun (One Nation)’ .
从 1990 年左右开始并持续到现在,WPM 值的增加是显而易见的。再说一次,考虑到嘻哈音乐流行的时间线,我并不觉得这有什么特别令人惊讶的(不管怎样,“冰冰宝贝”(1990 年)是第一首在公告牌排行榜上排名第一的说唱单曲。如图所示,数据集中 WPM 值最高的都是 hip hop 曲目,而且都是 1990 年以后发行的。将 WPM 可视化为十年长度的直方图(左)也清楚地表明了这一点:从 90 年代中期开始,一直持续到现在,很大一部分歌曲的 WPM 值远远高于前几十年观察到的 WPM 值。
此外,最近几十年来,进入 Billboard 100 的歌词稀疏的歌曲比例越来越小。与 1965-1995 年相比,当时大约 1/4 到 1/3 的歌曲每分钟不到 50 WPM,很少有 1995-2015 年的 Billboard 歌曲如此稀疏。如前图所示,WPM 值最低的三首歌都是在 1985 年之前发行的,基本上没有任何歌词(除了“灵魂手指”,它有不朽的歌词:“灵魂手指!灵魂手指!灵魂手指”被邻居小孩喊。
速度随时间变化
从抒情内容和情感分析继续,我接下来深入研究了 Spotify 为每首歌曲计算的音乐特征的选择。首先,我检查了节奏,用每分钟节拍数(BPM)来衡量。
虽然我们肯定没有看到像抒情或 WPM 那样戏剧性的变化,但歌曲节奏随着时间的推移有一些变化。
用每十年的直方图可视化 BPM(左图)会使其中一些趋势更加清晰。最突出的是,现代歌曲中似乎有三组相对不同的节奏:90 BPM、 120 BPM 和~170 BPM。这与 1995 年以前的歌曲有些不同,1995 年以前的歌曲在 120 BPM 左右形成了一个大的、相对连续的分布。其他研究表明,大多数嘻哈歌曲都在 90 BPM 左右,而 120-130 BPM 是最受欢迎的节奏。另一方面,150-200 BPM 的歌曲可能只是被 Spotify 的算法误认为实际 BPM 两倍的歌曲(阿黛尔的《你好》、埃利·古尔丁的《像你一样爱我》、Fall Out Boy 的《世纪》都被错误地识别为> 150 BPM)。因此,相对于老歌来说,现代流行歌曲可以更清楚地分为两个相对不同的群体(慢节奏和“理想”节奏)。
现代歌曲更加同质化(在某些方面)
最后,我看了看其他音乐特征,看看关于流行音乐的的【T2 常见的 抱怨 是否属实,歌曲现在真的彼此更相似了。我发现三个音乐特征似乎可以佐证这一理论:歌曲时长、音乐情绪和能量。
(Left) Billboard Hot 100 songs plotted by their duration (top), mean overall linguistic sentiment (middle), and overall energy (bottom). (Right) The standard deviations for each of these three measures has steadily decreased over time.
这三个指标中的每一个都显示出它们的方差随着时间的推移而显著下降,粗略地说,这意味着现代歌曲比过去更加相似(至少在持续时间、情感和能量方面)。这种相似性的增加也可以通过按十年创建歌曲的树状图来可视化,根据音乐特征进行聚类,并以 500 的距离进行切割。在这里,我们再次看到现代音乐比过去的歌曲有更大程度的相似性(树中的组更少)。
在某种程度上,这也很容易解释:随着时间的推移,音乐制作人已经知道什么样的歌曲最有可能流行,并将其资源用于制作尽可能多的这类歌曲。根据你的观点,这要么意味着音乐整体在走下坡路(不太可能),要么只是收音机现在没有以前有趣了(更有可能)。我当然很难想象像“管状钟”这样 20 多分钟的乐器怪物会再次成为今年 100 首最受欢迎的歌曲之一。这是否是一件好事是一个解释的问题。
CNN 活动地图的实时可视化(使用 Tensorflow.js)
CNN 中有哪些激活图?
简单地说,激活图是特定卷积层的输出。我们可以使用激活图来可视化 CNN。
(这里,卷积层被称为卷积层,后跟最大池。)
激活地图有帮助吗?
是的,它们对 CNN 的可视化很有用,我们也可以部分地回答这样的问题:“CNN 是如何做决策的?”,“CNN 学哪些东西?”
剩余博文分为以下主题。
- CNN 详情
- 将 Keras 模型转换为 Tensorflow.js 模型
- 运行推理并保存激活图
- 显示激活图
CNN 的细节
对于实时可视化,我们需要更小的 CNN,它甚至可以在 CPU 上实时输出预测。所以,任何卷积层数少的 CNN 都可以。作为机器学习课程的一部分,我训练了紧凑型 CNN (3 Conv。层+ 2 FC 层)用于使用面部图像的二元性别分类。CNN 在包含 40k 张面部图像的 IMDB-WIKI 面部数据集【1】的子集上接受训练。受过训练的 CNN 有 0.94 F1 分。
CNN 架构的更多细节可以在这里找到。
Activation Map of First Layer
Activation Map of Second Layer
Activation Map of Third Layer
将 Keras 模型转换为 Tensorflow.js 模型
CNN 在 Keras 中实现,保存为 Keras 模型。有一种简单的方法可以将 keras 模型转换为 Tensorflow.js 兼容模型。
转换模型的步骤如下。官方文件可以在这里找到。
# install dependency
$ pip install tensorflowjs# Converting Model
$ tensorflowjs_converter --input_format keras \
path/to/my_model.h5 \
path/to/tfjs_target_dir
输出填充将如下所示:
$ ls tfjs_traget_dir
model.json
group1-shard1of1
group2-shard1of1
...
...
group6-shard1of1
运行推理并保存激活图
现在,是时候用 CNN 模型预测性别了。为简单起见,我们假设我们的面部图像来自现场直播。
您可以查看完整代码,其中包含使用 tracking.js 提取面部图像,然后调整为固定大小(50x50)的实现。
# loading Model
genderAI = await tf.loadModel('[https://immortal3.github.io/OnlineActivationMap/res/model/model.json'](https://immortal3.github.io/OnlineActivationMap/res/model/model.json'));
我们可以直接使用推论,但那样我们就只有最终结果了。我们希望在前进过程中保存激活图以便可视化。
# Final Prediction
const genderprediction = model.predict(face_image);
在前进过程中保存激活地图。
# list containing input for every layer
var input = []# First Layer;s Input is Facial Image
input.push(tf.tidy(() => { return tf.expandDims(facialImage,0).asType('float32').div(255.0)}));
# passing Input to every layer and saving output as input for next layer
for (var i = 1; i <= 12; i++) {
input.push(genderAI.layers[i].apply(input[i-1]));
}
# Saving activationmaps (note that we are displaying activation map after applying max pool)
const firstconvactivationmap = input[2];
const secondconvactivationmap = input[4];
const thirdconvactivationmap = input[6];
显示激活地图
为了可视化,我们可以使用 ploty.js 中的热图。您可以查看包含实现的完整代码。
现场演示:immortal3.github.io/OnlineActiv…
完整代码:【github.com/immortal3/O… /
关于我:【immortal3.github.io/about/】T4
(注意:对于 Mac 用户来说,tensorflow.js 存在一些问题,因此,它可能会工作,也可能不会工作。)
使用 Python 和天桥 API 从 OpenStreetMap 加载数据
你有没有想过德国大部分 Biergarten 在哪里,或者瑞士隐藏着多少家银行? OpenStreetMap 是一个伟大的开源世界地图,它可以让我们对这些和类似的问题有所了解。隐藏了大量的数据,充满了有用的标签和地理信息,但是我们如何得到这些数据呢?
Biergarten in Germany, can you guess the big peak?
从 OpenStreetMap (OSM)下载地图数据有多种方式,如他们的 wiki 所示。当然,你可以下载整个 Planet.osm 文件,但是在本文发表时,你需要释放超过 800 GB 的空间,才能将整个数据集放在你的计算机上等待分析。如果你只需要处理某个区域,你可以使用各种格式的提取,比如原生[.OSM](https://wiki.openstreetmap.org/wiki/OSM_XML)(存储为 XML)、[.PBF](https://wiki.openstreetmap.org/wiki/PBF_Format)(T2 的压缩版本)、 Shapefile 或 GeoJSON 。也可能有不同的 API,如本地 OSM API 或命名 API 。在本文中,我们将只关注override API,它允许我们从 OSM 数据集中查询特定的数据。
快速浏览一下 OSM 数据模型
在我们开始之前,我们必须看看 OSM 是如何构成的。在 OSM 数据模型中,我们有三个基本组件,分别是节点、方式和关系,它们都有一个 id。许多元素都带有标签,这些标签描述了被表示为键值对的特定特性。简单来说,节点是地图上的点(以纬度和经度表示),如下图所示,这是一张在伦敦的长凳的图片。
另一方面,方式是节点的有序列表,它可以对应于一条街道或一所房子的轮廓。这里有一个麦克索利在纽约的旧啤酒馆的例子,在 OSM 也可以找到。
最后一个数据元素是一个关系,它也是一个有序列表,包含节点、路径甚至其他关系。它用于建模对象之间的逻辑或地理关系。例如,这可用于大型结构,如凡尔赛宫中的包含多个多边形来描述建筑。
使用天桥 API
现在我们来看看如何从 OSM 加载数据。天桥 API 使用定制的查询语言来定义查询。这需要一些时间来适应,但幸运的是有 Martin Raifer 的over Turbo,它可以方便地直接在浏览器中交互评估我们的查询。假设您想要查询咖啡馆的节点,那么您的查询如下所示
node["amenity"="cafe"]({{bbox}}); out;
其中查询源代码中的每条语句都以分号结束。该查询首先指定我们想要查询的组件,在本例中是一个节点。我们在查询中应用了一个按标签过滤的方法,寻找所有键值对为"amenity"="cafe"的节点。在文档中可以找到不同的标签过滤选项。有各种各样的标签可供选择,一个常见的关键字是 amenity ,它涵盖了各种社区设施,如咖啡馆、餐厅或只是一张长椅。为了对 OSM 其他可能的标签有一个大概的了解,看看 OSM 地图功能或 taginfo 。
另一个过滤器是边界框过滤器,其中{{bbox}}对应于我们要在其中搜索的边界框,并且只在天桥 Turbo 中工作。否则,您可以通过经纬度中的(south, west, north, east)指定一个边界框,如下所示
node["amenity"="pub"]
(53.2987342,-6.3870259,53.4105416,-6.1148829);
out;
你可以试试天桥涡轮。正如我们之前在 OSM 数据模型中看到的,也有可能拥有相同属性的方法和关系。我们也可以通过使用一个 union block 语句来获得这些结果,该语句收集一对括号内的语句序列的所有输出,如
( node["amenity"="cafe"]({{bbox}});
way["amenity"="cafe"]({{bbox}});
relation["amenity"="cafe"]({{bbox}});
);
out;
下一种过滤查询的方法是通过元素 id 过滤。下面是查询node(1); out;的例子,它给出了经度接近于零的世界的本初子午线。
另一种过滤查询的方法是按地区指定,可以像指定area["ISO3166-1"="GB"][admin_level=2];一样指定,这样我们就可以得到英国的地区。我们现在可以使用它作为查询的过滤器,方法是将(area)添加到我们的语句中,如
area["ISO3166-1"="GB"][admin_level=2];
node["place"="city"](area);
out;
该查询返回英国的所有城市。也可以使用关系或方式作为区域。在这种情况下,区域 id 需要通过将2400000000添加到其 OSM id 中,或者在有关系的情况下,通过添加3600000000从现有的 OSM 方式中导出。请注意,并不是所有的路/关系都有一个区域对应物(即那些标有area=no的路/关系,以及大多数没有定义name=*的多多边形将不属于区域)。如果我们将英国的关系应用到前面的例子中,我们就会得到
area(3600062149);
node["place"="city"](area);
out;
最后我们可以指定查询数据的输出,这由 out 动作配置。到目前为止,我们将输出指定为out;,但是还有各种可以追加的附加值。第一组值可以控制输出信息的详细程度或详细程度,如文档中描述的ids、skel、body(默认值)、tags、meta和count。
此外,我们可以添加地理编码信息的修改。geom为每个对象添加完整的几何图形。当返回没有关联坐标的关系或路径,并且您想要获得它们的节点和路径的坐标时,这很重要。例如,查询rel["ISO3166-1"="GB"][admin_level=2]; out geom;不会返回任何坐标。值bb仅将边界框添加到每个路径和关系,而center仅添加同一边界框的中心(不是几何图形的中心)。
排序顺序可通过asc和qt进行配置,分别按对象 id 或四块索引排序,后者明显更快。最后,通过添加一个整数值,您可以设置要返回的最大元素数。
结合我们目前所学的知识,我们最终可以查询德国所有比尔加滕的位置
area["ISO3166-1"="DE"][admin_level=2];( node["amenity"="biergarten"](area);
way["amenity"="biergarten"](area);
rel["amenity"="biergarten"](area);
);
out center;
Python 和天桥 API
现在,我们应该已经很好地掌握了如何使用 transition API 查询 OSM 数据,但是我们现在如何使用这些数据呢?下载数据的一种方法是使用命令行工具 curl 或 wget 。为了做到这一点,我们需要访问其中一个over API 端点,在这里我们将按照格式http://overpass-api.de/api/interpreter?data=query查看。当使用 curl 时,我们可以通过运行以下命令下载查询的 OSM XML
curl --globoff -o output.xml [http://overpass-api.de/api/interpreter?data=node(1);out;](http://overpass-api.de/api/interpreter?data=node(1);out;)
其中先前精心制作的查询出现在data=之后,并且该查询需要被 urlencoded 。为了使用方括号和花括号而不被 curl 解释,--globoff很重要。该查询返回以下 XML 结果
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API 0.7.54.13 ff15392f">
<note>The data included in this document is from www.openstreetmap.org.
The data is made available under ODbL.</note>
<meta osm_base="2018-02-24T21:09:02Z"/> <node id="1" lat="51.4779481" lon="-0.0014863">
<tag k="historic" v="memorial"/>
<tag k="memorial" v="stone"/>
<tag k="name" v="Prime Meridian of the World"/>
</node></osm>
在文档中有多种输出格式可供选择。为了下载 JSON 格式的查询结果,我们需要在查询的开头添加[out:json];,如
curl --globoff - o output.json [http://overpass-api.de/api/interpreter?data=[out:json];node(1);out;](http://overpass-api.de/api/interpreter?data=[out:json];node(1);out;)
给我们之前的 JSON 格式的 XML 结果。您也可以通过访问overpass-api.de/api/interpr…。
但是我已经承诺使用 Python 来获得结果查询。我们现在可以用 Python 运行我们众所周知的 Biergarten 查询,方法是使用 requests 包来访问天桥 API 和 json 包,以从查询中读取结果 json。
import requests
import jsonoverpass_url = "http://overpass-api.de/api/interpreter"
overpass_query = """
[out:json];
area["ISO3166-1"="DE"][admin_level=2];
(node["amenity"="biergarten"](area);
way["amenity"="biergarten"](area);
rel["amenity"="biergarten"](area);
);
out center;
"""
response = requests.get(overpass_url,
params={'data': overpass_query})
data = response.json()
在这种情况下,我们不必为我们的查询使用 urlencoding,因为这由requests.get负责,现在我们可以存储数据或直接进一步使用数据。我们关心的数据存储在elements键下。那里的每个元素都包含一个type键和一个id键,前者指定它是节点、路还是关系。因为我们在查询中使用了out center;语句,所以我们为每条道路和关系获取了一个存储在center键下的中心坐标。在节点元素的情况下,坐标就在lat, lon键下面。
import numpy as np
import matplotlib.pyplot as plt# Collect coords into list
coords = []
for element in data['elements']:
if element['type'] == 'node':
lon = element['lon']
lat = element['lat']
coords.append((lon, lat))
elif 'center' in element:
lon = element['center']['lon']
lat = element['center']['lat']
coords.append((lon, lat))# Convert coordinates into numpy array
X = np.array(coords)plt.plot(X[:, 0], X[:, 1], 'o')
plt.title('Biergarten in Germany')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.axis('equal')
plt.show()
另一种用 Python 访问 over float API 的方法是使用 overpy 包作为包装器。在这里你可以看到我们如何用 overpy 包来翻译前面的例子
import overpyapi = overpy.Overpass()
r = api.query("""
area["ISO3166-1"="DE"][admin_level=2];
(node["amenity"="biergarten"](area);
way["amenity"="biergarten"](area);
rel["amenity"="biergarten"](area);
);
out center;
""")coords = []
coords += [(float(node.lon), float(node.lat))
for node in r.nodes]
coords += [(float(way.center_lon), float(way.center_lat))
for way in r.ways]
coords += [(float(rel.center_lon), float(rel.center_lat))
for rel in r.relations]
overpy 的一个优点是它从响应中检测内容类型(即 XML、JSON)。如需更多信息,请查看他们的文档。你可以将这些收集到的数据用于其他目的,或者像在 openstreetmap-heatmap 项目中一样,用 Blender 将其可视化。这就把我们带回了标题图片,正如你可能已经猜到的,它显示了德国比尔加藤的分布。
Image from openstreetmap-heatmap
结论
从获取特定区域内的建筑的需求开始,我发现在 OSM 有多少不同的东西可以发现,我迷失在地理空间兔子洞。看到 OSM 还有多少有趣的数据有待探索是令人兴奋的,甚至包括在 OSM 找到建筑物的 3D 数据的可能性。由于 OSM 是基于贡献的,你也可以探索 OSM 是如何随着时间的推移而增长的,以及有多少用户加入了本文中的文章,该文章使用 pyosmium 检索某些地区的 OSM 用户统计数据。我希望我启发了你,让你带着新装备的工具去 OSM 深处发现新奇和有趣的发现。
感谢阅读!如果你喜欢这篇文章,请继续展示你的爱,并关注我更多的文章。还有,在 LinkedIn 或者Twitter上随时联系我。
本文原载于janakiev.com。
用于异常检测的局部异常因子
关于局部异常因子的简短综述
局部异常值因子(LOF)是一个分数,表示某个数据点是异常值/异常值的可能性。
LOF ≈1 没有异常值
≫1 之外
首先,我引入一个参数 k ,它是 LOF 计算要考虑的邻居数量。LOF 是一种计算方法,通过查看某一点的相邻点来找出其密度,并在稍后将其与其他点的密度进行比较。使用正确的数字 k 并不简单。虽然小的 k 具有更局部的焦点,即仅查看附近的点,但是当数据中有很多噪声时,它更容易出错。然而,大的 k 可能会遗漏局部异常值。
The density of the red point to its nearest neighbors is not different from the density to the cloud in the upper right corner. However, it is probably an outlier compared to the nearest neighbors’ density.
k 距离
定义了这个 k 之后,我们可以引入 k-distance ,它是一个点到其邻居k的距离。如果 k 为 3,则 k 距离将是一个点到第三个最近点的距离。
The red point’s k-distance is illustrated by the red line if k=3.
可达性距离
k 距离现在用于计算可达性距离。这个距离度量就是两点之间的最大距离和第二点的 k 距离。
reach-dist(a,b) = max{k-distance(b),dist(a,b)}
基本上,如果点 a 在点 b 的 k 邻域内, reach-dist(a,b) 将是 b 的 k-distance 。否则就是 a 和 b 的真实距离这只是一个“平滑因子”。为简单起见,将这视为两点之间的通常距离。
局部可达性密度
reach-dist 然后用于计算另一个概念——局部可达性密度(lrd)。为了获得点 a 的 lrd,我们将首先计算 a 到其所有 k 最近邻居的可达性距离,并取该数字的平均值。lrd 就是平均值的倒数。请记住,我们讨论的是密度,因此,到下一个邻居的距离越长,相应点所在的区域就越稀疏。因此,密度越低——反之亦然。
lrd(a) = 1/(总和(reach-dist(a,n))/k)
凭直觉,局部可达性密度告诉我们从我们的点到下一个点或点群要走多远。它越低,密度越小,我们要走的路就越长。
The lrd of the upper right point is the average reachability distance to its nearest neighbors which are points (-1, -1), (-1.5, -1.5) and (-1, -2). These neighbors, however, have other lrds as their nearest neighbors don’t include the upper right point.
力线
然后将每个点的 lrd 与它们的 k 邻居的 lrd 进行比较。更具体地说,将计算并平均每个点与其相邻点的 lrd 的 k 比率。LOF 基本上是 a 的邻居的 lrd 与 a 的 lrd 的平均比值。如果该比率大于 1 ,则点 a 的密度平均小于其相邻点的密度,因此,从点 a 开始,我们必须比从 a 的相邻点到其下一个相邻点行进更长的距离才能到达下一个点或点群。请记住,点 a 的邻居可能不认为 a 是邻居,因为他们的可及范围内有更近的点。
总之,一个点的 LOF 表示该点相对于其相邻点的密度。如果一个点的密度远小于其相邻点(≫1 附近)的密度,则该点远离密集区域,因此是异常值。
参考
布鲁尼格、M. M .、克里格尔、H. P .、Ng、R. T .、桑德、J. (2000 年 5 月)。LOF:识别基于密度的局部异常值。在 ACM sigmod 记录(第 29 卷,№2,第 93–104 页)。ACM。
用于相似项目搜索的位置敏感散列
一种识别近似最近邻的有效方法。
Source: Unsplash
动机
每个人都知道 Shazam ,这款应用可以让你在几秒钟内识别出任何一首歌曲。它识别歌曲的速度不仅让我惊讶,也让我想知道他们是如何用一个巨大的歌曲数据库(大约 1000 万)做到这一点的。我意识到这可以通过使用音频指纹和敏感灰化来实现(我很确定 Shazam 使用了一些先进的技术)。本文试图解释实现一个程序来执行音乐搜索(通常是类似的项目搜索)的步骤和概念。
音频指纹识别是从固定持续时间的音频流中识别独特特征的过程。可以为所有现有的歌曲识别这种独特的特征,并将其存储在数据库中。当我们听到一首新歌时,我们可以从录制的音频中提取相似的特征,并与数据库进行比较,以识别这首歌。然而,在实践中,这种方法将面临两个挑战:
- 识别歌曲所需的独特特征/特征向量的高维度
- 将记录的音频特征与数据库中所有歌曲的特征进行比较在时间和存储器方面是昂贵的
第一个挑战可以使用 PCA 等降维技术来解决,第二个挑战可以使用聚类和最近邻搜索的组合来解决。位置敏感哈希(以下简称 LSH)可以通过以下方式解决这两个问题
- 将高维特征减少到更小的维度,同时保持可区分性
- 以高概率将相似的对象(在这种情况下是歌曲)分组到相同的桶中
LSH 的应用
在开始了解 LSH 之前,值得注意的应用领域包括
- 推荐系统
- 近似重复检测(文档、在线新闻文章等。)
- 分层聚类
- 全基因组关联研究
- 图像相似性识别(VisualRank)
- 音频相似性识别
- 数字视频指纹
优步利用 LSH 检测 平台滥用 (假账、支付欺诈等。).使用 LSH 可以构建一个 Shazam 风格的应用程序或 Youtube 大小的推荐系统。
什么是 LSH?
LSH 是一种基于哈希的算法,用于识别近似最近邻。在正常最近邻问题中,空间中有一堆点(我们称之为训练集)并且给定一个新点,目标是识别训练集中最接近给定点的点。这种过程的复杂性是线性的[对于那些熟悉 Big-O 符号的人来说,O(N),其中 N 是训练集的大小]。近似最近邻算法试图将这种复杂度降低到亚线性(小于线性,但是可以是任何值)。亚线性复杂度是通过减少查找相似项目所需的比较次数来实现的。
LSH 的工作原理是,如果特征空间中有两个彼此靠近的点,它们很可能具有相同的散列(数据的简化表示)。LSH 主要不同于传统的散列法(又名加密),因为加密散列法试图避免冲突,而 LSH 的目标是最大化相似点的冲突。在加密散列法中,对输入的微小扰动会显著改变散列,但是在 LSH 中,微小的失真会被忽略,从而可以容易地识别主要内容。哈希冲突使得相似的项目很有可能具有相同的哈希值。
位置敏感哈希(Locality Sensitive Hashing,LSH)是一种通用的哈希技术,顾名思义,它旨在保留数据的本地关系,同时显著降低数据集的维度。
既然我们已经建立了 LSH 是一个哈希函数,其目的是最大化相似项目的冲突,让我们正式定义:
如果对于高维特征空间中给定的两个点 a,b,1,则散列函数 h 是局部敏感的。如果 a 和 b 接近 2,Pr(h(a) == h(b))为高。如果 a 和 b 相差 3,Pr(h(a) == h(b))为低。识别接近物体的时间复杂度是亚线性的。
LSH 的实施
了解了什么是 LSH,是时候了解如何实现它了。实现 LSH 需要理解如何生成哈希值。构建 LSH 的一些流行方法有
- 最小独立排列
- Nilsimsa 哈希(专注于反垃圾邮件)
- TLSH (用于安全和数字取证应用)
- 随机投影又名 SimHash
在本文中,我将给出一个使用随机投影方法实现 LSH 的演练。好奇的读者可以从链接的 URL 中了解其他方法。
迂回随机投影法
随机投影是一种在低维特征空间中表示高维数据的技术(降维)。它因其在低维空间中近似保持关系(成对距离或余弦相似性)的能力而受到关注,同时计算成本较低。
随机投影背后的核心思想是,如果向量空间中的点具有足够高的维数,那么它们可以以近似保持点之间距离的方式被投影到合适的低维空间中。
以上陈述是对 约翰逊-林登施特劳斯引理 的解释。
考虑一个用矩阵 D 表示的高维数据,有n个观察值(矩阵的列)和d个特征(矩阵的行)。可以用随机投影矩阵 R 将其投影到 k 维的低维空间,其中k<<d。从数学上讲,较低维度的表示 P 可由下式获得
随机投影矩阵 R 的列被称为随机向量,这些随机向量的元素独立于高斯分布(零均值,单位方差)提取。
使用随机投影方法的 LSH
在这个 LSH 实现中,我们构建了一个所有可能箱的表,其中每个箱由相似的项目组成。每个 bin 将由一个按位哈希值表示,该哈希值是由一系列 1 和 0 组成的数字(例如:110110,111001)。在这种表示中,具有相同按位哈希值的两个观察值比具有不同哈希值的观察值更可能相似。生成按位哈希表的基本算法是
Dot product of random vector and observation 1 > 0, which gives a bit value of 1. Similarly, dot product of random vector and observation 2 < 0 and the resulting bit value will be 0.
- 创建长度为
d的k个随机向量,其中k是按位散列值的大小,d是特征向量的维数。 - 对于每个随机向量,计算随机向量和观察值的点积。如果点积的结果为正,则将位值指定为 1,否则为 0
- 连接为
k点积计算的所有位值 - 对所有观察重复上述两个步骤,以计算所有观察的哈希值
- 将具有相同哈希值的观察值分组在一起以创建 LSH 表
下面是构建这种哈希表的代码片段:
考虑以下示例,其中我们的目标是通过为三个 5 维输入向量创建 2 位哈希值来找到相似的向量。
随机投影向量可以从高斯分布(零均值和单位方差)生成。
使用投影矩阵进行点积,并计算三个向量的哈希值,如下图所示。
我们可以从上面的例子中推断出,与 vec1 和 vec3 或者 vec2 和 vec3 相比,vec1 和 vec2 更有可能是相似的(相同的哈希值)。我们可以观察到,与其他两种组合相比,vec1 和 vec2 的余弦相似性最大,这证实了随机投影方法的输出。
这种想法背后的直觉是,如果两个点完全对齐,即,从原点具有完美的相关性,则它们将在相同的散列容器中。类似地,相隔 180 度的两个点将在不同的仓中,而相隔 90 度的两个点有 50%的概率在相同的仓中。
此外,由于随机性,不可能将所有相似的项目正确分组。为了克服这个限制,通常的做法是创建多个散列表,并且如果它们在至少一个表中的同一个 bin 中,则认为观察值a类似于b。还值得注意的是,多个表更好地概括了高维空间,并分摊了不良随机向量的贡献。
在实践中,哈希表的数量和哈希值(k)的大小被调整以调整召回率和精确度之间的折衷。
下面是构建多个哈希表的代码片段:
回到音乐识别
回到音乐识别的问题,一般的算法是:
- 为数据库中的所有歌曲构建特征向量
- 使用上面定义的类构造 LSH 哈希表,并适当选择表的数量和哈希大小。
- 对于新录制的音频,构建特征向量并查询 LSH 表
- 将录制音频的特征向量与步骤 3 中返回的匹配进行比较。根据特征向量的元素,用于比较的度量可以是 L2 距离、余弦相似性或雅克卡相似性。
- 返回具有最低/最高指标值(取决于所选指标)的结果作为匹配项
在步骤 4 中,对数据子集(比整个数据库小得多)执行相似歌曲标识的比较。这是快速计算的主要原因。此外,没有一个哈希表存储高维特征向量,节省了大量内存。最后,可以修改步骤 5,使其成为一个推荐系统。
这种音乐搜索算法的实现可以在这里找到。
结论
我希望您已经了解了什么是 LSH,以及它是如何实现内存效率和计算量的。
你能抽出时间来读这篇文章真是太棒了!如果你觉得这有帮助,请考虑分享。
关于我
我最近从旧金山大学的数据科学硕士项目毕业,正在寻找机器学习方面的职业机会。你可以访问我的 网站 或者 LinkedIn 了解更多关于我的背景和我做过的项目。
附加参考流程
逻辑理论—基本符号
第二部分——简要介绍连接词、蕴涵和量词
逻辑理论的起源始于一个论证的概念。大多数逻辑教科书都包含一个开放的、核心的论点定义,听起来很像下面这样:
一个论点包含一个或多个特殊的陈述,称为 前提 ,作为一个理由来相信一个进一步的陈述,称为结论,是真实的
前提是逻辑理论的原子:一切都是由它们构成的。前提是一个声明性的陈述,即必须严格地评估为真或假。单个前提被称为原始前提 — 美国有 50 个州(这是正确的)。将多个前提连接在一起形成一个复合前提 — 美国有 50 个州**迈阿密今天下雪了*(这是假的)。如何连接多个语句?就像你在前面的例子中看到的,使用你已经熟悉的操作符,但是需要它们自己的语言语法。*
连接词
类似于数学的其他分支,前提有它们自己的一套基本运算符(加、减等)。在逻辑理论中,五个基本逻辑连接词,统称为 连接词 ,填补了这个角色。它们总结在下表中,假设字母 P & Q 代表两个原始前提:
如果您接触过任何级别的编程,那么很有可能对上表有所了解。这是因为连接词是普通语言语法的核心&几乎总是为每个连接词指定一些特殊字符(&& = and,| = or,等等……)。
五个连接词中的哪一个用作两个前提之间的逻辑连接符,根据被修改的前提的真值来确定复合陈述的总真值。这里有一个重要的原则,乍一看似乎有悖常理,但值得一提:当分析复合语句时,没有必要知道 P & Q 实际上说了什么,只需要知道这些部分是真还是假。
含义
在这五个连接词中,有一个立即值得进一步研究——蕴涵,也就是 if-then 语句。蕴涵是 P → Q 的标准形式的连接词,其中 P 被称为假设(或前因),Q 被称为结论(或后果)。
虽然隐含具有上面定义的标准形式,但是还有其他三种常见的条件类型值得回顾。以下四个条件句简单却很常见&通过将条件句与所介绍的核心连接词结合起来,形成了强大的复合陈述:
条件本身是一个复合前提,也就是说,它严格地评估为真或假。对于任何蕴涵,就像任何其他连接词一样,复合前提的真值由其两个独立前提的真值决定。与上面介绍的定义相对应,例如,当假设为假时,蕴涵为真*,当结论为真时,蕴涵为或;这就只剩下一种方式让一个蕴涵为假:当假设为真时,结论为假。*
如果这看起来像是要在精神上跟踪很多东西,就像我一样,那么请放松&请放心,在不久的将来,强大的工具会让分析复杂的条件像遵循蓝图一样简单。我们将使用的主要工具是一个漂亮的逻辑 101 工具,名为 真值表 。然而,在我们进入真值表之前,让我们快速绕道,填补我们基本逻辑理论符号知识的最后一个缺口。检查一个特殊的场景——以下陈述是前提吗?
x 大于十
量词
根据我们在开篇段落中引入的严格定义,前提必须评估为真或假——语句不能是不明确的或开放式的。这意味着变量,就像我们从代数开始就习惯看到的那样,在逻辑理论中是一个禁忌;至少没有一些修改。
上面加粗的语句是而不是被认为是一个前提,因为 x 可能是 5 或 25,使得语句为真或为假,但目前都不是。然而,这并不意味着我们必须从我们的工具集中删除变量。这里的是利用变量的一种方式;这个过程叫做 量化 ,这是一种在逻辑中标注未知变量界限的巧妙方法。看看下面的更新语句,这是前提吗?
为所有 x,x 大于一百
现在我们已经定义了变量的宇宙*、 o r 域,这个陈述不再含糊不清——它现在是一个前提,因为它评估为绝对*假。这种“for all x”的用法在逻辑理论中被称为应用一个 量词。 量词主要有两种。第一个,我们刚刚看到的,被恰当地命名为 全称量词。 由一个倒过来的“a”所口述,∀很容易记住它代表一个 ll 或宇宙内每一个可能的实例所作的陈述。检查第二处改动:
存在一个大于一百的 x
再一次,在不移除变量的情况下,我们找到了一种方法,通过应用一个量词,将一个陈述转换成一个前提,因为这个陈述现在严格地评估为真*。这第二类量词被称为 存在量词 。由一个反过来的“e”表示,∃,它通常读作“存在”或“有”这两个量词总结如下:*
在真值表上
现在,基本符号已经过时了,是时候通过真值表跳到基本的应用形式了。在下一部分,我们将首先从定义逻辑中的等价开始;为了使用真值表来分析我们介绍的四个条件中的哪一个(如果有的话)是彼此相等的。在检查了几个示例语句后,我们将最终进入逻辑理论的核心:证明。
来源
数据的逻辑单元
我在试图用现有数据库进行数据分析或机器学习的客户身上看到的一个谬误是,单个数据库中的单个文档代表了发送到数据分析或机器学习软件的唯一逻辑数据单元。换句话说,对于每个文档,CSV 中应该有一行,或者 JSON 中应该有一个数据结构。
这假设目标软件将把关系放在一起,或者分割聚集的数据,但是这两者都不容易或者特别有用。相反,当我们从现有数据库创建数据集时,我们应该深入研究对任务有意义的逻辑单元。
在某些情况下,单个文档代表多组数据。一个简单的例子可能是发票,其中每个行项目可能代表一组单独的数据。如果有三个行项目,数据集中应该有三行。发票中的公共数据(如日期和发票号)将被复制到每一行中。
在其他情况下,一组文档一起代表一组数据。我们不应该期望目标软件将来自两个数据库的数据放在一起,也不应该期望数据分析师找到一种方法来聚合它们,而是应该将各个部分放在一行中。一个例子可能是产品数据库和定价数据库,其中产品和价格应该放在一起。虽然在系统中将它们分开可能有很好的理由,但是如果将它们分开,数据分析可能会复杂得多。
当然,这引出了更复杂关系的概念。我们谈到的发票可能只有一个项目编号,因此我们希望从产品和定价数据库中提取产品和标准价格,以便与发票的每一行相匹配。数据分析师可以使用它来确定平均折扣百分比,甚至该百分比在一段时间内或旺季的趋势。
虽然这些都是数据分析的好例子,但同样的概念也适用于机器学习。通常,机器学习系统会使用自然语言处理。数据集通常更像一个故事,而不是一行。但是,当我们整理叙述时,我们可能希望从我们的产品数据库中提取数据,从反馈数据库中提取关于产品的评论,以及在讨论数据库中提及产品的讨论。
太多时候,机器学习被视为倾倒大量数据,并期待机器“弄清楚”。但是这既不现实也没有效率。机器学习是人类创造力和软件处理能力之间的一种合作形式。正如我在我之前的文章中提到的,我们必须是老师,只有当我们给人工智能系统提供高质量的信息时,我们才能从它们那里获得高质量的洞察力。
在创建下一个数据集之前,考虑一下数据是否已经处于适合特定种类分析所需的逻辑单元中。如果不是,那就把信息分解或汇总起来,这样可以节省时间和金钱,并获得更好的结果。这项任务越往后推进,难度越大,效果越差。
如果你喜欢这篇文章,请在下面给它一些爱,或者分享给别人。
顺便说一下,如果您的公司部分或全部使用 Notes/Domino 数据库,Genii 软件可以帮助您快速轻松地创建这样的拆分或组合数据集。观看我们的视频五个问题——Midas LSX 的数据挖掘,观看简短演示。
登录光泽&梦想仪表板
我真的相信仪表盘是你在任何应用上看到的最重要的页面,不管应用的性质如何。当然,也有我们不同意的例子,比如“给我<专题>页面,这就是我所需要的,不要浪费我的时间!”对此,我认为这些特定的应用程序和服务没有以一种为用户提供价值的方式利用仪表板页面。
多年来,dashboard(登录后通常看到的第一个页面)旨在通过将链接放在一个漂亮的页面上来帮助您导航应用程序,以便轻松快速地找到您的路。其他服务,如亚马逊,利用第一个登录屏幕,通过提出建议和提醒你重新订购经常购买的商品,让你购买更多产品。像 Tumblr 和 Pinterest 这样的应用程序设计了他们的登录屏幕来展示最近的内容以吸引用户。
因此,为了各公司的目标,我将把重点放在追踪信息对用户有用的应用上。我知道公司需要设计他们的页面,以最好地服务于他们的高层次目标,例如增加日常活跃用户活动,但对于大部分应用程序来说,设计一个仪表板页面的意图是通知用户是非常宝贵的。
一个有用的仪表板设计的主要例子是以收入为中心的性能指标。例如,当你登录 Square 时,你会看到一个关于你最近业绩的简单概述,显示总销售额、过期发票、客户频率等等。这个页面不仅通知你,还提醒,警告,确认。提醒你客户未付的发票。看到低销售额可能会被认为是对你的警告,事情可能会变得更好(也许你的网站关闭了,你不知道)。该页面通过合计销售额的增长来确认您最近的努力是成功的。
另一个确凿的例子是 Fitbit 。无论您登录电脑还是打开移动设备上的应用程序,都会显示您最近的活动总数,包括步数、睡眠、饮食等。再一次,这种仪表板设计告知用户他们的成功和失败。
但是,如果我们进一步发展这个仪表板模型,并以一种我们可以为用户提供更多帮助的方式来设计它,会怎么样呢?最近,以健康为导向的科技公司已经在他们的应用程序中加入了可爱的小建议。例如, Fitbit 和 Jawbone 会提出建议,帮助你获得更好的睡眠。但是想象一下,如果我们更进一步,使用用户的数据做出假设,而不仅仅是提出宽泛的建议,会怎么样?
将人工智能,更具体地说是机器学习,集成到软件中的可能性几乎是无限的,但前提是我们开始考虑未探索领域的场景。有了机器学习,我们可以设计能够真正自我设计的仪表板,只向用户显示最相关和最重要的(隐藏的)信息。
同意还是不同意?欢迎在下面评论或在推特上给我发消息。感谢阅读:)
逻辑回归
“方程中的美比让它们适合实验更重要……”—保罗·狄拉克
这也就是所谓的分类*。这在很多情况下会用到,我们希望将输入分类到预定义的类中。为了前任。将电子邮件标记为垃圾邮件/非垃圾邮件,根据商业门户的数据预测客户的年龄组等。 在 线性回归 中,输出域是一个连续的值域,即它是一个无限集合,而在逻辑回归中,我们要预测的输出*只需要很少的离散值。即它是有限集。为简单起见,让我们考虑一个二元分类,其中 y 只能取两个值,1(正)和 0(负)。就像线性回归一样,我们需要从一个假设开始。由于输出域是有界的(0,1 ),因此产生超出此范围的值的假设没有意义。**
****
plot of f(x) for x belongs to (-10, 10)
给定上述一组逻辑回归模型(为什么设置?因为θ是可变的)我们需要找到最佳拟合模型的系数θ,其最好地解释了训练集。为此,我们需要从一组由θ参数化的概率假设开始,然后通过最大似然找到θ。 让我们从伯努利分布开始,它是一个随机变量的概率分布,取值为 1 的概率为 p,取值为 0 的概率为 q= 1-p。
****
在 线性回归中我们 通过将对数似然的导数等于零来求系数。我们像以前一样评估了可能性的导数,但是得到的 Ex(3)不是我们可以解决的数学上封闭的方程。(记住 x 和 theta 都是 eq 中的向量,h 是非线性函数) 我们仍然可以通过使用称为 梯度上升的强力算法来找到系数。 我们从某个系数开始,然后不断迭代更新θ,直到似然函数收敛。
例子 让我们以维基百科例子 假设我们希望回答以下问题:
一个由 20 名学生组成的小组花 0 到 6 个小时准备考试。学习时间的长短如何影响学生通过考试的概率?
****
Plot of derived model for the range (0,6)
逻辑回归:使用 Python 的简化方法
逻辑回归的目的是什么?
在逻辑回归中,我们希望用一个或多个自变量(X)来模拟因变量(Y)。是分类的方法。该算法用于分类的因变量。使用一个函数对 y 进行建模,该函数为 x 的所有值提供介于 0 和 1 之间的输出。在逻辑回归中,使用了 Sigmoid (也称为逻辑)函数。
The Sigmoid Function
使用混淆矩阵的模型评估
在我们对一些训练数据训练了逻辑回归模型之后,我们将评估模型对一些测试数据的性能。为此,我们使用混淆矩阵。混淆矩阵是一个表格,通常用于描述分类模型对一组真实值已知的测试数据的性能。下面给出了一个混淆矩阵。
在这里,TP 代表真正值,这是我们预测为是,而实际值为真的情况。TN 代表 True Negative,这是我们预测为 no 而实际值为 false 的情况。FP 代表假阳性,即我们预测为是而实际值为假的情况。FN 代表假阴性,即我们预测为否而实际值为真的情况。
我们从混淆矩阵中推断出什么?
混淆矩阵帮助我们确定模型预测正确的频率,或者换句话说,模型的准确性。根据上表,它由下式给出:
(TP + TN ) /总计= 100 + 50 / 165 = 0.91
这意味着该模型 91%是正确的。混淆矩阵也用于测量误差率,误差率由下式给出:
(FP + FN ) /总计= 15 /165 = 0.09
模型有 9%的误差。
在本文中,我们将处理 python 中建模逻辑回归的非常简单的步骤。
带详细解释的 Python 代码
我们将观察数据、分析数据、可视化数据、清理数据、构建逻辑回归模型、拆分成训练和测试数据、进行预测并最终对其进行评估。这些都会一步一步来。我们将要处理的数据是在 kaggle.com可用的‘泰坦尼克号数据集’。这是一个非常著名的数据集,通常是学生学习基于分类的机器学习的第一步。我们试图预测分类:生存或死亡
首先,我们将导入 numpy 和 pandas 库:
import numpy as np
import pandas as pd
让我们进行可视化导入:
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
我们将继续把泰坦尼克号的数据集导入熊猫的数据框架。之后,我们将检查数据帧的头部,以便清楚地了解数据帧中的所有列。
train=pd.read_csv('titanic_train.csv')
train.head()
我们遇到的大多数数据都有缺失数据。我们将检查丢失的数据,也将它们可视化以获得更好的想法并删除它们。
train.isnull()
在这里,我们找到了布尔值。True 表示值为 null,False 表示值为 False,反之亦然。由于有大量的数据,我们使用 seaborn 库来可视化空值。那样的话,我们的任务就容易多了。
sns.heatmap(train.isnull())
年龄和客舱列具有空值。我在之前的博客中已经处理过 NA 值的处理问题。请看看它。
摆弄数据并充分利用可视化库来享受数据带来的乐趣总是一个好习惯。
sns.countplot(x='Survived',data=train)
这是一个计数图,显示了幸存的人数,这是我们的目标变量。此外,我们可以根据性别和乘客等级绘制计数图。
sns.countplot(x='Survived',hue='Sex',data=train)
在这里,我们看到一种趋势,即女性比男性存活的更多。
sns.countplot(x='Survived',hue='Pclass',data=train)
从上面的情节可以推断,属于 3 班的乘客死的最多。
我们可以用更多的方式来可视化数据。然而,我不在这里讨论它们,因为我们需要到达模型构建的步骤。
数据清理
我们希望填充缺失的年龄数据,而不是仅仅删除缺失的年龄数据行。一种方法是填写所有乘客的平均年龄(插补)。然而,我们可以更聪明地处理这个问题,按乘客级别检查平均年龄。例如:
plt.figure(figsize=(12, 7))
sns.boxplot(x='Pclass',y='Age',data=train,palette='winter')
我们可以看到,在较高的阶层中,较富裕的乘客往往年龄较大,这是有道理的。我们将根据年龄的 Pclass 使用这些平均年龄值进行估算。
def impute_age(cols):
Age = cols[0]
Pclass = cols[1]
if pd.isnull(Age):if Pclass == 1:
return 37elif Pclass == 2:
return 29else:
return 24else:
return Age
现在应用那个函数!
train['Age'] = train[['Age','Pclass']].apply(impute_age,axis=1)
现在让我们再检查一下热图。
sns.heatmap(train.isnull(),yticklabels=False,cbar=False)
太好了!让我们继续下去,并放弃机舱柱。
train.drop('Cabin',axis=1,inplace=True)
转换分类特征
我们需要使用 pandas 将分类特征转换为虚拟变量!否则,我们的机器学习算法将无法直接将这些特征作为输入。
train.info()
sex = pd.get_dummies(train['Sex'],drop_first=True)
embark = pd.get_dummies(train['Embarked'],drop_first=True)
在这里,我们正在模拟性别和登上专栏。在虚拟化之后,我们将删除剩余的不需要的列。
train.drop(['Sex','Embarked','Name','Ticket'],axis=1,inplace=True)
我们将把新的 sex 和 apolloed 列连接到 dataframe。
train = pd.concat([train,sex,embark],axis=1)
现在,数据帧看起来像这样:
测试列车分离
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(train.drop('Survived',axis=1),
train['Survived'], test_size=0.30,
random_state=101)
训练和预测
from sklearn.linear_model import LogisticRegression
logmodel = LogisticRegression()
logmodel.fit(X_train,y_train)
predictions = logmodel.predict(X_test)
估价
我们可以使用分类报告来检查精确度、召回率、f1 分数
from sklearn.metrics import classification_report
print(classification_report(y_test,predictions))
The Classification Report
关于逻辑回归的所有内容都在一篇文章中
每个伟大的领袖背后都有一个更伟大的后勤专家。
与其他算法不同,逻辑回归很容易被年轻的开发人员误导。可能是因为人们还认为它是一个回归机器学习算法。
逻辑回归是一种统计机器学习算法,它通过考虑极端情况下的结果变量来对数据进行分类,并尝试制作一条对数线来区分它们。
像我五岁一样解释
逻辑回归是线性回归的兄弟,但与其名称不同,逻辑回归是一种分类算法。
让我们复习一下第一个线性回归:
公式:
在哪里,
- y =必须预测的值
- m =直线的斜率
- x =输入数据
- c = y 截距
有了这些值,我们可以预测 y 值,例如。
- 这里的蓝点是 x 值(输入数据)。
- 现在使用输入数据,我们可以计算斜率和 y 坐标,这样我们的预测线(红线)应该覆盖大部分的点。
- 现在使用这条线,我们可以预测给定 x 值的 y 的任何值。
现在,线性回归需要注意的一点是,它适用于连续数据,但如果我们的分类算法需要线性回归,我们需要进一步调整我们的算法。
首先,我们需要定义一个阈值,如果我们的预测值低于阈值,那么它属于第 1 类,否则属于第 2 类。
现在,如果你在想“哦,这很简单,我们必须用阈值和 vola 来定义线性回归,它变成了分类算法,这里面有一个技巧。我们必须自己定义阈值,对于大型数据集,我们将无法计算阈值。此外,一旦定义了阈值,即使我们的预测值发生变化,阈值也是相同的。
更多参考请点击这里。
另一方面,逻辑回归产生逻辑曲线,该曲线的值限于 0 和 1 之间。
逻辑回归类似于线性回归,但曲线是使用目标变量“几率”的自然对数而不是概率构建的。此外,预测值不必呈正态分布或在每组中具有相等的方差。
如果你还是不明白,那么我推荐你看下面的视频,它用简单的方式解释了逻辑回归。
公式
为了解释逻辑回归,我需要一些物理媒介来表达我在这个数字媒介中的知识。
所以我在笔记本上写了逻辑回归公式,然后拍了照片贴在这里。
如果你想要 pdf 版本,点击这里。
page 1 of 7
page 2 of 7
page 3 of 7
page 4 of 7
page 5 of 7
page 6 of 7
page 7 of 7
用 python 实现
- 用 python 从头开始实现逻辑回归算法**,并在每个步骤中进行解释,上传到我的 Github 库。**
- 在 Scikit learn 的帮助下实现逻辑回归也被添加到我的 Github 存储库中。****
简单而详细的解释逻辑回归用于机器学习问题。…
github.com](github.com/2796gaurav/…)**
优势
- 最简单的机器学习算法之一,但效率极高。
- 方差很低。
- 它也可以用于特征提取
- 使用随机梯度下降,逻辑模型可以很容易地用新数据更新。
不足之处
- 不能很好地处理大量的分类变量。
- 它需要非线性特征的变换。
- 它们不够灵活,无法自然地捕捉更复杂的关系。
应用程序
- 图像分割和分类
- 地理图像处理
- 手写识别
- 垃圾邮件检测
何时使用
- 当我们需要调整比值比时,我们知道一个以上的风险因素。
- 当卡方检验不显著时。
此外,我将添加其他机器学习算法。这篇文章的主旨是深入了解逻辑回归,不使用任何硬词,从头开始解释。此外,如果您想实现逻辑回归,从这些数据集开始,您可以在注释部分用代码注释您的预测得分。
如果你想学习更多的机器学习算法,请跟随我,因为我将添加我所知道的所有机器学习算法。
先前我已经以一种非常基本的信息方式添加了朴素贝叶斯解释。
一个简单而深入的学习经验,在例子的帮助下从零开始学习一个机器学习算法。
towardsdatascience.com](/all-about-naive-bayes-8e13cef044cf)
在那之前,
快乐编码:)
别忘了拍手拍手拍手…
**