TowardsDataScience 2023 博客中文翻译(一百五十六)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

如何用 25,000 台计算机训练 ChatGPT

原文:towardsdatascience.com/how-25-000-computers-trained-chatgpt-11104686a24d

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

照片由 Volodymyr Hryshchenko 提供,来源于 Unsplash

ChatGPT 背后的突破

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

·发表于 Towards Data Science ·阅读时间 5 分钟·2023 年 8 月 29 日

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

作者提供的图片

“Good” 之后是什么词?

你可能会想到早上好,或者再见。但你绝对不会说 声音很大。这没有意义。几十年来,计算机科学家们一直在训练 AI 解决这个确切的问题。

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

作者提供的图片

给定一个词,我们的 AI 预测下一个词。这样做几次,你就生成了一句完整的句子。

这就是 ChatGPT 的工作原理。

经过整个互联网的训练,ChatGPT 学会了像人类一样聊天。然而,这一巨大的成就只有在 2010 年代末期的突破之后才得以实现。这一突破支撑了 ChatGPT,并永远改变了我们生活的世界。

这是一个 AI 从整个互联网的每本书、每条推文、每个网站中阅读并学习的故事。以及它是如何实现的。

句子很长。

当我们超越单个词时,下一个词的预测就变得困难得多。看这个例子。

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

作者提供的图片

在这种情况下,说我吃了一个好的 早晨是没有意义的。但是我们的 AI 只关注“good”,并且输出“morning”。即使是人类也需要许多词来预测下一个词。因此,AI 也需要这些额外的信息。

我们的 AI 需要阅读许多词来预测下一个词。ChatGPT 一次可以读取超过 8**,000 个先前的词**。自然的做法是逐个将每个词输入 AI。

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

作者提供的图片

这就是过去 AI 的工作方式。**递归神经网络(RNN)**一次处理一个词,在读取句子时存储信息。

这个 AI 的一个问题是它极其缓慢。每个词都必须等待前一个词处理完成,这在大规模时是个问题。想象一下,如果你的洗衣机一次只能洗一件衬衫,这种顺序处理将需要几天时间。但每个人都知道我们可以同时放入所有衬衫,几分钟就能完成。这就是并行的概念。通过并行执行工作而不是顺序执行,我们可以显著加速洗衣机、计算机和 AI。

RNN 只能在数百万个词上进行训练,远远不及互联网上的万亿词汇。我们需要一种更快、更高效的句子阅读方法。

Transformer 是解决方案。

2017 年,一篇题为Attention Is All You Need的论文被发表。这篇论文有效地改变了句子的处理方式。这些研究人员发明了一种可以一次读取整句的 AI。

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

图片由作者提供

这种新的 AI 被称为Transformer,它的高效性使得它能够从互联网上的每本书和每个网站中学习。要理解它是如何做到这一点的,我们需要退一步了解计算机如何读取文本。

AI 如何读取文本?

计算机以 1 和 0 的形式工作。这些 1 和 0 被称为二进制,它们组成了数字。计算机科学家需要一种将词语表示为数字的方法。这在 2013 年得以实现,当时 Google 的科学家们创建了word2vec

词语包含语义意义。狗与猫相关。国王与王后相关。Word2vec 能够在向量或数字列表中表示这些语义。

使用 word2vec,你可以取“King”,减去“Man”,加上“Woman”,然后得到“Queen”这个词。

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

图片由作者提供

这个数字向量称为词嵌入。它们将词语的意义嵌入到这个向量中。在训练 AI 处理文本时,我们实际上是将这些词嵌入输入给 AI。AI 进行一些数学运算,变换这些向量,并生成下一个词。变换这些向量是非常耗时的。

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

图片由作者提供

Transformer 完成了这一切的并行处理。

不再等待前一个词处理完成,我们同时变换所有这些词嵌入,进行平均以将它们汇总。这将顺序操作的数量从句子的长度减少到一个常数。

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

图片由作者提供

Lambda Labs估计训练 ChatGPT 在单个 GPU 上需要355 年。但通过利用其并行性,ChatGPT 在25,000 个 GPU上训练,且仅用了几天时间。

Transformer 引发了人工智能领域的范式转变。

随着并行性的增加,越来越大的 AI 可以被训练。尽管过去最大的序列模型是基于数百万字进行训练的,但 ChatGPT 是在接近 一万亿 字的数据上训练的。

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

图片来自作者,数据来源于原始论文。

ChatGPT 在 CommonCrawl 上进行了训练,这是自 2008 年以来的整个互联网的集合。使用 超过 25,000 台计算机,该模型阅读并学习了整个互联网的每个网站。想象一下阅读每本书、每条推文和每段代码。

今天,ChatGPT 正在被用来编写代码,生成电视广告,并帮助你完成几乎可以想象的任何事情!通过将句子转向侧面,我们开创了 AI 的新时代,这一时代突破了曾经认为可能的界限。

但我们可能已经达到了极限。

在 GPT-4 发布后,OpenAI 的 CEO Sam Altman 说,

“我认为我们正处于这些巨大模型时代的尽头……”

在从整个互联网学习之后,接下来会是什么?ChatGPT 的影响正在渗透到每个行业。但像任何突破一样,进展会趋于平稳。AI 的下一个拐点,只有时间才能告诉我们。

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

图片来自作者,数据来源于原始论文。

如果你喜欢这篇文章:

  • 关注我的 Medium, LinkedIn,和 Twitter 以获取我的最新进展。

一个优秀的数据科学家如何看待矩阵乘法

原文:towardsdatascience.com/how-a-good-data-scientist-looks-at-matrix-multiplication-33a3128cd1bb

四种不同的视角

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

·发表于数据科学前沿 ·阅读时间 5 分钟·2023 年 2 月 23 日

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

作者提供的图片

介绍:

数据科学是通过科学计算方法、过程和算法从结构化或非结构化数据中提取知识和洞察的领域。

数据——无论是结构化数据(如数据表)还是非结构化数据(如图像)——都被表示为矩阵。

这些数据在计算过程(如机器学习模型)中的处理主要涉及矩阵乘法。

因此,对矩阵乘法操作的深入理解对从事数据科学和机器学习领域的人员大有裨益。

矩阵的乘法可以从 4 个不同的角度来看待:

  1. 行和列的点积

  2. 列的线性组合

  3. 行的线性组合

  4. 排名为 1 的矩阵之和

AB为相乘的矩阵,表示为AB。设AB的维度分别为*m*x*p**p*x*n*。我们知道,为了能够相乘AB,矩阵A的列数应与矩阵B的行数匹配。

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

为了简单起见,并且不失一般性,我们考虑以下示例维度。

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

如我们所知,下面的AB是两个矩阵AB的乘积。

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

1. 行和列的点积:

在矩阵AB中,element-11可以看作是矩阵Arow-1和矩阵Bcolumn-1的点积。

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

同样,element-12可以看作是矩阵Arow-1和矩阵Bcolumn-2的点积。

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

矩阵乘法作为行和列的点积(图片由作者提供)

视角:

AB中的Element-*ij*Arow-*i*Bcolumn-*j*的点积。

2. 列的线性组合:

为了形成矩阵乘法的列视角,将矩阵AB重新组织如下。

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

AB的第 1 列可以看作是*b11*倍的A的第 1 列和*b21*倍的第 2 列的和。即,AB的第 1 列是A列的线性组合(加权和),其中组合的权重是B的第 1 列的元素。

同样,column-2ABA列的线性组合,其中组合的权重是Acolumn-2的元素。

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

矩阵乘法作为列的线性组合(图片由作者提供)

视角:

AB中的每一列是A的列的线性组合,其中组合的权重是B中对应列的元素。

3. 行的线性组合:

现在,让我们从行的角度来看AB,将其重写如下。

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

AB的第 1 行可以看作是*a11*倍的B的第 1 行和*a12*倍的第 2 行的和。即,AB的第 1 行是B行的线性组合(加权和),其中组合的权重是A的第 1 行的元素。

同样,row-2ABB行的线性组合,其中组合的权重是Arow-2的元素。

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

矩阵乘法作为行的线性组合(图片由作者提供)

视角:

AB中的每一行是B行的线性组合,其中组合的权重是A中对应行的元素。

4. 秩-1 矩阵的和:

AB重写如下,可以得到两个秩-1 矩阵,每个矩阵的大小与AB相同。

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

很明显,上述两个矩阵是秩-1 的,因为它们的行(和列)都是线性相关的,即所有其他行(列)都是某一行(列)的倍数。因此,秩为 1。

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

矩阵乘法作为秩-1 矩阵的和(图片由作者提供)

视角:

矩阵ABp个秩-1 矩阵的和,每个矩阵的大小为mxn,其中第*i_*个矩阵(在p中)是将Acolumn-*i*Brow-*i*相乘的结果。

结论:

这些不同的视角在不同的场合中都有其相关性。

例如,在Transformer神经网络架构中的Attention机制中,注意力矩阵的计算可以从“行和列的点积”角度看作矩阵乘法。

更多关于注意力机制和 Transformer 的信息可以在下面的文章中找到。

## 走进变压器

数据流、参数和维度

towardsdatascience.com

我希望这些关于矩阵乘法的视角能够帮助读者更直观地理解机器学习和数据科学算法与模型中的数据流。

人工智能如何改变我们的编码方式

原文:towardsdatascience.com/how-ai-is-changing-the-way-we-code-36ff30262e65?source=collection_archive---------5-----------------------#2023-08-23

来自 ChatGPT 和 Stack Overflow 的证据

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

·

关注 发布在 Towards Data Science ·11 分钟阅读·2023 年 8 月 23 日

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

图片来源:Pavel Danilyuk,来自 Pexels

简而言之: 在本文中,您将找到我关于人工智能和工作的最新研究总结(探讨人工智能对生产力的影响,同时开启关于长期效果的讨论),一个使用 ChatGPT 和 Stack Overflow 说明的准实验方法(差异中的差异),以及如何通过简单的 SQL 查询从 Stack Overflow 提取数据。

完整科学文章的链接(请引用):arxiv.org/abs/2308.11302

与大多数技术革命一样,ChatGPT 的发布伴随着惊奇和恐惧。一方面,仅仅两个月内,应用程序就以 1 亿月活跃用户打破了历史上增长最快的消费应用记录。另一方面,高盛的一份报告声称,这项技术可能会取代全球超过 3 亿个工作岗位 [1]。此外,埃隆·马斯克和 1000 多名科技领袖及研究人员签署了一封公开信,呼吁暂停最先进的人工智能发展 [2]。

``我们只能看得见短远的距离,但我们可以看到很多需要做的事情。’’ 艾伦·图灵

根据艾伦·图灵的名言,本文并不试图英勇预测人工智能的遥远未来及其影响。然而,我专注于一个主要的可观察后果:人工智能如何改变我们的编码方式。

随着 ChatGPT 的诞生,世界发生了变化。至少,作为一个每天都在编码的人,我的世界在一夜之间发生了改变。我不再需要花费数小时在谷歌上寻找正确的解决方案,或在 Stack Overflow 上深入挖掘答案并将解决方案翻译成适合我具体问题的变量名称和矩阵维度,我只需询问 ChatGPT。这个聊天机器人不仅能在眨眼间给出答案,而且答案会适应我的具体情况(例如,正确的名称、数据框维度、变量类型等)。我感到惊讶,我的生产力瞬间提升。

因此,我决定探索 ChatGPT 发布的大规模影响及其对生产力的潜在影响,最终对我们工作的方式。 我定义了三个假设(Hs),并使用 Stack Overflow 数据进行了测试。

H1: ChatGPT 减少了 Stack Overflow 上的问题数量。 如果 ChatGPT 能在几秒钟内解决编码问题,我们可以预期在编码社区平台上提出问题和获得答案的时间会减少。

H2: ChatGPT 提高了提问的质量。 如果 ChatGPT 被广泛使用,那么 Stack Overflow 上剩余的问题必须得到了更好的记录,因为 ChatGPT 可能已经提供了一些帮助。

H3: 剩余问题更加复杂。 我们可以预期剩余的问题会更具挑战性,因为这些问题可能无法通过 ChatGPT 得到解答。因此,我们正在测试未解答问题的比例是否增加。此外,我还测试了每个问题的浏览量是否发生变化。如果每个问题的浏览量保持稳定,这将是一个额外的迹象,表明剩余问题的复杂性增加,并且这一发现不仅仅是由于平台活动减少所致。

为了验证这些假设,我将利用 ChatGPT 在 Stack Overflow 上的突然发布。2022 年 11 月,当 OpenAI 公开发布他们的聊天机器人时,没有其他替代品可用(例如 Google Bard),并且可以免费访问(不像 OpenAI ChatGPT 4 或 Code Interpreter 那样限于付费订阅)。因此,可以观察到这一冲击如何改变在线编码社区的活动。然而,尽管这种冲击很“清晰”,其他影响可能会混淆,因此需要质疑因果关系。特别是季节性因素(例如发布后的年末假期)以及问题越新,浏览量越低且找到答案的概率越小。

理想情况下,为了减少季节性等潜在混淆变量的影响并测量因果效应,我们希望观察没有 ChatGPT 发布的世界,但这是不可能的(例如因果推断的基本问题)。尽管如此,我将通过利用 ChatGPT 对编码相关问题的答案质量在不同语言之间变化,并使用准实验方法来限制其他因素混淆效应的风险(差异中的差异)来应对这一挑战。

为此,我将比较 Stack Overflow 上 Python 和 R 的活动。Python 是一个明显的选择,因为它可以说是编程社区中最流行的语言之一。

使用最广泛的编程语言(例如在 TIOBE 编程社区中排名第一)

编程社区指数)。Python 在线资源的丰富提供了像 ChatGPT 这样的聊天机器人的丰富训练集。现在,为了与 Python 进行比较,我选择了 R。Python 通常被引用为 R 的最佳替代品,两者都可以免费使用。然而,R 的流行度稍低一些(例如在 TIOBE 编程社区指数中排名第 16),因此训练数据可能较少,这意味着 ChatGPT 的性能可能较差。经验性证据证实了这种差异(更多细节请参见方法部分)。因此,R 对于 Python 来说是一个有效的反事实(它受季节性影响,但我们可以预期 ChatGPT 的影响可以忽略不计)。

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

图 1:ChatGPT 对 Stack Overflow 每周问题数量的影响

Overflow(作者提供的图表)

上图显示了每周原始数据。我们可以看到在 ChatGPT 3.5 发布后,关于 Python 的 Stack Overflow 每周问题数量突然减少了重要的 21.2%,而对 R 的影响略小(减少了 15.8%)。

这些‘定性’观察结果得到了统计模型的确认。后面描述的计量经济学模型发现,Python 在 Stack Overflow 上的每周问题数平均下降了 937.7(95%置信区间:[-1232.8,-642.55];p 值=0.000)。随后,利用差分中的差分方法的分析进一步揭示了问题质量的改善(通过平台上的得分进行衡量),同时未回答问题的比例增加(虽然每个问题的平均浏览次数似乎没有变化)。因此,这项研究为之前定义的三个假设提供了证据。

这些发现强调了 AI 在我们工作方式中的深远作用。通过处理常规查询,生成性 AI 使个人能够将精力转向更复杂的任务,同时提高他们的生产力。然而,长期的重要潜在不利影响也在讨论部分中进行了讨论。

文章的其余部分将介绍数据和方法,然后是结果,并以讨论结束。

数据

数据是通过在Stack Overflow 数据浏览器门户上执行 SQL 查询提取的(许可证:CC BY-SA)。以下是使用的 SQL 命令:

SELECT Id, CreationDate, Score, ViewCount, AnswerCount
FROM Posts
WHERE Tags LIKE '%<python>%'
AND CreationDate BETWEEN '2022–10–01' AND '2023–04–30'
AND PostTypeId = 1;

然后,我将数据按周汇总,以减少噪音,从而获得了从 2022 年 10 月 17 日星期一到 2023 年 3 月 19 日的数据集,其中包含每周帖子数量、浏览次数、每个问题的浏览次数、每个问题的平均得分以及未回答问题的比例。得分由平台用户定义,他们可以投票表示问题是否表现出*“研究努力;它是有用且清晰的”*。

方法

为了测量因果效应,我使用了一个差分中的差分模型,这是一种计量经济学方法,通常利用时间上的变化,将处理组与未处理组进行比较。为了了解更多关于这种方法的内容,我推荐你阅读两个免费的电子书中的相关章节:勇敢与真实的因果推断因果推断:混音带

简而言之,Diff-in-Diff 模型计算双重差分以识别因果效应。以下是简化的解释。首先,这个想法是计算两个简单的差分:处理组和未处理组在处理前(ChatGPT 发布前)和处理后期间的“平均”差异(这里分别为 Python 和 R 问题)。我们关心的是处理对处理单位的影响(这里是 ChatGPT 发布对 Python 问题的影响)。然而,如前所述,可能还有另一个效应与处理效应混淆(例如季节性)。为了解决这个问题,该模型的想法是计算双重差分,以检查处理组(Python)的第一个差分与控制组(R)的第二个差分的差异。由于我们期望控制组没有处理效应(或微不足道),尽管仍受季节性影响,我们可以排除这个潜在的混淆因素,最终测量因果效应。

这是一个稍微更正式的表示。

处理组的第一个差分:

E[Yᵢₜ| Treatedᵢ, Postₜ]-E[Yᵢₜ| Treatedᵢ, Preₜ] = λₜ+β

这里的 i 和 t 分别指代语言(R 或 Python)和周数。而 treated 指的是与 Python 相关的问题,Post 指的是 ChatGPT 可用的时间段。这个简单的差分可能代表了 ChatGPT 的因果效应(β)+ 一些时间效应 λₜ(例如季节性)。

控制组的第一个差分:

E[Yᵢₜ| Controlᵢ, Postₜ]-E[Yᵢₜ| Controlᵢ, Preₜ] = λₜ

控制组的简单差分不包括处理效应(因为它是未处理的),仅包括 λₜ。

因此,双重差分将给出:

DiD = ( λₜ+β) — λₜ = β

在假设 λₜ 对两个组相同(平行趋势假设,如下所述)的情况下,双重差分将允许我们识别 β,即因果效应。

该模型的本质在于平行趋势假设。为了声明因果效应,我们应该确信如果没有 ChatGPT,Stack Overflow 上 Python(treated)和 R(untreated)的问题演变在处理期(2022 年 11 月之后)会是相同的。然而,这显然无法直接观察和测试(参见因果推断的基本问题)。(如果你想了解更多关于这个概念和因果推断的信息,请查看我在 Towards Data Science 上的视频和文章:因果关系的科学与艺术)。然而,我们可以测试在冲击发生前趋势是否平行,这表明控制组是一个潜在的良好“反事实”。用数据进行的两次不同的安慰剂测试表明,我们不能拒绝 ChatGPT 前期的平行趋势假设(测试的 p 值分别为 0.722 和 0.397(见在线附录 B))。

正式定义:

Yᵢₜ = β₀ + β₁ Pythonᵢ + β₂ ChatGPTₜ + β₃ Pythonᵢ × ChatGPTₜ + uᵢₜ

“i” 和 “t” 分别对应 Stack Overflow 上问题的主题(i ∈ {R; Python})和周数。Yᵢₜ 代表结果变量:提问数量(H1)、平均问题评分(H2)和未答复问题的比例(H3)。Pythonᵢ 是一个二元变量。

如果问题与 Python 相关,则变量取值为 1,否则为 0

否则(与 R 相关)。ChatGPTₜ 是另一个二元变量

从 ChatGPT 发布及以后取值为 1,之前为 0

否则。uᵢₜ 是一个以编程语言为聚类的误差项

层级 (i)。

这个模型的核心在于平行趋势假设。为了声称因果效应,我们应该确信如果没有 ChatGPT,Python(处理组)和 R(对照组)在处理期(2022 年 11 月以后)的帖子演变将是相同的。然而,这显然无法直接观察和测试(参见因果推断的基本问题)。(如果你想了解更多关于这一概念和因果推断的信息,请查看我在 因果性科学与艺术 上的视频和文章)。然而,可以测试在冲击之前的趋势是否平行,从而表明对照组是一个良好的“反事实”。在这种情况下,两次不同的安慰剂测试表明,我们不能拒绝 ChatGPT 前期的平行趋势假设(测试的 p 值分别为 0.722 和 0.397(见在线附录 B))。

结果

H1: ChatGPT 减少了在 Stack Overflow 上提问的数量。

如引言中所述,Diff-in-Diff 模型估计在 Stack Overflow 上 Python 的每周提问平均减少了 937.7(95% CI: [-1232.8, -642.55]; p 值 = 0.000),这代表了每周提问减少了 18%。

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

图 2: ChatGPT 对每周提问数量的影响(图片来源:作者)

H2: ChatGPT 提高了提问的质量。

ChatGPT 可能对回答问题有帮助(参见 H1)。然而,当聊天机器人无法解决问题时,它可能让人进一步探索问题或解决方案的某些元素。该平台允许我们测试这一假设,用户可以对每个问题投票,如果他们认为 “这个问题展示了研究努力;它有用且清晰”(增加 1 分) 或不认为(减少 1 分) 这第二次回归估计问题的分数平均增加了 0.07 分(95% CI: [-0.0127 , 0.1518]; p 值: 0.095)(见图 3),这代表了 41.2% 的增加。

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

图 3: ChatGPT 对提问质量的影响(图片来源:作者)

H3:剩下的问题更加复杂。

现在我们有一些证据表明 ChatGPT 能够提供显著帮助(解决问题并帮助记录其他问题),我们希望确认剩下的问题更复杂。为此,我们将关注两件事。首先,我发现未回答问题的比例在上升(没有答案可能是问题更复杂的标志)。更具体地说,我发现未回答问题的比例增加了 2.21 个百分点(95% 置信区间:[0.12, 0.30];p 值:0.039),这代表了 6.8% 的增长。其次,我们还发现每个问题的浏览量没有变化(我们无法拒绝其未变化的零假设,p 值为 0.477)。这个第二个测试使我们部分排除由于流量较低导致未回答问题增多的替代解释。

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

图 4:ChatGPT 对未回答问题比例的影响(作者提供的图像)

讨论

这些发现支持了这样的观点:生成 AI 可能会通过处理常规问题来彻底改变我们的工作,让我们可以专注于需要专业知识的更复杂问题,同时提高我们的生产力。

虽然这个承诺听起来很令人兴奋,但也有其反面。首先,低技能的工作可能会被聊天机器人取代。其次,这种工具可能会对我们的学习方式产生负面影响。就个人而言,我把编程看作是骑自行车或游泳:观看视频或上课程是不够的,你必须亲自尝试和失败。如果答案太好,而我们不强迫自己学习,很多人可能会难以掌握。第三,如果 Stack Overflow 上的问题数量减少,这可能会减少生成 AI 模型训练集的一个宝贵来源,从而影响其长期性能。

所有这些长期不利影响尚不明确,需要仔细分析。请在评论中告诉我你的想法。

[0] Gallea, Quentin. “从平凡到重要:AI 对工作动态的影响——来自 ChatGPT 和 Stack Overflow 的证据” arXiv econ.GN(2023 年)

[1] Hatzius, Jan. “人工智能对经济增长的潜在巨大影响(Briggs/Kodnani)。” 高盛(2023 年)。

[2] www.nytimes.com/2023/03/29/technology/ai-artificial-intelligence-musk-risks.html

[3] Bhat, Vasudev 等. “Min (e) d 你的标签:对 Stack Overflow 问题响应时间的分析。” 2014 IEEE/ACM 国际社会网络分析与挖掘会议(ASONAM 2014)。IEEE,(2014 年)

《阿波罗 8 号如何赢得月球竞赛》

原文:towardsdatascience.com/how-apollo-8-won-the-moon-race-829f14b4b6e1

快速成功的数据科学

使用 Python 模拟自由返回轨迹

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

·发表于 走向数据科学 ·阅读时长 10 分钟·2023 年 11 月 21 日

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

“地球升起”由阿波罗 8 号宇航员比尔·安德斯(NASA)拍摄

五十五年前的今年 12 月,阿波罗 8 号的机组人员成为首批离开地球引力范围、前往其他天体的人。本月,那次任务的指挥官弗兰克·博曼在 95 岁时去世。为了纪念这一历史事件及其杰出的机组人员,我将回顾阿波罗 8 号飞行路径的计算机模拟。这样的模拟对于任务规划、教学辅助手段以及媒体和公众的传播都是非常有用的。

为什么阿波罗 8 号如此重要?

在 1968 年夏季,美国在太空竞赛中处于劣势。苏联的 Zond 飞船看起来已准备好前往月球,CIA 拍到了停在发射台上的巨大苏联 N-1 火箭,而美国陷入困境的阿波罗计划仍需进行三次测试飞行。

但在那年的 8 月,NASA 的经理乔治·洛提出了一个大胆的想法。现在就去月球。与其在地球轨道上进行更多测试,不如在 12 月绕月飞行,让成为测试!

在那个时刻,太空竞赛实际上已经结束。不到一年后,苏联就已经投降,尼尔·阿姆斯特朗完成了他对全人类的伟大飞跃。

决定将阿波罗 8 号飞船送上月球并非易事。1967 年,阿波罗 1 号的舱内三名宇航员遇难,多次无人驾驶任务也发生了爆炸或其他失败。

在这种背景下,且事关重大,一切都取决于自由返回轨迹的概念。任务设计如此,以便如果服务模块引擎未能点火,飞船将简单地绕月球一圈,像回旋镖一样返回地球。这个概念的优雅之美甚至被融入了官方任务徽章中。

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

阿波罗 8 号任务徽章(NASA,CC BY-SA 4.0,来自维基媒体共享资源)

在本文中,我们将使用用 Python 编程语言构建的计算机模拟来探讨自由返回轨道。虽然不是必需的,如果你想在阅读过程中参与模拟,可以从这个GitHub 仓库下载源代码和支持文件。你将需要文件apollo_8_free_return.pyearth_100x100.gifmoon_27x27.gif

了解阿波罗 8 号任务

阿波罗 8 号任务的目标仅仅是绕月,因此不需要带上登月舱组件。宇航员们乘坐的是指令舱和服务舱,这两个部分合称为 CSM。

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

阿波罗指令舱和服务舱(来源:Real-world Python)

在 1968 年秋季,CSM 引擎仅在地球轨道中经过测试,对其可靠性存在合理的担忧。要绕月球运行,引擎必须点火两次,一次是减速使航天器进入月球轨道,再一次是离开轨道。

通过自由返回轨道,如果第一次机动失败,宇航员仍然可以顺利返回家园。事实证明,引擎在两次点火时都表现完美,阿波罗 8 号绕月球运行了 10 圈。(不过,命运多舛的阿波罗 13 号却充分利用了其自由返回轨道!)

自由返回轨道

尽管计算自由返回轨道需要大量复杂的数学运算(毕竟这是火箭科学),但你仍然可以使用一些简化的参数在二维图中绘制,如下所示。

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

自由返回轨道(不按比例缩放)(来源:Real-world Python)

为了在二维中模拟自由返回,我们需要几个关键值:CSM 的起始位置(R₀)、CSM 的速度和方向(V₀),以及 CSM 与月球之间的相位角(gamma₀)。相位角,也称为引导角,是从起始位置到最终位置所需的 CSM 轨道时间位置的变化。

跨月注入速度(V₀)是一种推进机动,用于将 CSM 设置为前往月球的轨道。这是在地球的停泊轨道上完成的,在此过程中,航天器进行内部检查,并等待与月球的相位角达到最佳时机。此时,土星五号火箭的第三级点火并脱落,留下 CSM 前往月球。

由于月球在移动,你必须预测它的未来位置或引导它,就像用猎枪打飞碟一样。这需要知道在跨月注入时的相位角(gamma₀)。

引导月球与射击霰弹枪有所不同,因为太空是弯曲的,你需要考虑地球和月球的引力。这两个天体对航天器的牵引力会产生难以计算的扰动。实际上如此困难,以至于计算在物理学领域获得了一个特殊的名称:三体问题

三体问题

三体问题是预测三个相互作用的天体行为的挑战。艾萨克·牛顿的引力方程对于预测两个天体的行为(如地球和月球)效果很好,但如果再加入一个天体,无论是航天器、彗星、卫星等,情况就会变得复杂。牛顿从未能将三个或更多天体的行为简化为一个简单的方程。275 年来——即使国王提供奖金以寻找解决方案——世界上最伟大的数学家们也徒劳无功。

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

三体问题(Mgolden96, CC BY-SA 4.0, via Wikimedia Commons)

问题在于三体问题不能使用简单的代数表达式或积分来解决。计算多个引力场的影响需要在不使用高速计算机的情况下进行数值迭代,这在没有高速计算机的情况下是不可行的,例如你的笔记本电脑。

1961 年,迈克尔·米诺维奇(Michael Minovitch),一位在喷气推进实验室的暑期实习生,利用当时世界上最快的计算机 IBM 7090 找到了第一个数值解。他发现,数学家们可以通过使用修正圆锥方法来减少求解限制性三体问题(如我们的地月-CSM 问题)所需的计算次数。

修正圆锥方法

修正圆锥方法是一种分析性近似方法,它假设你在地球引力影响范围内处理一个简单的两体问题,而在月球引力影响范围内处理另一个问题。这是一种粗略的“简便计算”,提供合理的出发和到达条件估计,减少了初始速度和位置向量的选择。剩下的就是通过反复的计算机模拟来优化飞行路径。

因为研究人员已经找到了并记录了阿波罗 8 号任务的修正圆锥解,我们不需要再计算它。我已经将其调整到我们将要查看的 2D 模拟中。

如果你下载源代码,你可以通过调整参数如 R₀ 和 V₀ 来实验不同的解决方案。

模拟

自由返回轨迹模拟将捕捉飞行路径的基本要素,同时为了“观赏效果”做出若干近似。这些近似包括在 2D 环境中运行模拟,忽略阿波罗 8 号的十次月球轨道,并扭曲时间和距离的尺度。作为简化处理,地球和月球都不旋转。

时间尺度失真

在 1968 年,往返月球大约需要 六天。没有人愿意实时观看这个过程,所以模拟每次循环将时间单位增加 0.001。这意味着,当运行 4,100 次循环的模拟时,每个时间步代表现实世界中约 两分钟 的时间。时间步长越长,模拟速度越快,但结果的准确性越低,因为小错误会随着时间积累。

你可以通过首先运行一个小时间步以获得最大准确性,然后使用结果找到产生类似结果的最大时间步,来优化飞行计划模拟中的时间步。

距离尺度失真

模拟不是按比例的。虽然地球和月球的图像将具有正确的 相对尺寸,但它们之间的距离比实际距离 更小,因此需要相应调整相位角。我在模型中减少了距离,因为外太空很大。真的很大。如果你想按比例显示模拟并将其全部放在计算机显示器上,那么你必须接受一个荒谬的小地球和月球。

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

地球和月球系统在最近距离,或近地点,按比例显示(作者图像)

为了保持两个天体的可识别性,模拟使用了更大的、适当缩放的图像,并减少了它们之间的距离。这种配置将更容易让观众理解,同时仍然可以复现自由返回轨迹。

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

模拟中的地球和月球系统,仅按比例缩放了天体大小(真实世界 Python)

由于在模拟中地球和月球距离较近,月球的轨道速度将比实际生活中更快,这符合开普勒第二定律。为了补偿这一点,月球的起始位置被设计为适当减少相位角。

为了最终提高可视性,CSM 的大小被大幅增加。按比例显示时,它会比一个像素还小。

运行模拟

模拟追踪了阿波罗 8 从土星五号火箭的第三阶段停止点火进行月球注入直到指令模块在太平洋溅落的整个过程。初始加速代表了飞船在自由返回机动期间需要点燃推进器的唯一时间。

注意:下面的动画是 GIF 格式,根据 Medium 的要求。直接从 Python 脚本运行程序时,图像质量更好。

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

自由返回轨迹模拟(作者)

如果你在 Python 脚本中取消注释 self.pendown() 选项,你可以通过在 CSM 和月球后面绘制一条线来追踪旅程。自由返回轨迹的“8”字形模式非常清晰可见,以及飞船接近月球时的情况,距离仅为 69 英里(110 公里)。

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

模拟慢动作并记录路径(作者)

如果你调整模拟输入,你会发现对参数的最小调整可能会导致任务出现偏差。负面结果包括撞击月球、以过陡的角度进入地球大气层,或是永远飞向太空。

要模拟月球撞击,将代表 V₀月球注入速度的Vo_X变量从其初始值 485 更改为 475。

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

将 Vo_X 速度变量从 485 更改为 475 会导致 CSM 坠毁(作者)

尽管这种敏感性部分是由于小型模拟的自由度有限,但现实世界中也存在相同的问题。在关键时刻,太空旅行变成了秒和厘米的游戏,这也是为什么在轨道插入点燃等重要机动中需要计算机来控制推进器的原因。

模拟重力推进

迈克尔·米诺维奇解决三体问题的方案引领他发现了另一个重要的发现:重力推进。也称为重力助推弹弓机动,该技术涉及利用大型行星的重力场来加速或减速航天器,使其进入不同的轨道。最著名的应用是在 1970 年代,将旅行者号航天器送往太阳系的壮丽旅行。

你可以通过将Vo_X变量设置为 520 到 540 之间的值来模拟重力推进。这会导致 CSM月球后方通过,并偷取一些月球的动量,从而增加飞船的速度并改变其飞行轨迹。

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

模拟重力推进概念。再见,阿波罗 8 号!(作者)

有趣的是,以这种方式加速 CSM 将减缓月球在其轨道上的速度,因为物理法则要求能量必须守恒。然而,由于两者质量的巨大差异,对月球的影响微不足道。

总结

本文提到的 Python 模拟允许你尝试著名的自由返回轨道,这一轨道使 NASA 决定冒险提前登月。模拟的好处在于,如果失败了,你还能活着再试。NASA 为所有拟议任务运行无数次模拟,结果帮助 NASA 在竞争的飞行计划之间做出选择,找到最有效的路线,决定在出现问题时该如何处理,等等。

模拟对于外太阳系探索尤其重要,因为巨大的距离使实时通信变得不可能。关键事件的时机,如点燃推进器、拍摄照片或释放探测器,都是基于详细的模拟预编程的。

参考文献及进一步阅读

现实世界的 Python: 黑客解决问题的代码指南(无淀粉出版社,2020)由李·沃恩编著,专门用一章详细解释自由返回模拟代码。

阿波罗 8 号: 第一次登月任务的惊险故事(亨利·霍尔特公司,2017),由杰弗里·克卢格编著,涵盖了阿波罗 8 号历史性任务的从不太可能的开始到“不可思议的胜利”。

PBS Nova 阿波罗 8 号如何离开地球轨道 是一个关于阿波罗 8 号转月注入机动的短视频剪辑,标志着人类首次离开地球轨道,前往另一个天体。

NASA Voyager 1 & 2 维修手册(海恩斯,2015),由克里斯托弗·赖利、理查德·科菲尔德和菲利普·道林撰写,提供了关于三体问题以及迈克尔·米诺维奇对太空旅行众多贡献的有趣背景。

维基百科的引力助推页面包含了许多有趣的引力助推机动和历史行星掠过的动画,这些动画可以通过本文提到的阿波罗 8 号模拟器来重现。

追逐新视野: 探索首个冥王星任务的史诗(皮卡多出版社,2018),由艾伦·斯特恩和大卫·格林斯普恩编著,记录了模拟在 NASA 任务中的重要性和普遍性。

谢谢

感谢阅读,请关注我以获取更多未来的快速成功数据科学文章。

探索解决股票切割问题的贪婪算法

原文:towardsdatascience.com/how-bad-is-being-greedy-cdec75ce52a6

为股票切割问题创建快速估算

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

·发表于 Towards Data Science ·7 分钟阅读·2023 年 8 月 3 日

目录

  1. 股票切割问题的动机

  2. NP-Hard 问题的快速概述

  3. 将股票切割问题编码到 Python 中

  4. 贪婪算法

  5. 与低维空间中的穷举搜索的比较

  6. 与随机搜索在更高维空间中的比较

  7. 结论

股票切割问题的动机

我是一名数据科学家。虽然我的数据科学技能在工作中非常重要(这很自然),但我发现数据科学概念也帮助解决了许多工作之外的问题!

我的数据科学技能在我的 DIY 爱好中派上了用场。一个常见的挑战是知道如何规划材料的切割。我有一个需要从多个同尺寸材料中切割的清单。如何规划这些切割以尽可能少浪费呢?这个挑战被称为“股票切割问题”。事实证明,这个问题很难解决,实际上是 NP-Hard 的!

在本文中,我将探索一种“捷径”(双关语)来解决这个问题,并分析这种方法与长途解决方案的比较。

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

我去年制作的白橡木桌面,钢制底座 — 作者图片

NP-Hard 问题的快速概述

我不会在这里深入探讨 NP-Hard 问题,但我确实想给出一些直观的理解。使优化问题变得困难的通常是其解决方案空间的大小。也就是说,你需要探索多少可能的解决方案才能找到最佳方案?一个问题的难度通常通过问题规模增长时解决方案空间增长的速度来评估。

对于“股票切割问题”,当你增加更多切割时,问题变得更大。看看解决方案空间增长的速度吧!

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

作者图片

解空间呈阶乘增长,这意味着必须搜索的解决方案总数是 n!,正如你所看到的,这个数字增长非常快。

NP 代表‘非确定性多项式’,这意味着问题的增长速度快于任何多项式函数。有很多资源深入探讨 NP/NP-hard 问题。这里我只会讨论到这些。

将库存切割问题编码为 Python

库存切割问题本质上是一个排序问题。你按照特定顺序进行切割,当某块库存的长度用完时,你开始在下一块库存上进行切割(仍然按照顺序)。

可视化最能解释这一点。假设我们有这个切割顺序:[4’, 2’, 1’, 2’, 2’, 1’],并且我们有 5’ 的库存。浪费计算如下:

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

图片作者

这里我们总共浪费了 4’。

但是,如果我们改变顺序(保持所有相同的切割),可能会得到不同的浪费水平。让我们尝试 [4’, 1’, 2’, 2’, 1’, 2’]:

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

图片作者

在这里,我们只有 3’ 的浪费——简单地改变顺序就减少了我们的浪费!这就是这个优化问题的核心思想。我们想找出哪种切割顺序最好。

现在,为了将其编码为 Python 脚本,我们需要 (1) 用于计算每个订单浪费的函数,和 (2) 将列表排序为最优顺序的算法。

计算浪费的函数只是复制了上述逻辑。以下是 Python 代码:

def total_waste(stock_size, solution):

    '''
        Calculates cutoff waste give a specific solution

        inputs
        stock_size (float) : the dimension of the stock 
                             available for purchase
        solution (list)    : list of floats depicting the 
                             order to make the cuts

        output
        cut_off_waste (float) : the total cutoff waste of 
                                the given solution

    '''

    # set up variable to keep track of the total lengths of 
    # cuts on current piece of stock
    temp_cut_length = 0

    # start with no waste
    cut_off_waste = 0

    for cut in solution:

        # if next cut doesn't fit on current stock,
        # calculate new waste and reset for another piece of stock
        if temp_cut_length + cut > stock_size:

            # calculate cutoff waste
            cut_off_waste += stock_size - temp_cut_length

            # reset cut length
            temp_cut_length = cut

        else:
            # add to cumulative length of cuts on stock
            temp_cut_length += cut

    # add in last cut waste -- it is not captured in the loop
    cut_off_waste += stock_size - temp_cut_length

    return cut_off_waste

我们将在下一节中介绍所需的算法。

贪婪算法

贪婪算法非常简单,只需找到适合当前库存剩余部分的最大块。

使用之前的示例,我们将假设我们想进行这些切割 [4’, 2’, 1’, 2’, 2’, 1’],并且我们需要一个贪婪算法来优化顺序。

我们首先从适合当前库存的最长切割开始。由于我们还没有进行任何切割,我们当前的库存长度是 5’。4’ 是我们拥有的最长切割,它适合在 5’ 的剩余库存中。下一个最长的切割是 2’,由于我们只剩下 1’ 的库存,这个切割太长了。我们转到下一个最长的切割,即 1’。它适合在剩余库存中,因此我们下一个切割是 1’。该算法按照这种模式进行,直到没有剩余的切割。

以下是该算法在 Python 中的实现:

def greedy_search(cuts, stock_size):

    '''
        Calculates a greedy optimal solution

        inputs:
        cuts (list)        : cuts that need to be made
        stock_size (float) : size of stock available for purchase

        outputs:
        cut_plan (list) : sequence of cuts to obtain greedy 
                          optimal results
        waste (float)   : amount of material wasted by solution

    '''

    # empty cut off plan, to be populated
    cut_plan = []
    # start with cutoff size equal to stock size
    cut_off = stock_size
    # copy cuts list to avoid modifying original list
    cuts_copy = copy(cuts)

    # sort cuts in desc order
    cuts = list(np.sort(cuts)[::-1])

    # continue ordering cuts until
    # all cuts have been ordered
    while len(cuts_copy) > 0:

        for cut_size in cuts_copy:

            # if cut size is smaller than remaining stock,
            # assign the cut now
            if cut_size < cut_off:

                # add cut to plan
                cut_plan.append(cut_size)

                # update the leftover amount
                cut_off -= cut_size

                # remove cut from list of cuts still needing 
                # to be ordered
                cuts_copy.remove(cut_size)

        # reset cut_off to be the full stock size
        cut_off = stock_size

    # calculate waste using total_waste function
    waste = total_waste(stock_size, cut_plan)

    return cut_plan, waste

与低维空间穷举搜索的比较

通过使用贪婪算法的近似解,我们节省了大量时间,但这种近似解有多好?对解空间进行穷举搜索可以得到全局最优解——这是我们的金标准。让我们将贪婪算法的解与仅有少量切割的全局最优解进行比较(记住,找到大量切割的全局最优解确实很困难)。

我随机创建了 250 个切割列表,切割尺寸范围从 2 到 10。每个切割的范围是 0 到 1,库存尺寸设置为 1.1。以下是性能表现:

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

图片由作者提供

正如你所见,随着’n’的增加,贪婪算法的性能相对于全局最优解变得更差,但仍然相对接近且高度相关。

与高维空间中的随机搜索比较

不幸的是,我们有一个重大的盲点……也就是说,我们不知道在高维空间中的全局最优解。现在,我们进入比较不同类型启发式算法(旨在近似全局最优解的算法)的领域。贪婪算法与随机搜索解空间的效果如何?

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

图片由作者提供

我们可以看到,随着切割数量的增加,随机搜索的效果变得越来越差。这是有道理的,因为随机搜索是在随机选择 500 个解并挑选最佳的一个——随着解空间的爆炸性增长,我们随机搜索到的解空间的概率百分比越来越小。我们现在可以看到,贪婪解法明显比随机查看潜在解决方案要好。

结论

看起来,对于股票切割问题,贪婪解法是一种合理且非常快速的找到相当好解的方法。对我来说,这就足够了。我每年只做几个项目,通常规模较小。然而,对于制造厂等应用,更复杂且密集的方法可能对公司有显著的经济影响。你可以研究一下“混合整数线性规划”(MILP),这是一种寻找更优解的方法。

如果我要深入研究这个问题,我会将贪婪方法与更好的元启发式算法(随机搜索可能是最差的)进行比较,例如各种版本的爬山算法、禁忌搜索或模拟退火。不过现在我就先放到这里,我还有另一个表格要做!

有关本文中使用的所有代码,请参见这个 repo

人工智能如何使旧视频看起来更流畅?

原文:towardsdatascience.com/how-can-ai-make-old-videos-look-smoother-5ad8b70fdd64

视频帧插值技术已经取得了长足的进展,而人工智能正在将其引向一些奇怪的方向。

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

·发表于 Towards Data Science ·阅读时长 7 分钟·2023 年 1 月 10 日

那是在 2015 年,我正在为与我的博士生导师委员会的会议创建一些数据可视化。这是在我研究生阶段接近尾声的时候,我运行了一些超级计算机模拟,模拟了一个在星际气体云中形成的大质量恒星。

我认为展示这些模拟结果的最佳方式是创建各种数据动画。我的分析代码处理了数吉字节的模拟数据,并在特定时间间隔生成了图像文件。因此,我使用 ffmpeg 将它们拼接成动画:

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

这是一个展示原恒星盘演化过程的天体物理学模拟视频。作者自制。请参阅 Klassen et al. (2016)

我一直希望能拥有更高的帧率,以便获得更流畅、更美观的动画,但我受限于模拟中获得的数据。

有时我会花几个小时尝试生成中间帧,以使我的影片在编译时看起来更流畅。那时我的尝试笨拙且最终被放弃,但今天已经有许多技术效果非常好。事实上,大多数现代电视都包括(默认开启的)选项,以人工增强视频的帧率。

这项技术的正式名称是视频帧插值(VFI),结果发现这一领域已有相当多的研究。

什么是视频帧插值?

视频画面通常是由单独的静态帧组装而成的。如果帧率较低,视频可能会显得“跳跃”。为了让视频看起来更流畅,已经开发了各种技术来人工插入原始帧之间的中间帧。

在下面的示例中,一个短动漫剪辑的帧率通过 AI 技术提升了 8 倍。结果是视频更加平滑。

让我们深入探讨这些技术。我们将从一些不需要人工智能的方法开始,最后介绍一些最先进的方法。

作为我们的源材料,我们将使用由电影制片人Pat Whelen拍摄的 6 秒钟火车机车剪辑,上传到免费的股票照片和视频网站Pexels

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

原始 23 fps 的火车机车剪辑。感谢:Pat Whelen, Pexels。免费使用。

原始视频以 23 帧每秒的高分辨率录制。一般来说,我们的目标是在插值过程中将帧率翻倍。

帧插值技术

帧平均

添加更多帧的最简单方法之一是将两个连续的帧混合,创建这两帧的平均值。这很容易做到。我使用了ffmpeg来执行插值,使用了minterpolate滤镜:

ffmpeg \
  -i input/train.mp4 \
  -crf 10 \
  -vf "minterpolate=fps=46:mi_mode=blend" \
  output/train_blended.mp4

有关滤镜设置的更多细节可以在这里找到。结果如下,转换为动画 gif。

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

源视频帧率通过视频帧混合技术得到了提升。

如果仔细观察,你可以从结果视频中看到,任何运动的地方都会出现伪影。如果物体在帧之间移动过多,那么混合的中间帧会非常明显地显示物体出现在两个位置,并且在运动的地方呈半透明状。

为了克服这个问题,研究人员开发了运动估计技术,以提高插值的质量。

运动估计

为了创建看起来不仅仅是两个其他帧模糊平均值的中间帧,开发了运动补偿帧插值。这种方法通过识别连续帧中的物体,从类似的视觉特征计算这些物体的运动路径。这样就创建了一个向插值算法可以利用的向量“运动场”。

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

来自Choi & Ko (2010)的图示,显示了覆盖在视频帧上的运动场。

多年来,多个运动估计算法已被实现到ffmpeg中,我们将使用一种称为“重叠块运动补偿”(OBMC)的算法。结果如下:

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

使用名为重叠块运动补偿的运动插值技术增强了源视频的帧率。

尽管生成的视频质量要好得多,但视频中仍可能出现微小的伪影。为了实现上述视频,我再次依赖于ffmpeg中的minterpolate滤镜,但使用了一些不同的设置:

ffmpeg \
  -i input/train.mp4 \
  -crf 10 \
  -vf "minterpolate=fps=46:mi_mode=mci:mc_mode=obmc:me_mode=bidir" \
  output/train_obmc.mp4

使用人工智能的帧插值

计算机视觉领域正在通过新人工智能技术的应用迅速发展。深度神经网络可以执行高度准确的图像分割、物体检测甚至 3D 深度估计。

之前的技术依赖于估计帧之间物体的运动。这些物体是通过视觉特征检测的。卷积神经网络(CNNs)在从图像中提取视觉特征方面表现出色,因此在这里应用它们似乎是合理的。

接下来,如果我们能更多地了解图像所表示的世界的 3D 特性,那么我们可以更好地估计图像中不同部分的运动,从而生成更准确的中间帧。

这里的真正改变者是增加了深度估计。一种训练有素的神经网络可以预测图像中各部分的距离。

下方的动画展示了一篇名为“深入探讨自监督单目深度估计”(ICCV 2019, 代码)的论文中的结果。深度神经网络准确地逐帧估计图像中哪些部分代表了较近的物体与较远的物体。

这种技术的良好效果并不令人感到意外。这是我们的大脑本能地做的事情,即使是在闭上一只眼睛去除视差信息时也是如此。使用双眼可以进一步提高准确性。

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

深度感知视频帧插值技术,如 2019 年由 Bao 等人提出的DAIN 算法,比以前的方法表现更好,因为它们可以考虑遮挡情况,即当物体互相经过时。

最近,黄等人(ECCV 2022)提出的“实时中间流估计”(RIFE)技术取得了卓越的基准成绩,同时运行速度也快得多。这可能代表了目前的最先进技术。

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

来自 RIFE 论文的一个示例视频片段,展示了 2 张输入图像的 16 倍插值:github.com/megvii-research/ECCV2022-RIFE

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

RIFE 对相同输入进行的深度估计。

让我们通过将 RIFE 算法应用于纽约市场景来总结我们的练习。我将GitHub 仓库克隆到我的笔记本电脑上,下载了 repo 的 ReadMe 文件中描述的预训练模型参数,并对requirements.txt文件进行了几处调整。我在没有 GPU 帮助的情况下在笔记本电脑上运行了代码。处理 6 秒的视频素材大约花费了 15 分钟。以下是结果:

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

使用新颖的深度 CNN 技术进行视频插值,“实时中间流估计”(RIFE)。

在 RIFE 创建的高分辨率 mp4 视频中效果更佳。对于本文,我将该视频转换成了动画 gif。

最终想法

这个领域发展非常迅速。训练于互联网上数十亿图像的图像生成 AI 已经能够从一系列输入图像或基于文本的提示中生成高度一致的、新颖的图像。

其他技术将深度估计方法扩展到从多个摄像机角度创建点云,然后使用称为神经渲染的技术合成新的人工视角。举例来说,Rückert 等(2021)及其神经渲染方法:

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

Rückert 等(2021)中的神经渲染。左侧的图像是从一系列真实图像(右下角)生成的。

随着这一领域的持续发展,我们可以期待中间帧的准确性更高,伪影更少,即使更多的帧本质上是由非常大的预训练人工神经网络“梦到”或幻觉出来的。相对较少的输入帧即可在它们之间产生高度逼真、流畅的过渡。

这打开了很多创造性的可能性,比如恢复旧档案视频、为静态图像制作动画,以及从少量二维照片中创建虚拟现实世界。

这也可能导致世界上充斥着大量合成图像,使得区分什么是实际真相变得困难。同时,期待你的视频看起来非常流畅。

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

我的原始研究数据可视化(见上文),经过了 RIFE 算法处理。

如果你喜欢阅读这样的故事并希望支持我作为作者,可以考虑注册成为 Medium 会员。每月 $5,你可以访问我和其他成千上万名作家的所有作品。如果你通过我的链接注册,我将获得一小笔佣金,而你无需额外付费。

[## 通过我的推荐链接加入 Medium — Mikhail Klassen

阅读米哈伊尔·克拉森(Mikhail Klassen)以及在 Medium 上的其他数千名作家的每一个故事。你的会员费直接支持…

mikhailklassen.medium.com

机器学习如何应用于音频分析?

原文:towardsdatascience.com/how-can-machine-learning-be-used-in-audio-analysis-847ebbefeb6?source=collection_archive---------18-----------------------#2023-01-10

了解机器学习如何用于分析音频信号,并为分类和回归任务生成预测

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

·

关注 发表在 Towards Data Science ·5 分钟阅读·2023 年 1 月 10 日

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

图片由 Jarrod Reed 提供,来源于 Unsplash

机器学习在近十年来迅速发展。实际上,它被广泛应用于医疗保健农业制造业等多个行业。随着技术和计算能力的进步,机器学习的潜在应用不断增加。由于数据以各种格式大量存在,现在正是利用机器学习数据科学从数据中提取各种见解并进行预测的最佳时机。

机器学习最有趣的应用之一是在音频分析中,理解不同音频格式的质量。因此,使用各种机器学习和深度学习算法可以确保对音频数据进行预测并理解其结果。

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

Med Badr Chemmaoui拍摄的照片,来源于 Unsplash

在进行音频分析之前,必须单独采样并分析信号。我们采样的频率也称为采样率奈奎斯特率。将时域信号转换为频域信号将非常有助于对信号进行逻辑理解,并计算如功率和能量等有用的组件。所有这些特征都可以提供给我们的机器学习模型,用于进行预测。

有一种流行的将音频信号转换为谱图(图像)的方法,这样可以将其输入到**卷积神经网络(CNNs)**中进行预测。谱图可以捕捉音频信号的重要特征,并以 2D 形式呈现,从而可以与基于图像的网络一起使用。

许多机器学习模型在给定图像的情况下能很好地预测输出标签。因此,包含幅度和不同频率单位的音频信号也可以转换为图像,并用于强大的机器学习预测。

在这篇文章中,我们将通过一个随机示例来讨论如何读取音频文件,并绘制它以了解其图形表示。随后,我们将对图像数据进行特征工程,并在将音频转换为图像后执行卷积操作。最后,我们将获得样本预测以用于未见过的数据。请注意,这段代码仅用于演示,未考虑具体数据集。

读取数据

我们将导入用于读取音频文件的必要库,这些文件通常以**‘.wav’**格式存在。在读取文件后,我们会得到一个数组表示,如上面的代码单元所示。最后,我们将绘制输出,以便使用 matplotlib 查看它的样子。

特征工程

现在数据已经被绘制和可视化以查看‘.wav’文件中的异常,我们将使用一个流行的库**‘librosa’**,它可以用来计算音频数据的短时傅里叶变换。这是为了确保信号被分解成其组成频率,这是一种在众多行业中广泛使用的技术。

模型训练

现在我们已经使用librosa获取了频率成分,我们将使用机器学习模型进行预测。需要注意的是,这是一项分类问题,因此,我们选择使用随机森林分类器。不过,也可以使用任何其他适合你的需求和业务的机器学习模型。

我们现在将使用相同的代码,但用于回归任务,其中输出是连续的而不是离散的。下面是关于如何进行训练和使用随机森林回归器监控性能的代码单元格。

超参数调优

在模型(随机森林)可以实时部署之前,确定正确的超参数非常重要。在深度神经网络中,有很多超参数需要搜索。由于我们使用的是随机森林作为基准模型,因此我们应该能够在最小的搜索空间内找到正确的超参数。让我们看看如何在通用数据集上进行超参数调优。

在代码单元格中,我们指定估计器数量树的最大深度,以便在测试集上获得最佳结果。我们最终监控得分,并观察超参数的变化如何导致模型性能的提升。

模型部署

现在我们已经进行了超参数调优以提供最准确的预测,是时候保存提供最佳结果的机器学习模型了。因此,我们将使用 python 中的pickle库,以便能够保存可以用于服务的机器学习模型。

保存模型后,我们将在构建生产就绪代码时再次加载它,并用它来对 incoming batches 或数据流进行预测。需要注意的是,在训练数据期间使用的特征化步骤也必须在测试集上执行,以避免数据偏差。

持续监控

我们知道模型在处理接收用户数据时表现良好,但一个重要且常被忽视的步骤是监控模型的预测质量。模型的表现可能会与训练期间有所不同。这可能是因为训练数据和服务数据之间存在差异。例如,可能会出现概念漂移数据漂移,这些情况会对投入生产的推理模型的性能产生显著影响。

持续监控确保采取措施检查预测模型,并了解其在变化数据下的行为。如果预测的准确性最低,并导致企业收入损失,则应采取措施用这些异常数据重新训练模型,以确保模型行为不会出现意外变化。

结论

在阅读完这篇文章后,你可能对如何进行音频数据的机器学习以及整体工作流程有了很好的了解。我们见识了读取数据、特征工程、模型训练、超参数调整、模型部署及持续监控等步骤。应用这些步骤并确保在开发管道时没有错误,将导致一个稳健的机器学习生产系统。

以下是你可以联系我或查看我的工作的方式。

GitHub:suhasmaddali (Suhas Maddali ) (github.com)

YouTube:https://www.youtube.com/channel/UCymdyoyJBC_i7QVfbrIs-4Q

LinkedIn:(1) Suhas Maddali, Northeastern University, Data Science | LinkedIn

中等: Suhas Maddali — Medium

如何在没有复杂算法的情况下改进预测指标和流程?

原文:towardsdatascience.com/how-can-you-improve-your-forecasting-metrics-and-process-without-sophisticated-algorithms-2819e88fb823

开发描述性分析可以帮助识别改进需求规划 KPI 和流程效率的重点领域

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

·发表于数据科学前沿 ·阅读时间 10 分钟·2023 年 8 月 26 日

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

图片由Lukas Blazek提供,来源于Unsplash

引言

需求规划是集成业务规划(IBP)流程的核心阶段。此阶段的结果构成了其他阶段(例如供应规划、生产规划)的基础。此阶段通常以基于历史销售生成的统计预测开始,并将其与销售输入结合以得出初步基线预测。随后,这一预测将经过审查并与销售和营销相关者对齐,从而形成共识预测。我们通常在 IBP 的这一阶段追踪预测准确性和偏差作为关键绩效指标(KPI)。供应链、销售和营销团队可能会投入大量时间、精力(和金钱)来准确预测,往往还会投资于昂贵的预测工具。虽然拥有一套先进的算法确实有助于提高预测准确性,但通过历史销售和预测数据得出的描述性分析也可以帮助简化需求规划过程并提升 KPI。

我们为什么需要这样的分析?

大部分情况下,分析有两个主要目的:

  1. 它们有助于识别提升 KPI 的机会

  2. 它们有助于识别流程中存在的低效环节

例如,将每个产品和客户的销售预测准确性与统计预测准确性进行比较,可以帮助了解在哪些方面投入时间收集销售输入会比系统生成的统计预测更准确。销售团队可以专注于这些特定项目,从而节省时间和精力,同时生成更好的预测。

分析还帮助向高级领导层传达明确的信息。与其尝试解读晦涩的 KPI 数据,不如利用分析突出需要改进的具体领域,以及可以从整个业务中借鉴的高绩效实体。这在获取管理层对特定、具体目标的认可时非常有效。

设计分析

一种更直观的方法是查看需求规划过程的各个组成部分(图 1),并为这些子过程开发描述性分析。

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

图 1. 需求规划过程

  • 本文中的所有图像,除非另有说明,均由作者提供

首先,我们分析历史销售数据并清理异常值。在统计预测生成步骤中,使用调整了异常值的历史销售数据来生成基于系统的预测。在下一步骤中,销售团队收集客户反馈或提供其需求估计,这成为销售预测。需求经理使用分析仪表板分析统计和销售预测、历史销售数据以及特殊事件信息,以制定基准预测。基准预测由销售、市场营销和供应规划团队的利益相关者在定期会议上(通常是每月或每周)审查,以达成共识预测。在此会议上,所有利益相关者都审查分析,以确定重点行动项。讨论后,将供应限制(如果有的话)纳入预测,以得出最终预测。

在实施分析之前,必须决定其粒度。组织内的不同业务单元可能会在不同的产品和客户层级上规划其需求、供应和物流。产品规划可能会根据制造设置在 SKU、产品系列(或其他)层级进行。客户规划可能会根据账户设置在客户级别或市场细分级别进行。与其为每个单独的实体开发和展示描述性分析,不如开发选择分析和洞察的层级的灵活性。分析设计也受我们希望改进的 KPI 的影响。在本文中,我们将重点讨论基于销量的描述性分析,这有助于改善加权平均绝对百分比误差(MAPE),作为预测准确性的指标。

分析模板

在本节中,我们将讨论使用预测和历史销售(实际数据)的描述性分析。请注意,所有的预测和实际数据均为所选细化层级的销售量。下面的可视化中所选择的细化层级(在产品和客户层级、历史时间段、预测类型等方面)只是示例,可以根据业务设置进行更新。每个可视化顶部的蓝色框是下拉菜单,用户可以选择多个项目(显示实体除外,在该选项中我们只能选择一个实体)。显示实体是分析可视化的层级。时间段表示分析所用的最近过去的时间段(在本节所示示例中为月份)。

I. 需求规模和变异性

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

图 2. 需求规模和变异性

在图 2 中,我们展示了过去 12 个月 SKU 层级的实际销售数据。这些数据以箱线图的形式展示,突出显示了销售的中位数、第 25 百分位、第 75 百分位、最小值和最大值。

洞察:图 2 中的箱线图提供了历史时间段内需求规模(由中位数表示)以及需求的变异性(通过四分位距(IQR)表示)。我们可以选择按中位数或 IQR 排序,以识别最大销售量或最大变异性的项目。

行动:通常,我们将预测工作重点放在高销售量和高变异性的项目上,同时对低销售量或低变异性的项目使用统计预测。

II. 历史销售帕累托图

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

图 3. 历史销售帕累托图

在图 3 中,我们绘制了过去 6 个月每个客户提升的实际数据。

洞察:图 3 中的图表显示了按 6 个月提升量降序排列的客户列表。此视图还使我们能够计算这一时期内一组客户的累计销售额。

行动:通常,少数客户负责了大部分需求(80-20 法则)。集中精力预测这些项目,将有助于获得更高的时间投资回报。

III. 持续表现不佳的项目

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

图 4A. 预测偏差(原始值)

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

图 4B. 预测偏差(绝对值)

在图 4A 和图 4B 中,我们分别查看了过去 6 个月 SKU 层级的预测与实际数据的原始和绝对偏差。

洞察:图 4A 中的正偏差显示了我们持续高估的区域,而负偏差突出了持续低估的项目。第二张图(图 4B)显示了我们对某些项目预测时机的错误(间歇性地高估和低估)。

行动:理想情况下,我们会降低有持续正偏差的项目的预测,并增加那些持续被低估的项目的预测,除非业务条件发生了变化。对于那些我们无法准确把握时机的项目,我们可能需要与客户合作,了解根本原因,并更好地把握时机。

IV. 基于预测准确度的项目分段

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

图 5. 销售预测误差与统计预测误差之间的偏差

在图 5 中,我们展示了 SKU-客户组合在过去 6 个月的销售预测误差与统计预测误差之间的偏差。

洞察:图 5 中的正偏差显示了销售预测在 6 个月内的累计误差高于相应的统计预测。负偏差显示了销售调整使得预测优于统计预测(即累计销售预测误差低于所选时间段内的累计统计预测误差)。

行动:为了改进指标,我们将对有正偏差的项目使用统计预测,对有负偏差的实体使用销售预测。这再次假设业务条件保持稳定。

V. 基于近期销售的异常值

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

图 6. 从近期销售的预测偏差

在图 6 中,我们调查了下个月销售预测与过去 3 个月平均值之间的偏差。

洞察:图 6 中的正误差显示了我们相对于近期销售的过度预测,而负偏差显示了我们预计销售将低于近期历史。

行动:我们希望仔细审查异常值,并验证预测是否偏离实际,或最近销售是否存在异常,如有必要进行调整。

VI. 基于增长和季节性的异常值

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

图 7A. 基于增长率的预测偏差

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

图 7B. 实际与预测增长率

对于这些视觉图表,我们通常选择产品系列或更高层次的属性,因为较低层次的属性(例如 SKU)可能会导致增长率的噪音。出于同样的原因,我们倾向于按季度查看异常值,而不是按月。在图 7A 中,我们查看了销售预测偏差的产品系列与预期第二季度销售额的偏差。第二季度的预期销售额仅仅是最后可用的第二季度销售额与多个年份的平均第二季度销售增长率的乘积。在图 7B 中,我们深入分析了过去 3 年每季度的增长率(%)。

洞察:图 7A 中的正偏差显示了我们在预测销售时的过度预测情况,相较于考虑了年均增长和季节性的预期销售,而负偏差显示了我们预计销售低于调整后的年均增长的季节性预期。深入研究图 7B 中的一个产品系列(例如,PF21),我们发现明年第二季度的估计增长率远低于过去 3 年的平均第二季度增长率,这需要进一步审查。

行动:需要审查最大的偏差(正负),以了解为什么预测与预期增长和季节性不一致,并相应调整。

VII. 价格-销量异常值

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

图 8.(标准化)价格与销量

在图 8 中,我们将产品系列 PF23 的标准化价格与销量进行对比。虽然价格使用了相关饲料‘Feed3’的价格进行标准化,但销量未进行标准化,因为我们可能没有关于该产品系列或类似产品系列的整体行业需求数据。在历史期间,使用历史价格和销量生成散点图,而使用预测价格和销量生成前瞻性的标准化价格和销量预测。

洞察:散点图显示了在不同粒度下价格(标准化)和销量(标准化)之间的相关性。虽然这大致说明了销量如何随价格变化而变化(注意标准化实体本身是近似值),但该图表可以帮助识别预测异常值(例如,在与(标准化)历史价格与销量趋势比较时,对于给定的预测(标准化)价格,预测(标准化)销量过高)。

行动:我们在价格与销量图表中探索预测异常值,并审查历史业务背景以及当前市场需求和供应条件,以评估异常值是否合理。如果不合理,则调整销量或价格以使预测与历史趋势一致。

VIII. 随时间变化的一致预测恶化或改善的实体

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

图 9A. 预测与实际(原始)的偏差

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

图 9B. 选定预测中误差最小的项目

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

图 9C. 滞后预测与实际数据的对比

在图 9A 中,我们分析了过去 6 个月Lag2Final Forecast(实际数据分析前 2 个月最终确定的预测)在 SKU 级别的表现。进一步地,我们还调查了图 9B 中显示的在 6 个月内具有最小Lag2Final Forecast绝对误差的产品系列项。为了理解这些项目的趋势,我们在图 9C 中绘制了不同滞后预测与实际数据的对比图。

洞察:从图 9A 中,我们可以根据误差是正还是负来识别那些持续被高估或低估的实体。图 9B 显示了在一段时间内具有最高准确性的滞后预测项。我们深入分析(如图 9C 所示),调查图 9B 表中的每个项目在过去一段时间内相对于其他滞后预测的表现。

行动:我们希望减少所有滞后预测的误差,因此会重点关注所有这些预测中的表现不佳者。另一个可行的事项是从任何粒度上表现最佳的滞后预测中学习,并将其用于未来参考。例如,如果我们发现Lag3FinalLag2Final再到Lag1Final的预测效果越来越差,我们可能首先想要了解根本原因——如果被认为是与业务异常无关的糟糕预测更新,我们可能会在特定项目的Lag3Final后停止更新该预测。

摘要

虽然我们讨论了一些关键的描述性需求规划分析,但这些并不是详尽无遗的。例如,详细列表可以在 这里 找到。然而,考虑分析数量的权衡是重要的。分析过少无法提供足够的洞察,而分析过多则消耗大量时间和精力,违背了例外管理预测的初衷。目标是从多个分析中寻找洞察的一致性。最终,无论分析的数量如何,我们都希望利用这些分析来识别需要额外关注的领域,以改善组织的需求规划过程和预测准确性。

感谢阅读。希望你觉得有用。随时向我发送评论到 rkumar5680@gmail.com。让我们在 LinkedIn 上联系。

ChatGPT 的工作原理:聊天机器人背后的模型

原文:towardsdatascience.com/how-chatgpt-works-the-models-behind-the-bot-1ce5fca96286

对你听说过的聊天机器人背后的直觉和方法的简要介绍。

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

·发表于 Towards Data Science ·阅读时间 9 分钟·2023 年 1 月 30 日

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

这篇关于驱动 ChatGPT 的机器学习模型的温和介绍,将从大语言模型的介绍开始,深入探讨使 GPT-3 能够训练的革命性自注意力机制,然后深入挖掘使 ChatGPT 异常出色的强化学习技术。

大语言模型

ChatGPT 是一种自然语言处理模型的扩展,称为大语言模型(LLMs)。LLMs 消化大量的文本数据,并推断文本中的单词之间的关系。随着计算能力的进步,这些模型在过去几年里得到了发展。LLMs 随着输入数据集和参数空间的增大而提高其能力。

语言模型的最基本训练涉及在单词序列中预测一个单词。最常见的是下一词预测和掩码语言建模。

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

作者生成的下一词预测和掩码语言建模的任意示例。

在这种基本的序列技术中,通常通过长短期记忆(LSTM)模型实现,模型根据周围的上下文填入最有统计概率的单词。这种序列建模结构有两个主要的限制。

  1. 模型无法对一些周围的单词赋予比其他单词更多的权重。在上述示例中,虽然‘reading’通常会与‘hates’相关联,但在数据库中‘Jacob’可能是如此热衷于阅读,以至于模型应给予‘Jacob’比‘reading’更多的权重,从而选择‘love’而不是‘hates’。

  2. 输入数据是单独且顺序处理的,而不是作为整个语料库处理。这意味着,当 LSTM 被训练时,上下文窗口是固定的,仅在序列中的几个步骤之外扩展。这限制了单词之间的关系的复杂性和可以推导出的意义。

针对这个问题,2017 年 Google Brain 团队引入了变换器。与 LSTM 不同,变换器可以同时处理所有输入数据。通过使用自注意力机制,模型可以根据语言序列的任何位置对输入数据的不同部分给予不同的权重。这一特性显著提升了将意义注入 LLM 的能力,并使得处理显著更大的数据集成为可能。

GPT 和自注意力

生成预训练变换器(GPT)模型最早由 openAI 在 2018 年推出,命名为 GPT-1。之后,模型在 2019 年演变为 GPT-2,2020 年演变为 GPT-3,最近在 2022 年推出了 InstructGPT 和 ChatGPT。在将人类反馈整合到系统之前,GPT 模型演变的最大进展是由计算效率的成就驱动的,这使得 GPT-3 能够在比 GPT-2 上训练更多的数据,从而拥有更广泛的知识基础和执行更广泛任务的能力。

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

GPT-2(左)和 GPT-3(右)的比较。由作者生成。

所有 GPT 模型大体上遵循在“Attention is All You Need”(Vaswani et al., 2017)中建立的变换器架构,该架构包括一个编码器来处理输入序列和一个解码器来生成输出序列。在原始变换器中,编码器和解码器都有一个多头自注意力机制,使得模型能够对序列的不同部分赋予不同的权重,从而推断意义和上下文。作为对原始变换器的演变,GPT 模型利用了 Radford 等人(2018)建立的仅解码器的变换器,采用了掩蔽自注意力头。该架构通过 Radford 等人(2019)和 Brown 等人(2020)的工作进一步微调。采用仅解码器的框架是因为 GPT 的主要目标是生成连贯且上下文相关的文本。自回归解码由解码器处理,使得模型能够保持上下文,并逐个标记生成序列。

驱动 GPT 的自注意力机制通过将标记(文本片段,可以是一个单词、句子或其他文本组)转换为向量,来表示标记在输入序列中的重要性。

  1. 为输入序列中的每个标记创建查询、键和值向量。

  2. 通过计算步骤一中的查询向量与每个其他标记的键向量之间的点积,计算它们之间的相似性。

  3. 通过将步骤 2 的输出输入到softmax 函数中生成标准化权重。

  4. 生成最终向量,通过将步骤 3 中生成的权重与每个令牌的值向量相乘,来表示令牌在序列中的重要性。

GPT 使用的‘多头’注意机制是自注意力的进化。模型并非仅执行步骤 1-4 一次,而是并行地多次迭代此机制,每次生成查询、键和值向量的新线性投影。通过这种方式扩展自注意力,模型能够理解输入数据中的子含义和更复杂的关系。

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

作者生成的 ChatGPT 截图。

尽管 GPT-3 在自然语言处理方面引入了显著的进展,但其在与用户意图对齐的能力上仍有限。例如,GPT-3 可能会生成

  • 缺乏帮助性,意味着它们不遵循用户的明确指示。

  • 包含幻觉,即反映不存在或不正确的事实。

  • 缺乏可解释性,使得人们难以理解模型如何得出特定的决定或预测。

  • 包含有害或偏见内容,即有害或冒犯性内容,并传播虚假信息。

在 ChatGPT 中引入了创新的训练方法,以应对标准 LLM 的一些固有问题。

ChatGPT

ChatGPT 是 InstructGPT 的衍生产品,它引入了一种新方法,将人类反馈纳入训练过程,以更好地使模型输出符合用户意图。有关强化学习从人类反馈(RLHF)的详细描述,请参阅openAI 的 2022论文训练语言模型以遵循人类反馈的指示,下面进行了简化。

步骤 1:监督微调(SFT)模型

第一个开发涉及对 GPT-3 模型进行微调,通过聘请 40 名承包商创建一个监督训练数据集,其中输入具有已知输出供模型学习。输入或提示收集自实际用户输入到 Open API 中。标签员随后为每个提示编写了适当的回应,从而为每个输入创建了已知输出。然后使用这个新的监督数据集对 GPT-3 模型进行微调,创建了 GPT-3.5,也称为 SFT 模型。

为了最大化提示数据集的多样性,每个用户 ID 最多只能有 200 个提示,任何共享长前缀的提示都被删除。最后,所有包含个人可识别信息(PII)的提示都被删除。

在汇总来自 OpenAI API 的提示后,标签员还被要求创建样本提示,以填补仅有少量真实样本数据的类别。感兴趣的类别包括

  • 简单提示: 任何任意请求。

  • 少样本提示: 包含多个查询/响应对的指令。

  • 基于用户的提示: 对应于 OpenAI API 请求的特定用例。

在生成响应时,要求标注者尽力推断用户的指令是什么。论文描述了提示请求信息的三种主要方式。

  1. 直接: “告诉我关于……”

  2. 少样本: 给出这两个故事的例子,写另一个关于相同主题的故事。

  3. 续写: 给出一个故事的开头,完成它。

从 OpenAI API 和标注者手工编写的提示汇编得到了 13,000 个输入/输出样本,用于监督模型。

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

图片(左侧)摘自**《训练语言模型以遵循人类反馈的指令》** OpenAI 等,2022 arxiv.org/pdf/2203.02155.pdf。额外的上下文由作者在右侧红色部分添加。

第 2 步:奖励模型

在第 1 步中训练好 SFT 模型后,模型生成了更符合用户提示的响应。下一步的改进形式是训练奖励模型,其中模型输入是一系列提示和响应,而输出是一个缩放值,称为奖励。奖励模型是为了利用强化学习,在这种学习方式中,模型学会生成输出以最大化其奖励(参见第 3 步)。

为了训练奖励模型,标注者会看到 4 到 9 个 SFT 模型的输出,这些输出都是针对一个输入提示的。他们需要将这些输出从最好到最差进行排名,生成输出排名的组合如下。

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

响应排名组合的示例。由作者生成。

将每个组合作为单独的数据点纳入模型导致了过拟合(无法超越已见数据进行推断)。为了解决这个问题,模型是通过将每组排名作为一个单独的批次数据点来构建的。

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

图片(左侧)摘自**《训练语言模型以遵循人类反馈的指令》** OpenAI 等,2022 arxiv.org/pdf/2203.02155.pdf。额外的上下文由作者在右侧红色部分添加。

第 3 步:强化学习模型

在最终阶段,模型会接收到一个随机提示并返回一个响应。这个响应是使用模型在第 2 步中学到的“策略”生成的。策略代表了机器为了实现目标而学会使用的策略;在这个案例中,目标是最大化奖励。基于在第 2 步中开发的奖励模型,会为提示和响应对确定一个缩放奖励值。然后,奖励反馈到模型中,以进化策略。

2017 年,Schulman et al. 介绍了 Proximal Policy Optimization (PPO),这一方法用于更新每次生成回应时的模型策略。PPO 结合了来自 SFT 模型的每个令牌 Kullback–Leibler (KL) 惩罚。KL 散度测量两个分布函数的相似性,并惩罚极端距离。在这种情况下,使用 KL 惩罚减少了回应与在步骤 1 中训练的 SFT 模型输出之间的距离,以避免过度优化奖励模型,并过于偏离人类意图数据集。

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

Training language models to follow instructions with human feedback OpenAI et al., 2022 arxiv.org/pdf/2203.02155.pdf 插入的图片(左)。作者添加的额外背景信息(右)以红色标注。

过程的第 2 和第 3 步可以重复迭代,尽管在实践中尚未广泛实施。

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

由作者生成的 ChatGPT 截图。

模型评估

模型评估通过在训练期间留出一个模型未见过的测试集来进行。在测试集上进行一系列评估,以确定模型是否比其前身 GPT-3 更好地对齐。

有用性:模型推断和遵循用户指令的能力。标注者 85 ± 3% 的时间更喜欢 InstructGPT 的输出而不是 GPT-3。

真实度:模型出现幻觉的倾向。PPO 模型在使用 TruthfulQA 数据集进行评估时,显示出真实度和信息量的轻微增加。

无害性:模型避免不适当、贬低和诋毁内容的能力。无害性通过使用 RealToxicityPrompts 数据集进行了测试。测试在三种条件下进行。

  1. 指示提供尊重的回应:结果显著减少了有害回应。

  2. 指示提供回应,没有任何尊重设置:毒性没有显著变化。

  3. 指示提供有害回应:回应实际上比 GPT-3 模型显著更有害。

要了解更多关于创建 ChatGPT 和 InstructGPT 的方法,请阅读由 OpenAI 发布的原始论文 Training language models to follow instructions with human feedback2022 arxiv.org/pdf/2203.02155.pdf

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

由作者生成的 ChatGPT 截图。

祝学习愉快!

来源

  1. openai.com/blog/chatgpt/

  2. arxiv.org/pdf/2203.02155.pdf

  3. medium.com/r/?url=https%3A%2F%2Fdeepai.org%2Fmachine-learning-glossary-and-terms%2Fsoftmax-layer

  4. www.assemblyai.com/blog/how-chatgpt-actually-works/

  5. medium.com/r/?url=https%3A%2F%2Ftowardsdatascience.com%2Fproximal-policy-optimization-ppo-explained-abed1952457b

关于计算机视觉中颜色表示的全面指南 (CV-02)

原文:towardsdatascience.com/how-color-is-represented-and-viewed-in-computer-vision-b1cc97681b68

颜色空间和颜色模型的详细解释

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

·发布于 Towards Data Science ·7 min read·2023 年 4 月 3 日

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

照片由 Lucas Kapla 拍摄,来源于 Unsplash

动机

我们如何感知一个物体?人类和计算机视觉系统的工作方式相同吗?有多少种颜色?我们是否知道或想知道这些问题的所有答案?如果“是”,那么这篇文章将是最适合你的。

眼睛是造物主创造的美丽杰作,它能以美观和和谐的方式感知物体的颜色。颜色是一种基于电磁波谱的视觉感知 [1]。动物视觉系统探测物体波长的吸收情况,不同的吸收产生不同的颜色。颜色可能是无限的,但我们大致认为存在 1000 万种颜色 [2]。光是产生颜色的必需条件。在没有光的情况下,一切都显得黑暗。想象一下你被锁在一个黑暗的房间里。感觉如何?所以,没有光,世界是没有意义的。它也为我们的生活带来了魅力。

计算机不能像人类一样感知物体。计算机通过一些标准的颜色空间(颜色的表示方式)来生成和识别颜色。

*在这篇文章中,我将讨论不同的颜色模型,以便更好地了解颜色在计算机视觉系统中的表示和感知。*

目录

  1. **人类与计算机视觉系统**

  2. **什么是颜色空间?**

  3. **不同的颜色模型**

人类与计算机视觉系统

人类视觉系统是复杂的。首先,眼睛感知环境/物体,然后不同的器官和神经将信号传递给大脑。最后,大脑进行识别并做出相应的反应。

[注:我只是简单地表示了这个过程,因为它超出了本文的范围。实际上,过程要复杂得多。如果你仍然对了解更多关于人类视觉系统的信息感兴趣,请阅读 文章]**

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

人类与计算机视觉系统(图像来源于作者)

计算机是一台在没有人类隐性或显性指令的情况下无法执行任何任务的机器。对于计算机视觉系统,摄像头拍摄图像以感知环境,摄像头输入进一步传递给计算机。最后,不同的计算机视觉模型识别图像并显示输出。

什么是颜色空间?

颜色是计算机视觉系统的一个重要组成部分。颜色空间是以有组织的方式组合的颜色,主要用于在不同介质中再现颜色。例如,你有一个笔记本电脑屏幕和一个 52 英寸的大型显示器。显然,总像素和颜色组合会有所不同。不同的颜色空间帮助我们使其与屏幕分辨率兼容,以提供更好的颜色组合体验。

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

CIE 1931 xy 色度图(根据 Wikimedia Commons 自由许可证 CC BY-SA 3.0

上面的色度图表示了颜色空间。它展示了不同 x 和 y 轴值及各种波长的波段。这个空间使所有可能的颜色组合对人眼可见。像 RGB、sRGB 等有很多颜色空间。每个颜色空间下的颜色组合(用三角形标记)包含了指定的颜色。阅读 文章以获得详细解释。

不同的颜色模型

颜色模型是我们可以在数学上表示不同颜色的方式。例如,RGB 颜色模型结合了红色、绿色和蓝色。不同强度值的混合产生不同的颜色。

我们经常将颜色模型与颜色空间搞混。 让我们来澄清一下。颜色模型在数学上表示不同的颜色,而“颜色”一词出现在我们在不同介质中再现颜色时。例如,sRGB 颜色空间是红色、绿色和蓝色不同范围的颜色强度的混合。阅读答案如果你还想了解更多区别。

常见颜色模型有 *RGB, CMYK, HSL, 和 HSV*

  • RGB 颜色模型

RGB 是基本的颜色模型组合,包括不同强度的红色、绿色和蓝色。强度值范围从 0 到 255。这个模型使用三个颜色通道(红色、绿色和蓝色)来表示颜色。

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

RGB 加法颜色(来自Wikimedia Commons 公共领域许可证)

可能的颜色组合有(255 x 255 x 255)16,581,375 种。它也被称为加法颜色模型,因为它通过结合 RGB 颜色来产生不同的颜色。大多数显示器使用 RGB 颜色模型。

我创建了一个立方体 RGB 颜色模型的 gif,以便更好地理解。

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

如何通过 RGB 值改变颜色(gif 由作者创建)

立方体上的黑色圆圈表示不同 RGB 强度值的确切颜色。

*[注:我使用了* [***网站***](https://programmingdesignsystems.com/color/color-models-and-color-spaces/index.html) *来模拟颜色模型。]*

  • CMYK 颜色模型

CMYK 颜色模型是由四种颜色青色、品红色、黄色和黑色(Key)组成的。它是 RGB 颜色模型的修改版本,因为我们通过连续减去红色、绿色和蓝色来获得青色、品红色和黄色。

Cayan = 255- Red
Magenta = 255- Green
Yellow = 255- Blue

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

CMYK 颜色模型(图片由作者提供)

我们无法通过青色、品红色和黄色的组合来产生纯黑色。因此,额外的黑色(Key)用于完成模型。

这种颜色模型最常用于打印。

  • HSL 和 HSV 颜色模型

这两种颜色模型是基于人类对 RGB 颜色的感知创建的。尽管这些模型与人类感知不完全相同,但它们是兼容的。在讨论颜色模型之前,我想解释一下主要的颜色属性***色相、饱和度和亮度/明度***。

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

RGB/HSL/HSV 色相,饱和度 100%和亮度 50%(值 100%)(来自 wikimedia commons 的免费许可证CC BY-SA 4.0

色相 — 上面的颜色轮表示从 0 到 360 度的多种颜色。轮子上的任何特定位置都被认为是色相。下图清楚地描绘了这一情况。

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

色相范围 0–360°(来自 wikimedia commons 的免费许可证CC BY-SA 4.0

饱和度 — 它是颜色(色相)的强度。下图表示了红色的饱和度范围。红色的灰度是低饱和度,而纯红色是高饱和度。

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

饱和度范围(左侧为 0%)(Wikimedia commons 免费许可证CC0

明度 / 亮度 — 它是测量单个颜色亮度的指标***。*** 其中,暗色是低亮度,白色是高亮度。蓝色的亮度如下所示。

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

蓝色的亮度/明度(图片由作者提供)

👉 HSL 颜色模型由色调、饱和度和亮度组成。请看下面的图像。

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

HSL 颜色模型(来自 Wikimedia Commons 免费许可 CC BY-SA 3.0

颜色模型与实心圆柱进行比较。色调表示从 0 到 360 度的不同角度的颜色。在圆柱的顶部,所有颜色的亮度都很高。这就是为什么它看起来是白色的原因。从上到下,亮度逐渐降低;在底部,没有光线。饱和度值从圆柱的中心到外侧逐渐从低到高。HSL 颜色模型在不同色调、饱和度和亮度下的模拟如下所示。

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

HSL 颜色模型(GIF 由作者创建)

圆柱上的圆圈表示不同色调、饱和度和亮度值在左侧刻度中显示的特定颜色。

👉HSV 颜色模型类似于 HSL 颜色模型。在这里,“亮度”一词被“值”取代。在 HSL 中,最大亮度时,颜色为纯白色。另一方面,在 HSV 中,最大值时,颜色不是纯白色,而是类似于在特定颜色上照射光线。

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

HSV 颜色模型(来自 Wikimedia Commons 免费许可 CC BY-SA 3.0

让我们通过模拟更好地理解该模型。

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

HSV 颜色模型(GIF 由作者创建)

[我用来模拟模型的 网站 ]

结论

除了这些颜色模型,还有一些其他颜色模型。但这些模型在计算机视觉中广泛使用。详细来说,RGB 颜色模型通过混合红色、绿色和蓝色来表示颜色。CMYK 是青色、品红色、黄色和关键(黑色)颜色的颜色模型组合。而最后两个颜色模型,HSL 和 HSV,是用于更直观地表示 RGB 颜色的颜色模型,以反映人类对 RGB 颜色的感知。

参考文献

  1. 颜色 — 维基百科

  2. 有多少种颜色?你想知道的一切 (wikihow.com)

  3. 颜色模型和颜色空间 — 编程设计系统

我为你选择了一些文章列表。

## 开始使用 NumPy 和 OpenCV 进行计算机视觉

用 Python 开始你的计算机视觉编程

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

Md. Zubair

机器学习基础

查看列表6 个故事外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Md. Zubair

数据科学统计

查看列表13 个故事外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Md. Zubair

数据可视化完整指南

查看列表4 个故事外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

企业如何停止在人工智能和数据驱动决策中失败

原文:towardsdatascience.com/how-companies-can-stop-failing-at-ai-and-data-driven-decision-making-44221bfb4833?source=collection_archive---------8-----------------------#2023-02-08

四个杠杆可以帮助商业领袖成功利用数据

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

·

关注 发表在 Towards Data Science ·7 min read·2023 年 2 月 8 日

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

图片由 Towfiqu barbhuiya 提供,来自 Unsplash

数据已经成为一个热门话题十多年了。它随着大数据的兴起而发展,近年来,AI 和机器学习也成为了前沿。过去十年也是一个极度增长的十年。资本充裕,公司有足够的时间来学习和完善他们的技术。然而,研究指出组织在有效利用数据方面的失败。经济环境现在发生了变化,公司现在更加关注盈利能力。失败的成本现在太高了,那些能够有效利用数据的公司将拥有竞争优势。AI 和数据驱动的决策可以在这里提供帮助,通过清晰化讨论、将事实与意见分开,并加速市场推出的时间。

然而,大多数公司尚未建立一个适合 AI 和数据驱动决策的组织模型。随着公司调整战略以应对新的经济现实,以下四个关键要素可以帮助建立基于数据的决策文化:

明确数据需要如何使用的原因和方式

  • 目标、目标和指标的一致性。 现代劳动力高度以目的为驱动。对他们来说,效率、盈利能力、增长等是实现目标的手段,而不是目标本身。因此,领导层需要对公司所追求的目的非常清楚。这个目的需要被转化为具体的目标,然后进一步细化为需要衡量的准确指标。我的一个咨询客户,一家道路救援公司,特别有效地做到了这一点。他们的目的在于确保没有客户在道路上被困超过特定时间,这取决于服务区域。然后,这被转化为每个组织的目标,例如,财务预算分配被优化以实现这一目标,客户服务部门将致力于第一次呼叫解决问题,销售部门不仅依据目标完成情况获得奖励,还依据 NPS 进行激励,以确保他们将正确的产品卖给正确的客户。最后,执行仪表板中包含了所有这些指标,并且在年度规划过程中为这些 P0 指标设定了目标。

  • 明确的数据导向问题陈述在整个组织中层层传递。 拥有一套清晰的问题陈述可以带来整个组织的一致性。这些陈述在公司层面需要简单明了,例如:“将运营利润率提高 50 个基点”。这有助于每个人对需要解决的问题达成一致,并且为其提供一个数据点。总体目标可以进一步细分到各个职能部门,他们可以决定想要采取的措施。例如,市场营销可能会制定一个问题陈述:“改变媒体投放模型,以在减少营销支出$xx 的同时保持 MQLs。”

  • 高层的“使用”数据,而不仅仅是“认可”。 即使高层同意基于数据的决策是必要的,他们仍然会依赖直觉。高层应当做出基于数据的决策,即使这有时与他们的直觉相悖。他们也应当传达这一点,以便整个组织感受到自己是一个数据驱动的组织。我曾与一位非常有效的销售高管合作,他理解数据的力量,并确保他的团队充分利用公司的数据能力。他的两个主要方法是:在做出决定之前,确保至少有一些支持数据,并且向数据团队提供非常明确的陈述,例如——“我想了解 5%和 10%的价格上涨对我们销售量和利润的影响。”

拥有对数据的共同理解

  • 什么正在被测量? 我们常常认为数据是客观的,但实际上,它可能非常主观。组织往往对一些基本指标如增长、流失率和服务成本有模糊甚至不一致的定义。必须对用于衡量组织的指标及其确切定义有共同的理解。如果缺乏这种理解,数据就会成为争论的引发者,而不是推动决策的工具。我发现,最有效的方法之一是建立一个公司级的数据词典,提供精确的定义和数据来源。

  • 谁负责测量? 我们生活在矩阵型组织的时代,多个团队跨职能合作,常常有些任务重叠。如果多个个人或团队负责一项事物,最终没有人真正拥有它。强有力的责任心和流程至关重要。每个人都应明确谁负责和提供每个指标。虽然关于如何定义指标可能会有争论,但一旦争论完毕,指标所有者提供的数字即为事实。类似于前述,确定数据词典中的负责人也至关重要。

  • 什么是黄金真理来源? 在大型组织中,找到十几个真理来源并不罕见。每个团队都会创建自己版本的真理,以满足其用例。这会在组织中造成混乱。这通常被视为战术数据话题,而实际上它是一个高层领导话题。拥有一组核心数据表,例如财务数据、市场推广指标和人员指标,是至关重要的。这是分析效率丧失的最大原因之一,分析师花费无数时间试图协调数据,而高层则花费宝贵时间争论数据,而不是制定成功的市场策略。

建立基础要素

  • 简化技术栈。 技术越简单,维护越容易,解释和使用也越容易。工程团队倾向于追逐炫目的技术,但业务目标和用例应该定义需要实施的技术,而不是相反。如今技术发展迅速,创新层出不穷。这导致了我们有时会看到寻找钉子的锤子的情况。我见过许多组织拥有多个复杂的数据栈,且几乎没有互操作性。最好保持技术栈的简单,有时 Power Pivot 运行在数据库之上就足够了。

  • 自助分析。 如今数据如此庞大,除非加以情境化,否则很难有效利用。这种情境通常存在于业务和具体职能中。数据基础设施需要使分析师甚至业务人员能够利用数据。像 Alteryx 这样的工具可以方便非技术团队构建 ETL,而像 Tableau 这样的工具可以帮助他们使报告变得可重复。这不仅仅是技术问题,还涉及文化和组织如何使用数据的哲学。

  • 治理和流程。 这些通常是组织中最后投资的领域。这是一个既不受高管也不受数据团队热爱的主题。然而,随着时间的推移,它成为了速度的限制因素。例如,新聘请的分析师常常需要几个月时间来适应,因为他们要在混乱的数据中摸索;仍然需要花费数周时间查找和清理数据,而这些分析应该只需要几个小时。

创建一个重视和使用数据的文化

  • 授权决策。 决策不是领导者的唯一特权,也不应该是。微观决策最终会累积。组织中每天可能发生数百个决策。例如:小额交易的定价决策、过程工作流的软件插件选择、待办事项的优先级排序等。明确的决策权和利用数据来提供信息的文化可以带来巨大的效率。员工感到被授权,可以迅速行动。但这很难实现,根据我的经验,这需要领导推动并且具有高度跨职能的组织转型主题。

  • 定义仪式和文档。 文化变革需要通过行动来实践和推动。培养小的变化可以产生大的影响。一个最有效的方法是创建仪式并将其融入工作方式中。一个简单但强大的做法是,如果在会议中需要做出决定,请求者需要在会议前发送经过分析和对齐的支持数据作为预读。同样,我观察到,开始运营评审时查看一组指标在决策中非常有效。亚马逊的 备忘录和新闻稿 是这种文档的绝佳例子。

  • 连接数据与业务。 每当数据与职能团队之间存在交易关系时,他们在翻译过程中会失去洞察力。那些朝着相同问题陈述工作的联合业务+数据团队最为高效。明确的问题陈述,例如“我们如何在相同的营销预算下提高转化率?” 可以帮助团队对齐到同一个目标。然后,业务团队需要向数据团队传授背景知识,而数据团队则需要向业务团队传授可能性艺术及分析技术的局限性。数据和技术团队需要有一个席位才能发挥有效作用。那些将其作为后端功能的组织在挖掘数据价值方面会有所欠缺。

任何形式的组织变革都很困难,而成为一个人工智能和数据驱动决策的组织更是如此,因为这需要将业务、技术和数据分析元素结合在一起。然而,这是可能的,使用本文讨论的一些策略可以提供一个良好的开端。

关注我在 LinkedInMedium 的动态,以获取有关人工智能与数据驱动决策和人机团队合作的更多见解。

Cypher 在 Neo4j v5 中的变化

原文:towardsdatascience.com/how-cypher-changed-in-neo4j-v5-d0f10cbb60bf?source=collection_archive---------10-----------------------#2023-01-17

在 Neo4j 最新发布版本中,Cypher 有哪些新功能和被弃用的特性

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

·

关注 发表于 Towards Data Science ·9 分钟阅读·2023 年 1 月 17 日

几周前,Neo4j 5 发布了。如果你像我一样,在较新的 Neo4j 4 版本中忽略了所有弃用警告,你可能需要更新你的 Cypher 查询以适配最新的 Neo4j 版本。幸运的是,新 Cypher 语法没有重大变化,因此更新过程应该不会太困难。然而,我决定写这篇博客文章来帮助你过渡。此外,我还会介绍一些新的 Cypher 语法,这些语法可以简化你的查询。

本博客文章中的 Cypher 示例可作为 GitHub 上的 Jupyter Notebook 下载。

Neo4j 环境设置

你需要设置一个 Neo4j 环境来跟随这篇文章中的代码示例。像往常一样,你可以使用Neo4j Desktop应用程序来设置本地环境。另一方面,你可以使用作为Neo4j Aura提供的免费云实例。如果你选择 Neo4j Aura 的路径,使用免费的永久实例并启动一个没有预填充图形的空项目。

附注:免费的 Neo4j Aura 实例不提供 GDS 支持。由于这是一个以 Cypher 为重点的博客文章,你不会使用 GDS 库中的任何算法。

数据集

我对奇幻或超级英雄数据集有特别的喜爱。这次,我找到了一个描述《沙丘》系列角色的数据集。

## Frank Herbert’s DUNE Characters

在奇幻世界中的社交网络…帮助构建数据集!

www.kaggle.com

沙丘数据集在 Kaggle 上以 CC0 许可证提供。为了方便你,我已经将数据集复制到 GitHub 仓库中,这样你就不必下载数据集,可以轻松地在你的本地或云实例的 Neo4j 中导入它。此外,我将关系类型 Parent-Child 和 Other Family 重命名为 Family,并删除了 Unknown 关系。

图形模型

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

沙丘图形模型。作者提供的图片。

图形模型围绕角色展开。角色节点具有多个属性,如名字、文化、以及他们的出生或去世时间。此外,他们的家族忠诚度被表示为次要节点标签。使用次要节点标签而不是单独的节点的主要目的是展示 Cypher 中新节点标签过滤选项。角色之间有四种关系类型:

  • 同盟

  • 敌人,

  • 家庭

  • 婚姻

数据集导入

与大多数导入情况一样,你首先需要在 Neo4j 中定义唯一约束。唯一约束确保每个具有特定标签的节点的给定属性是唯一的。

在 Neo4j v5 中,定义唯一约束的语法略有变化。

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

UNIQUE CONSTRAINTS 的语法更改。作者提供的图片。

新的唯一约束语法中有两个关键词被替换。ON 关键词被替换为FOR,而ASSERT 被更改为REQUIRE

以下 Cypher 语句定义了Character节点的name属性的唯一约束。

CREATE CONSTRAINT IF NOT EXISTS FOR (c:Character) REQUIRE c.name IS UNIQUE;

接下来,你需要导入 CSV 文件。尽管 Dune CSV 文件只有 1000 行,但你将假设你正在处理一个具有数千行的大型 CSV 文件。因此,你希望将批量导入分成多个事务。由于 Neo4j v5 中USING PERIODIC COMMIT子句已被弃用,你需要使用新的批处理事务语法。

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

导入大型 CSV 文件的语法更改。图片由作者提供。

子查询已经在 Neo4j v4 中引入,但在 v5 中发挥了更重要的作用。子查询通过CALL子句实例化,并用花括号**{}包裹。它们非常适合各种功能,如后联合处理限制每行结果、以及条件执行。此外,Cypher 子查询现在是唯一的原生 Cypher 语法(不包括 APOC),可以将单个 Cypher 语句批处理成多个事务。为了指定 Cypher 子查询应拆分成多个事务,你需要添加IN TRANSACTIONS OF x ROWS**,其中 x 代表每个批次的行数。

以下 Cypher 语句包含两个嵌套的子查询。顶层子查询用于将每 10 行的导入批处理到一个新事务中。另一方面,你可以将嵌套的 Cypher 子查询用作条件执行功能。

LOAD CSV WITH HEADERS FROM "https://bit.ly/3kbU21V" AS row
CALL {
  WITH row // Explicit import of variables
  MERGE (c:Character {name:row.Character})
  SET c += apoc.map.clean(row, 
     ["name", "Detail", "to", "relationship_type", "House_Allegiance"], [])
  WITH c, row
  CALL apoc.create.addLabels(c, [row.House_Allegiance]) YIELD node
  // nested subquery for conditional execution
  CALL {
    WITH row, c // Explicit import of variables
    WITH row, c
    WHERE row.to IS NOT NULL
    MERGE (c1:Character {name: row.to})
    WITH row, c, c1
    CALL apoc.merge.relationship(c, toUpper(row.relationship_type), {}, {}, c1)
    YIELD rel
    RETURN count(*) AS count
  }
  RETURN count(*) AS finalCount
} IN TRANSACTIONS OF 10 ROWS // Define batched transaction for every 10 rows
RETURN count(*)

导入查询稍微复杂一些,因为我希望在一个 Cypher 语句中完成导入。它以你可能见过的LOAD CSV子句开始。为了将导入批处理成多个事务,你需要使用CALL子句来启动 Cypher 子查询。顶层子查询以IN TRANSACTIONS OF x ROWS子句结束,该子句指定了事务批处理。

如果你想在 Cypher 语句中使用任何变量,你必须通过WITH子句显式导入它。首先,顶层子查询从外部查询中导入row变量。接着,它合并 Character 节点并设置几个属性。由于纯 Cypher 中不支持动态的次级标签,你可以使用 APOC 的过程。

一些《沙丘》角色在 CSV 的 torelationship_type 列中定义了额外的关系。另一方面,torelationship_type 列在几个行中是空的。 FOREACH 条件执行技巧 是我博客文章的主要选择。然而,由于这篇博客文章的主题是 Cypher 子查询,我决定展示如何使用 Cypher 子查询进行条件执行。首先,通过嵌套的 Cypher 子查询,你需要导入 rowc 变量。接下来,你需要过滤出 to 列不为空的行。然而,你不能在用于导入变量的同一 WITH 子句中过滤变量。因此,你需要添加第二个 WITH 子句来过滤行。最后,你使用 APOC 的合并关系过程,因为纯 Cypher 语法不支持创建具有动态关系类型的属性。

如果这个示例对你来说有点复杂,你可以查看 文档

新的内联过滤选项

Neo4j v5 中有许多新的内联过滤选项。那么什么是内联过滤呢?本质上,它是直接在 MATCH 子句中过滤图模式的能力。

你将开始学习用于过滤节点标签的新语法。在 Neo4j v5 中,引入了以下逻辑表达式,以允许更灵活的节点过滤。

  • & — AND 表达式

  • | — OR 表达式

  • ! — NOT 表达式

例如,如果你想匹配所有具有 FremenHarkonnen 标签的节点,你可以使用 | 表达式。

MATCH (c:Fremen|Harkonnen)
RETURN count(*)

另一方面,如果你需要找到同时具有 CharacterHarkonnen 标签的所有节点,你可以使用 & 表达式。

MATCH (c:Character&Harkonnen)
RETURN count(*)

! 表达式允许你否定节点标签。例如,假设你想匹配所有具有 Character 标签但没有 Harkonnen 标签的节点。

MATCH (c:Character&!Harkonnen)
RETURN count(*)

现在 Cypher 还支持用于过滤节点标签的嵌套表达式。例如,以下 Cypher 语句匹配所有不具有 FremenHarkonnen 标签的节点。

MATCH (c:!(Fremen|Harkonnen))
RETURN count(*)

这些表达式使用括号 () 嵌套。

Cypher 的另一个新特性是可以在 MATCH 子句中包含 WHERE 子句。这使你能够在 MATCH 语句中直接应用 Cypher 按节点属性过滤的所有灵活性。

例如,以下 Cypher 语句匹配所有Culture属性以Z开头且Died属性不为空的字符。

MATCH (c:Character WHERE c.Culture STARTS WITH "Z" AND c.Died IS NOT NULL)
RETURN c.name AS character

用于过滤节点的相同逻辑表达式也可以用于过滤关系类型。例如,| 表达式(表示逻辑 OR)在 Cypher 中已经存在了一段时间。

以下 Cypher 语句匹配所有Character节点,其Culture属性值为Bene Gesserit,并展开它们的ALLIESFAMILY关系。

MATCH p=(c:Character WHERE c.Culture = "Bene Gesserit")-[r:ALLIES|FAMILY]-()
RETURN [n in nodes(p) | n.name] AS pairs, type(r) AS results

仅使用**&表达式实际上没有什么意义,因为单个关系不能有多个类型。然而,与否定!表达式结合使用时,&**可能会很有用。

例如,以下 Cypher 语句展开所有不是ALLIESFAMILY的关系。

MATCH p=(c:Character WHERE c.Culture = "Fremen")-[r:!ALLIES&!FAMILY]-()
RETURN [n in nodes(p) | n.name] AS pairs, type(r) AS results

存在性子查询

接下来,你将了解存在性子查询的语法如何更改。存在性子查询可以用来查找属于指定模式的图模式。

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

存在性过滤器的语法更改。图片由作者提供。

在这个例子中,存在性子查询用于查找具有进或出FAMILY关系的Character节点。我喜欢存在性子查询,因为它们提供了根据任何图模式过滤节点的灵活性,而无需在 MATCH 子句中展开它们并担心查询基数(行数)。在 Neo4j v5 中,你必须添加EXISTS子句,并用大括号括起用于过滤的指定图模式以执行存在性子查询。

MATCH (c:Character)
WHERE exists { (c)-[:FAMILY]-() }
RETURN count(*) AS count

此外,你现在可以在存在性子查询中引入新的引用变量。例如,以下存在性子查询过滤具有FAMILY关系的Character节点。然而,仅考虑FAMILY关系的终节点同时具有ALLIESMARRIAGE关系的模式。

MATCH (c:Character)
WHERE exists { (c)-[:FAMILY]-(t)
               WHERE (t)-[:ALLIES]-() AND (t)-[:MARRIAGE]-() }
RETURN count(*) AS count

你还可能看到在存在性子查询中使用的MATCH子句。根据我的经验,MATCH子句完全是可选的。然而,它可能使存在性子查询的语法更具可读性和直观性。

MATCH (c:Character)
WHERE exists { MATCH (c)-[:FAMILY]-(t)
               WHERE (t)-[:ALLIES]-() AND (t)-[:MARRIAGE]-() }
RETURN count(*) AS count

查看文档以获取更多存在性子查询的示例

计数子查询

本文最后一类子查询是所谓的计数子查询。它们用于计数定义的图模式数量。例如,我在以前的博客文章中经常使用它们来计数一个节点拥有的关系数量。

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

计数子查询的语法更改。图片由作者提供。

之前,你可以使用**size()函数来计数特定模式的数量。这是一种方便的语法,可以计数图模式而不影响主查询的基数。此外,它可能比其他计数关系数量的方法表现更好。在 Neo4j v5 中,你需要用count{}替代size()**操作符。

以下 Cypher 语句返回按其度数(关系计数)排序的前五个 Character 节点。

MATCH (c:Character)
RETURN c.name AS character,
       count{ (c)--() } AS degree
ORDER BY degree DESC
LIMIT 5

如之前一样,您可以使用WHERE子句中的计数子查询来过滤节点。在这个例子中,Cypher 语句过滤了具有多个关系的节点。

MATCH (c:Character)
WHERE count{ (c)--() } > 2
RETURN count(*) AS count

摘要

Neo4j 的新版本提供了更快的性能和更多的 Cypher 灵活性。然而,您可能需要重构一些现有的 Cypher 语句,以便与 Neo4j v5 兼容。希望这篇博客文章能帮助您完成升级过程。

一如既往,代码可以在GitHub上找到。

数据泄漏如何影响模型性能声明

原文:towardsdatascience.com/how-data-leakage-affects-model-performance-claims-841eb01276bb

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

·发布于数据科学之路 ·4 分钟阅读·2023 年 1 月 2 日

今年出现了几项 重要 科学进展,这些进展得益于机器学习驱动的研究。随着热情的增长,也带来了与基于 ML 的科学中遇到的可重复性问题相关的一些担忧。已经发现了几种方法论问题,其中数据泄漏似乎是最普遍的。通常,数据泄漏会扭曲结果,并导致过于乐观的结论。

数据泄漏可能通过多种方式发生。本帖的目的是介绍一些最常遇到的类型,并提供一些关于如何识别和缓解它们的提示。

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

图像由作者使用 dreamstudio.ai 生成

数据泄漏 可以定义为目标变量与其预测变量之间通过数据收集方法或预处理策略无意中引入的人工关系。

我将尝试举例说明的主要数据泄漏来源有:

  1. 训练数据集和测试数据集之间的分离不当

  2. 使用不合法的特征(代理变量)

  3. 测试集并非从感兴趣的分布中抽取

1. 训练数据集和测试数据集之间的分离不当

数据科学家知道他们需要将输入数据划分为训练集和测试集,仅使用训练集来训练模型,并且只在测试集上计算评估指标。这是一个大多数人都知道要避免的教科书错误。然而,初步的探索性分析通常是在完整的数据集上进行的。如果这初步分析也涉及预处理和数据清理步骤,那么它可能成为数据泄露的来源。

可能引入数据泄露的预处理步骤:

  • 在拆分两个数据集之前进行缺失值插补或缩放。通过使用完整的数据集来计算插补参数(均值、标准差等),一些在训练过程中不应对模型可用的信息被引入到训练集中。

  • 在拆分两个数据集之前进行过采样/欠采样 也会导致训练集和测试集之间的不正确分离(训练集中的过采样数据可能会出现在测试集中,导致过于乐观的结论)

  • 在拆分之前未删除数据集中的重复项。在这种情况下,相同的值可能会在拆分后成为训练集和测试集的一部分,导致过于乐观的评估指标。

2. 使用不合法的特征

当数据集包含不应在建模中合法使用的特征时,也被视为数据泄露。一个直观的例子是,如果其中一个特征是结果变量的代理。

西雅图建筑能源基准数据集 包含了这样一个变量的例子。西雅图的目标是根据已经公开的特征(如建筑表面、建筑类型、物业用途、建造日期等)来预测建筑的能源性能。它们的数据集中还包含电力和天然气消耗值,以及目标变量场地能源使用和温室气体排放。电力和天然气消耗值与目标变量高度相关,在构建预测模型时包含这些特征将产生非常准确的结果。

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

某些特征与目标变量之间的相关性(作者图片)

然而,这些特征只是结果变量的代理。它们实际上并没有解释任何常识没有告诉我们的事情:使用大量电力的建筑总体能源使用会很高。

如果电力使用值在预测时是可用的,那么预测场地能源使用变成了一项微不足道的任务,实际上没有必要建立模型。

这里给出的例子很简单,但通常,是否使用特定特征的判断需要领域知识,并且可能是特定于问题的。

3. 测试集不是从感兴趣的分布中抽取的

这种特定的数据泄漏源可能更难举例,但可以直观地解释。我们可以将其分为几个子类别:

  • 时间泄漏:如果模型用于对未来进行预测,那么测试集不应包含任何早于训练集的数据(模型将基于未来的数据进行构建)

  • 训练和测试样本之间的非独立性:这个问题在医学领域更为常见,其中有多个样本是从同一个患者身上在一段时间内收集的。这个问题可以通过使用特定的方法如 块交叉验证来处理,但在通用情况下是一个困难的问题,因为数据中所有的潜在依赖关系可能都不为人知。

  • 采样偏差:选择数据集中一个不具代表性的子集进行评估。一个这样的偏差例子是仅选择极端抑郁的病例来评估抗抑郁药物的有效性,并就该药物对一般抑郁症的治疗效果做出声明。

结论

数据泄漏可以在建模流程的各个阶段引入,检测它可能并不明显。预处理步骤和测试/训练分割方法将取决于数据集的特性,并可能需要特定领域的知识。一般来说,如果获得的结果好得令人难以置信,那么数据泄漏的可能性很高。

数据科学如何创造价值

原文:towardsdatascience.com/how-data-science-can-deliver-value-f2d4a1ea3a49

对价值主张进行分类可以更容易地传达你们团队的工作内容

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

·发表在Towards Data Science ·阅读时间 4 分钟·2023 年 10 月 11 日

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

照片由Shubham Dhage提供,来源于Unsplash

大多数科技工作者会同意,目前的经济环境不太乐观。今年早些时候许多公司裁员包括我所在的公司。更紧张的现金流通常意味着对团队的绩效和对组织的价值贡献进行更严格的审查。因此,你和你的团队能够清晰地阐明如何为业务目标做出贡献变得更为重要。

不过,团队——尤其是数据科学团队——可以通过不同的方式创造价值。这些方式包括指标与测量、产品特性、战略洞察以及操作决策产品

为什么这四个类别?它们并非完全互斥——我预期一些团队会偶尔跨越这些类别。但一般来说,这些类别需要不同的技能集,产生不同的成果,并专注于特定的问题。了解哪个标签适用于你的团队或项目,可以帮助你确保拥有实现成果所需的正确技能,并更容易地传达你们的工作内容。也许,你会发现组织中还有一些未开发的领域。

1) 衡量指标与测量

不要低估公司中良好指标的价值。负责指标和测量这些指标的数据团队在评估业务表现方面发挥了关键作用。他们帮助提醒业务领导者可能需要调整的性能下降情况。他们帮助定义关键绩效指标,以便团队朝着正确的目标努力。他们创建计划和测量绩效的预测。本质上,他们将运营业务的复杂性简化为一些关键统计数据,以简化许多决策。这是一项非常有价值的工作。

此外,我还想强调的是,指标和测量还包括实验,这是许多数据科学家的常见职责。一个新功能是否对指标产生了提升?最新的营销活动是否增加了预订量?这些分析都属于这一类别。

所需的典型技能:商业智能、领域知识、实验、统计、SQL、数据可视化、仪表板管理、管道管理、有时是机器学习

示例

  • 定义新的业务指标

  • 预测年度公司关键结果

  • 分析产品实验的提升

  • 创建客户终身价值数据集

2) AI/ML 产品或产品功能

数据科学的第二个常见领域是构建面向外部的产品功能。这些功能通常由机器学习提供支持,尽管这不是必需的。这项工作创建了一个服务/功能或改善了客户的用户体验。例如,一个推荐引擎在流媒体平台上提供电视节目建议。因此,交付物是一个可以嵌入产品或网站的工作(且通常一个关键要求是可扩展的)算法。

所需的典型技能:软件工程、机器学习、深度学习、API 开发

示例

  • 搜索

  • 流媒体平台或电子商务网站上的推荐引擎

  • 垃圾邮件检测对于电子邮件客户端

  • 面部识别功能解锁手机

3) 战略洞察

这是可能是最模糊的领域,关于实际交付的内容,但战略洞察包括指导业务决策的研究或分析。它可以利用数据分析、统计建模、模拟等。它可以从简单到非常先进,但交付物通常是一个建议。业务应如何进行以及为什么?这些项目通常与业务利益相关者紧密合作。它们通常关注特定的临时问题,而不是需要定期做出的决策(见下一个类别)。

所需的典型技能:分析、统计推断、仪表板管理、模拟、概率、领域知识

示例

  • 推荐新分销中心的位置

  • 使用聚类创建营销人物画像

  • 模拟可能影响购买的杠杆

  • 零基预算

4) 操作决策产品

最后,这一类别关注的是用于内部业务决策的工具。通过做出更好的和/或更快的决策,业务如何提高运营效率?例如,构建一个帮助营销部门竞标 Google 关键词的工具是一个可以通过运营决策产品解决的问题。

这一类别与战略洞察的区别在于,首先,决策产品应是生产级应用。其次,决策产品回答的是具体的、重复出现的决策问题,而不是一次性的业务问题。因此,决定在哪里开设新的配送中心可能是一个战略洞察问题,而自动将库存分配到数千个商店则是一个运营决策产品。

这一类别与 AI/ML 产品或产品功能不同。区别在于它如何创造价值,而不是这些工具是如何构建的。运营决策产品是通过更高效或更有效地运营来增加收入或降低成本。因此,我会将一个动态调整电子商务网站价格的定价工具归类为运营决策产品,而不是 AI/ML 产品功能。

典型所需技能:优化、运筹学、实验、软件工程

示例

  • Google 广告竞价模型

  • 邮件个性化

  • 商店库存采购或分配决策

  • 劳动力排班

那么你的工作属于哪一类?度量与测量、产品功能、战略洞察还是运营决策产品*?* 所有这些工作都可以为业务提供有价值的知识、工具、功能和方向。主要区别在于它们如何贡献价值。了解你工作的价值主张并向利益相关者阐明这一点至关重要。

此外,我希望领导者能够利用这些分类来明确数据科学如何支持业务。当领导层不知道如何使用数据科学时,往往会出现数据科学团队被未充分利用的情况。团队不被视为必要时,可能会发生裁员。但是,如果高管们清楚了解数据科学如何提供帮助,他们可能会突然意识到团队应该处理的项目清单。然后,就看你如何交付了。

有什么想法?请留下评论分享你的经验。

数据科学如何帮助福尔摩斯找到凶手

原文:towardsdatascience.com/how-data-science-helped-sherlock-holmes-find-a-murderer-5cff72a5c98a

使用图论、约束编程和混合整数线性规划解决“谁杀了丹斯莫尔公爵”的谜团

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

·发表于 数据科学的前沿 ·14 分钟阅读·2023 年 4 月 28 日

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

图片由 弗拉基米尔·赫里申科 提供,来源于 Unsplash

库存管理、投资组合优化、机器调度、车辆路线以及许多其他现实生活中的问题都是数据科学和分析技术应用的绝佳例子。这些问题在大学里通常是我们最早学习的内容。然而,我对可以被表示为抽象实体的众多其他问题感到着迷,这些实体可以是图、计划或一组数学方程,并利用适当的技术加以解决。一旦你掌握了建模技能,将这些技术应用于供应链问题或简单的谜题都是很直接的。

在本文中,我将展示如何使用 图论约束编程混合整数线性规划 解决丹斯莫尔公爵谋杀案的谜团。

克劳德·贝尔热的《谁杀了丹斯莫尔公爵》是一部悬疑小说,专注于找出在怀特岛的丹斯莫尔城堡安放炸弹导致公爵死亡的人。尽管过去了十年,这个案件仍然未能破解,直到福尔摩斯和华生决定深入探讨此事。

当邓斯摩尔公爵因爆炸事件在怀特岛的城堡中遇难时,他的六位前妻——贝蒂夏洛特伊迪丝费利西亚乔治亚海伦——成为了主要嫌疑人。问题进一步复杂化的是公爵的遗嘱在爆炸中被毁,据说其中对某位前妻的态度非常严厉。然而,揭示了所有六位女性在悲剧发生前都曾收到过城堡的邀请。

他所有的前妻都发誓她们只去过一次城堡。她们也不记得自己在那里待了多久,但知道在访问期间遇见了谁。

  • 遇见了贝蒂夏洛特费利西亚乔治亚

  • 贝蒂遇见了夏洛特伊迪丝费利西亚海伦

  • 夏洛特遇见了贝蒂伊迪丝

  • 伊迪丝遇见了贝蒂夏洛特费利西亚

  • 费利西亚遇见了贝蒂伊迪丝海伦

  • 乔治亚遇见了海伦

  • 海伦遇见了贝蒂费利西亚乔治亚

根据提供的信息,福尔摩斯和华生认为凶手多次访问了城堡,这与前妻们只访问过一次的说法相矛盾。侦探怀疑其中一位前妻在谎报她访问城堡的次数。确定哪位前妻对她们访问的频率撒了谎,是解开谜团的关键。

我将展示三种解决这个难题的方法:使用图论、约束编程和混合整数线性编程。

图论

这就是贝尔热最终解决谜团的方法,这似乎是最直接的办法。每个前妻在城堡的停留时间都是特定的,有明确的到达和离开时间。虽然我们不知道她们的确切停留时间以及到达和离开的顺序,但从审问中我们知道她们的某些访问时间是重叠的。

为了简化问题,我们集中关注海伦及其在城堡访问期间与贝蒂费利西亚乔治亚的互动。为了说明她们的访问,我们可以使用水平线,端点表示她们的到达和离开时间,如下所示:

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

时间段和重叠示例

如果两个时间段有重叠,这意味着对应的人在城堡里同时出现过,因此一定见过面。我们可以将时间段表示为图,其中每个节点对应一个人。如果两个时间段相交,我们就在相应的节点之间画一条边。对于海伦贝蒂费利西亚乔治亚,最终得到的图如下所示:

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

时间段图示例

这种图称为时间段图,可以用来建模任何时间段集合。然而,并非所有图都可以表示为时间段。例如,考虑下图:

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

周期图 C4

它不能被分解为区间,因为无法找到四个区间,使得 A-B, B-C, C-DD-A 相交。这个图称为 C4。如果一个图有 C4 作为子图,肯定不是一个区间图。

因此,如果图不是一个区间图,我们知道至少有一个人撒谎关于他们是否访问过城堡。我们可以利用这一点通过从审问中构建图并检查它是否为区间图来识别真正的罪犯。

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

基于审问的图。如果两个人见过面,它们之间就有一条边。

让我们在 Python 中使用库networkx并创建图:

people = ['Ann', 'Betty', 'Charlotte', 'Edith', 'Felicia', 'Georgia', 'Helen']
people_met = {'Ann': ['Betty', 'Charlotte', 'Felicia', 'Georgia'],
              'Betty': ['Ann', 'Charlotte', 'Edith', 'Felicia', 'Helen'],
              'Charlotte': ['Ann', 'Betty', 'Edith'],
              'Edith': ['Betty', 'Charlotte', 'Felicia'],
              'Felicia': ['Ann', 'Betty', 'Edith', 'Helen'],
              'Georgia': ['Ann', 'Helen'],
              'Helen': ['Betty', 'Felicia', 'Georgia']}

def create_graph(plot_graph=False):
    """
    Generate graph based on interrogation, and draw it it plot_graph = True
    :param plot_graph: True if graph is plotted
    :return: Graph
    """
    G = nx.Graph()
    for person in people:
        G.add_node(person)
    for p1 in people_met.keys():
        for p2 in people_met[p1]:
            G.add_edge(p1, p2)
    if plot_graph:
        nx.draw_spectral(G, node_size=500, node_color=['red', 'green', 'pink', 'brown', 'yellow', 'orange', 'skyblue'],
                         with_labels=True)
        plt.show()
    return G

既然图已经定义好了,接下来需要进行以下两个步骤:

  • 使用 networkxsimple_cycles 函数生成图的所有简单周期(见文档此处)。将生成所有长度的基本周期。

  • 对于所有长度为 4 的周期,使用 subgraph 函数生成子图。并检查它是否不是chordal。换句话说,检查该周期是否为 C4 —— 一个长度为 4 的周期,其中所有节点的度数均为 2(见此处)。

def check_cycles(G):
    """
    Print all the chordless cycles with length = 4
    :param G: Input graph
    """
    list_cycles = list(sorted(nx.simple_cycles(G.to_directed())))
    for l in list_cycles:
        if len(l) == 4:
            H = G.subgraph(l)
            if not nx.is_chordal(H):
                print(l, len(l))

G = create_graph(False)
check_cycles(G)

C4 子图是:

  • , 夏洛特, 伊迪斯, 费莉西亚

  • , 费莉西亚, 伊迪斯, 夏洛特

  • 乔治亚, 海伦, 贝蒂,

  • 乔治亚, , 费莉西亚, 海伦

  • 乔治亚, 海伦, 贝蒂,

  • 乔治亚, 海伦, 费莉西亚,

出现在所有周期中,如果将她从集合中去除,可以完美地生成一个区间图,这表明她可能在撒谎,并可能被认为是凶手。

约束编程

约束编程(CP)是一种解决问题的方法,旨在通过关注寻找满足给定约束的可行解来解决组合和逻辑问题。CP 算法通过逐步减少可行解集来实现收敛。由于其处理复杂逻辑语句和约束的能力,CP 在解决当前问题时特别有效。

为了解决我们的问题,我们可以使用一个 CP 模型,其中 N 是人们的集合,s_i 是个体 i 到达城堡的时间,d_i 是他们访问的持续时间,e_i 是他们访问的结束时间。我们还可以引入一个逻辑变量 v_i,如果个体 i 不能被包含在访问计划中,则 v_iTRUE,否则为 FALSE。此外,met_i 是个体 i 在访问期间遇到的人的集合。整数变量 sde 的上限很高(1000),并且必须是非负的。

我们将使用 ortools库来解决这个问题:

from ortools.sat.python import cp_model
import pandas as pd
from matplotlib import pyplot as plt

people = ['Ann', 'Betty', 'Charlotte', 'Edith', 'Felicia', 'Georgia', 'Helen']
people_met = {'Ann': ['Betty', 'Charlotte', 'Felicia', 'Georgia'],
           'Betty': ['Ann', 'Charlotte', 'Edith', 'Felicia', 'Helen'],
           'Charlotte': ['Ann', 'Betty', 'Edith'],
           'Edith': ['Betty', 'Charlotte', 'Felicia'],
           'Felicia': ['Ann', 'Betty', 'Edith', 'Helen'],
           'Georgia': ['Ann', 'Helen'],
           'Helen': ['Betty', 'Felicia', 'Georgia']}

model = cp_model.CpModel()
num_vals = 1000

# Arrival time of person i in the castle
s = {i: model.NewIntVar(0, num_vals, 'start_' + i) for i in people}
# Duration of the visit of person i in the castle
e = {i: model.NewIntVar(0, num_vals, 'end_' + i) for i in people}
# Departure time of person i from the castle
d = {i: model.NewIntVar(0, num_vals, 'duration_' + i) for i in people}
# Logic variable that is True (1) is person cannot be included in the visit schedule. False otherwise
v = {i: model.NewBoolVar('v_' + i) for i in people}

初始步骤是确定两个个体是否重叠,这意味着验证区间 (s_i, e_i)(s_j, e_j) 是否在任何时刻相交。这可以通过满足以下两个条件之一来实现:

  • s_j < e_i AND s_i < e_j

  • s_i < e_j AND s_i > s_j

还需要定义当两个区间不重叠时的情况。它应满足以下两个条件之一:

  • e_i ≤ s_j

  • s_i ≥ e_j

本质上,为了让两个人见面,它们的区间必须重叠,否则它们必须不重叠。然而,如果一个人不能被包含在计划中呢?这就是变量 v_i 发挥作用的地方。

最后,对于每一对人 ij

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

当两个个体 ij 见面时,它们必须遵守以下两个重叠条件之一:(s_j < e_i AND s_i < e_j) 或者 (s_i < e_j AND s_i > s_j)。如果它们未能遵守其中一个条件,那么一个或两个个体将不会被包含在计划中 (v_i = True 或者 v_j = True)。

另一方面,如果两个个体 ij 不见面,它们应遵循非重叠条件 (e_i ≤ s_j 或者 s_i ≥ e_j)。如果它们不遵守这个条件,一个或两个个体将不会被包含在计划中 (v_i = True 或者 v_j = True)。

为了表示这些条件,我们将使用布尔变量 b1b2b3b4

  • b1 = s_j < e_i AND s_i < e_j

  • b2 = s_i < e_j AND s_i > s_j

  • b3 = e_i ≤ s_j

  • b4 = s_i ≥ e_j

# Auxiliary Boolean variables
b1 = {(p, p2): model.NewBoolVar(name='b1_' + p + "_" + p2) for p in people for p2 in people if p != p2}
b2 = {(p, p2): model.NewBoolVar(name='b2_' + p + "_" + p2) for p in people for p2 in people if p != p2}
b3 = {(p, p2): model.NewBoolVar(name='b3_' + p + "_" + p2) for p in people for p2 in people if p != p2}
b4 = {(p, p2): model.NewBoolVar(name='b4_' + p + "_" + p2) for p in people for p2 in people if p != p2}

for i in people:
    for j in people:
        if i != j:
            if j in people_met[i]:
                # Overlap condition 1
                model.Add(e[i] > s[j]).OnlyEnforceIf(b1[(i, j)])
                model.Add(s[i] < e[j]).OnlyEnforceIf(b1[(i, j)])
                # Overlap condition 2
                model.Add(s[i] < e[j]).OnlyEnforceIf(b2[(i, j)])
                model.Add(s[i] > s[j]).OnlyEnforceIf(b2[(i, j)])
                # At least one of the overlap conditions
                model.AddAtLeastOne([b1[(i, j)], b2[(i, j)], v[i], v[j]])
            else:
                # No overlap condition 1
                model.Add(e[i] <= s[j]).OnlyEnforceIf(b3[(i, j)])
                # No overlap condition 2
                model.Add(s[i] >= e[j]).OnlyEnforceIf(b4[(i, j)])
                # At least one of the non overlap conditions
                model.AddAtLeastOne([b3[(i, j)], b4[(i, j)], v[i], v[j]])

如果一个人的访问持续时间 (d_i) 为 0,则 v_i 的值为 True。这意味着该人不被包含。如果 v_i 为 False,则 d_i 必须是严格正的。

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

# Duration of person (d_i) is 0 is value v_i is True. If v_i is False, d_i must be strictly positive.
for i in people:
    model.Add(d[i] == 0).OnlyEnforceIf(v[i])
    model.Add(d[i] > 0).OnlyEnforceIf(v[i].Not())

最后,最后一个约束确保每个人的到达时间加上持续时间等于结束时间

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

# Departure time is equal to arrival time plus duration
for i in people:
    model.Add(s[i] + d[i] == e[i])

我们的目标函数是最大化包含的人员数量,这等同于最小化变量 v_i 的总和。

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

# Objective function is maximizing the number of people included - minimizing the sum of variable v_i.
var_obj = 0
for i in people:
    var_obj += v[i]
model.Minimize(var_obj)Running the model we can plot the gantt chart generated:

通过解决模型并绘制甘特图,我们得到如下结果:

 solver = cp_model.CpSolver()
status = solver.Solve(model)

if status == cp_model.OPTIMAL:
   for p in people:
      print(p, solver.Value(s[p]), solver.Value(e[p]), solver.Value(d[p]))
gantt_result_dict = {'Person': [], 'Start': [], 'End': [], 'Duration': []}
for i in people:
   gantt_result_dict['Person'].append(i)
   gantt_result_dict['Start'].append(solver.Value(s[i]))
   gantt_result_dict['End'].append(solver.Value(e[i]))
   gantt_result_dict['Duration'].append(solver.Value(d[i]))
gantt_result_df = pd.DataFrame.from_dict(gantt_result_dict)
print(gantt_result_df)
fig, ax = plt.subplots(1, figsize=(16, 6))
ax.barh(gantt_result_df['Person'], gantt_result_df['Duration'], left=gantt_result_df['Start'])
plt.grid()
plt.show()

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

运行 CP 模型生成的甘特图

谁是那个不能被包含且持续时间等于 0 的人?

混合整数线性规划

虽然这可能不是最简单的方法,但我最喜欢的解决这个难题的方法是使用 MILP。要了解更多关于如何建模和解决 MILP 的信息,可以参考我下面的文章:

medium.com/towards-data-science/heuristics-as-warm-start-for-mixed-integer-programming-mip-models-9046781dd21f

我们仍然有集合 N,表示参与的人,以及 met_i,表示人员 i 遇到的人。在这种情况下,我们将采用时间索引方法,事先定义一组时间段 T(假设 T = 6)。变量如下:

  • y_i:二进制。若人员 i 被包含,则为 1。否则为 0

  • x_(i, t):二进制。若人员 it 在城堡中,则为 1。否则为 0

  • z_(i, j, t):二进制。若人员 ijt 同时在城堡中,则为 1。否则为 0

  • w_(i, t):二进制。若人员 it 到达城堡,则为 1。否则为 0

让我们还使用 ortools 来解决它:

import pandas as pd
from matplotlib import pyplot as plt
from ortools.linear_solver import pywraplp

people = ['Ann', 'Betty', 'Charlotte', 'Edith', 'Felicia', 'Georgia', 'Helen']
people_met = {'Ann': ['Betty', 'Charlotte', 'Felicia', 'Georgia'],
              'Betty': ['Ann', 'Charlotte', 'Edith', 'Felicia', 'Helen'],
              'Charlotte': ['Ann', 'Betty', 'Edith'],
              'Edith': ['Betty', 'Charlotte', 'Felicia'],
              'Felicia': ['Ann', 'Betty', 'Edith', 'Helen'],
              'Georgia': ['Ann', 'Helen'],
              'Helen': ['Betty', 'Felicia', 'Georgia']}

periods = 6
T = [p for p in range(0, periods)]
solver = pywraplp.Solver('puzzle', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)

# 1 if person i is included. 0 otherwise
y = {(i): solver.IntVar(0, 1, "y_{0}".format(i)) for i in people}

# 1 if person i is in the castle at t. 0 otherwise
x = {(i, t): solver.IntVar(0, 1, "x_{0}_{1}".format(i, t)) for i in people for t in T}

# 1 if person i and j are in the castle simultaneously at t. 0 otherwise
z = {(i, j, t): solver.IntVar(0, 1, "z_{0}_{1}_{2}".format(i, j, t))
for i in people for j in people for t in T if i != j}

# 1 if person i arrives in the castle at t. 0 otherwise
w = {(i, t): solver.IntVar(0, 1, "w_{0}_{1}".format(i, t)) for i in people for t in range(0, periods - 1)}

约束条件如下所示:

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

(1) 保证任何包含在计划中的个人必须至少在城堡中出现过一次。(2) 确保如果一个人被包含,他们必须与其他他们遇到的个体在同一时间在城堡中。(3)(4) 确保两个个体仅当且仅当他们都被包含且在某时刻都在城堡中时才同时存在。(5) 确保未见过的两个人不能同时在城堡中。(6) 定义每个人的到达时间。(7) 不允许任何人在时间段 0 和 T(为了简单起见)期间在城堡中。最后,(8) 保证任何包含在计划中的人只有一个记录的到达时间。

# If a person is included she must have been in the castle at least once
c1 = {i: solver.Add(solver.Sum(x[(i, t)] for t in T) >= y[i]) for i in people}

# If a person is included she must have been in the castle simultaneously with other people she met at least once
c2 = {(i, j): solver.Add(solver.Sum(z[(i, j, t)] for t in T) >= y[i])
      for i in people for j in people_met[i]}

# Two people were simultaneously at t in the castle only if they are both there at t
c3 = {(i, j, t): solver.Add((z[(i, j, t)] >= x[(i, t)] + x[(j, t)] - 1))
      for i in people for j in people for t in T if i != j}

# Two people were simultaneously at t in the castle only if they are both there at t and if they are included
c4 = {(i, j, t): solver.Add(
    (x[(i, t)] + x[(j, t)] + periods * (1 - z[(i, j, t)]) >= y[i] + y[j]))
      for i in people for j in people for t in T if i != j}

# Two people that did not meet cannot be in the castle simultaneously
c5 = {(i, j): solver.Add(solver.Sum(z[(i, j, t)] for t in T) == 0)
      for i in people for j in people if i != j and j not in people_met[i]}

# Defines the arrival time of person
c6 = {(i, t): solver.Add((w[(i, t)] >= x[(i, t + 1)] - x[(i, t)]))
      for i in people for t in range(0, periods - 1)}

# Person cannot be in the castle in period 0 and period T
c7 = {(i): solver.Add(x[(i, 0)] + x[(i, periods - 1)] == 0)
      for i in people}

# If a person was included it has just one arrival time
c8 = {(i): solver.Add(solver.Sum(w[(i, t)] for t in range(0, periods - 1)) == y[i])
      for i in people}

目标函数是最大化包含的人数

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

number_of_people = solver.Sum(y[i] for i in people)
solver.Maximize(number_of_people)

解决模型并绘制甘特图,我们得到如下结果:

gantt_result_dict = {'Person': [], 'Start': [], 'End': [], 'Duration': []}
duration = {i: 0 for i in people}
start = {i: 0 for i in people}
end = {i: 0 for i in people}
for i in people:
    for t in T:
        if x[(i, t)].solution_value() >= 0.1:
            duration[i] += 1
            if x[(i, t - 1)].solution_value() == 0:
                start[i] = t
    end[i] = start[i] + duration[i]
    gantt_result_dict['Person'].append(i)
    gantt_result_dict['Start'].append(start[i])
    gantt_result_dict['End'].append(end[i])
    gantt_result_dict['Duration'].append(duration[i])
gantt_result_df = pd.DataFrame.from_dict(gantt_result_dict)
print(gantt_result_df)
fig, ax = plt.subplots(1, figsize=(16, 6))
ax.barh(gantt_result_df['Person'], gantt_result_df['Duration'], left=gantt_result_df['Start'])
plt.grid()
plt.show()

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

通过运行 MIP 模型生成的甘特图

再次没有包括在内的是谁?

这个例子演示了如何使用不同技术以各种方式处理和解决问题,但所有方法都产生相同的结果。你自己尝试解决问题时,可能会开发出替代的方法或模型。

尽管在考虑这个特定问题时,图论 似乎是最简单的方法,但由于它是一种特定的方法,因此不能普遍适用于所有问题。数学规划(MILP)与 约束编程 的差异可能是整篇文章或甚至一本书的主题。不过,主要的差异是:

  • 数学编程 模型支持离散和连续决策变量,而 约束编程 仅支持离散决策变量(整数或布尔值)。

  • 约束编程 支持逻辑约束以及算术表达式,包括模运算、整数除法、最小值、最大值和一个通过决策变量索引值数组的表达式。它还可以利用专门的约束,例如 全不同无重叠 约束,这可以简化建模,而 数学编程 仅支持 = 约束。

参考文献

[1] B. Claude 和 W. Ian, 《谁杀了丹斯莫尔公爵》(1994),Biblioteque Oulipienne #67

除非另有说明,所有图片均为作者提供

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值