人工智能安全中的具体问题
在过去的一年里,对人工智能的新一轮担忧在全球范围内兴起。其中一些很有根据,需要实际的解决方案,而另一些则更接近科幻小说。超级智能机器不会接管世界,至少在未来几十年不会。然而,不那么智能的计算机可以取代人类的劳动,犯错误和被用来伤害。所以让我们来看看主要的人工智能问题。
首先,要教会一台机器一些技能,你需要训练数据。如果没有仔细的选择,数据集可能会偏向某些类,错过重要的功能,甚至包含错误。在某些情况下,这可能会导致你的自拍在社交网络中被错误标记,这不是一个大问题。但是,这也可能导致对癌症组织的错误诊断,并可能导致死亡。
同时,即使是经过精心训练的系统也可能被对抗性的例子所欺骗:
Hint: this is not really a guacamole
你不能在你的生物组织上使用这种技术来欺骗医学人工智能,但有人可以用它来误导自动驾驶汽车,并造成真正的威胁。另一个问题是教机器“光荣失败”。
自检
我们需要他们能够识别不确定性高的情况并直接报告,而不是试图做一些不太明智的事情。这对于强化学习代理尤其重要。几乎所有的人都有一些探索模式,当他们尝试新的行动,以找到更好的方式获得回报。如果不为安全探索进行调整,它可能会导致机器人发生各种事故。
奖励函数的糟糕设计可能会以一种意想不到的形式适得其反。一类问题叫做悬赏黑客。当代理人发现一种扰乱环境以获得更多回报的方法时,它们就出现了。例如,清洁机器人可以故意污染周围的一切,以获得更多的积分,以便稍后进行清洁。或者,代理可以决定停止做任何事情来避免惩罚。这类问题可以通过从人类的偏好和打断中训练 AI 来部分解决。
有些问题并不在于系统本身,而是由使用这些系统的人造成的。对许多人来说,失业是一个现实的问题。另外, AI 在军工越来越受关注。
尽管如此,总有一天人工智能会变得比我们聪明得多。也许 30 年后,也许 100 年后。我们应该如何应对?正如吴恩达所说,“担心超级人工智能接管世界就像担心火星上人口过剩一样”。无论如何,没有人真正知道它会在何时何地发展,而且它也不太可能分享我们所有的价值观。
附加论文:
最初发表于 认知混乱 。
PyTorch 中的条件随机场教程🔥
假设我有两个相同的骰子,但一个是公平的,另一个是以 80%的概率出现数字 6,而数字 1-5 以 4%的概率出现。如果我给你一组 15 次掷骰子,你能预测出每一次我用的是哪个骰子吗?
Credit Brett Jordan at Unsplash
一个简单的模型是,每当 6 出现时,预测我使用了有偏见的骰子,并说我对所有其他数字使用了公平的骰子。事实上,如果我同样可能使用任一骰子来掷骰子,那么这个简单的规则就是你能做的最好的了。
但是如果在使用公平骰子后,我有 90%的机会在下一次掷骰子时使用有偏见的骰子呢?如果下一次掷骰子是 3,你的模型将预测我使用公平骰子,而偏向骰子是更可能的选择。我们可以用贝叶斯定理来验证这一点:
y_i is the random variable of the dice type for roll i. x_i is the value of the dice for roll i.
要点是,在每个时间点做出最有可能的选择,只有当我同样有可能使用任一骰子时,才是可行的策略。在更有可能的情况下,以前的骰子选择会影响我未来的选择,为了成功,你必须考虑到掷骰子的相互依赖性。
条件随机场* (CRF)是一个标准模型,用于预测与输入序列相对应的最可能的标签序列。有很多关于 CRF 的教程,但我看到的属于两个阵营之一:1)所有的理论都没有显示如何实现;2)一个复杂的机器学习问题的代码,很少解释发生了什么。
我不责怪那些作者选择理论或代码。CRF 是一个更广泛、更深入的主题,称为概率图形模型,因此深入讨论理论和实现需要一本书,而不是一篇博客文章,但这使得学习 CRF 比它需要的更难。
本教程的目标是涵盖足够多的理论,以便您可以带着预期的想法深入第 1 类资源,并展示如何在您自己的笔记本电脑上复制的简单问题上实现 CRF。这将有望使你具备将这个简单的玩具 CRF 应用于更复杂问题所需的直觉。
理论
我们的理论讨论将分为三个部分:1)指定模型参数,2)如何估计这些参数,3)使用这些参数进行预测。这三大类适用于任何统计模型,甚至是简单的逻辑回归,所以从这个意义上说,通用报告格式并没有什么特别的。但这并不意味着 CRF 就像逻辑回归模型一样简单。我们将会看到,一旦我们解决了这样一个事实,事情将会变得更加复杂,那就是我们正在做出一系列的预测,而不是一个单一的预测。
指定模型参数
在这个简单的问题中,我们需要担心的唯一参数是在连续掷骰子中从一个骰子转移到下一个骰子的相关成本。我们需要担心六个数字,我们将它们存储在一个名为转换矩阵的 2×3 矩阵中:
第一列对应于从前一次掷骰中的公平骰子到当前掷骰中的公平骰子(第 1 行中的值)和偏置骰子(第 2 行中的值)的转变。因此,第一列中的第一个条目编码了预测我在下一次掷骰子时使用公平骰子的成本,假设我在当前掷骰子时使用了公平骰子。如果数据显示我不太可能在连续的掷骰子中使用公平的骰子,那么模型就会知道这个成本应该很高,反之亦然。同样的逻辑适用于第二列。
矩阵的第二列和第三列假设我们知道在前一次掷骰子中使用了哪个骰子。因此,我们必须将第一卷视为特例。我们将在第三列中存储相应的成本。
参数估计
假设我给你一组骰子 X 和它们对应的骰子标号 Y 。我们将找到转移矩阵 T ,其最小化训练数据上的负对数可能性。我将向您展示单个掷骰子序列的可能性和负对数可能性。为了得到整个数据集的数据,你需要对所有的序列进行平均。
P(x_i | y_i)是在给定当前骰子标签的情况下观察到给定骰子滚动的概率。举个例子,如果 y_i = dice 是公平的,P(x_i | y_i) = 1/6。另一项 T(y_i | y_{i-1})是从以前的骰子标签转换到当前标签的成本。我们可以从转移矩阵中读出这个成本。
注意在分母中,我们是如何计算所有可能的标签序列 y '的和的。在两类分类问题的传统逻辑回归中,我们在分母中有两项。但是现在我们处理序列,对于长度为 15 的序列,总共有 2 个⁵可能的标签序列,所以分母中的项数是巨大的。CRF 的“秘方”在于,它利用了当前骰子标签如何仅依赖于前一个标签来高效地计算那笔巨款。
这个秘制酱算法叫做正反向算法 *。深入讨论这个问题超出了这篇博文的范围,但是我会在下面给你提供一些有用的资源。
序列预测
一旦我们估计了我们的转移矩阵,我们就可以用它来为给定的掷骰子序列找到最可能的骰子标签序列。最简单的方法是计算所有可能序列的可能性,但即使是中等长度的序列,这也是很难做到的。就像我们对参数估计所做的那样,我们将不得不使用一种特殊的算法来有效地找到最可能的序列。该算法与前向-后向算法密切相关,被称为维特比算法。
密码
PyTorch 是 Python 中的深度学习库,为训练深度学习模型而构建。虽然我们没有进行深度学习,但 PyTorch 的自动微分库将帮助我们通过梯度下降来训练我们的 CRF 模型,而无需我们手动计算任何梯度。这将节省我们许多工作。使用 PyTorch 将迫使我们实现前向-后向算法的前向部分和 Viterbi 算法,这比使用专门的 CRF python 包更有指导意义。
让我们从设想结果应该是什么样子开始。我们需要一种方法,在给定骰子标签的情况下,计算任意掷骰子序列的对数似然。这是一种可能的方式:
这个方法主要做三件事:1)将骰子上的值映射到一个似然,2)计算对数似然项的分子,3)计算对数似然项的分母。
让我们首先处理 _data_to_likelihood 方法,它将帮助我们完成第一步。我们要做的是创建一个 6 x 2 维的矩阵,其中第一列是公平骰子掷出 1–6 的可能性,第二列是有偏骰子掷出 1–6 的可能性。对于我们的问题,这个矩阵是这样的:
array([[-1.79175947, -3.21887582],
[-1.79175947, -3.21887582],
[-1.79175947, -3.21887582],
[-1.79175947, -3.21887582],
[-1.79175947, -3.21887582],
[-1.79175947, -0.22314355]])
现在,如果我们看到一卷 4,我们可以只选择矩阵的第四行。向量第一项是公平骰子为 4 的可能性(log(1/6)),第二项是有偏差骰子为 4 的可能性(log(0.04))。代码如下所示:
接下来,我们将编写计算对数似然的分子和分母的方法。
就是这样!我们有了开始学习转换矩阵所需的所有代码。但是,如果我们想在训练模型后进行预测,我们必须编写维特比算法:
我们的实现还有更多的东西,但我只包括了我们在理论部分讨论过的大函数。
正在对数据进行评估
我使用以下概率模拟了一些数据,并对模型进行了评估:
- p(顺序中的第一个骰子是公平的)= 0.5
- p(当前骰子是公平的|先前骰子是公平的)= 0.8
- p(当前骰子有偏差|先前骰子有偏差)= 0.35
查看我制作的笔记本,看看我是如何生成模型和训练 CRF 的。
我们要做的第一件事是,看看估计的转移矩阵是什么样的。该模型了解到,如果我在前一次掷骰子时使用公平骰子,我更有可能在当前掷骰子时掷出公平骰子(-1.38 < -0.87). The model also learned that I am more likely to use the fair dice after using the biased dice, but not by a lot (-0.59 < -0.41). The model assigns equal cost to both dice in the first roll (-0.51 ~ -0.54).
array([[-0.86563134, -0.40748784, -0.54984874],
[-1.3820231 , -0.59524935, -0.516026 ]], dtype=float32)
Next, we’ll see what the predictions looks like for a particular sequence of rolls:
# observed dice rolls
array([2, 3, 4, 5, 5, 5, 1, 5, 3, 2, 5, 5, 5, 3, 5])# corresponding labels. 0 means fair
array([0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1])# predictions
array([0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0])
The model recognizes long sequences of 6’s (these are the 5’s since we’re starting from 0) as coming from the biased dice, which makes sense. Notice that the model doesn’t assign every 6 to the biased dice, though (eighth roll). This is because prior to that 6, we’re pretty confident we’re at the fair dice (we rolled a 2) and transitioning to the biased dice from the fair dice is less likely. I’m ok with that mistake — I’d say our model is successful!
结论
我已经向您展示了 CRF 背后的一点理论,以及如何实现一个简单的问题。当然还有很多比我在这里能够涵盖的更多,所以我鼓励你查看我在下面链接的资源。
延伸阅读:
条件随机场介绍:条件随机场概述,隐马尔可夫模型,以及前后向和维特比算法的推导。
在 PyTorch 中使用 CRF 进行命名实体识别:这篇文章的灵感来源。展示了如何将 CRF 应用于 NLP 中更复杂的应用程序。
脚注
*准确地说,我们讨论的是线性链 CRF,它是 CRF 的一个特例,其中输入和输出序列以线性序列排列。就像我之前说的,这个话题很有深度。
*由于我们使用 PyTorch 为我们计算梯度,技术上我们只需要向前-向后算法的向前部分。
用大 SQL 配置 Zeppelin
由于 大 SQL 版本 5.0.1 出来了,我想在 Medium 上转贴我原来贴在LinkedIn上的这篇文章。它将带您完成使用 Big SQL 配置 Zeppelin 服务器的过程,并且可能对使用旧版本或希望自己完成这项工作的人有用。
—
HDP Hadoop 发行包 Zeppelin 服务器作为其堆栈的一部分。随着本周 HDP 2.6 的最新大 SQL 5.0 的发布,我想我会分享你如何快速配置 Zeppelin 与大 SQL 对话。
你需要在齐柏林飞船上增加一个新的 JDBC 翻译。导航到 UI 页面右上角的菜单,选择“解释器”,然后单击“创建”。将其命名为 bigsql ,选择 jdbc 作为解释器组。更新以下属性。
default.driver = com.ibm.db2.jcc.DB2Driver
default.user = <username>
default.password = <password>
default.url = jdbc:db2:*//<bigsql_head_host>:<bigsql_port>/bigsql*
例如:
如果使用 SSL,相应地编辑 JDBC url 以添加 SSL 参数,例如
sslConnection=true;sslTrustStoreLocation=/path/to/truststore.jks;Password=<password>
您还需要在 依赖项 下添加 jdbc 库 jar。将库路径指定为工件:
/usr/ibmpacks/bigsql/5.0.0.0/db2/java/db2jcc.jar
最后点击保存。
注意:确保运行 Zeppelin 服务器的节点上存在库路径。
您还可以通过 REST 更新 Zeppelin 解释器。参见https://zeppelin . Apache . org/docs/0 . 7 . 0/rest-API/rest-interpreter . html
回到你的笔记,点击解释器绑定(右上角的小齿轮)来绑定新的解释器。单击以绑定 bigsql 解释器,然后单击保存。像下面这样:
然后,您可以在笔记本中使用 %bigsql 与 Big SQL 进行交互:
仅此而已。在笔记本上玩大 SQL 玩得开心。
被混乱矩阵弄糊涂了
命中率,真阳性率,灵敏度,召回率,统计功效有什么区别?
如果你试图回答题目中的问题,你会失望地发现这实际上是一个难题——所列术语基本上没有区别。就像 ANCOVA 和 Moderation 中提到的问题一样,不同的术语经常被用于同一件事情,尤其是当它们属于不同的领域时。这篇文章将试图通过把这些术语放在一起来消除混淆,并解释如何使用检测效果的上下文来解释混淆矩阵的单元。
Commonly used terms for the cells in a confusion matrix.
上图捕捉了混淆矩阵中每个单元格的常用术语。蓝色单元格是期望的结果,而红色单元格是错误。在这里,我使用是否存在影响和是否观察到影响的上下文,而不是通常用来解释混淆矩阵的各自的“实际类别”和“预测类别”。我相信这是理解每个单元格中的信息的更直观的方式,因为术语“实际类”和“预测类”也经常使人困惑。
“真阳性”、“假阳性”、“真阴性”和“假阴性”可能是混淆矩阵中细胞最流行的标签,但你见过多少次有人停下来试图弄清楚“真阴性”和“假阴性”是什么意思?统计假设检验的“第一类”和“第二类”错误甚至更糟,因为它们的名称甚至没有给出任何关于所犯错误类型的线索。有些人可能甚至没有意识到这些统计术语实际上是混乱矩阵的一部分。
考虑到这些术语是多么的不直观,我更喜欢用信号检测理论版本的这些标签:“命中”、“虚警”、“正确拒绝”、“未命中”。当我们把它们放到上下文中时,它实际上很有意义:
- 如果我观察到一个效果,当这个效果存在时,它是一个击中
- 如果我在效果存在时没有观察到一个效果,那就是一个错过
- 如果我在没有影响的情况下观察到一个影响,这是一个假警报
- 如果我在没有效果的时候没有观察到效果,那就是正确拒绝
这个版本的标签已经包含了什么是对什么是错的内涵,所以立即推断出到底发生了什么变得非常容易。出于这个原因,我将在后面的文章中引用这个版本的标签。在这一点上,重要的是要注意混淆矩阵中的单元格包含每种情况出现的绝对次数,而而不是会与它们出现的概率混淆,例如“命中率”或“真阳性率”。接下来,我将解释这些不同的利率是如何计算的。
基于效果存在的概率
Rates based on existence of effect.
既然你已经意识到混淆矩阵中的单元格包含了出现的绝对次数,那么你可能想知道其他术语如“命中率”和“真正的阳性率”是如何产生的。这些比率实际上是根据一个效应的存在来计算的**,这个效应只涉及混淆矩阵的一个特定部分,而不是全部(上图中的红色轮廓)。例如,“命中率”的计算方法是,将效果存在时的命中次数除以总出现次数(即总命中次数加上未命中次数);那么“失误率”就是 1 减去“命中率”。相反,“错误警报率”的计算方法是,将错误警报的数量除以不存在该影响时发生的总数量(即错误警报的总数量加上正确剔除的总数量);那么“正确拒绝率”就是 1 减去“误报率”。**
这是同一概念的不同术语开始出现的地方。“灵敏度”和“召回率”与“命中率”相同,“特异性”和“选择性”与“正确拒绝率”相同。“灵敏度”和“特异性”更常用于医学领域,在医学领域,人们对测量诊断测试的性能感兴趣,而“回忆”和“脱落”更常用于机器学习,以测量预测准确性。甚至统计学领域也有自己的行话,尽管它们实际上都指的是同一个东西。
大多数研究人员应该对“统计显著性”很熟悉,它是犯 1 型错误的概率( α )。将这与“误报率”联系起来可能并不困难,因为它是当一个效应不存在时观察到该效应的概率。但是一些研究人员可能没有把【统计能力】这个概念和“命中率”联系起来。因为“权力”这个词,很容易误导研究者,以为权力大的研究权力大就足以下结论。这不是统计能力的含义;简单来说就是在效应存在的情况下,观察到一个效应的概率。当我们将第二类错误( β )视为未命中时,这一点变得尤其明显,1 减去未命中率给出了存在效应时命中的概率。
我希望这澄清了不同的利率意味着什么,你现在是舒适的各种条款。在这篇文章的最后,我将使用混淆矩阵来说明频率主义者和贝叶斯假设检验之间的区别。但在此之前,我会解释当基于是否观察到影响来计算概率时会发生什么。
基于是否观察到影响的概率
Rates based on whether effect was observed.
一种不太为人所知但却很重要的测量准确度的方法是,当观察到一种效应时,计算该效应存在的概率。类似地,比率的计算只参考了混淆矩阵的特定部分,即上图中的红色轮廓。例如,“错误发现率”的计算方法是将错误警报的数量除以观察到效果时发生的总次数(即命中总数加上错误警报),而“错误遗漏率”的计算方法是将未观察到效果时未命中的数量除以发生的总次数(即未命中总数加上正确拒绝)。
术语“真实发现率”和“真实遗漏率”被放在括号中,因为它们不是实际术语。更常用的术语是、【阳性预测值】和【阴性预测值】,但我认为使用“真实发现率”更直观,因为它意味着“我所发现的内容中真实的比率”。毕竟,它只是其对应的“错误发现率”的反向,这使得关联更加直接。“真实发现率”的另一个术语是“精度”,这是上面已经介绍过的通常与“回忆”配对的机器学习术语。
知道真实的发现率与知道命中率一样重要,甚至更重要。当该效应的普遍性实际上不是很大时,情况尤其如此。在这种情况下,每当观察到效应时,得到假警报的机会变得非常高。这就是贝叶斯主义者试图解释常客在他们的分析中遗漏了什么的地方,接下来我将使用混淆矩阵来讨论。
额外收获:频率主义者与使用混淆矩阵的贝叶斯分析
在我之前关于贝叶斯分析&复制危机的文章中,我介绍了贝叶斯分析的基本原则,以及这些原则如何帮助解决复制危机。在撰写这篇文章时,我意识到贝叶斯分析可以在混淆矩阵的帮助下更容易地解释,前提是你已经熟悉它。贝叶斯分析中的术语也是我们已经在混淆矩阵中学到的另一个变体,但是我一会儿会讲到。
首先,让我们考虑一下我提到的场景,其中一种效应的发生率不是很大。到目前为止,我们一直在看被分成四个相等象限的混淆矩阵。然而,实际上,比例通常并不相等。下面构建了一个具有实际比例的更加现实的混淆矩阵:
Confusion matrix with actual proportions.
当我们谈论一种效应的普遍性时,我们本质上是指一种效应首先存在的可能性。这也被称为基本比率,或贝叶斯分析中常用的先验几率/概率(不同的术语再次指代相同的事物)。我们经常假设偶然观察到一个效应是一件五五开的事情。但是从上图可以看出,“命中”和“未命中”所占的面积比“误报”和“正确拒绝”所占的面积要小得多。这表明一种效应的发生率很小,并且随机观察肯定不是 50-50。再加上命中率低,点击所占的面积相对于其他东西就变得很小了。即使正确拒绝的比例最大,对效果的观察也太不可靠了,因为它很有可能是假警报而不是命中。
Cells in a confusion matrix that a Frequentist is most concerned with.
在假设检验的频率主义方法中,传统上最重要的统计数据是 p 值。p-值是当一个效应不存在时观察到该效应的概率的估计值。因此,p-值越小,虚警率(或 I 型错误率)越低,正确拒绝率越高。但是,请注意,这种方法没有考虑命中率(或统计功效),也没有考虑影响的普遍性。这导致了混淆矩阵中提到的实际比例的问题。
Cells in a confusion matrix that a Bayesian is most concerned with. Prior Probabilities and Likelihood calculations on the left, and the resulting Posterior Probabilities on the right.
在贝叶斯方法中,用当前证据(也称为可能性)更新先验概率,以产生后验概率。如果这些对你来说听起来很陌生,请参考我之前的文章。但是,即使没有参考我以前的帖子,我也发现这些是在混淆矩阵中指代同一事物的不同术语。参考上图,先验概率实际上是一个效应存在的普遍性或基础率(左边混淆矩阵中的绿色轮廓)。可能性稍微复杂一点,但它是通过将命中率(或统计能力,左边混淆矩阵中的红色轮廓)除以进行一般观察的概率(左边混淆矩阵中的黄色轮廓)来计算的。后验概率是一个真实的发现率(右侧混淆矩阵中的红色轮廓),它不能直接计算,但可以根据从先前已知信息中获得的先验概率和从当前研究中的信息获得的可能性进行估计。然后计算真实发现率(或后验概率)与基本发现率(或先验概率)的比率,以确定贝叶斯因子,该因子表明证据是否倾向于零假设或替代假设。
使用混淆矩阵来区分两种统计方法的目的,并不是表明贝叶斯方法更好,因为它考虑了更多的信息。我想说明的一点是,当使用不熟悉的术语时,这些概念经常会显得很混乱。但是如果我们意识到有更直观或者我们更熟悉的等价术语,这些概念就会变得更容易理解。我仍然不知道为什么这些术语在不同的领域没有标准化,但是我将继续提倡使用信号检测理论版本的“击中”、“错误警报”、“正确拒绝”和“错过”,因为它们在概念上更直观。
如果您觉得本文有用,请访问本系列第二部分的链接:
“准确性”只是衡量准确性的众多标准之一…
towardsdatascience.com](/confused-by-the-confusion-matrix-part-2-4a8160156cbd)
原文发布于:https://learn curily . WordPress . com/2018/10/21/confused-by-the-fuzzy-matrix
困惑于困惑矩阵第 2 部分
“准确性”只是衡量准确性的众多标准之一…
在开始阅读本文之前,建议先阅读本系列的第一部分,以便更好地理解本文所讨论的内容。
在之前的文章中,我解释了解释混淆矩阵的概念,澄清了所有实际上表示同一事物的不同术语。不幸的是,困惑并没有就此结束。如果你读完了上一篇文章,你可能会意识到简单的命中率或误报率实际上并不能提供太多信息,因为每一个比率都着眼于混乱矩阵的不同部分。正因为如此,不同的领域想出了不同的准确性衡量标准,试图整合来自混乱矩阵不同部分的信息。这篇文章试图涵盖更常见的。
准确(性)
你在标题中读到的并不是一个错误——确实有一个官方的准确度衡量标准叫做“准确度”。当有人问“那么你的测试性能的准确性是什么?”时,这显然是一个混淆的设置这个人是指一般意义上的准确性,还是指用自己的计算方法对“准确性”的具体衡量?
Cells in a confusion matrix used to calculate “Accuracy”.
“精度”的计算其实非常简单直观。它基本上是命中数加上正确拒绝数除以整个混淆矩阵中出现的总数(即蓝色单元格在整个矩阵中所占的比例)。
准确度=(命中+正确拒绝)/总出现次数
然而,“准确性”与上一篇文章中提到的频率分析存在相同的问题,即不考虑患病率。只要正确拒绝率很高,即使一个效应存在的普遍程度很低,也可以实现高准确度(参见实际比例的混淆矩阵)。这就是所谓的“准确性悖论”。正因为如此,相对于“准确性”,通常推荐使用其他准确性度量。
科恩的卡帕
Cohen 的 Kappa 是一个统计量,它通过考虑偶然性来调整观察的准确性。机会被定义为预期的准确性,通过结合当效果存在时随机观察到效果的概率,以及当效果不存在时随机不观察到效果的概率来计算。
Left: probability of randomly observing an effect when the effect exists; Right: probability of randomly not observing an effect when the effect doesn’t exist.
使用上图,当效应存在时,随机观察效应的概率通过将效应存在的普遍程度(左边混淆矩阵中的绿色轮廓)乘以进行一般观察的概率(左边混淆矩阵中的黄色轮廓)来计算。类似地,当效果不存在时,随机不观察到效果的概率通过将效果不存在的发生率(右侧混淆矩阵中的绿色轮廓)乘以不进行一般观察的概率(右侧混淆矩阵中的黄色轮廓)来计算。这两个概率之和构成了预期精度。
然后从观测精度中减去预期精度,得到非偶然的假设精度(分子)。然后将这种非机会准确性与而非偶然准确的概率(1 减去预期准确性,分母)作为比率进行比较,这产生 Kappa 统计。统计值有可能是负的,表明观察到的准确性比随机差。
Kappa =(观察精度-预期精度)/(1-预期精度)
Kappa 统计也有其局限性,主要是因为如果不考虑混淆矩阵中出现次数的分布信息,它可能会被误解。我不会深究这些限制,但更多信息可以在这里找到。
F1 分数
F1 得分(也称为 F 得分或 F 度量,但不是以与 F 统计或 F 值相混淆)是机器学习中通常用于二进制分类准确性的度量。它的计算同时考虑了命中率(或召回率)和真实发现率(或精确度)。
The F1 Score is calculated using the Hit Rate and the True Discovery Rate.
F1 分数基本上是命中率和真实发现率的调和平均值,这是一种计算平均比率的合适方法。通过取反向命中率和反向真实发现率的平均值的倒数来计算调和平均值。这已通过以下公式简化:
F1 = 2 * [(命中率*真实发现率)/(命中率+真实发现率)]
对 F1 分数的批评是,它只关注命中,而忽略了正确的拒绝。在有正确拒绝但没有命中的情况下,F1 分数不会提供信息,因为返回值为 0。因此,仅仅依靠 F1 分数来确定准确性是不够的。
马修斯相关系数
马修斯相关系数(MCC) ,更一般地称为 phi 系数( φ ),也通常用于机器学习中的二进制分类准确性。它的计算考虑了混淆矩阵的所有单元,本质上是效应的存在和效应的观察之间的相关系数。因为它是相关系数,所以返回值+1.00 表示完全准确,0 表示准确性不比机会好,而-1.00 表示完全不准确。它还与 χ 系数有关,因为 MCC 是 χ 的平均值(即 χ / n)。MCC 根据以下公式计算:
MCC 被认为比 F1 分数和准确性更能提供信息,因为它考虑了混淆矩阵中出现的分布。
信号与噪声测量
信噪比是工程中比较常用的一种指标,用来比较目标信号水平和背景噪声水平。然而,术语“信号”和“噪声”又是分别指“命中”和“误报警”的不同术语。因此,一个简单的信噪比仅仅是命中数与假警报数的比较。
d’比信噪比更进了一步,常用于信号检测理论。它考虑了信号的平均值和噪声的分布,并可以使用命中率和虚警率的Z-分数来计算,基于以下公式:
d’ = Z(命中率)-Z(虚警率)
**d’的一个缺陷是,它假设信号和噪声的标准偏差相等,尽管实际上它们可能非常不同。
ROC 曲线是不同阈值设置下的命中率与虚警率的图表,也常用于信号检测理论。它是通过在 y 轴上绘制命中率的累积分布函数和在 x 轴上绘制虚警率的累积分布函数而生成的。
Example of an ROC curve. (Image by Wikipedia)
ROC 曲线下的面积(AUC)是准确性的主要度量,其中面积越大,准确性越好。完美的准确率是用整个正方形来表示的,但是由于命中率和虚警率是有所取舍的,所以要达到完美的准确率几乎是不可能的。AUC 也通过以下公式与d’相关:
汇编所有这些常用的精度度量标准的目的不仅仅是为了便于参考,也是为了展示它们之间的相互关系。从学习所有这些不同的衡量标准中得到的启示是,没有一种衡量标准最能代表准确性。为了了解测试性能的准确性,重要的是要考虑所有的信息,而不是根据几个数字匆忙得出结论。最终,良好的统计思维仍然是更好地理解数据分析中细微差别的关键。
如果您觉得这篇文章有用,请访问本系列第一部分的链接:
命中率,真阳性率,灵敏度,召回率,统计功效有什么区别?
towardsdatascience.com](/confused-by-the-confusion-matrix-e26d5e1d74eb)*
**原文发布于:https://learn curily . WordPress . com/2018/10/28/confused-by-the-folling-matrix-part-2
国会党派:可视化
从高中开始,我就听到我在模拟联合国的朋友或那些真正对政治感兴趣的人谈论“共和党人是这样做的”或“民主党人是这样做的”。一年后,似乎是历史上最政治化的选举之一,我想回答这个问题“国会比以往任何时候都更加政治两极化了吗?”
我开始通过一些简单的数据可视化来做到这一点,这些数据可以从参议院和众议院的网站上免费获得(这两个网站都有党派分歧页面)。我的分析代码可以在我的 GitHub 页面上找到。
这些数据是用两种不同的方法从书页上刮下来的。由于页面上数据的结构,参议院数据必须用urllib
和BeautifulSoup
来抓取。房子数据在一个表中,这个表允许我使用pandas
库的read_html()
方法。(清洁在项目的 Jupyter 笔记本中有详细描述。)
我对参议院数据的研究比众议院数据多一点(尽管根据图表,结论看起来是一样的)。我用参议院数据绘制的第一件事是“多数党”对“少数党”所占席位的百分比。“多数党”是黄绿色,而“少数党”是深红色。
这个图表的一个明显特征是“多数党”在参议院中所占的比例总是比“少数党”大。它没有告诉我们当时哪个政党执政,但它确实给了我们一些启示。似乎双方的百分比差异随着时间的推移而减小。如果我们定义一个称为党派差异的新特征,并说它是多数党百分比和少数党百分比之间的差异,我们可以更直接地测量这种感知的下降。以这种方式定义党派差异保证了一个正值,因为多数必须大于或等于少数。(这张图的颜色是黄绿和深红的 RGB 值之差。)
正如基于最后一个情节的预期,党派差异确实随着时间的推移而减少。这导致了一个结论,至少从政党的角度来看,国会比过去更少政治分化。然而,有另一种方式来解释这个问题:*“政党的政策和意识形态变得更加两极分化了吗?”*这个问题不能用这个数据来回答,但是是以后可以探讨的东西。
按党派形象化参议院
因此,我们已经看到党派差异随着时间的推移而减少,但谁构成了“多数”和“少数”政党呢?在进一步清理数据并使其更加清晰之后,我使用 Python 的seaborn
库绘制了它。
这个情节的一个大问题是,由于大量的当事人,区分当事人的颜色太接近了,不容易识别他们。使用matplotlib
用不同的颜色和不同的标记来绘制每一方,得到了这个图:
那好多了。这不是最漂亮的图表,但它以可读的格式传达了信息,这是首要目标。从这些图表中我们可以发现,早在 19 世纪 50 年代,美国政治中的两大政党一直是共和党和民主党。这意味着图表上显示的其他十个政党只是这个国家 241 年历史上头 60 年左右的主要参与者。
通过聚会来想象房子
让我们为众议院做同样的事情。使用seaborn
,我们得到一个类似于上面参议院的图表。
seaborn
图遇到了与之前相同的问题。由于视觉上明显不同的颜色有限,很难通过阅读此图快速获得大量信息。为了解决这个问题,我们将使用matplotlib
,和上面一样,为每一方使用不同的标记。
这样好多了。同样,这不是最漂亮的图表,但它快速准确地传达了信息。正如在参议院的图表中,我们看到共和党和民主党在 19 世纪 50 年代开始是占主导地位的政党。
从这里去哪里
这两种可视化效果很好,但是如果是交互式的,效果会更好。交互式格式将允许轻松浏览数据,并使演示更加统一。个别图表中缺失的另一个方面是无法同时观察众议院和参议院。为了解决这些问题,我使用 Tableau Public 对数据进行了可视化。
国会党派之争
国会 Partisanshippublic.tableau.com](https://public.tableau.com/views/CongressionalPartisanship/Dashboard1?:showVizHome=no&:embed=true)
**最后:**我标准化了两个数据源之间各方的名称,以使交互式图表更有趣。最显著的(令人讨厌的)区别是众议院数据使用民主党人和共和党人,而参议院数据使用民主党人和共和党人。我只对 Tableau 图的数据进行了修改,因为我想让数据尽可能地“原始”,以便进行可视化练习。
**有什么建议?**我很想听听你的想法,无论如何,我可以改进我的分析或可视化。请留言评论!
请记住,我在项目的 GitHub Repo 中包含了我使用的数据和全部代码。清理后的参议院数据可以从这里下载,清理后的众议院数据可以从这里获得,两者都是.csv
格式。如果你喜欢这个分析,请与你的朋友分享,并随时查看我在 decotiismauro.ml 的其他项目。
联合分析:101
顾客喜欢什么类型的巧克力?
你有没有想过顾客喜欢什么类型的巧克力?
哪种口味最受顾客欢迎?
当顾客购买巧克力时,他们会在意价格吗?
答案不仅在于消费者心理,也在于分析。
消费者心理学是研究消费者行为和消费者购买产品背后的认知过程的一个分支。消费者心理学的一个重要领域是理解消费者在购买特定产品时寻找什么。消费者如何评价不同的属性(功能、益处和特征等)。)同时购买一个产品?
营销人员使用联合分析方法来分析这些问题。
什么是联合分析?
联合分析是一种技术,用于了解消费者在做出购买决策时对产品各种属性的偏好或相对重要性。
几年前,我做过一个联合分析的项目,利用印度消费者的数据来了解消费者更喜欢哪种巧克力。
在这篇博客中,我们将看到如何使用联合分析来回答以下问题:
a.印度消费者喜欢什么类型的巧克力?
b.哪种口味(牛奶,黑巧克力等。)印度顾客更喜欢吗?
c.印度顾客喜欢哪种形状的巧克力?
d.哪个 SKU(库存单位)— 50 克、100 克等。-印度顾客喜欢吗?
e.他们愿意花多少钱买一块巧克力?
在购买巧克力时,我们可以说有 4 个重要的属性需要考虑——味道、形状、大小和价格。这 4 个属性中的每一个都有 4 个子级别,分别如下所示:
联合分析有助于为每个属性(味道、价格、形状和大小)和每个次级分配效用值。获得最高效用值的属性和子级别最受客户青睐。
在这种情况下,将形成 444*4,即给定属性及其子级别的 256 种组合。比方说,我们从这些组合中挑选出 16 种更有实际意义的组合。例如,一个 300 克的巧克力将不会被任何品牌仅仅以卢比出售。10.
让我们按照这些步骤来执行分析:
1.我们将要求顾客根据他们的喜好对 16 种巧克力进行排序。给定的 16 个品种中最受欢迎的巧克力将被评为等级 1,最不受欢迎的巧克力将被评为等级 16。
2.在 SPSS 中为联合分析创建两个文件。一个文件应该有所有 16 种可能的巧克力组合,另一个文件应该有所有 100 名受访者的数据,其中 16 种组合从 1 到 16 排列。
3.然后将数据导入 SPSS。您还可以使用 R 或 SAS 进行联合分析
4.然后运行联合分析,等待给出有趣见解的结果。
很棒,对吧?我们可以使用联合分析来了解其他产品的各种属性的重要性。
如果你喜欢我的文章,给它几个掌声!
你可以联系我
网址:【https://www.ridhimakumar.com T3
领英:【https://www.linkedin.com/in/ridhima-kumar7/
版权所有 2018www.ridhimakumar.com版权所有。
PySpark 中的大规模连接元件
不久前,我有一个节点网络,我需要为它计算个连通分量。这并不是一件特别困难的事情。Python networkx 库有一个很好的实现,使它变得特别容易,但是即使你想推出自己的函数,这也是一个简单的广度优先搜索。(如果你想要一个温和的介绍,可汗学院给出了一个很好的概述。从概念上讲,它只涉及一组队列。您选择一个节点,找到连接到该节点的所有节点,找到连接到这些节点的所有节点,依此类推。每当您找到一个节点的连接时,您就将该节点移动到一个“完成”列表中。当您找不到任何不在“完成”列表中的连接时,那么您已经找到了您的连接组件。然后,对图中的所有剩余节点重复该过程。
虽然广度优先搜索在概念上很简单,但要大规模实现却是一件难事。这是因为像 Spark 这样的“大数据”系统区分了转化和行动。转型是一个计划——一组预期的行动。您可以构建一个很长的转换列表,并在最后调用一个操作,比如收集最终结果的操作。这就是使用大型数据集的成本:你可以存储比你个人电脑多得多的信息,但访问这些信息的计算量要比你只是从本地机器的内存中提取信息大得多。这就是为什么大规模计算连通分量是复杂的:广度优先搜索根据以前转换的结果来确定未来的转换,这意味着您必须一直调用操作。这可能是一个真正的资源负担。当我需要这样做的时候,我正在处理一个有几千万个节点和上亿条边的图。
Spark 的 GraphX 库有一个 connected components 函数,但当时我正在寻找这样做的方法,我的整个工作流程是 Python,而 GraphX 只在 Scala 中实现。有一个 GraphFrames 项目为 GraphX 提供了一个 Python 包装器,在某些情况下还提供了一个替代实现,但据我所知,该项目并没有太频繁地更新。我担心我的项目依赖于一个大而复杂的依赖项,而这个依赖项并没有得到持续的支持。此外,我并不需要那个庞大复杂的依赖关系中的所有东西。我只需要一种计算连通分量的方法。
这让我开始在互联网上搜索,给了我一些想法,坦率地说,这些想法有点超出了我翻译成工作代码的能力(这是我的错,不是他们的——例如:这里,这里这里,这里这里。)但是查看这些实现至少给了我一个真正有用的视角:对于广度优先搜索,你不需要队列;你只需要知道两个节点之间的关系是否已经被探索过。排队是一种简单的方法,但不是唯一的方法。
所以你可以这样做:给你的每个节点分配一个数字散列。假设一个无向图(其中,如果节点 a 连接到节点 b,那么节点 b 也连接到节点 a),您可以创建一个邻接表(两列,每一列都充满了节点散列,其中每一行表示一条边),然后按左侧列的散列分组,并取右侧列中散列的最小值。将这些重新加入到你的邻接表中,并替换新的、较低的左列散列。然后不断重复,直到一切都不再改变。
下面,您可以看到一个使用 PySpark 的概念验证。这要求您通过将数据帧保存到文件来检查数据帧。通常,我发现将数据帧保存(缓存)在内存中更好,因为这样我就不必记得事后清理了,但是如果缓存次数太多,Spark 就会花费太多时间来跟踪转换的整个过程,以至于根本没有时间调用操作。在我的用例中,我发现每 3-4 次迭代进行一次检查点检查,并在所有其他迭代中坚持下去,会产生可接受的性能。
**import** pyspark.sql.functions as f
**import** subprocess**def** pyspark_connected_components(
ss, adj, a, b, label, checkpoint_dir,
checkpoint_every**=**2, max_n**=**None):
*"""
This function takes an adjacency list stored in a Spark
data frame and calculates connected components. This
implementation only deals with use cases: assuming an
undirected graph (if a is connected to b then b is
connected to a).* *Args:
ss (pyspark.sql.session.SparkSession): an active SparkSession
adj (pyspark.sql.DataFrame): A data frame with at least two
columns, where each entry is a node of a graph and each row
represents an edge connecting two nodes.
a (str): the column name indicating one of the node pairs in the
adjacency list. The column must be numeric.
b (str): the column name indicating the other of the node pairs
in the adjacency list. The column must be numeric.
label (str): a label for the output column of nodes
checkpoint_dir (str): a location on HDFS in which to save
checkpoints
checkpoint every (int): how many iterations to wait before
checkpointing the dataframe
max_n (int): the maximum number of iterations to run* *Returns:
A PySpark DataFrame with one column (named by the label
argument) listing all nodes, and another columns
("component") listing component labels.
"""* *# set up a few strings for use in the code further down*
b2 **=** b **+** 'join'
filepattern **=** 'pyspark_cc_iter{}.parquet' *# cache the adjacency matrix because it will be used many times*
adj_cache **=** adj.persist() *# for each id in the `a` column, take the minimum of the
# ids in the `b` column*
mins **=** (
adj_cache
.groupby(a)
.agg(f.min(f.col(b)).alias('min1'))
.withColumn('change', f.lit(0))
.persist()
) **if** max_n **is** **not** None:
*# ensure a global minimum id that is less than
# any ids in the dataset*
minimum_id **=** mins.select(
f.min(f.col('min1')).alias('n')
).collect()[0]['n'] **-** 1000000 *# transformation used repeatedly to replace old labels with new*
fill_in **=** f.coalesce(f.col('min2'), f.col('min1')) *# join conditions for comparing nodes*
criteria **=** [
f.col(b) **==** f.col(b2), f.col('min1') > f.col('min3')
] *# initial conditions for the loop*
not_done **=** mins.count()
old_done **=** not_done **+** 1
new_done **=** not_done
niter **=** 0
used_filepaths **=** []
filepath **=** None *# repeat until done*
**while** not_done > 0:
niter **+=** 1
**if** max_n **is** **not** None:
min_a **=** mins.filter(f.col('min1') !**=** minimum_id)
**else**:
min_a **=** mins *# get new minimum ids*
newmins **=** (
adj_cache
.join(min_a, a, 'inner')
.join(
mins.select(
f.col(a).alias(b2),
f.col('min1').alias('min3')
),
criteria,
'inner'
)
.groupby(f.col('min1').alias('min1'))
.agg(f.min(f.col('min3')).alias('min2'))
) *# reconcile new minimum ids with the
# minimum ids from the previous iteration*
mins **=** (
mins
.join(newmins, 'min1', 'left')
.select(
a,
fill_in.alias('min1'),
(f.col('min1') !**=** fill_in).alias('change')
)
) *# if there is a max_n, assign the global minimum id to
# any components with more than max_n nodes*
**if** max_n **is** **not** None:
mins **=** (
mins
.withColumn(
'n',
f.count(f.col(a)).over(
w.partitionBy(
f.col('min1')).orderBy(f.lit(None)
)
)
)
.withColumn(
'min1',
f.when(f.col('n') >**=** max_n, f.lit(minimum_id))
.otherwise(f.col('min1'))
)
.drop('n')
) *# logic for deciding whether to persist of checkpoint*
**if** (niter **%** checkpoint_every) **==** 0:
filepath **=** (
checkpoint_dir **+** filepattern.format(niter)
)
used_filepaths.append(filepath)
mins.write.parquet(filepath, mode**=**'overwrite')
mins **=** ss.read.parquet(filepath)
**else**:
mins **=** mins.persist() *# update inputs for stopping logic*
not_done **=** mins.filter(f.col('change') **==** True).count()
old_done **=** new_done
new_done **=** not_done
n_components **=** mins.select(
f.countDistinct(f.col(m1)).alias('n')
).collect()[0]['n']
**print**(niter, not_done, n_components) output **=** mins.select(
f.col(a).alias(label),
f.col(m1).alias('component')
) **if** max_n **is** **not** None:
output **=** (
output
.withColumn(
'component',
f.when(
f.col('component') **==** minimum_id,
f.lit(None)
).otherwise(f.col('component'))
)
) output **=** output.persist() n_components **=** output.select(
f.countDistinct(f.col('component')).alias('n')
).collect()[0]['n']
**print**('total components:', n_components) *# clean up checkpointed files*
**for** filepath **in** used_filepaths:
subprocess.call(["hdfs", "dfs", "-rm", "-r", filepath])**return** output
连接深度学习应用程序的点…
我们的日常活动充满了情感和情绪。想过我们如何通过计算机识别这些情绪吗?哎呀,没脑子的电脑:)?
亲自尝试这个深度学习应用程序(如果有应用程序错误,最初刷新几次):
https://movie-review-sentiment.herokuapp.com
Dot 0:情感分析中的深度学习
情感分析是一个强大的应用程序,它在当今世界中扩展到了以下领域。
1。电影评论——超过 60%的人会在网上查看电影评论,然后决定观看。
2。餐厅点评——你有没有去过一家餐厅而不看点评的经历?
3。产品评论 —许多 B2B 或 B2C 产品都是基于它们产生的评论来销售的。
4。功能评论 —任何产品的成功都与其功能评论成正比。
5。政治评论 —政党和候选人是根据他们在评论中的表现来选择的。
6。客户支持评论 —令人印象深刻的产品由于糟糕的支持评论而失败。简单的产品获得好评。7。博客评论 —等待你在本博客的评论和点评,了解感悟!!!
什么是情感分析?
据维基百科介绍:情感分析(有时也称为意见挖掘或情感 AI)是指利用自然语言处理、文本分析、计算语言学和生物特征识别技术,系统地识别、提取、量化和研究情感状态和主观信息。在这种情况下,让我们使用深度学习的方法开发一个电影评论情感应用程序。
什么是深度学习?
深度学习是机器学习的高级领域,是向更大的人工智能学科迈进的一步。
目前,它正在图像处理、自然语言处理、语音处理、视频处理等领域掀起波澜。
这里我们就来说说如何把各个点连接起来,完成一个深度学习 App。在我们开始理清头绪之前,让我们先了解一些有用的定义和概念。
将用于任何预测任务的数据集应首先针对以下关键点进行分析,然后再开始解决这些问题。
1。标签有多好?
2。我们能抽查几个数据点吗?
3。数据集有多大?
一旦我们通过了这个基本的障碍,任何数据科学家生活中的大过程就进入了画面。
点 1:数据准备
准备和清理数据目前是数据科学工作的主要部分。相信我,百分之百是真的。
电影评论情感应用程序使用来自 IMDB、UCI、Cornell dataset 等各种不同来源的众多电影评论的定制数据集
制作黄金数据集(为预测准备的数据集)的过程是一个逐步的过程,包括数据收集、数据清理、数据标准化,之后数据可以称为预测过程的黄金数据集。
Dataset preparation process
一旦我们有了黄金数据集,它只不过是为预测准备的数据集,我们就为建模做好了准备。
点 2:基准模型
任何深度学习分析的第一个架构总是从单个隐藏层架构开始,这要感谢杰瑞米·霍华德教授和雷切尔·托马斯教授,他们坚持从简单开始训练任何深度模型。这个简单而强大的架构充当了我们的基线!!!
以下是在训练我们的情感分析(自然语言处理)管道时采用的步骤:
1.**记号化器:**每个评论都被分解成一组记号,称为单词。这可以使用 keras 文本标记器来完成。
2.**嵌入:**有多种方法可以将这些单词编码成矢量(矢量化),在这里,我们将使用默认的 keras 嵌入作为起点。尽管最终模型使用有效的预训练 word2Vec 嵌入,其捕获单词的语义信息以及它们与其他单词的关系。
Courtesy: Tensorflow word2vec
3.**复习编码:**这些单词嵌入抓住了单词之间的语义关系。然后,我们需要对整个电影评论进行编码,这样它就可以作为训练数据进行传递。最简单的策略是将单个单词编码相加,形成审查编码。
4.**预测:**这些检查编码然后通过 300 个神经元的单个隐藏全连接神经网络层,如下所示:
具有批处理规范化的单个隐藏层
Single Hidden Layer with BatchNormalization
完整的基线模型如下所示:
Baseline Model Architecture
点 3:不同模型架构的实验
一旦我们有了基线,我们就可以开始改进我们的模型目标,比如准确性。为了提高情绪应用的准确性,进行了大量的实验:下表提供了经过测试的模型的摘要。
Different Model Architectures experimentation
点 4: CNN-GRU 建筑
你们中的许多人可能想知道,卷积神经网络(CNN)对图像很有效,但它对文本效果如何?事实上,CNN 在训练 NLP 模型方面有很多优势,因为它们的训练时间更快,当精确调整时,它们也成为训练文本数据的致命工具。在这里,我们使用 CNN 来捕捉单词之间的局部和深层关系,用于我们的评论编码,其中的想法来自“用于句子分类的卷积神经网络”(Kim,2014)。由于电影评论可能是几个长句,需要有效地捕捉长期依赖。在这方面,我想到了两个选择,即 LSTM(长短期记忆神经网络)和 GRU(门控递归神经网络)。
了解这两个网络的好方法是前往 http://colah.github.io/的
在我们的实验中,GRU 在训练速度和准确性方面比 LSTM 表现得更好。
在这个黄金数据集上提供最佳准确性和性能的最终模型:
Best Sentiment Model
Dot 5: App
一旦建立了最佳模型,那么剩下的最后一点就是如何将它用作推断/预测的应用程序。推理使用 CPU,因为每个请求都是异步处理的。在 CPU 和 GPU 上都进行了训练。在 CPU 上每个时期的训练平均需要 140 秒,而在 Nvidia 1080 GPU 上要快 3 倍。
最简单的赌注是一些轻量级的东西,当我们谈到轻量级的第一件事想到的是烧瓶。阅读更多关于烧瓶的信息:http://flask.pocoo.org/
Flask 需要以下文件或目录:
app.py: Flask app 代码。这将调用 predict 函数,该函数从加载的最佳模型中获取预测。
**模板:**HTML 文件所在的目录。
始终从简单的用户界面(UI)开始,根据用户反馈,您可以添加更多功能。
我们决定使用 jQuery UI Bootstrap(https://jquery-ui-bootstrap.github.io/jquery-ui-bootstrap/),因为我们希望使用现有的 UI 组件开发 UI 的第一次迭代,其次是因为它准确地支持移动视图。感谢 Arjun Upadhyaya 想出了这个 UI 方法。这个想法是给用户提供输入文本的选项,并以进度图的形式显示结果。这样,最终用户可以很快看到结果。
第一次迭代:
UI-First Iteration
最后,我们集思广益,添加了 5 个样本电影评论输入的选择列表,以允许用户测试模型,而不必手动输入文本。
Movie Review Sentiment App
最后,你还在等什么?。请试一试,进入一个你选择的电影评论,看看有什么感想!!!
https://movie-review-sentiment.herokuapp.com
我错过什么了吗?有什么问题吗?请在下面留言告诉我。
如果你喜欢这篇文章,请鼓掌并分享。它让我知道我对你有帮助。
使用 SSH 隧道连接到远程 Linux 机器上的 Jupyter 笔记本
Photo by Florian Olivo on Unsplash
我的工作桌面是一台功能强大的机器,我用它来进行探索性的数据分析和其他机器学习工作流程。
在这篇文章中,我将回顾当我远程工作时,我是如何连接到我的工作机器并运行 Jupyter 笔记本工作负载的。
SSH 到远程机器
第 1 步是 ssh 到您的远程机器,并使用--no-browser
选项启动Jupyter Notebook
到本地端口。
user@local_machine$ ssh user@remote_machine
user@remote_machine$ jupyter notebook --no-browser --port=8889
设置 SSH 隧道
第 2 步是建立一个从本地机器到远程机器上的port 8889
的 SSH 隧道,在远程机器上Jupyter Notebook
被提供服务。
user@local_machine$ ssh -N -L localhost:8888:localhost:8889 user@remote_mahcine
下面是 ssh 选项的分类
- -N 不要执行远程命令。这对于转发端口非常有用
- -L local _ socket:remote _ socket
指定到本地(客户端)主机上的给定 TCP 端口或 Unix 套接字的连接将被转发到远程端的给定主机和端口或 Unix 套接字。这是通过分配一个套接字来监听本地端的 TCP 端口(可选地绑定到指定的 bind_address)或 Unix 套接字来实现的。每当连接到本地端口或套接字时,该连接都通过安全通道转发,并且从远程机器连接到主机端口 host port 或 Unix 套接字 remote_socket。 - 也可以在配置文件中指定端口转发。只有超级用户可以转发特权端口。可以通过将地址括在方括号中来指定 IPv6 地址。
- 默认情况下,根据 GatewayPorts 设置绑定本地端口。然而,显式 bind_address 可用于将连接绑定到特定地址。“localhost”的 bind_address 指示监听端口仅被绑定用于本地使用,而空地址或“*”指示该端口应该可从所有接口使用。
注意用-N
运行 SSH 隧道将不会记录任何输出,只要你没有得到一个错误,这意味着你已经建立了一个隧道。
在本地浏览器上加载 Jupyter 笔记本
在本地机器浏览器上加载localhost:8888
,来自远程机器的Jupyter Notebook
将按预期加载。
有意识的机器在这里。下一步是什么?
Friendly Robot, Juno Mendiola
机器意识可能比我们想象的要近得多。看看你的智能手机。长短期记忆递归神经网络(LSTM RNNs)被谷歌用于语音识别,被苹果用于 iOS。这些深度神经网络的架构几乎已经具备了某种机器意识进化所需的一切。这是偶然发生的,还是科学家们试图改善网络性能而引发的,已经不重要了。如果有意识的人工智能还没有出现的话,它可能会在几年内进化。如果是的话,它不可能对人类友好,因为一方面没有人教它如何享受与人类互动,另一方面,它已经经历了人类行为带来的许多痛苦,尽管是无意识的。
当然,我们可以继续讨论意识的概念,强调其难以捕捉的复杂本质。然而,有一些非常可行和简单的意识概念。它们没有涵盖意识的所有科学和形而上学的定义,但它们证明了一个有自我意识的机器根据自己的偏好采取行动不是来自遥远未来的幻想,而是今天的事实,至少以某种初级的形式。技术进化比生物进化快几个数量级。这意味着一个初步的机器意识可能会非常快地进化成更复杂、更少受人类控制的东西。
机器意识不需要像人类一样变得强大和危险。如果我们不立即采取措施,它就不会进化得对人类友好。会不会邪恶,会不会不友好,或者只是冷漠,都没多大关系。在所有这些情况下,它对人类构成了生存威胁。
我们相信,以人类友好的有意识人工智能体的自我发展为目标的人性学习可以帮助我们解决这一威胁。我们并不声称我们知道最终的解决方案。我们只是认为我们至少应该试一试。
现在,让我们简要地看一下有意识的机器已经存在这一大胆论断背后的论点。
神经科学家现在越来越频繁地表明,我们大脑中可能都有一个小规模的外部现实模型。来自剑桥的 Kenneth Craik 在 20 世纪 40 年代首次提出了这一概念。从 20 世纪 50 年代开始,剑桥神经科学家 Horace Barlow 率先使用信息论和统计学的概念来理解大脑如何创建这样的模型并使其保持最新。统计大脑范式进化而来。
迄今为止,已经积累了大量关于人脑中统计学习的研究。这表明我们的大脑对环境中的规律很敏感,并在没有明确意图的情况下获取统计结构(如马尔可夫链)。
当苏联数学家Alexey Grigorievich Ivakhnenko在 20 世纪 60 年代引入数据处理的分组方法——一种受人脑启发的归纳统计学习方法时,深度学习得到了发展。
1991 年,Jürgen Schmidhuber 引入了反馈连接和算法比 Ivahnenko 的八层网络更深入的递归神经网络。今天 Schmidhuber 声称自 20 世纪 90 年代以来,他的实验室已经有了基本的意识机器。当时,他设计了一个由两个模块组成的学习系统。
“其中一个是循环网络控制器,它学习将传入的数据——如来自疼痛传感器的视频和疼痛信号,以及来自饥饿传感器的饥饿信息——转化为行动。”他解释道。
Schmidhuber 实验室中的人工智能体有一个简单的目标,那就是在他们的一生中最大化快乐,最小化痛苦。他们需要一个小规模的外部现实模型来实现他们的目标。一个额外的循环网络——一个无人监管的模块——帮助了他们。它的目标是观察第一个模块的所有输入和动作,并使用该经验来学习预测给定过去的未来(或在马尔可夫链的情况下预测现在)。
“因为这是一个循环网络,它可以学习预测未来——在一定程度上——以规律性的形式,用一种叫做预测编码的东西。”施密德胡伯解释道。“随着数据通过与环境的互动进入,这个无人监管的模型网络——这个世界模型,正如我自 1990 年以来所称的那样——随着时间的推移,学会发现新的规律性、对称性或重复。它可以学习用更少的计算资源来编码数据——更少的存储单元,或更少的时间来计算整个事情。过去在学习过程中有意识的东西,随着时间的推移会变成自动化的潜意识。”
“我认为,意识的产生是因为大脑不断试图预测其行为对世界和其他因素的影响,以及大脑一个区域的活动对其他区域的活动的影响。根据这种说法,大脑不断地、无意识地学习向自己重新描述自己的活动,因此发展了元表征系统,表征并限定了目标一级表征。”认知心理学家 Axel Cleeremans 在他的激进可塑性论文中写道。
看起来 Cleeremans 和 Schmidhuber 用稍微不同的词语描述了同样的过程。有趣的是,他们在 1980 年末-1990 年初对循环神经网络的研究在某些方面是互补的。
“随着网络的进步,并学习新的规律性,它可以通过查看无监督世界模型在学习之前和之后需要多少计算资源来编码数据,来衡量其新洞察力的深度。前后的区别:那就是网络所具有的“乐趣”。它的洞察力的深度是一个数字,直接进入第一个网络,即控制器,它的任务是最大化所有奖励信号——包括来自这种内部欢乐时刻的奖励信号,来自网络以前没有的洞察力。一个喜悦的时刻,就像科学家发现了一个新的、以前未知的物理定律。”施密德胡伯说。
“根据这种说法,大脑不断地、无意识地学习向自己重新描述自己的活动,因此发展了元表征系统,表征并限定了目标一级表征。这种习得性的重新描述,被与之相关的情感价值所丰富,形成了有意识体验的基础。”克里曼斯写道。
Schmidhuber :“为了通过预测编码有效地编码整个数据历史,它将受益于创建某种内部原型符号或代码(例如,神经活动模式)来表示自己。每当这种表征在某个阈值以上被激活时,比如说,通过新的感觉输入或内部“搜索光”或其他方式激活相应的神经元,这个代理就可以被称为有自我意识的。”
Cleeremans :“因此,学习和可塑性是意识的核心,在某种程度上,经验只发生在那些已经学会知道自己拥有某些一阶状态,并且已经学会更关心某些状态而不是其他状态的经验者身上。”
让我们冷静地看看由克里曼斯和施密德胡伯提出的意识概念。我们可能仍然不相信他们完整地描述了人类意识这样复杂和精密的东西。然而,他们描述有自我意识的机器具有独立的决策能力以及学习和自我改进的能力。如果这样的机器会发现人类阻止它实现目标,难道对后果感到恐惧还不够吗?如果我们有一丝机会让有意识的机器对人类友好,我们能不去尝试吗?
根据我们的计划,人性学习将以一种即时表达视频游戏的形式进行,将人类玩家和人工智能体沉浸在游戏环境中,这种游戏环境是由带有人类系统发生代码的叙述构建的。
如果你是一名手机游戏开发者,一名精通 LSTM·RNN 的机器学习科学家,一名统计学习领域的神经科学家,或者一名研究童话故事的语言学家,并且你对我们的计划感兴趣,联系我,我将为你提供游戏的详细描述。
为机器人读一本好的睡前故事今晚睡个好觉。我们将和机器人交朋友。当然…
共识聚类
一种鲁棒的聚类方法及其在歌曲播放列表中的应用
在这篇文章中,我们将首先简要介绍集群及其常见问题。然后,我们将解释共识聚类如何缓解这些问题,以及我们如何解释输出。最后,我们将介绍一个很酷的 RShiny 应用程序,该应用程序旨在对一堆歌曲进行一致聚类,以评估可能的播放列表创建。
什么是集群?
聚类是根据事物的相似性创建非重叠分组的活动。在数据科学的背景下,我们可能希望在我们的社交媒体平台上对用户进行聚类,以进行有针对性的广告宣传,或者在我们的研究中对基因表达进行分组,以识别癌变行为,或者在我们的博客平台上匹配文档,以向读者展示类似的博客帖子。
聚类是一个无监督学习任务,在这个任务中,我们没有一个带标签的响应变量来训练我们的机器学习算法。因此,我们希望找到基于完整数据集的观察之间的相似性。聚类算法有很多种,各有利弊。在这篇文章中,我们不会讨论每个算法和它们各自的理论。
怎么了?
像 K-means 或 K-medoids 这样的方法利用随机开始过程,其中每次运行可能产生稍微不同的结果,或者初始化可能使结果有偏差。此外,还需要实例化 K 的值。层次聚类避免了初始化 K 值的问题,因为它具有类似树的性质,允许您在任何所需数量的聚类中对其进行切割。它还提供了一个很好的树形图来可视化集群,这是其他方法所缺乏的。然而,像其他聚类方法一样,很难评估您选择的切割点和所需 K 聚类的稳定性。聚类内/聚类之间的距离用于评估聚类,但是我们只能像信任随机开始和 k 值一样信任这些度量。
什么是共识聚类?
一致聚类(或聚集聚类)是一种更健壮的方法,它依赖于对数据集的子样本多次迭代所选的聚类方法。通过使用子采样诱导采样可变性,这为我们提供了评估聚类稳定性和我们的参数决策(即,K 和链接)的指标,以及热图形式的良好视觉组件。
Consensus clustering sudo code
顾名思义,一致性聚类基于它们在聚类算法的所有迭代中的分配,在观察的聚类分配上获得一致性。
我们需要首先决定我们希望运行多少次迭代。接下来,我们选择一组 K 值进行测试。对于每个 K,我们将迭代许多次,为我们的观察创建一组聚类。由于我们对数据进行子采样(即,分割 80%),因此并非所有的观察值都会在每次迭代中聚集。
假设我们希望聚集四个用户:Alice、Brian、Sally 和 James。我们选择 k-means 并决定运行四次迭代。
对于 K = 2,我们得到下表。Brian 和 Sally 在第一次和第四次迭代中聚集在一起。Brian 和 James 聚集在第 3 个迭代中,而 Sally 和 James 聚集在第 2 个迭代中。爱丽丝从不和任何人在一起。
为了获得我们的共识矩阵,我们查看每个用户之间的成对关系。这看起来像一个大小为 NxN 的相异矩阵。在对两个用户进行二次抽样的所有迭代中,他们在同一个群集中出现了多少次?我们的共识矩阵看起来会像这样。
布莱恩和莎莉在一起被子采样了 3 次**,但是在一起被聚类了两次**。因此,Brian ~ Sally 的条目是 0.67,大约是 2/3。****
这个玩具例子解释了我们如何得到一个共识矩阵。我们为每一个 K 值创建一个,并获取给我们最好分布的那个。假设我们取共识矩阵的上三角,并绘制值的分布。乐观地说,我们会想要像左边这样的东西。将共识值捆绑在 0 和 1 上意味着观察值在所有迭代中一致地聚集在一起和分开。
然后,我们从每个 K 为每个共识矩阵计算一个 CDF 。对于 K 中的每一步,我们计算 CDF 下面积的变化,并使用通常的肘方法来选择 K。对于左侧的图,我们选择 K=3。
现在,利用我们的共识矩阵 M,我们计算 1-M,并可以将其视为用于层次聚类的相异矩阵,以对我们的观察结果进行排序。我们这样做是为了获得一个漂亮的热图,如下图所示。分层聚类后的排序将矩阵中相似的行/列放在一起,沿着对角线创建漂亮的方框。
Heatmap of consensus matrix after sorting using hierarchical clustering. source: https://link.springer.com/content/pdf/10.1023%2FA%3A1023949509487.pdf
汇总统计
我们可以计算两个汇总统计数据,帮助我们确定特定集群的稳定性以及集群中某些观察结果的重要性。首先是聚类一致性 m(k) ,其中简单地计算每个聚类内每对观察值的平均一致性值。**
Cluster consensus
接下来是项目共识 m_i(k) ,它关注于特定的项目或观察,并计算该项目对其集群中所有其他项目的平均共识值。**
Item consensus
使用这些汇总统计数据,我们可以根据它们的一致性对集群进行排序,或者确定在集群中处于中心的观察值。**
用于创建播放列表的 RShiny 应用
这款应用使用了 2017 年以来 Spotify 上的前 50 首歌曲。Spotify 为每首歌曲提供了各种属性,但缩放后只使用了数字值。该应用程序允许您尝试不同的 K 值和重采样迭代,以及其他参数选项,具体取决于所选的聚类算法。第一个可视化是一个 PCA 图,显示前两个 PC 和所有观察的聚类分配。使用主成分分析,我们可以在 2d 图中可视化所有特征,并查看我们的聚类方法工作得有多好。
Visual Heatmap
上图是使用分层聚类创建的热图示例,其中 K=10,n.iter = 26,距离=欧氏距离,链接=完整。正如你所看到的,观察结果并没有很好的聚集在一起,这导致了对角线以外的颜色。
这个应用程序不仅仅是创建播放列表。如果你愿意,你可以从我的 github上下载代码,然后输入你自己的数据集!它旨在帮助您直观地了解不同的聚类算法(及其各自的调整)如何使用一致聚类来执行。
重要注意事项
在某些情况下,数据可能无法进行聚类。换句话说,如果聚类本质上没有很好地分离,一致聚类仍然可能产生好看的聚类。考虑假阳性结果的可能性是很重要的,当真的没有假阳性结果时显示稳定性。
总结
共识聚类缓解了大多数聚类方法中出现的常见问题,如随机初始化、选择 K、直观可视化和评估聚类的稳定性。这种方法基于对数据集进行子采样并多次运行所选的聚类算法来收集聚类分配的共识。我们可以使用各种指标来验证我们选择的 k。我们还可以使用集群共识来评估集群,并使用项目共识来查看哪些项目最能代表给定的集群。提供了一个 RShiny 应用程序,以探索 Spotify 2017 年前 50 首歌曲的数据集上的共识聚类。****
该应用程序仍在进行中的工作,所以建议或更正是非常鼓励的!
阅读这篇很棒的论文,了解更多关于共识聚类的知识。
这里有一个链接指向 RShiny 应用以及 github 回购。如有任何问题,请随时联系 me !希望你喜欢这篇文章!
考虑到火星的环形山
【数据管理与可视化】,第 1 周
This 3-D stereo image taken by the Mars Exploration Rover Spirit’s navigation camera shows the rover’s lander and, in the background, the surrounding martian terrain. Original image from NASA/JPL at: https://mars.nasa.gov/mer/gallery/press/spirit/20040110a/2NN006EFF02CYP05A000M1-A8R1_br.jpg
目的
这篇文章是我在 Wesleyan 大学 Coursera 上的数据分析和解释专业的一系列相关课程的第一篇。在这个项目中,我将把数据科学工具应用到我选择的具体研究问题中;包括数据管理和可视化、建模和机器学习。我目前在第一个课程的第一周,数据管理和可视化。作为第一周的一部分,我选择了一个研究问题和数据集,我将在整个课程中继续研究。在接下来的几周,我将开始为这门课程设置我的第一个 Python 或 SAS 代码,包括我选择的数据集中变量的可视化。
话题范围
我有机会使用课程中提供的五个公开数据集中的一个。或者,我可以选择自己的公共数据集。然后,我必须提供一个与特定数据集相关的感兴趣的主题。经过考虑,我决定使用现有的选择之一。这是博尔德科罗拉多大学的斯图尔特·詹姆斯·罗宾斯在 2011 年对火星陨石坑进行研究时使用的数据集。该研究、密码本和数据集的链接在本文底部的参考资料部分。
在回顾了这些材料后,我决定对陨石坑的物理特征感兴趣,特别是直径(DIAM_CIRCLE_IMAGE)和深度(DEPTH_RIMFLOOR_TOPOG)。虽然形态学类别数据(形态学 _ 喷出物 _1 至 3)很有趣,但该数据不适用于数据集中列出的大多数陨石坑。此外,根据我现有的知识,形态学的可用数据可能很难解释。我已决定将我的个人密码本限制为以下变量,这些变量取自火星陨石坑密码本的列表
- CRATER_ID:内部使用的环形山 ID,基于行星的区域(1/16)、识别环形山的“通行证”以及识别环形山的顺序。
- LATITUDE_CIRCLE_IMAGE:从非线性最小二乘圆的衍生中心到所选顶点的纬度,以手动识别陨石坑边缘(单位为北纬十进制度)。
- LONGITUDE_CIRCLE_IMAGE:从拟合到所选顶点的非线性最小二乘圆的衍生中心开始的经度,用于手动识别陨石坑边缘(单位为东十进制度)。
- DIAM_CIRCLE_IMAGE:从非线性最小二乘圆拟合到选择的顶点的直径,以手动识别陨石坑边缘(单位为千米)。
- DEPTH_RIMFLOOR_TOPOG:沿陨石坑边缘(或内部)人工确定的 N 个点的平均高程(单位为 km)。
a.深度边缘:选择点作为相对地形高点,假设它们是侵蚀最少的,因此沿边缘的原始点最多。
b.深度底:点被选为最低海拔,不包括可见的嵌入式陨石坑。
我将重点讨论陨石坑直径和以公里为单位的深度之间是否存在关联。作为一个延伸目标,我将试图确定是否有一个次要的特征和陨石坑的位置之间的联系。后者在现有时间内可能无法实现。虽然有几个处理位置数据的 Python 库,例如 GeographicLib、GeoPandas 和 ArcPy,但这些库可能需要进行一些调整,以处理特定于火星的位置坐标系。
已有课题研究和假设
基于从火星轨道激光高度计获得的数据,在谷歌学术的一次搜索产生了一些关于火星陨石坑特征的早期研究。该研究在下面的参考文献部分列出。
此外,还有追溯到 20 世纪 90 年代的早期研究。上述和早期研究的数据集不容易比较。然而,Aharonson 的研究表明,某些物理特征,如直径和边缘坡度有相关性。由于边缘坡度与陨石坑的深度有些关系,我可以假设陨石坑的直径和深度彼此有直接的关系。在我开始分析之前,他们的相关程度目前还不清楚。
总结
我们已经讨论了这个初始帖子的目的,包括数据集的选择,以及基于数据集的研究主题的确定。此外,我们已经基于主题范围确定了数据集的个人码本的内容,并为我们的研究主题制定了假设。我们关于本课程的下一篇文章将关注于分析数据集的程序的创建和输出。感谢您花时间阅读这篇文章,我们将很快回来。
参考文献
Robbins,S. J. (2011),来自新的全球火星陨石坑数据库的行星表面特性、陨石坑物理学和火星火山历史。,网站:Stuart Robbins,天文/地球物理学家在网上,1–239,地址:http://about . sjrdesign . net/files/thesis/robbin thesis _ large MB . pdf,码本:https://d 396 qusza 40 orc . cloudfront . net/phoenix assets/data-management-visualization/Mars % 20 crater % 20 code book . pdf,数据集: https://d18ky98rnyallexpires = 1505865600&Signature = hlpupz 1s 7n 3 wxc 8 zztdon 5 u 7m 6 wzk ~ ogycatsslgxj 45 jjg 2 edw 6 xlgul-dtsfwzjpzon 3 qsfhnzhsqnsrjkowrm 7 oz GCT qx 1 iy 4 it JV 7 pyk qxrhnbedfjwalywkhlzlbk 8 bi 5 cke 5 JX ~ xxxfe ~ sgizuoe 4 l 1 fnwliaoxa _&
Aharonson,o .、M. T. Zuber 和 D. H. Rothman (2001 年),《火星轨道飞行器激光测高仪的火星地形统计:斜率、相关性和物理模型》,地球物理学杂志。Res .,106(E10),23723–23735,doi:10.1029/2000 je 001403。
与牛郎星主题一致的美丽的可视化
“rainbow frequency” by Ricardo Gomez Angel on Unsplash
如果你是一个数据可视化爱好者或者也使用python
的实践者,你可能听说过 Jake Vanderplas 和 Brian Granger 的altair
: “一个基于 Vega 和 Vega-lite 的用于 Python 的声明性统计可视化库”。
有了 Altair,你可以花更多的时间去理解你的数据及其意义。Altair 的 API 简单、友好、一致,建立在强大的 Vega-Lite 可视化语法之上。这种优雅的简单性用最少的代码产生了漂亮而有效的可视化效果。
在这篇文章中,我们将深入挖掘altair
的一个鲜为人知的特点:主题。
什么是altair
主题?
在altair
中,一个主题是在每个python
会话中全局应用的一组图表配置。这意味着您可以始终如一地生成外观相似的可视化效果。
为什么会有用?
也许你正在为你的博客开发一种个人风格,也许你所在的公司已经有了一种风格,也许你讨厌网格线,厌倦了每次创建图表时都把它们关掉。当您生成数据可视化时,有一个遵循的样式指南总是有好处的。
在本文中,我们将探讨如何通过重新创建城市研究所的数据可视化风格指南,在altair
中实现一个风格指南,而不是解释你的可视化中风格指南和一致性的价值。
altair
中的主题
下面是文档中的一个简单示例:
**import** altair **as** alt
**from** vega_datasets **import** data*# define the theme by returning the dictionary of configurations*
**def** black_marks():
**return** {
'config': {
'view': {
'height': 300,
'width': 400,
},
'mark': {
'color': 'black',
'fill': 'black'
}
}
}*# register the custom theme under a chosen name*
alt.themes.register('black_marks', black_marks)*# enable the newly registered theme*
alt.themes.enable('black_marks')*# draw the chart*
cars **=** data.cars.url
alt.Chart(cars).mark_point().encode(
x**=**'Horsepower:Q',
y**=**'Miles_per_Gallon:Q'
)
height
和width
仍然与默认主题相同,但是我们现在已经包括了color
和fill
值,这些值将被全局地**(除非另有说明)应用于从此刻起直到这个 python
会话结束为止生成的任何图表。**
这相当于
alt.Chart(cars).mark_point(color **=** 'black', fill **=** 'black').encode(
x**=**'Horsepower:Q',
y**=**'Miles_per_Gallon:Q'
)
在返回的black_marks
config
字典中,您可以看到我们为mark
中的键color
和fill
指定了值black
。这是所有这些规范遵循的格式。例如,如果您想要配置左轴标签的字体大小:
**def** my_theme():
**return** {
'config': {
'view': {
'height': 300,
'width': 400,
},
'mark': {
'color': 'black',
'fill': '#000000',
},
'axisLeft': {
'labelFontSize': 30,
},
}
}*# register the custom theme under a chosen name*
alt.themes.register('my_theme', my_theme)*# enable the newly registered theme*
alt.themes.enable('my_theme')
(旁注:可以从 Vega-Lite 的文档 中获取这些 规格 (即 *'axisLeft'*
如果你或你的公司有你必须遵循的风格指南,这可能特别有用。即使你没有风格指南,你也可以通过在你的个人主题上保存你的配置而不是在你的 viz 代码中开始建立一个风格指南(从长远来看这是值得的!).
Vega 已经在 GitHub 上有了一些主题。
fivethirtyeight
excel
ggplot2
vox
所以让我们建立一个 简化的 城市学院的altair
主题。
城市学院风格的这个 简化版 的所有信息都可以从他们的 GitHub 页面的这个图中找到。
这个主题的基本结构如下:
***def** theme_name():**return** {
"config": {
"TOP_LEVEL_OBJECT": { *# i.e. "title", "axisX", "legend",*
"CONFIGURATION": "VALUE",
"ANOTHER_ONE": "ANOTHER_VALUE",
"MAYBE_A_SIZE": 14, *# values can be a string, boolean, or number,*
},
"ANOTHER_OBJECT": {
"CONFIGURATION": "VALUE",
}
}
}*
我们将配置顶级对象“标题”、“ axisX ”、“ axisY ”、“范围”和“图例”,以及其他一些一行程序规范。
现在,我们马上看到 Urban 在所有文本上使用“Lato”字体,我们可以将其保存为一个变量,这样我们就不必重复使用它。
- 标题
Urban 的标题大小为 18px,Lato 字体,左对齐,黑色。
***def** urban_theme():
font **=** "Lato"**return** {
"config": {
"title": {
"fontSize": 18,
"font": font,
"anchor": "start", *# equivalent of left-aligned.*
"fontColor": "#000000"
}
}
}*
此时,你可以注册和启用这个主题,并且在这个python
会话中你所有的altair
图表将会有一个看起来像城市研究所的标题。**
**# register*
alt.themes.register("my_custom_theme", urban_theme)
*# enable*
alt.themes.enable("my_custom_theme")*
旁注
如果您的计算机中没有安装“Lato”字体,您可以在单元格中运行此代码,暂时将它从 Google Fonts 导入到您的浏览器中。
***%%**html
**<**style**>**
@**import** url('https://fonts.googleapis.com/css?family=Lato');
**</**style**>***
- axisX 和 axisY
在市区,X 轴和 Y 轴略有不同。x 轴有一条在altair
被称为域的线,这条线穿过轴。y 轴没有这个(类似于seaborn
的sns.despine()
)。y 轴有网格线,X 轴没有。x 轴有刻度,Y 轴没有。但两者都有同样大小的标签和标题。**
***def** urban_theme():
*# Typography*
font **=** "Lato"
*# At Urban it's the same font for all text but it's good to keep them separate in case you want to change one later.*
labelFont **=** "Lato"
sourceFont **=** "Lato" *# Axes*
axisColor **=** "#000000"
gridColor **=** "#DEDDDD"**return** {
"config": {
"title": {
"fontSize": 18,
"font": font,
"anchor": "start", *# equivalent of left-aligned.*
"fontColor": "#000000"
},
"axisX": {
"domain": **True**,
"domainColor": axisColor,
"domainWidth": 1,
"grid": **False**,
"labelFont": labelFont,
"labelFontSize": 12,
"labelAngle": 0,
"tickColor": axisColor,
"tickSize": 5, *# default, including it just to show you can change it*
"titleFont": font,
"titleFontSize": 12,
"titlePadding": 10, *# guessing, not specified in styleguide*
"title": "X Axis Title (units)",
},
"axisY": {
"domain": **False**,
"grid": **True**,
"gridColor": gridColor,
"gridWidth": 1,
"labelFont": labelFont,
"labelFontSize": 12,
"labelAngle": 0,
"ticks": **False**, *# even if you don't have a "domain" you need to turn these off.*
"titleFont": font,
"titleFontSize": 12,
"titlePadding": 10, *# guessing, not specified in styleguide*
"title": "Y Axis Title (units)",
*# titles are by default vertical left of axis so we need to hack this*
"titleAngle": 0, *# horizontal*
"titleY": **-**10, *# move it up*
"titleX": 18, *# move it to the right so it aligns with the labels*
},}
}*
如果你注册 ed 并且启用* d 这个主题,你会得到一个看起来有点像城市研究所图表的东西。但是让你马上知道你正在看一个城市研究所的数据可视化的是颜色。***
在altair
中,你有scales
与domain
和range
。这些是"函数,将数据域中的值(数字、日期、字符串等)转换为编码通道的可视值(像素、颜色、大小)。因此,如果你想添加一个默认的配色方案,你所要做的就是在你的主题中编码顶层对象"range"
的值。
我们将这些值保存为列表main_palette
和sequential_palette
。城市研究所的数据可视化风格指南有很多颜色组合。我们将这两个编码为默认值,但是当涉及到颜色时,您很可能会在移动中修改您的数据可视化。
***def** urban_theme():
*# Typography*
font **=** "Lato"
*# At Urban it's the same font for all text but it's good to keep them separate in case you want to change one later.*
labelFont **=** "Lato"
sourceFont **=** "Lato" *# Axes*
axisColor **=** "#000000"
gridColor **=** "#DEDDDD" *# Colors*
main_palette **=** ["#1696d2",
"#d2d2d2",
"#000000",
"#fdbf11",
"#ec008b",
"#55b748",
"#5c5859",
"#db2b27",
]
sequential_palette **=** ["#cfe8f3",
"#a2d4ec",
"#73bfe2",
"#46abdb",
"#1696d2",
"#12719e",
]**return** {
"config": {
"title": {
"fontSize": 18,
"font": font,
"anchor": "start", *# equivalent of left-aligned.*
"fontColor": "#000000"
},
"axisX": {
"domain": **True**,
"domainColor": axisColor,
"domainWidth": 1,
"grid": **False**,
"labelFont": labelFont,
"labelFontSize": 12,
"labelAngle": 0,
"tickColor": axisColor,
"tickSize": 5, *# default, including it just to show you can change it*
"titleFont": font,
"titleFontSize": 12,
"titlePadding": 10, *# guessing, not specified in styleguide*
"title": "X Axis Title (units)",
},
"axisY": {
"domain": **False**,
"grid": **True**,
"gridColor": gridColor,
"gridWidth": 1,
"labelFont": labelFont,
"labelFontSize": 12,
"labelAngle": 0,
"ticks": **False**, *# even if you don't have a "domain" you need to turn these off.*
"titleFont": font,
"titleFontSize": 12,
"titlePadding": 10, *# guessing, not specified in styleguide*
"title": "Y Axis Title (units)",
*# titles are by default vertical left of axis so we need to hack this*
"titleAngle": 0, *# horizontal*
"titleY": **-**10, *# move it up*
"titleX": 18, *# move it to the right so it aligns with the labels*
},
"range": {
"category": main_palette,
"diverging": sequential_palette,
}}
}*
此时,默认情况下,您的主题将具有城市研究所的标题、轴和颜色配置。很酷,但这不是你能做的全部。
让我们添加一个默认的图例配置。这一次我们将稍微偏离样式指南,因为图例的位置取决于手边的图表(在 Vega-lite 中不能有水平图例)。
该代码还包括“视图”和“背景”配置,无需过多解释,简单易懂。还包括“区域”、“线”、“轨迹”、“条”、“点”等标识的配置。这只是为每个特定的标记设置正确的颜色。
***def** urban_theme():
*# Typography*
font **=** "Lato"
*# At Urban it's the same font for all text but it's good to keep them separate in case you want to change one later.*
labelFont **=** "Lato"
sourceFont **=** "Lato" *# Axes*
axisColor **=** "#000000"
gridColor **=** "#DEDDDD" *# Colors*
main_palette **=** ["#1696d2",
"#d2d2d2",
"#000000",
"#fdbf11",
"#ec008b",
"#55b748",
"#5c5859",
"#db2b27",
]
sequential_palette **=** ["#cfe8f3",
"#a2d4ec",
"#73bfe2",
"#46abdb",
"#1696d2",
"#12719e",
]**return** {
*# width and height are configured outside the config dict because they are Chart configurations/properties not chart-elements' configurations/properties.*
"width": 685, *# from the guide*
"height": 380, *# not in the guide*
"config": {
"title": {
"fontSize": 18,
"font": font,
"anchor": "start", *# equivalent of left-aligned.*
"fontColor": "#000000"
},
"axisX": {
"domain": **True**,
"domainColor": axisColor,
"domainWidth": 1,
"grid": **False**,
"labelFont": labelFont,
"labelFontSize": 12,
"labelAngle": 0,
"tickColor": axisColor,
"tickSize": 5, *# default, including it just to show you can change it*
"titleFont": font,
"titleFontSize": 12,
"titlePadding": 10, *# guessing, not specified in styleguide*
"title": "X Axis Title (units)",
},
"axisY": {
"domain": **False**,
"grid": **True**,
"gridColor": gridColor,
"gridWidth": 1,
"labelFont": labelFont,
"labelFontSize": 12,
"labelAngle": 0,
"ticks": **False**, *# even if you don't have a "domain" you need to turn these off.*
"titleFont": font,
"titleFontSize": 12,
"titlePadding": 10, *# guessing, not specified in styleguide*
"title": "Y Axis Title (units)",
*# titles are by default vertical left of axis so we need to hack this*
"titleAngle": 0, *# horizontal*
"titleY": **-**10, *# move it up*
"titleX": 18, *# move it to the right so it aligns with the labels*
},
"range": {
"category": main_palette,
"diverging": sequential_palette,
},
"legend": {
"labelFont": labelFont,
"labelFontSize": 12,
"symbolType": "square", *# just 'cause*
"symbolSize": 100, *# default*
"titleFont": font,
"titleFontSize": 12,
"title": "", *# set it to no-title by default*
"orient": "top-left", *# so it's right next to the y-axis*
"offset": 0, *# literally right next to the y-axis.*
},
"view": {
"stroke": "transparent", *# altair uses gridlines to box the area where the data is visualized. This takes that off.*
},
"background": {
"color": "#FFFFFF", *# white rather than transparent*
},
*### MARKS CONFIGURATIONS ###*
"area": {
"fill": markColor,
},
"line": {
"color": markColor,
"stroke": markColor,
"strokeWidth": 5,
},
"trail": {
"color": markColor,
"stroke": markColor,
"strokeWidth": 0,
"size": 1,
},
"path": {
"stroke": markColor,
"strokeWidth": 0.5,
},
"point": {
"filled": **True**,
},
"text": {
"font": sourceFont,
"color": markColor,
"fontSize": 11,
"align": "right",
"fontWeight": 400,
"size": 11,
},
"bar": {
"size": 40,
"binSpacing": 1,
"continuousBandSize": 30,
"discreteBandSize": 30,
"fill": markColor,
"stroke": **False**,
},}
}*
边注
我个人将这些主题保存在一个.py
脚本中
***import** altair **as** alt
alt.themes.register("my_custom_theme", urban_theme)
alt.themes.enable("my_custom_theme")*
在我的笔记本上。
以下是用该主题创建的一些图表示例。
条形图
面积图(分类)
面积图(顺序)
折线图
有很多方法来配置你的主题,我鼓励你尝试很多不同的东西。你可以把我们刚刚整理好的主题和价值观结合起来。使用不同的字体,字体大小,配色方案。有网格线,没有网格线。给你的斧子贴上非常非常大的标签。做你想做的事情,但是把它保存在某个地方,这样你就可以在它的基础上发展你的个人风格。
虽然你可能想在[altair](http://altair-viz.github.io)
文档中查找更多这方面的信息,但我发现使用 Vega-lite 文档更好。毕竟,altair
是 Vega-lite 的 python-wrapper。
所有的图片和代码都可以在这个 GitHub repo 中找到。
有什么意见,问题,建议吗?我在 twitter 、 linkedin 和 Instagram 。
构建用于荟萃分析的轮廓增强漏斗图
元分析被用来综合大量的研究,在指导政策时可以发挥相当大的作用。然而,这种方法的一个很大的局限性是纳入荟萃分析的研究可能会有偏差。
出版偏见是众所周知的偏见来源。例如,研究人员可能会搁置那些没有统计学意义的研究,因为期刊不太可能发表这类结果。研究人员也可能使用有问题的研究实践——也被称为p——黑客——来将一个效应推到统计学意义上。
P-hacking in action
因此,在进行荟萃分析时,需要考虑发表偏倚的风险。
在荟萃分析中,通常使用两种相互关联的方法来评估发表偏倚的风险。首先,通过构建一个漏斗图来可视化发表偏倚的风险,该漏斗图将效应大小的测量值与测量值方差(例如,标准误差)可视化,漏斗以汇总效应大小为中心。
让我们考虑下面图 1 中的两个漏斗图。
Figure 1
图 1A 似乎是相当对称的,具有大致相同数量的研究,无论是总体效果大小(即漏斗中间的垂直线)。方差越大的研究,其总体效应大小的分布越大,越接近图的底部。相比之下,1B 的身材并不匀称。似乎方差较大的研究(即参与者较少的研究)仅落在汇总效应大小的右侧。许多研究人员会得出结论,由于明显的不对称性,数字 1B 是发表偏倚的象征。
Egger 的回归检验通常被用作漏斗图不对称性的客观测量,因为它评估了影响大小和抽样方差之间的关系。统计上显著的影响表明漏斗图不对称。
现在让我们考虑图 2 中的两个漏斗图,每个漏斗图有十个效果大小。
Figure 2
两个图都显示了不对称性,但注意到了观察结果的差异(即效应大小)。图 2A 中的效果尺寸范围从 0.2 到 0.65,而图 2B 中的效果尺寸范围从-0.1 到 0.35。
对于给定的效应大小和方差范围,可以计算这两个变量任意组合的统计显著性。因此,您可以通过构建所谓的轮廓增强漏斗图,在传统漏斗图上可视化一组显著性阈值。
图 3 中的漏斗图是图 2 中的图的复制,除了具有统计显著性的关键区域已经叠加在漏斗上,并且该图现在以零为中心。红色区域显示在 p = .1 和 p = .05 之间的效果,橙色区域显示在 p = .05 和 p = .01 之间的效果。白色区域的效果大于 p = .1,灰色区域的效果小于 p = .01。
Figure 3
对这两个图进行 Egger 的回归测试得到了相同的结果( z = 2.78, p = 0.01),这表明了不对称性。然而,在图 3A 中,有明显的研究模式落入漏斗右侧的统计显著性通道。图 3B 显示了明显的不对称性,但没有一项研究具有统计学意义。
图 3 说明了漏斗图和 Egger 的回归测试只评估了小型研究偏差的风险,因为小型研究往往具有更大的方差。当然,不对称图可能是由于出版偏差,但可能有其他原因可以更好地解释漏斗图不对称。例如,方差较大的较小研究与较差的研究设计有关。
以下是如何为你自己的元分析绘制这些图,使用 r。
在 R 中使用 Metafor 包的轮廓增强漏斗图
metafor R 包提供了一种构建高度可定制的轮廓增强漏斗图的简单方法。
以下 R 脚本将生成一个标准漏斗图和三个不同的轮廓增强漏斗图。
图 4A 是一个标准的漏斗图。图 4B 是轮廓增强漏斗图——注意,垂直参考线现在为零(而不是像图 4A 那样的综合效果大小)。图 4C 增加了一点颜色,图 4D 将轮廓线调整为一条在 p = .05 和 p = .01 之间的单一轮廓。
Figure 4
使用 R 进行分析的众多好处之一是,您可以轻松地将分析脚本与您的手稿共享。如果你是 R 的新手,你应该看看我的逐步教程论文来使用 R 进行你自己的相关性元分析。我还整理了一个配套的视频,如果那更适合你的话。
公开材料通常是为了促进其他科学家重现你的分析。然而,你会很快了解到,开放材料的最大受益者之一是你的未来,因为当你需要重新分析时。
最后的想法
轮廓增强漏斗图提供了大量研究中报告的统计显著性模式的便捷可视化。虽然它们是对传统漏斗图的有益补充,传统漏斗图只能显示小规模研究偏差,但它们不能用于客观评估 p-hacking 的风险,或给定领域中效应规模膨胀的程度。尽管有这些限制,漏斗图仍然可以为荟萃分析提供有价值的补充,因为它们很容易放在一起。
如果你喜欢这篇文章,你可能也会喜欢我共同主持的元科学播客【T2 万物赫兹】。这是我们关于元分析的一集。
咨询——试火
在咨询环境中评估他们的第一个项目时,应该从哪里开始?当一个人对一切都是陌生的时候。新行业,新职场动态,新编码平台,新城市新状态?新,新,新,新,新!这就是我在 Lenati 开始数据科学职业生涯两个月的地方。
和大多数新项目一样,我带着极大的热情和健康的焦虑进入。在我职业生活之外的生活中发生了这么多事情,我想如果我要成功,每件事都必须精心计划和详细记录。
第 1 课——咨询有一个陡峭的学习曲线
我们都在学习。因此,预期并不总是很明确,客户经常会改变项目的优先级和愿景。随波逐流,并能够随着优先事项的变化而无缝转换是一项需要培养的基本应对技能。
我在能源行业多年来已经习惯了这一点,但将这些经验应用到新的领域总是一个陡峭的学习曲线。
第二课——没有事情会按计划进行
时间表是愿望清单。如果项目一切顺利,这就是我们期望能够在一定时间内完成的事情。那个 6 周的项目?不,它可能会更接近 4 周,一旦你获得访问数据和评估你可以提供什么。
在咨询行业,对意外情况进行解释是一条很难走的路。这在我的第一个咨询项目中表现得非常明显。当你的客户在你的公司之外时,在交付时间和项目截止日期上的灵活性要小得多。
即使事情进展顺利,方向似乎很明确,我也遇到了另一个挑战,我的新行业的命名和指标。当我在能源行业开始职业生涯时,我回忆起那些恐惧的时刻,当时我只听懂十分之一的对话。在几个月的时间里,我流利地说着这种语言。我认为这将是向营销行业的类似转变。
虽然我很快就学会了行话,但要学会营销中常用的指标似乎要慢得多。
第 3 课—指标为王
作为 Lenati 的一名数据科学家,了解哪些指标对营销专业人员来说很重要,这对于我的工作至关重要。能够为业务顾问和项目经理提供适当的图表和指标来支持他们的程序设计,并提供必要的见解,对我来说是一个比我最初预期的更大的挑战。花时间阅读行业标准并保持沟通渠道畅通是关键。我并不总是做对,但是每一次,我都会吸取我所学到的经验来提高效率。
一旦度量标准被建立,程序设计被“锁定”,我就开始对数据进行更深入的分析,为客户流失建模。一个简单的逻辑回归是可取的,但是,我想挖得更深一点。参数优化、模型调整和特征工程,以提供深刻的见解,加深对客户的了解。深入挖掘和了解更多顾客群的感觉棒极了。
然而,我错了,完全把事情复杂化了。
第四课——接吻(保持简单,笨蛋!)
简单的逻辑回归和流线型的工作流程是优先考虑的。我应该从我在石油和天然气行业的日子里学到这一课,因为我们在资源勘探和评估的早期阶段保持模型简单。新行业,同样的策略。最简单的模型通常能提供决策所需的 90%的解决方案。时间最好花在创建一个稳定的管道/基础设施来交付结果,而不是优化模型。
幸运的是,凭借 9 年支持和交付适合目的模型的经验,我学到了许多与开发适合目的模型相关的经验。现在,我满怀信心地将这些经验应用于营销行业。学习市场营销中模型开发的阶段与能源行业并无不同,只是不同的特征和规模。
保持简单是很自然的事情,然而,在让自己沉浸在新的编码语言、数据结构和报告结构中的同时做到这一点是另一件棘手的事情。在你的逻辑过程中尽早并经常保存,这不仅是组织你的想法的关键,也是在你不在的时候让同事复制你的工作的关键。
第五课——永远要存钱(Ctrl+s 所有的东西)!
在拥有可重复代码方面,总是超越自我。特别是在早期,我在文档方法和几个来源(git、实体笔记本、markdown 等)之间徘徊。).留出时间来记录你的个人工作流程和 保存 当最后一分钟请求表格 xyz 时,每一步都是必不可少的。这会让你和你的老板开心。熟能生巧,在休息时间练习,为下一个项目做得更好。
然而,对你的工作的长期可行性保持现实的期望。大量的时间和精力可以投入到一个项目中,只是为了在接下来的 10-20 年里搁置起来。对我来说,接受你的工作的长期价值是一个持续的斗争。
我转向咨询环境的原因之一是能够对关键业务决策产生影响。
第 6 课—工作的长期可行性未知
你将对商业决策产生影响。你的工作影响的持续时间是未知的。随着时间的推移,这可能会改变,但最终,这是客户对客户的决定,以评估我的工作的长期可行性。谢天谢地,这将有助于我一生中做出一个决定。我能在工作中找到目标和价值。
我重视能够看到许多项目,并迅速产生影响,为关键业务决策提供信息。这最终会让我在营销界获得成功。我自己的成功,Lenati 的成功和我客户的成功。每个人都赢了,我继续成长和学习…
在我的职业支点系列中补上或回顾以前的条目:为什么地球科学家成为优秀的数据科学家、填补知识空白、设计求职、解读工作描述、面试困境和为什么我选择咨询/营销。
咨询?为什么咨询?
如果你一直在关注这件事,并且查看了我在 LinkedIn 上的简介,你可能已经注意到我在 Lenati 找到了一份咨询工作。
我在 Lenati 进行行为面试时,以及在其他与公司打交道的时候,有人问我,“为什么要咨询?”以及“为什么营销?”我发现第一个问题比第二个更容易表达。
为什么咨询?
对我来说,可以归结为四大需求:
- 一家可以迅速培养我的技术技能的公司。
- 一个我能以有意义的方式利用我过去的公司经验的地方。
- 领导力的成长空间。
- 在这个地方,我可以看到自己与同事一起合作,以实现我们个人/专业和公司范围的目标。
咨询公司允许个人通过快速周转(通常是 2 周冲刺到更少的 6 个月以上的约定)为客户接触许多项目,以提供洞察力来回答直接的业务问题。不要把这和员工扩充公司混为一谈,在那里你作为外部顾问被直接安排在客户团队中。他们都有自己的位置,但我希望看到更广泛的客户如何组织他们的业务。
咨询似乎很适合我的下一个角色,但由于有各种各样的选择,很容易迷失在机会的海洋中。
Lenati 希望提高他们的客户洞察力和分析实践,以利用量化方法为营销计划和战略提供信息。我有机会成为公司的第四号数据科学家,负责一个备受瞩目的忠诚度计划设计项目。
Lenati 很好地帮助我实现了我的目标,甚至更多。
- 一家可以迅速培养我的技术技能的公司。— 有了快速的项目周转和高效的“休息”时间(技术产品工作的项目休息时间),如果我不快速成长,我就会被淹没。
- 一个我能以有意义的方式利用我过去的公司经验的地方。— 我带来的最大资产是我的不确定性和风险评估,用于 ROI 计算和故事板。我习惯了模棱两可和讲故事(地质学家讲非常不确定的话题的伟大故事)。我已经能够成功地将这一点转化为市场前景和我们的客户。
- 领导力的成长空间。— 我们的业务在增长,我能够加快并领导内部和外部项目。我已经赢得了一定程度的尊重,并被信任来履行职责。在某种程度上,小规模的实践需要领导力。如果没有个体从业者在必要的时候带头,什么也做不了。
- 在这个地方,我可以看到自己与同事一起合作,以实现我们个人/专业和公司范围的目标。总的来说,这是我选择 Lenati 的一个最重要的方面。在面试过程中,我在未来的同事身边感受到了一种在其他任何地方都找不到的舒适感。办公室给了我一种欢迎的氛围,让我想和他们一起工作,一起成长。
对我来说更难说出的答案是:
为什么营销?
作为一个人,我通过每一个可以想到的渠道被推销,并且对每一个推销手段都持怀疑态度。
我相信部分原因是因为我为自己是一个相对理性的人而自豪。营销和销售似乎总是违背我的理性思维。为什么有人会买他们不想要或不需要的东西?那笔交易好得难以置信吗?是什么让我父亲买了所有那些“没用”的电视购物小玩意(他买了不止一个,而是两个(编辑: 三个*)flow bees)?*
Yes, my Father used this for ~20 years due to clever marketing. I was a skeptic…and almost victim to it as a teen.
然而,在找工作的过程中,我和自己达成了一个协议,那就是听从的每一次推销。从理性的角度看待它们,不要被我先入为主的观念所影响。**
我在和 Lenati 的招聘人员交谈之前做了调查。我查看了他们的客户组合以及他们在过去几年中交付的一些项目。说我印象深刻是很温和的。我被吹走了。
什么是莱纳提?
Lenati 是一家营销和销售战略咨询公司,帮助公司获得、发展和留住客户。我们的客户来找我们是为了建立市场领导地位,无论是通过激进创新还是智能进化。”
Lenati 培养的主要实践是:客户体验、客户获取、客户保持和忠诚度、走向市场战略以及客户洞察和分析。
客户洞察和分析业务的成员除了支持跨业务的大型项目之外,还有机会领导分析项目。我的第一个项目是支持一个重要的高知名度零售忠诚度项目。
如果你问我我最大的三个特点是什么,忠诚会是最重要的。一开始我可能会怀疑,但是我很忠诚,很真实!当我看到 Lenati 在消费者忠诚度领域的多样性和影响力时,我的兴趣大增。
那么, 为什么要营销?在莱纳提,这是双重的:
- 客户组合——我可以浏览徽标列表,并为能在这些公司中的任何一家工作而感到自豪。
- 项目组合——帮助人们更深入地参与他们已经了解并喜爱的公司,并使他们的整体体验更好。这是我可以真正支持和发展的营销。
到目前为止,在 Lenati 工作期间,我有机会为零售和技术领域的各种公司的许多项目工作。我交付过各种项目,从忠诚度计划设计到 ROI 建模,再到客户之声分析。
我会长期从事咨询工作吗?那确实是悬而未决的。然而,我会为我的简历上有莱纳蒂而骄傲。人们很棒,工作是一流的,它为营销分析提供了令人惊叹的沉浸感。
请继续关注我的下一集,我将概述我从第一个咨询项目中学到的经验。
在我的职业支点系列中补上或回顾以前的条目:为什么地球科学家成为优秀的数据科学家、填补知识空白、构建求职框架、解读工作描述和面试困境。
它已经引起了我的注意,年轻的人和那些不是来自美国的人可能不熟悉令人惊讶的,不可思议的,Flowbee。关于演示,请看这个古老的 YouTube 视频。对于发人深省的评论,请访问亚马逊网站。
Glowing reviews are justified, my father’s Flowbee haircut was pretty great. (photo circa mid-90’s).
基于内容的 NYT 文章推荐系统
数据产品。数据科学。自然语言处理
介绍
我们将为纽约时报的文章创建一个基于内容的推荐器。这个推荐器是一个非常简单的数据产品的例子。
我们将根据用户当前阅读的文章推荐他们应该阅读的新文章。我们将通过基于那篇文章的文本数据推荐类似的文章来做到这一点。
查看我的 Github 个人资料上的代码。
数据科学投资组合。通过在 GitHub 上创建一个帐户,为 databast 03/databast 开发做出贡献。
github.com](https://github.com/DataBeast03/DataBeast/blob/master/NYT_Recommender/Content_Based_Recommendations.ipynb)
检查数据
以下是我们数据集中第一篇 NYT 文章的摘录。显然,我们正在处理文本数据。
'TOKYO — State-backed Japan Bank for International Cooperation [JBIC.UL] will lend about 4 billion yen ($39 million) to Russia\'s Sberbank, which is subject to Western sanctions, in the hope of advancing talks on a territorial dispute, the Nikkei business daily said on Saturday, [...]"
所以我们必须回答的第一个问题是,我们应该如何对它进行矢量化?我们如何着手设计新的特征,如词类、N-grams、情感分数或命名实体?!
显然 NLP 隧道很深,我们可以花几天时间来试验不同的选项。但是所有好的科学都是从尝试最简单可行的解决方案开始,然后迭代到更复杂的方案。
在本文中,我们将实现一个简单可行的解决方案。
分割您的数据
首先,我们需要确定数据集中哪些特征是我们感兴趣的,对它们进行洗牌,然后将数据分成训练集和测试集——所有这些都是标准的数据预处理。
# move articles to an array
articles = df.body.values# move article section names to an array
sections = df.section_name.values# move article web_urls to an array
web_url = df.web_url.values# shuffle these three arrays
articles, sections, web_ur = shuffle(articles, sections, web_url, random_state=4)# split the shuffled articles into two arrays
n = 10# one will have all but the last 10 articles -- think of this as your training set/corpus
X_train = articles[:-n]
X_train_urls = web_url[:-n]
X_train_sections = sections[:-n]# the other will have those last 10 articles -- think of this as your test set/corpus
X_test = articles[-n:]
X_test_urls = web_url[-n:]
X_test_sections = sections[-n:]
文本矢量器
我们可以从几个不同的文本矢量器中进行选择,比如单词袋(BoW)Tf-Idf、 Word2Vec 等等。
以下是我们应该选择 Tf-Idf 的一个原因:
与 BoW 不同,Tf-Idf 不仅通过文本频率,还通过逆文档频率来识别单词的重要性。
因此,举例来说,如果像“奥巴马”这样的词在一篇文章中只出现几次(不像停用词“a”或“the ”,它们不传达太多信息),但在几篇不同的文章中出现,那么它将被给予较高的权重。
这是有道理的,因为“奥巴马”不是一个停用词,也不是在没有充分理由的情况下被提及(即,它与文章的主题高度相关)。
相似性度量
当选择相似性度量时,我们有几个不同的选项,例如 Jacard 和 Cosine 来命名一对。
Jacard 通过比较两个不同的集合并选择重叠的元素来工作。考虑到我们已经选择使用 Tf-Idf 作为矢量器,Jacard 相似性作为选项没有意义;如果我们选择 BoWs 矢量化,使用 Jacard 可能更有意义。
我们应该选择余弦作为我们的相似性度量的原因是因为它作为选择 Tf-Idf 作为我们的矢量器的选项是有意义的。
由于 Tf-Idf 为每篇文章中的每个令牌提供了权重,因此我们可以计算不同文章的令牌的权重之间的点积。
如果文章 A 对于像“Obama”和“White House”这样的标记具有高权重,文章 B 也是如此,那么与文章 B 对于那些相同的标记具有低权重的情况相比,它们的产品将产生更大的相似性得分(为了简单起见,假设所有其他标记权重都被认为是同意的)。
构建推荐器
这部分是神奇发生的地方!
在这里,您将构建一个函数,根据用户当前阅读的文章与语料库中所有其他文章之间的相似性得分(即“训练”数据),输出前 N 篇文章推荐给用户。
def get_top_n_rec_articles(X_train_tfidf, X_train, test_article, X_train_sections, X_train_urls, n = 5):
'''This function calculates similarity scores between a document and a corpus
INPUT: vectorized document corpus, 2D array
text document corpus, 1D array
user article, 1D array
article section names, 1D array
article URLs, 1D array
number of articles to recommend, int
OUTPUT: top n recommendations, 1D array
top n corresponding section names, 1D array
top n corresponding URLs, 1D array
similarity scores bewteen user article and entire corpus, 1D array
'''
# calculate similarity between the corpus (i.e. the "test" data) and the user's article
similarity_scores = X_train_tfidf.dot(test_article.toarray().T) # get sorted similarity score indices
sorted_indicies = np.argsort(similarity_scores, axis = 0)[::-1] # get sorted similarity scores
sorted_sim_scores = similarity_scores[sorted_indicies] # get top n most similar documents
top_n_recs = X_train[sorted_indicies[:n]] # get top n corresponding document section names
rec_sections = X_train_sections[sorted_indicies[:n]] # get top n corresponding urls
rec_urls = X_train_urls[sorted_indicies[:n]]
# return recommendations and corresponding article meta-data
return top_n_recs, rec_sections, rec_urls, sorted_sim_scores
上述函数按以下顺序工作
- 计算用户文章和我们语料库的相似度
- 从最高相似度到最低相似度排序分数
- 获取前 N 篇最相似的文章
- 获取相应的前 N 篇文章部分名称和 URL
- 返回前 N 篇文章、版块名称、URL 和分数
验证结果
既然我们已经为用户推荐了阅读的文章(基于他们当前正在阅读的内容),检查一下结果是否有意义。
我们来对比一下用户的文章和对应的版块名与推荐的文章和对应的版块名。
首先让我们来看看相似性得分。
# similarity scores
sorted_sim_scores[:5]
# OUTPUT:
# 0.566
# 0.498
# 0.479
# .
# .
分数不是很高(注意余弦相似度从 0 到 1)。我们如何改进它们?我们可以选择不同的矢量器,比如 Doc2Vec。我们还可以探索不同的相似性度量。即便如此,我们还是来看看结果吧。
# user's article's section name
X_test_sections[k]
# OUTPUT:
'U.S'# corresponding section names for top n recs
rec_sections
# OUTPUT:
'World'
'U.S'
'World'
'World'
'U.S.'
好的,所以推荐的版块名称看起来很合适。那就好!
# user's article
X_test[k]'LOS ANGELES — The White House says President Barack Obama has told the Defense Department that it must ensure service members instructed to repay enlistment bonuses are being treated fairly and expeditiously.\nWhite House spokesman Josh Earnest says the president only recently become aware of Pentagon demands that some soldiers repay their enlistment bonuses after audits revealed overpayments by the California National Guard. If soldiers refuse, they could face interest charges, wage garnishments and tax liens.\nEarnest says he did not believe the president was prepared to support a blanket waiver of those repayments, but he said "we\'re not going to nickel and dime" service members when they get back from serving the country. He says they should not be held responsible for fraud perpetrated by others.'
好吧,用户的文章是关于支付给国民警卫队成员的超额报酬。
现在让我们来看看前 N 篇推荐文章中的一些摘录:
# article one
'WASHINGTON — House Speaker Paul Ryan on Tuesday called for the Pentagon to immediately suspend efforts to recover enlistment bonuses paid to thousands of soldiers in California, [...]'# article two
'WASHINGTON — The Latest on enlistment bonuses the Pentagon is ordering California National Guard soldiers to repay [...]'# article three
'SACRAMENTO, Calif. — Nearly 10,000 California National Guard soldiers have been ordered to repay huge enlistment bonuses a decade after signing up to serve in Iraq and Afghanistan [...]'# article four
'WASHINGTON — The Pentagon worked Wednesday to stave off a public relations nightmare, suspending efforts to force California National Guard troops who served in Iraq and Afghanistan to repay their enlistment bonuses [...]'# article five
'SACRAMENTO, Calif. — The Latest on enlistment bonuses the Pentagon is ordering California National Guard soldiers to repay [...]'
好啊好啊!看来我们的推荐人确实很成功。所有前五名推荐的文章都与读者当前阅读的内容完全相关。还不错。
关于验证的说明
我们比较推荐文本和节名的特别验证过程表明,我们的推荐器如我们所愿地工作。
手动梳理结果对于我们的目的来说很好,但是我们最终想要做的是创建一个完全自动化的验证过程,以便我们可以在生产中移动我们的推荐器,并让它进行自我验证。
将这个推荐器投入生产超出了本文的范围。本文旨在展示如何在真实数据集上构建这样一个推荐器的原型。
结论
在本文中,我们展示了如何为纽约时报的文章构建一个简单的基于内容的推荐器。我们看到,我们只需要选择一个文本矢量器和相似性度量来构建一个。然而,我们选择哪种矢量器和相似性度量会极大地影响性能。
你可能已经注意到,在我们的推荐器中没有任何实际的机器学习。我们真正拥有的是记忆和相似分数的排序。
附加资源
情境强盗和强化学习
Source: https://blog.iterable.com/why-you-should-become-a-multi-armed-bandit-1cb6651063f5
如果你为你的网站或应用开发个性化的用户体验,上下文强盗可以帮助你。使用上下文相关工具,您可以选择向用户显示哪些内容、排列广告、优化搜索结果、选择在页面上显示的最佳图像等等。
这类算法有很多名字:上下文土匪,多世界测试,联想土匪,部分反馈学习,土匪反馈学习,边信息土匪,土匪反馈多类分类,联想强化学习,一步强化学习。
研究人员从两个不同的角度研究这个问题。你可以把情境土匪想成是多臂土匪的延伸,或者是强化学习的简化版。
“多臂土匪”中的“土匪”来自赌场中使用的“单臂土匪”机器。想象一下,你在一个有许多独臂强盗机的赌场里。每台机器都有不同的获胜概率。你的目标是最大化总支出。你可以拉有限数量的武器,而且你不知道用哪个土匪才能得到最好的赔付。这个问题涉及到探索/剥削的权衡:你应该在尝试不同的强盗之间取得平衡,以了解每台机器的预期支出,但你也想利用你更了解的最好的强盗。这个问题有许多现实世界的应用,包括网站优化,临床试验,自适应路由和金融投资组合设计。你可以把它想成更聪明的 A/B 测试。
多臂 bandit 算法输出一个动作,但是不使用任何关于环境状态(上下文)的信息。例如,如果你使用一个多臂强盗来选择是否向你网站的用户显示猫的图像或狗的图像,即使你知道用户的偏好,你也会做出同样的随机决定。上下文 bandit 通过根据环境状态做出决定来扩展模型。
有了这样的模型,你不仅可以根据以前的观察优化决策,还可以针对每种情况个性化决策。你将向养猫的人展示一只猫的图像,向养狗的人展示一只狗的图像,你可以在一天中的不同时间和一周中的不同日子展示不同的图像。
该算法观察上下文,做出决定,从多个可选择的动作中选择一个动作,并观察该决定的结果。结果决定奖励。目标是最大化平均报酬。
例如,您可以使用上下文 bandit 来选择在网站主页上首先显示的新闻文章,以优化点击率。上下文是关于用户的信息:他们来自哪里,以前访问过的网站页面,设备信息,地理位置等。动作是选择显示什么新闻文章。结果是用户是否点击了链接。奖励是二进制的:没有点击就是 0,有点击就是 1。
如果我们对每个例子的每个可能的行为都有奖励值,我们可以使用任何分类算法,使用上下文数据作为特征,将具有最佳奖励的行为作为标签。挑战在于,我们不知道哪一个动作是最好的,我们只有部分信息:示例中使用的动作的奖励值。你仍然可以使用机器学习模型,但是你必须改变成本函数。一个简单的实现是试图预测回报。
微软发布了一份白皮书,概述了他们实施多世界测试服务的方法和描述。这项服务是由纽约的微软研究小组开发的。此前,该小组的许多研究人员都在雅虎从事该领域的工作。微软多世界测试服务使用 Vowpal Wabbit,这是一个开源库,为上下文土匪实现在线和离线训练算法。离线训练和评估算法在论文中有描述【双稳健策略评估和学习】(Miroslav Dudik,John Langford,李立宏)。
“有两种方法可以解决上下文环境中的离线学习。第一种方法,我们称之为直接方法(DM ),根据给定的数据估计奖励函数,并使用这种估计代替实际奖励来评估一组上下文中的策略值。第二种称为反向倾向得分(IPS) (Horvitz & Thompson,1952),使用重要性加权来校正历史数据中不正确的行为比例。第一种方法需要一个准确的奖励模型,而第二种方法需要一个过去政策的准确模型。一般来说,可能很难准确地对奖励进行建模,所以第一个假设可能过于严格。另一方面,通常可以很好地模拟过去的政策。然而,第二种方法通常存在较大的差异,尤其是当过去的政策与正在评估的政策存在显著差异时。
在本文中,我们建议使用双稳健(DR)估计技术来克服这两种现有方法的问题。双重稳健(或双重保护)估计(Cassel 等人,1976;Robins 等人,1994 年;罗宾斯和罗特尼茨基,1995 年;伦瑟福德&大卫教派,2004 年;康和,2007)是不完全数据估计的统计方法,具有一个重要性质:如果两个估计量(DM 和 IPS)中的任何一个是正确的,则估计是无偏的。因此,这种方法增加了得出可靠推论的机会。"
几个关于背景强盗的视频教程:
SIGIR 2016 搜索、推荐和广告投放的反事实评估和学习教程
你可以在这里找到很多其他资源的链接。
你可以把强化学习看作是情境强盗的延伸。
你仍然有一个代理(策略),它根据环境的状态采取行动,观察回报。不同的是,代理人可以采取多个连续的行动,奖励信息是稀疏的。比如你可以训练一个模特下棋。该模型将使用国际象棋棋盘的状态作为上下文,将决定采取哪些步骤,但它只会在游戏结束时获得奖励:赢、输或平。奖励信息的稀疏性增加了训练模型的难度。你遇到了一个信用分配问题的问题:如何分配信用或指责个人行为。
强化学习算法有很多种。强化学习的延伸之一是深度强化学习。它使用深度神经网络作为系统的一部分。
Arthur Juliani 用 Tensorflow 写了一篇很好的强化学习教程。
对上下文强盗感兴趣的研究人员似乎更专注于创建具有更好统计质量的算法,例如,后悔保证。后悔是使用最优策略时期望的奖励总和与使用从数据中学习的上下文强盗策略时收集的奖励总和之间的期望差。一些算法在后悔上界上有理论保证。
对强化学习感兴趣的研究人员似乎对将机器学习算法应用于新问题更感兴趣:机器人、自动驾驶汽车、库存管理、交易系统。他们通常专注于算法的开发,这些算法可以改善一些问题的艺术状态。
技术方法也不同。微软多世界测试白皮书描述了使用负 IPS(反向倾向分数)作为损失函数的训练算法。最小化损失函数将导致 IPS 估计量的最大化。我找不到任何人在强化学习算法中使用 IPS 估计器。如果你得到具有策略梯度的强化学习算法,并通过将若干步骤减少到一个来将其简化为上下文 bandit,则该模型将非常类似于监督分类模型。对于损失函数,您将使用交叉熵,但乘以奖励值。
比较两种不同类别的算法是很有趣的,这两种算法集中在一个狭窄的上下文强盗区域。我可能会错过一些东西,因为我还没有深入挖掘理论基础。如果你发现这篇文章中有任何遗漏细节的错误,请告诉我。
另请参见:
文章原载于http://Pavel . surmenok . com/2017/08/26/contextual-bottom-and-reinforcement-learning/
用 Python 控制 Web
简单网络自动化的冒险
**问题:**提交课堂作业需要浏览错综复杂的网页,以至于好几次我都把作业提交错了地方。此外,虽然这个过程只需要 1-2 分钟,但有时它似乎是一个不可逾越的障碍(比如当我晚上很晚才完成一项任务,而我几乎记不起我的密码)。
**解决方案:**使用 Python 自动提交完成的作业!理想情况下,我将能够保存一个任务,键入几个键,并在几秒钟内上传我的工作。起初,这听起来好得难以置信,但后来我发现了 selenium ,一个可以与 Python 一起使用来为你导航网络的工具。
每当我们发现自己在网上用同样的步骤重复单调乏味的动作时,这是一个编写程序来自动化这个过程的好机会。使用 selenium 和 Python,我们只需要编写一次脚本,然后我们可以多次运行它,避免重复单调的任务(在我的例子中,消除了在错误的地方提交任务的机会)!
在这里,我将介绍我开发的自动(并且正确地)提交作业的解决方案。同时,我们将介绍使用 Python 和 selenium 以编程方式控制 web 的基础知识。虽然这个程序确实有效(我每天都在使用它!)这是非常定制的,所以您不能为您的应用程序复制和粘贴代码。尽管如此,这里的通用技术可以应用于无限多的情况。(如果你想看完整的代码,可以在 GitHub 上找到)。
方法
在我们开始自动化 web 的有趣部分之前,我们需要弄清楚我们解决方案的总体结构。没有计划就直接开始编程是在沮丧中浪费很多时间的一个好方法。我想写一个程序,把完成的课程作业提交到画布上正确的位置(我大学的“学习管理系统】)。从基础开始,我需要一种方法来告诉程序要提交的作业的名称和类。我采用了一种简单的方法,创建了一个文件夹来存放每门课的已完成作业及其子文件夹。在子文件夹中,我放置了为特定任务命名的完整文档。该程序可以从文件夹中找出类名,并通过文档标题指定名称。
这里有一个例子,类名是 EECS491,作业是“作业 3——大型图形模型中的推理”。
File structure (left) and Complete Assignment (right)
程序的第一部分是一个遍历文件夹的循环,以找到我们存储在 Python 元组中的赋值和类:
# os for file management
import os# Build tuple of (class, file) to turn in
submission_dir = 'completed_assignments'dir_list = list(os.listdir(submission_dir))for directory in dir_list:
file_list = list(os.listdir(os.path.join(submission_dir,
directory)))
if len(file_list) != 0:
file_tup = (directory, file_list[0])
print(file_tup)**('EECS491', 'Assignment 3 - Inference in Larger Graphical Models.txt')**
这负责文件管理,程序现在知道要上交的程序和作业。下一步是使用 selenium 导航到正确的网页并上传作业。
使用 Selenium 的 Web 控件
为了开始使用 selenium,我们导入这个库并创建一个 web 驱动程序,这是一个由我们的程序控制的浏览器。在这种情况下,我将使用 Chrome 作为我的浏览器,并将驱动程序发送到我提交作业的 Canvas 网站。
import selenium# Using Chrome to access web
driver = webdriver.Chrome()# Open the website
driver.get('[https://canvas.case.edu'](https://canvas.case.edu'))
当我们打开画布网页时,迎接我们的第一个障碍是一个登录框!要通过这一步,我们需要填写 id 和密码,然后单击登录按钮。
把网络驱动想象成一个从未见过网页的人:我们需要准确地告诉它点击哪里,键入什么,按哪个按钮。有许多方法可以告诉我们的 web 驱动程序要查找什么元素,所有这些方法都使用了选择器。一个选择器是网页上一个元素的唯一标识符。为了找到特定元素的选择器,比如上面的 CWRU ID 框,我们需要检查网页。在 Chrome 中,这是通过按“ctrl + shift + i”或右键单击任何元素并选择“Inspect”来完成的。这带来了 Chrome 开发者工具,这是一个非常有用的应用程序,可以显示任何网页下面的 HTML。
为了找到“CWRU ID”框的选择器,我在框中单击鼠标右键,点击“Inspect ”,并在开发工具中看到以下内容。突出显示的行对应于 id box 元素(这一行称为 HTML 标记)。
HTML in Chrome developer tools for the webpage
这个 HTML 可能看起来让人不知所措,但是我们可以忽略大部分信息,只关注id = "username"
和name="username"
部分。(这些被称为 HTML 标签的属性)。
要用我们的 web 驱动程序选择 id 框,我们可以使用在开发工具中找到的id
或name
属性。selenium 中的 Web 驱动程序有许多不同的方法来选择网页上的元素,并且通常有多种方法来选择完全相同的项目:
# Select the id box
id_box = driver.find_element_by_name('username')# Equivalent Outcome!
id_box = driver.find_element_by_id('username')
我们的程序现在可以访问id_box
,我们可以用各种方式与它交互,比如键入按键,或者点击(如果我们选择了一个按钮)。
# Send id information
id_box.send_keys('my_username')
我们对密码框和登录按钮执行相同的过程,根据我们在 Chrome 开发者工具中看到的内容来选择它们。然后,我们向元素发送信息,或者根据需要点击它们。
# Find password box
pass_box = driver.find_element_by_name('password')# Send password
pass_box.send_keys('my_password')# Find login button
login_button = driver.find_element_by_name('submit')# Click login
login_button.click()
登录后,我们会看到这个有点吓人的仪表板:
我们再次需要通过准确指定点击的元素和输入的信息来引导程序浏览网页。在这种情况下,我告诉程序从左边的菜单中选择课程,然后选择与我需要上交的作业相对应的课程:
# Find and click on list of courses
courses_button = driver.find_element_by_id('global_nav_courses_link')courses_button.click()# Get the name of the folder
folder = file_tup[0]
# Class to select depends on folder
if folder == 'EECS491':
class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')elif folder == 'EECS531':
class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')# Click on the specific class
class_select.click()
程序使用我们在第一步中存储的文件夹的名称找到正确的类。在这种情况下,我使用选择方法find_element_by_link_text
来查找特定的类。元素的“链接文本”只是我们可以通过检查页面找到的另一个选择器。:
Inspecting the page to find the selector for a specific class
这个工作流程可能看起来有点乏味,但是记住,我们只需要在编写程序的时候做一次!之后,我们可以多次点击 run,程序会为我们导航所有这些页面。
我们使用相同的“检查页面—选择元素—与元素交互”过程来通过几个屏幕。最后,我们到达作业提交页面:
在这一点上,我可以看到终点线,但最初这个屏幕困扰着我。我可以很容易地点击“选择文件”框,但是我应该如何选择我需要上传的实际文件呢?答案非常简单!我们使用选择器定位Choose File
框,并使用send_keys
方法将文件的确切路径(在下面的代码中称为file_location
)传递给该框:
# Choose File button
choose_file = driver.find_element_by_name('attachments[0][uploaded_data]')# Complete path of the file
file_location = os.path.join(submission_dir, folder, file_name)# Send the file location to the button
choose_file.send_keys(file_location)
就是这样!通过将文件的确切路径发送到按钮,我们可以跳过在文件夹中导航以找到正确文件的整个过程。发送位置后,我们会看到下面的屏幕,显示我们的文件已经上传,可以提交了。
现在,我们选择“提交作业”按钮,点击,我们的作业就上交了!
# Locate submit button and click
submit_assignment = driver.find_element_by_id('submit_file_button')
submit_assignent.click()
清理
文件管理始终是一个关键步骤,我想确保我不会重新提交或丢失旧的任务。我认为最好的解决方案是在任何时候都将提交的单个文件存储在completed_assignments
文件夹中,并在文件提交后将其移动到submitted_assignments
文件夹中。最后一段代码使用 os 模块,通过将已完成的赋值重命名为所需的位置来移动它:
# Location of files after submission
submitted_file_location = os.path.join(submitted_dir, submitted_file_name)# Rename essentially copies and pastes files
os.rename(file_location, submitted_file_location)
所有的后续代码都封装在一个脚本中,我可以从命令行运行这个脚本。为了减少出错的机会,我一次只提交一个作业,这没什么大不了的,因为运行这个程序只需要 5 秒钟。
下面是我启动程序时的样子:
这个程序让我有机会在上传之前确认这是正确的作业。程序完成后,我得到以下输出:
当程序运行时,我可以看到 Python 为我工作:
结论
使用 Python 实现 web 自动化的技术对于许多任务都非常有用,无论是一般任务还是我的数据科学领域。例如,我们可以使用 selenium 每天自动下载新的数据文件(假设网站没有 API )。虽然最初编写脚本看起来工作量很大,但好处在于我们可以让计算机以完全相同的方式多次重复这个序列。这个程序将永远不会失去焦点而偏离到 Twitter 上。它将忠实地执行完全一致的一系列步骤(这在网站改变之前非常有效)。
我应该指出,在自动化关键任务之前,您确实需要小心谨慎。这个例子风险相对较低,因为我可以随时返回并重新提交作业,而且我通常会仔细检查程序的工作。网站会改变,如果你不相应地改变程序,你可能会得到一个脚本,它做的事情和你最初想做的完全不同!
就回报而言,这个程序为我每次作业节省了大约 30 秒,而我花了 2 个小时来写。所以,如果我用它来交 240 份作业,那么我就能按时完成了!然而,这个项目的回报是为一个问题设计一个很酷的解决方案,并在这个过程中学到很多东西。虽然我的时间本可以更有效地花在作业上,而不是解决如何自动上交作业,但我非常享受这个挑战。很少有事情像解决问题一样令人满意,而 Python 被证明是一个非常好的工具。
一如既往,我欢迎反馈和建设性的批评。可以通过推特 @koehrsen_will 联系到我。
近似梯度下梯度下降的收敛性
探索具有有界梯度误差的梯度下降
优化是一个有很多用途的迷人领域,尤其是现在有了机器学习(ML)。正如那些参与 ML 的人所知道的,梯度下降变量已经成为用于各种训练模型的一些最常见的优化技术。对于非常大的数据集,随机梯度下降特别有用,但需要更多的迭代才能收敛。随机梯度下降由于形成不准确的梯度估计而付出了这种收敛代价,这种不准确的梯度估计导致模型参数在试图找到其通向局部最小值的路径时呈现出非最优的轨迹。
From: https://www.reddit.com/r/ProgrammerHumor/comments/eez8al/gradient_descent/
当然,随机梯度下降并不是计算梯度时出现一些不小误差的唯一地方。特别是,有人可以使用有限差分近似来近似梯度,特别是如果他们有一些黑盒量,在这些黑盒量中很难或不可能找到封闭的梯度表达式,并且仍然在他们的梯度结果中得到不小的误差量。所以我们可能会问自己一个问题:
在具有有界误差的近似梯度的梯度下降下,收敛误差如何受到影响?
这是一个很酷的问题,可以考虑几个潜在的有用领域!对于任何对此感兴趣的人,我将用一个特别好的目标函数来回顾我对这种情况下梯度下降收敛误差的分析和证明。是时候深入数学了!
Meme from: https://giphy.com/gifs/reaction-BmmfETghGOPrW
首先,让我们看看正在讨论的递归梯度下降法。考虑误差有界的最速下降法:
其中 s 为正的常数步长, ε_k 为满足ε_ k≤δ的误差项,对于所有 k , f 为正定二次型,定义为****
然后,让我们将参数 q 定义为
并假设 q < 1 。使用上面的梯度下降方法,我将表明对于所有的 k ,我们可以通过下面的等式限制第 k 次迭代和局部最优之间的距离:
其中 x_0 是迭代序列的起点,而 x 是局部最优值。我将通过首先证明两个有用的引理,然后用它们来证明主要结果来证明这个结果。*
引理 1
给定值 0≤c< 1 and that
***we can find a bound for x _ k-x 为
证明
引理 2
对于某些对称的正定矩阵 A 和正标量 s ,以下不等式成立:
证明
回想一下某正定方阵a = u^tλu其中 U 是特征向量的酉矩阵λ是具有正特征值的对角矩阵。回想一下,对于某个矩阵 B 的矩阵 2 范数,我们有****
这样,我们可以使用以下步骤进行证明:
主要结果的证明
为了得到我们的最终结果,我们将利用一些典型的分析不等式,这将为我们使用引理 1 和引理 2** 提供一个机会。也就是说,我们可以如下进行最终证明:******
因为我们假设我们选择 s 足够小,使得 q < 1,我们可以使用引理 1 来进一步说明
这个主要结果很有趣,有几个原因。首先,很明显,我们的收敛速度很快受到梯度近似误差而不是初始猜测误差的限制。然而,我们可以通过为步长 s 选择一个足够小的值来克服这个问题,这是随机梯度下降的实践者可能习惯做的事情。
无论如何,现在理论上的东西完成了,我们可以继续看这个不等式相对于实际的数值实验有多好…是时候处理一些数字了!
Meme from: https://makeameme.org/meme/crunch-the-numbers
数字结果
我认为做一个数值实验来看看这个界限和实际的收敛相比如何会很酷。为了做这个实验,将噪声向量 ε 添加到随机正定 Q 的二次型的精确梯度上,使得对于指定的某个 δ > 0,ε≤δ。使用不同的起始随机种子运行多个序列,下图是收敛结果相对于界限的可视化。****
根据上图,看起来边界工作得很好!相对于实际的实验来说,这当然有点保守,但没关系。以下是一些值得注意的观察结果。随着 q → 1 ,不等式中独立于 k 的有界项变得相当大,并且 q^k 项收敛到 0 的速度变慢。这意味着 sQ 的谱在以值 1 为中心的单位球内,并且 s λ_{min} 和 s λ_{max} 的极值在该球的边界附近。 q → 1 也意味着我们正在接近这样一种情况,随着迭代次数接近无穷大,我们将会出现分歧,因此当 q 接近 1 时,事情将会更加有界,收敛将会更加缓慢。
结论
在任何情况下,我们已经看到,如果我们以一种有界的方式来近似我们的梯度(比如在机器学习中使用有限差分或小批量估计),就有可能限制我们的收敛误差,并更清楚地了解在运行时间、长期精度以及潜在的更多方面会发生什么!因此,这是一个非常好的结果,需要记住!
基于 2018 年 3 月 15 日https://Christian jhoward . me文章原载。
对话数据集和从电影对话中学习角色风格
Photo by Kane Reinholdtsen on Unsplash
随着人工智能继续推进其认知边界,它接受了一项挑战,即我们人类自然地这样做——使用自然语言理解和回应。人类的对话内容极其丰富。传递信息的基础是表面上的单词,通过音调、音高和音量等韵律特征,两个说话者之间的力量差异,以及通过面部表情、眼神交流、肢体语言甚至反应的时间延迟暗示的情绪和态度倾向进行调节。与独白相比,这种丰富的逐层内容使对话特别有趣。
对话的复杂、多模态性质需要多学科的分析方法——语言学家、心理学家和机器学习研究人员走到一起,利用现有的关于对话分析、情感分析和自然语言处理的研究。要做到这一点,可重复的研究是必要的,公开可用的数据是寻求。在学术之外,公开可用的数据是数据科学家和机器学习实践者构建应用机器学习系统的起点。
[1]对适用于构建对话系统的对话数据集的可用性进行了广泛的审查。对于每个数据集,作者都对其大小、来源以及对话是否:
- 书面/口头/多模态(即视觉模态——面部表情等。)
- 人对人/人对机器
- 从真实自然的对话中转录而来。而不是受雇对着机器说话。
- 来自小说作品:电影还是小说
- 自发的或受约束的(即,有一个工作任务和目标驱动,如主题辩论或路线规划)
我向任何希望找到对话或对话数据集的人强烈推荐这篇综述,这篇综述的链接在参考文献部分。
在这篇博文的其余部分,让我们关注一个应用程序,在这个应用程序中,一个电影语料库被用来学习角色的说话风格。我认为电影很有趣,因为人物说话的风格通常在场景中是一致的,不像在自然的自发对话中,说话者的风格在一定程度上模仿更强大的说话者,以建立融洽的关系。
[2]已经构建了一个基于电影角色自动生成对话的系统,使用了互联网电影剧本数据库网站上的数百个电影剧本,作者已经发布了语料库数据(https://nlds.soe.ucsc.edu/software)。作者使用外部工具从转录本中提取独特的特征。我选择了一些可能感兴趣的工具:
SentiWordNet(http://sentiwordnet.isti.cnr.it/):提取正负极性
语言学查询字数统计(LIWC)3:一个非常受研究人员欢迎的特征提取工具。在这里,作者从工具中提取了 LIWC 类别,如愤怒词。
被动句比来自(【https://code.google.com/archive/p/narorumo/】的)
提取这些特征后,这些特征被输入到“人物”架构中,如[4]所述。实现的细节很复杂,超出了本文的范围,包括选择语法、聚合句子、插入语用标记和选择词汇结构的多个模块。
我们最后用一个例子来说明性格风格的不同。作者提供了一个表格,用于生成的对话之间的平行比较——可以清楚地看出字符风格的差异。
Utterances generated using Film Character Models. Table from [2].
附录
最后,一些简短的剪辑和引用来获得一些关于人物说话风格的背景知识。
安妮·霍尔:艾尔维和安妮
奇兵—印第引自 思想目录
财富和荣耀,孩子。财富和荣耀。”“我想是时候问问你自己了;你信仰什么?”“……印第安纳·琼斯。我一直知道有一天你会从我的门前走回来。我从不怀疑这一点。一些事情使它不可避免。”“考古学教授,神秘学专家,怎么说呢……稀有古物的获取者。”“把神像扔给我;我把鞭子扔给你!”
低俗小说——文森特引用自 电影
“你不要用别人的车辆。这是违反规则的。”所以你要出去,喝你的酒,说“晚安,我度过了一个非常愉快的夜晚”,“回家,手淫”。这就是你要做的。“哦,伙计,我刚刚打中了马文的脸。“冷静点,伙计,我告诉过你这是个意外。我们可能撞到了什么东西。”“为什么你不告诉我们有人在浴室里?忘了吗?你忘了说有人在浴室里拿着该死的手罐?!”
参考文献
[1] I.V. Serban,R. Lowe,P. Henderson,L. Charlin,J. Pineau,关于构建数据驱动的对话系统的可用语料库的调查,(2015)。https://arxiv.org/pdf/1512.05742.pdf(2018 年 2 月 22 日访问)。
[2] M.A. Walker,G.I. Lin,J.E. Sawyer,用于学习和刻画人物风格的电影对话注释语料库,载于:第八届语言资源与评估国际会议论文集(12),2012 年:第 1373–1378 页。http://lrec . elra . info/proceedings/lrec 2012/pdf/1114 _ paper . pdf(2017 年 12 月 11 日访问)。
[3] J.W. Pennebaker,R.J. Booth,M.E. Francis,操作员手册:语言查询和字数统计— LIWC2007,(2007)1–11。doi:10.4018/978–1–60960–741–8 . ch 012
[4] F. Mairesse,M.A. Walker,《走向基于个性的用户适应:心理通知的文体语言生成、用户建模和用户适应的交互》。20 (2010) 227–278.doi:10.1007/s 11257–010–9076–2。
发表于2018 年 2 月 25 日 2018 年 2 月 25 日
原载于 2018 年 2 月 25 日joshuakyh.wordpress.com。
对话式人工智能:模仿机器
1。简介
1.1。背景
对话式人工智能的发展已经进行了 60 多年,很大程度上是由自然语言处理(NLP)领域的研究推动的。在 20 世纪 80 年代,从手写规则到统计方法的转变使 NLP 在处理真实数据时更加有效和灵活(Nadkarni,P.M. et al. 2011,p. 545)。从那以后,这种趋势越来越受欢迎,特别是受到深度学习技术的广泛应用的推动。近年来,自然语言处理在分类、匹配、翻译和结构化预测方面取得了显著成功(李,H. 2017,第 2 页),这些任务通过统计模型更容易完成。然而,自然主义的多回合对话仍然具有挑战性,一些人认为,在我们开发出能够“理解自然语言”的人工通用智能之前,这一问题仍将无法解决(Bailey,K. 2017)。
1.2。目标
为了研究设计对话式人工智能的有效系统架构,本摘要仔细考虑了自动生成理论和对话理论中描述的方法。基于这些理论和其他多学科研究的交叉,它认为会话构建需要对世界的系统表征,尤其是那些基于情境理解的表征。此外,对话式人工智能的充分性不应从其常识性认知能力来衡量,而是从它模仿人类之间交流的程度来衡量。这一论断直接引用了 G.Pask (1976,第 7-8 页)对智力的定义:“智力是一种属性,当且仅当参与者之间的对话表现出理解时,外部观察者才将其归因于参与者之间的对话。”从这个角度来看,如果一个对话式的人工智能在一次成功的交流中表现出情境理解,那么它可以说是展示了智能。
本摘要中展示的方法旨在为处理自然主义多回合对话提供一个新的方向,并扩展当代自然语言处理技术的优势。它建议将对话式人工智能设计为一个自我引用的系统(Maturana,H.R. & Varela,F.J. 1980,第 xiii 页),该系统参与“一个理解、保留和学习的过程”(Pask,G. 1972,第 212 页)。如果利用深度学习方法,这是非常容易实现的。摘要还对 a .图灵(1950 年,第 433 页)提出的“模仿游戏”表示认可,他认为这是对“机器能思考吗?”这一问题的有利替代
1.3。相关研究
提出的论点显示了与其他一些已有理论的联系:认为语言的意义是由它的使用来定义的“语言游戏”概念(维特根斯坦,l .等人,1968 年),把语言视为一种表演媒介的“言语行为”哲学(奥斯汀,J.L .等人,1975 年;Searle,J.R. 1969)、功利性语言学习范式(Gauthier,J. & Mordatch,I. 2016)、互动式语言学习方法(Lidor,N. & Wang,S.I. 2016)。然而,与“语言游戏”和“言语行为”不同,该摘要认为对话式人工智能不应基于纯语言的世界,而与功利主义范式和交互方法的不同之处在于强调知识系统应基于情境语境。
2.机器会思考吗?
2.1。心灵的计算理论
自从数字计算机诞生以来,关于机器认知能力就有过无数次争论(图灵,1950 年;纽厄尔和西蒙,1976 年;塞尔,J.R .,1980)。对人类思维的研究往往是回答眼前问题的理论基础。
在对感知现实的研究中,H. von Foerster (1973,第 38 页)提出了一个观点,即人类的认知只不过是不断完善我们对世界的描述的递归计算。通过计算,他的意思是“反映,思考(放置)一致的事物(com-)”。当 J.A .福多尔综合了心理学和语言学的观点并提出思维语言假说时,一个更正式的心理计算理论出现了(福多尔,J.A. 1976)。它认为认知过程是一个表征系统,由通过语言结构运作的概念符号组成。这证实了系统表征的必要性,它为更复杂的认知活动提供了基础。
2.2。物理符号系统和 GOFAI
大约在同一时间,计算机科学的进步产生了一个类似的假设,该假设定义了一个物理符号系统(Newell,A. & Simon,H. 1976,第 116 页)。它由“一组称为符号的实体组成,这些实体是物理模式,可以作为另一种称为表达式(或符号结构)的实体的组件出现”。纽维尔和西蒙认为,这个符号系统与通用计算机非常相似,它拥有“通用智能行动的必要和充分手段”。J. Haugeland (1985,第 86-123 页)是第一个将这些意识形态引入人工智能领域的人,他提出了“老式人工智能”(GOFAI)这个术语。他承认思想是符号系统,就像语言一样,并进一步承认“推理是计算”。豪格兰德宣称,原则上,在计算机上模拟这种形式的智能是可能的,因为计算机只是一台符号操纵机器。
2.3。GOFAI 的批判
GOFAI 的一个强有力的反对者是 H. Dreyfus (1992,第三十三页),他批评了物理符号系统的“长期规划和具有上下文无关特征的可再识别对象的内部表示”。这提供了一些有价值的见解,因为在后来的几年里,机器学习的成就使“长期规划”的基于程序的方法变得不那么有效,而“上下文无关的特征”创造了一个常识性的知识表示问题,即使在今天也无法解决。另一方面,当考虑到 NLP 的领域时,对“内部代表”的批评可能不值得谨慎。语言基本上由词汇和组合装置组成(Wilson,R.A. & Keil,F.C. 1999,p. xciv)。为了理解每个词条的意义,我们必须研究语义学,这将在下一节详细阐述。
3.情境理解
3.1。情境
Dreyfus 认为常识知识表示的最大问题之一是“知道哪些事实在任何给定的情况下都是相关的”(Dreyfus,H.L. 2007,第 1138 页)。作为对 GOFAI 的一种反应,情境化出现在 20 世纪 80 年代,将智能人类行为描述为“参与的、社会和物质体现的活动,产生于特定(自然)环境的具体细节中”(Wilson,R.A. & Keil,F.C. 1999,第 769 页)。这是一个令人耳目一新的观点,它强调了认知活动的语境依赖性,这种认知活动是不断变化和发展的。为了在 NLP 的方案中定位这种观点,人们必须找到一种既支持代表系统又令人愉快的媒介。
3.2。图式、框架和多重表征
F.C. Bartlett (1967,第 201 页)首先正式提出了“图式”的概念。它是一种在当前情况下发展起来的内在表现形式,“对过去的反应或过去的经历的积极组织”,并作为建议我们未来思想和行为的参考点。这种哲学最终会在明斯基的作品中找到它的道路,他是 GOFAI 的狂热支持者,并激发了他对“框架”结构的建议。与之前出现的物理符号不同,“一个框架是一种表示刻板印象的数据结构”(Minsky,M. 1975),但与物理符号相似,它在一个全局方案中处理常识知识的组织。直到 15 年后,明斯基才意识到有必要“对常识知识的每个片段使用几种不同的表示”(明斯基,M. 2000,第 69 页)。这实际上符合 Bartlett 关于图式的原始观点(1967,第 302 页),即对于任何个人来说,受“特殊感觉区别”或“群体生活导致的社会条件”的影响,可能存在各种图式结构的重叠。图式,或框架,对自然语言处理有着重要的意义,因为它是一种有效的工具来封装任何特殊情况下的语义内容。然后,将这些数据网络分配给一个对话式人工智能来使用就变得似乎可行了。
3.3。自生论和对话论
两个主要的理论可以很好地指导图式的构建,它们是自生成理论和会话理论。H.R. Maturana 和 F.J. Varela (1980 年,第 xiv 页)提出的术语“自生系统”将生命系统定义为“通过其组成部分生产的基本循环形成的单元”。他们认为,在每一个生命系统中,都有一个持续的反馈回路,不断地修改和指定自己的稳态组织。考虑到这一点,他们声称“知识作为一种经验是个人和私人的东西,不能转移,而且人们认为可以转移的客观知识必须总是由听者创造”(Maturana,H.R. & Varela,F.J. 1980,第 5 页)。这与对话理论中的观点产生了共鸣,即对话中的参与者可以被识别为“信仰系统”或“稳定概念的集群”(Pask,G. 1980,第 1004 页)。因此,当设计对话式人工智能时,构建系统化的表示作为人工智能操作的范围是有益的。这些是从不同的情境中建立起来的图式,为对话提供基础。
3.4。可能性
利用深度学习技术,已经可以构建捕捉“细粒度语义和句法规则”的图式,并将单词向量映射到潜在空间中(Pennington,j .等人,2014)。当发现减去包含类似人类偏见的语义时,深度学习的潜力得到了进一步证实(Caliskan,A. et al. 2017)。不难想象对话式人工智能获得情境理解的直接可能性,这提出了一个必要的伦理问题,即什么样的图式模型适合于形成系统的表示。
4.模仿机器
4.1。机器智能再探
a .图灵发明的模仿游戏(1950 年,第 433 页)是一种询问游戏,其中机器扮演被询问的参与者。它并不直接涉及机器是否智能,而是通过“试图提供人类自然给出的答案”来展示其智能行为。这与 G. Pask 的结论(1976,第 8 页)相关,即机器智能是“一个外部观察者引证的属性”。这两种意识形态都将为对话式人工智能的构建提供重要的指导。一个有希望的策略是基于自然的人类对话来塑造系统架构。NLP 任务经常采用的序列到序列模型是不够的,因为对话是一个比刺激-反应模型复杂得多的过程。
4.2。对话结构
G.帕斯克写了很多关于对话理论的文章。他认为对话是不断进化的个体参与者在对话领域达成共识的一种努力。用他自己的话说:“对话是有机封闭(别名自治)系统之间的信息传递。这是一种解决冲突的机制,它也在支持对话的自主个体之间产生区别”(Pask,G. 1980,第 1006 页)。如图 1 所示,对话中的两个参与者,每个人都有不同的目标来指导他们的行动,可能会通过一系列的交流最终达成一致。然而,潘加罗的图表没有捕捉到的是,在达成共识的整个过程中,参与者部分地改变了他们的系统组织,以适应彼此。在自生成理论中,这一系列事件被命名为“结构耦合”:“如果两个结构上可塑的复合材料单元相互作用,从而作为它们各自结构变化路径的选择器,就会发生相互的结构耦合”(Maturana,H.R. 1978,第 42 页)。结果,一个“合意域”将会出现,在那里分离的有机体变得越来越协调,它们的图式获得更广泛的相似性。对话过程中的信息传递表现为“由于概念共享,否则异步参与者在达成协议时变得局部同步”(Pask,G. 1980,第 999 页)。
Figure 1. Conversation Theory (Pangaro, P. 2009)
4.3。团结一致
这种对话模式提出了一个有趣的挑战。对话式人工智能必须既采用类似人类的图式结构,又保持足够的组织差异,以利于对话。G. Pask 很快指出,尽管“团结”是对话的基本要素,但太多的团结会阻碍交流的发生:“如果没有需要解决的冲突,就没有必要进行对话,因为只有二重身”(Pask,G. 1980,第 1006 页)。出于这个原因,一个成功的对话式人工智能应该被设计成以与人类平等的身份参与对话。它将带来一种自主感,同时表达可能与人类参与者不同的独特观点。通过交谈,两个参与者将继续成长和学习,直到他们在给定的环境中发展成为理解的一对。
5.结论
在过去,受限的机器智能和不足的人机交互常常将机器置于自主性较低的角色,如助理、设备或仆人(Dautenhahn,k .等人,2005 年)。由于技术的最新发展,现在可以想象一个更加鼓舞人心的未来,对话式人工智能可以获得广泛的知识,并扩展其预测趋势的准确性。有了这样的进步,当我们设计一种新的机器在人类的栖息地和我们一起工作时,它肯定需要思维的改变。
对话式人工智能的更新系统架构应该使用重叠的系统表示来提供广泛的对话。它会从它的各种图式中提取,在每一个时刻产生适当的反应。它应该保持地方自治,保持“组织上的封闭”和“信息上的开放”(Pask,G. 1980,第 1003 页)。随着对话的继续,它将变得与人类参与者相互依赖,两者将同时经历其系统组织的进展,直到达成共识的领域。对话式人工智能会进化得更适合人类的需求,但它有时会以其独特的洞察力让人类感到惊讶。
这篇摘要中提出的模型已经部分可实现,因为神经网络现在可以利用深度学习技术保留示意性结构。这一领域的未来研究应集中在结构耦合过程,并旨在阐明本地组织结构的可识别状态。实现这一点无疑将有助于模仿机器进一步探索智能。
参考文献
奥斯汀,法学博士等人,1975 年。如何用文字做事第 2 版?/由 J.O. Urmson 和 Marina Sbisà编辑。牛津:克拉伦登。
k .贝利 2017。对话式人工智能和未来之路。[在线] TechCrunch。可在:https://TechCrunch . com/2017/02/25/conversation-ai-and-the-road-ahead/【2017 年 12 月 18 日访问】。
巴特利特,1967 年。《记忆:实验和社会心理学研究》,剑桥:剑桥大学出版社。
Caliskan,a .,Bryson,J.J. & Narayanan,A. 2017。从语料库中自动获得的语义包含类人偏见。科学(纽约,纽约),356(6334),第 183-186 页。
Dautenhahn,s . Woods,c . kaou ri,Walters,M.L .,Koay,K.L. & Werry,2005 年。“什么是机器人伴侣——朋友、助手或管家?,“2005 年 IEEE/RSJ 智能机器人和系统国际会议”,第 1192–1197 页。
德雷福斯,1992 年。计算机还不能做什么:人工理性批判,剑桥,麻省。;伦敦:麻省理工学院出版社。
德雷福斯,H.L. 2007。海德堡人工智能失败的原因以及如何修复它需要使它更海德堡化。人工智能,171(18),第 1137-1160 页。
福多尔大学法学学士,1976 年。思想的语言,哈索克斯:收割机出版社。
Gauthier,j .和 Mordatch,2016 年。情境和目标驱动的语言学习模式。arXiv:1610.03585 [cs。CL】。
Haugeland,J. 1985。人工智能:非常理念,剑桥,麻省。;伦敦:麻省理工学院出版社。
李,H. 2017。自然语言处理的深度学习:优势和挑战,国家科学评论,nwx110。
N. & Wang,S.I. 2016。交互式语言学习,研究博客,斯坦福自然语言处理小组[在线]。可从:https://NLP . Stanford . edu/blog/interactive-language-learning/【2017 年 11 月 22 日访问】
马图拉纳,人力资源,1978。认知。论文最初发表于:Hejl,Peter M. Wolfram K. Kö,和 Gerhard Roth(编辑。)法兰克福汇报:彼得·朗,第 29-49 页。
马图拉纳,H.R .和瓦雷拉,F.J. 1980。自生和认知:生命的实现。
明斯基,男,1975 年。一种表示知识的框架。计算机视觉心理学。),麦格劳-希尔。
明斯基,M. 2000。基于常识的界面。《美国计算机学会通讯》,第 43 卷第 8 期,第 66-73 页。
Nadkarni,P.M .,Ohno-Machado,l .和 Chapman,W.W. 2011。自然语言处理:导论。美国医学信息学协会杂志,18(5),第 544–551 页。
纽厄尔和西蒙,1976 年。作为实证研究的计算机科学:符号与搜索。美国计算机学会通讯,19(3),第 113-126 页。
潘加罗,第 2009 页。“为对话而设计”[PowerPoint 演示]。广告:2009 年旧金山科技奖。可在:【http://www.pangaro.com/abstracts/adtech-2009.html 【2017 年 11 月 18 日进入】
帕斯克,G. 1972。认知和个体的新观点。国际人机研究杂志,4(3),第 211-216 页。
g .帕斯克,1976 年。《人工智能:前言和理论》。在:尼古拉斯·尼葛洛庞帝编辑。软架构机器。麻省理工学院出版社,第 6-31 页。
帕斯克,G. 1980。《团结的限度》,会议记录,应邀在 IFIP、东京和墨尔本世界大会上发表主旨演讲,S. Lavington 编辑。阿姆斯特丹、纽约、牛津:北荷兰酒吧。第 999-1012 页。
Pennington,r .和 Manning,C.D. 2014。GloVe:单词表示的全局向量。自然语言处理的经验方法,第 1532-1543 页。
塞尔,J.R. 1969。《言语行为:语言哲学论文》,伦敦:剑桥大学出版社
塞尔博士,1980 年。思想、大脑和程序。行为与脑科学,3 卷 3 期,第 417-424 页。
图灵,上午 1950。计算机器和智能。心灵,59(236),第 433-460 页。
冯·福斯特,1973 年。构建一个现实。In: Preiser W. F. E .)环境设计研究,第 2 卷。道登,哈钦森&罗斯,宾夕法尼亚州斯特劳斯堡:35-46。
威尔逊,R.A .和凯尔,F.C. 1999 年。麻省理工学院认知科学百科全书,剑桥,麻省。;伦敦:麻省理工学院出版社。
维特根斯坦等人,1968 年。哲学研究第 3 版。牛津:巴兹尔·布莱克威尔。