分位数回归,从线性模型到树再到深度学习
假设一位房地产分析师想根据房屋年龄和离就业中心的距离等因素来预测房价。典型的目标将是在给定这些因素的情况下,生成最佳房价点估计值,其中“最佳”通常指的是使与现实的平方偏差最小化的估计值。
但是如果他们不仅想预测一个单一的估计值,还想预测可能的范围呢?这被称为预测区间,产生它们的一般方法被称为分位数回归。在这篇文章中,我将描述这个问题是如何形式化的;如何用六种线性的、基于树的、深度学习的方法实现(用 Python — 这里是 Jupyter 笔记本);以及它们在真实数据集上的表现。
分位数回归最小化分位数损失
正如回归最小化平方误差损失函数来预测单点估计一样,分位数回归在预测某个分位数时最小化分位数损失。最常见的分位数是中间值,或第 50 个百分位数,在这种情况下,分位数损失就是绝对误差的总和。其他分位数可以给出预测区间的端点;例如,中间 80%的范围由第 10 和第 90 个百分位数定义。分位数损失根据所评估的分位数而不同,例如,对于较高的分位数,负误差越多,惩罚越多;对于较低的分位数,正误差越多,惩罚越多。
在深入研究公式之前,假设我们已经对一个真值为零的单点进行了预测,我们的预测范围从-1 到+1;也就是说,我们的误差范围也是从-1 到+1。该图显示了分位数损失如何随误差而变化,具体取决于分位数。
让我们分别看一下每一行:
- 中间的蓝线显示了中位数,其围绕零对称,其中所有损失都等于零,因为预测是完美的。到目前为止看起来不错:中间值旨在将预测集一分为二,因此我们希望对低估和高估进行同等的权衡。我们很快就会看到,中位数周围的分位数损失是绝对偏差的一半,因此-1 和+1 都是 0.5,0 是 0。
- 浅蓝色线显示第 10 个百分位数,负误差损失较低,正误差损失较高。第 10 个百分位数意味着我们认为有 10%的可能性真实值低于预测值,因此低估比高估损失更小是有意义的。
- **深蓝色线显示第 90 百分位,**是第 10 百分位的反向模式。
对于低估和高估的预测,我们也可以通过分位数来观察这一点。分位数越高,分位数损失函数对低估的惩罚越多,对高估的惩罚越少。
鉴于这种直觉,以下是分位数损失公式(来源):
在 Python 代码中,我们可以用maximum
语句替换分支逻辑:
def quantile_loss(q, y, f):
# q: Quantile to be evaluated, e.g., 0.5 for median.
# y: True value.
# f: Fitted (predicted) value.
e = y - f
return np.maximum(q * e, (q - 1) * e)
接下来,我们将了解六种方法——OLS、线性分位数回归、随机森林、梯度增强、Keras 和 tensor flow——并了解它们如何处理一些真实数据。
数据
该分析将使用波士顿住房数据集,该数据集包含代表波士顿地区城镇的 506 个观察值。它包括 13 个特征和目标,即业主自住房屋的中值。因此,分位数回归预测的是房屋中值低于某个值的城镇(而不是房屋)的比例。
我对 80%的模型进行训练,对剩下的 20%进行测试。为了更容易可视化,第一组模型使用了一个单一的特征:AGE
,1940 年之前建造的业主自住单元的比例。正如我们可能预料的那样,有旧房子的城镇有较低的房屋价值,尽管这种关系是吵闹的。
对于每种方法,我们将预测测试集上的第 10、30、50、70 和 90 个百分点。
普通最小二乘法
尽管 OLS 预测的是平均值而不是中值,但我们仍然可以根据标准误差和逆正态 CDF 来计算预测区间:
def ols_quantile(m, X, q):
# m: OLS statsmodels model.
# X: X matrix.
# q: Quantile.
mean_pred = m.predict(X)
se = np.sqrt(m.scale)
return mean_pred + norm.ppf(q) * se
这种基线方法产生以平均值(预测为中位数)为中心的线性和平行分位数。一个调整良好的模型将显示大约 80%的点在顶线和底线之间。请注意,这些点与第一个散点图不同,因为这里我们显示的是评估样本外预测的测试集。
线性分位数回归
线性模型从平均值扩展到中位数和其他分位数。线性分位数回归预测给定的分位数,放松了 OLS 的平行趋势假设,同时仍然保持线性(在引擎盖下,它最小化了分位数损失)。这是用statsmodels
直截了当的说法:
sm.QuantReg(train_labels, X_train).fit(q=q).predict(X_test)
# Provide q.
随机森林
我们第一次离开线性模型是随机森林,一个树木的集合。虽然这个模型没有明确地预测分位数,但我们可以将每棵树视为一个可能的值,并使用其经验 CDF ( Ando Saabas 在此)计算分位数:
def rf_quantile(m, X, q):
# m: sklearn random forests model.
# X: X matrix.
# q: Quantile.
rf_preds = []
for estimator in m.estimators_:
rf_preds.append(estimator.predict(X))
# One row per record.
rf_preds = np.array(rf_preds).transpose()
return np.percentile(rf_preds, q * 100, axis=1)
在这种情况下,它变得有点疯狂,表明过度拟合。由于随机森林更常用于高维数据集,我们将在向模型添加更多要素后再讨论它们。
梯度推进
另一种基于树的方法是梯度提升,scikit-learn
的实现,其中支持显式分位数预测:
ensemble.GradientBoostingRegressor(loss='quantile', alpha=q)
虽然不像随机森林那样不稳定,但在单特征模型上看起来也不太好。
深度学习
Keras 是一个用户友好的神经网络工具包包装器,包括 TensorFlow 。我们可以使用深度神经网络通过传递分位数损失函数来预测分位数。代码有点复杂,所以查看一下 Jupyter 笔记本或阅读更多来自Sachin Abeywardana 的内容,看看它是如何工作的。
最深层的网络是带有纽结的线性模型(称为校正线性单位,或 ReLUs ),我们可以在这里直观地看到:Keras 预测,大约 70%建于 1940 年之前的城镇的房屋价值会出现更多的聚集,而在非常低和非常高的年龄段会出现更多的分散。基于测试数据的拟合,这似乎是一个很好的预测。
张量流
Keras 的一个缺点是每个分位数必须单独训练。为了利用分位数共有的模式,我们必须使用 TensorFlow 本身。参见朱庇特笔记本和雅各布·茨威格的文章了解更多信息。
我们可以在其预测中看到分位数之间的这种共同学习,其中模型学习一个共同的扭结,而不是每个分位数的单独扭结。这看起来是一个受奥卡姆启发的好选择。
哪个做得最好?
目测表明深度学习做得很好,线性模型做得还可以,基于树的方法做得很差,但是我们能量化哪个最好吗?是的,我们可以,使用测试集的分位数损失。
回想一下,分位数损失因分位数而异。因为我们计算了五个分位数,所以测试集中的每个观察值都有五个分位数损失。所有分位数观察的平均值证实了视觉直觉:随机森林表现最差,而张量流表现最好。
我们也可以通过分位数来打破这一点,揭示出基于树的方法在第 90 个百分位数表现特别差,而深度学习在较低的分位数表现最好。
较大的数据集为 OLS 提供了更多的改进机会
因此,随机森林对于这种单要素数据集来说很糟糕,但这不是它们的用途。如果我们将其他 12 个特征添加到波士顿住房模型中会发生什么?
基于树的方法卷土重来,虽然 OLS 有所改善,但 OLS 和其他非树方法之间的差距越来越大。
现实世界的问题往往超出预测手段。也许一个应用开发者感兴趣的不仅仅是用户的预期使用量,还有他们成为超级用户的概率。或者某车险公司想知道不同门槛下司机高额理赔的几率。经济学家可能希望从一个数据集到另一个数据集随机估算信息,从 CDF 中挑选以确保适当的变化(我将在后续文章中探讨这个例子)。
分位数回归对于这些用例中的每一个都是有价值的,机器学习工具通常可以胜过线性模型,尤其是易于使用的基于树的方法。在你自己的数据上尝试一下,让我知道效果如何!
量化基金和新的哑钱
大多数量化基金是新的“傻钱”来源,在不知情和无技能的散户供应减少的时候,这些钱可以被用来获利。此类基金的运营限制使它们很容易成为目标。
交易是零和游戏。尽管有些人认为事实并非如此,但他们这样做是自担风险的。如果交易者不明白利润必须来自其他市场参与者的损失,那么失败的条件已经存在。然而,说服任何拒绝理解这一事实的人并不是本文的目的。
在 20 世纪 80 年代和 90 年代,当交易非常流行的时候,专业交易者和其他熟练的市场参与者能够因为哑币的供应而获得可观的利润。不熟练和不知情的散户交易者使用未经测试的方法,如图表模式是 CTA、做市商、熟练专业交易者和其他消息灵通的市场参与者的主要利润来源。网络泡沫破灭后,在随后的熊市中,大多数不熟练的交易者退出了市场,其中一些成为了被动投资者。难怪 CTA 和其他熟练的市场参与者的回报一直很低,因为:周围没有足够的哑资金供应。我已经说了很多年了,最近得到了尼尔·伯格的证实。
鉴于以上对市场现实的介绍,至少在过去的 10 年里,交易者产生 alpha 变得更加困难。顺便说一句,由于各国央行的不懈干预,被动投资者在股市中获得了巨额回报,但这场派对很快就会结束。此外,这些被动投资者面临着很高的风险,即在某个时间点,央行可能会试图获利了结,并为地方政府的社会政策提供资金,我认为这是投资趋势股票市场的主要意图。实际上,央行抛售可能导致下一轮熊市,而不是地缘政治事件。
坏消息是,现在已经没有多少散户傻钱了。好消息是,有许多新的量化基金。虽然操作这些基金的人很聪明,有数学和编程技能,但他们没有市场经验,尽管他们认为自己有,因为他们认为交易市场相当于在读了一些相关书籍后部署一个算法。大多数人发现这还不算太晚,在叔叔点。我有一些故事要分享,但我不会。
量化对冲基金的局限性
熟练的专业交易者可以利用量化对冲基金的一些局限性:
1。高容量交易算法
基金期望资金流入,因此它们的策略应该适应这一点。这就限制了他们可以使用的策略类型。为了增加容量,必须交易大量的工具,这通常可以在股票市场上获得,因为期货市场的流动性要低得多。标准普尔 500 成分是构成合适宇宙的一个例子。交易大量的证券降低了回报方差,但由于偏差-方差权衡,通过实施弱模型也降低了预期回报。简而言之,高容量限制通常会导致弱模型和高交易摩擦下的低回报。
专业交易者可以利用这一限制,专注于交易模型相对较快的指数 ETF。由于再平衡,这些交易所交易基金的价格行为会影响潜在价格行为。最终结果是,对冲基金最终以更低的价格交易个股。
从容量限制中获利的另一种更先进的方法是采用非常快速的算法。HFT 交易者已经这样做了,但是如果滞后很小,中低频交易者可以受益。
2。低β限制
大多数量化对冲基金要求业绩与市场相关性低。这意味着β值尽可能接近 0。然而,这排除了一大类基于风险调整的高盈利模式。例如,自开始以来,SPY 中的 1-12 个月移动平均动量规则的夏普比率为 0.90,而买入并持有的夏普比率为 0.55,但贝塔系数为 0.48,远远高于预期阈值。
Source: Portfolio Visualizer
专业交易者可以使用类似的模型,尽管他们有更高的贝塔系数,但他们仍然会降低对冲基金的利润潜力,因为对冲基金要求更低的贝塔系数。
上述模型是作为一个例子提出的,但它的未来表现很可能也会受到哑金和央行支持的不利影响。这被称为“行人”策略,这只是一个例子。
3。依靠学术研究者的建议
依赖学术研究人员可能是对冲基金能做的最糟糕的事情。学术研究人员和专业熟练的交易者在心态上有很大的不同。
我最近看到一位学术研究人员向对冲基金做了一个关于使用机器学习的演示。对我来说显而易见的是,尽管这位研究人员是一个拥有高级数学技能的聪明人,但他使用了怪异的术语,目的是为了制造炒作和给人留下印象。
数据挖掘偏见和 p-hacking 是一个问题,但学术研究的解决方案模棱两可,并忽略了一个事实,即过度拟合的模型可以很好地工作甚至几十年,并在 p-hacking 显而易见之前实现巨额财富。在交易中,知道市场条件何时变化比估计数据挖掘偏差重要得多。实际上,只要市场条件保持不变,过度拟合模型可能是一个好的解决方案。我在我的论文里有例子 关于交易策略评估的量化主张的局限性 。我收到人们的电子邮件,告诉我这篇论文如何改变了他们对战略发展和市场的整体看法。不用说:我不期待学术研究者的任何赞扬,因为他们的目标是不同的。
4。很多量化基金都在劫难逃
为什么我把这个列为限制?在我看来,这是因为任何认为 algos 很容易赚钱的人最终都会失败。任何有切身体会的人都知道,交易不仅仅是算法。有许多因素会影响性能。保持一切都在雷达下是一项艰巨的工作,需要一大群高度自律的员工和任务共享(雷伊·达里奥和布里奇沃特原则),或者保持小规模运营——专注于几个流动市场的独角戏。因素、特征、机器学习、算法、回溯测试、数据挖掘偏差、花哨的平台等等。可能不到工作的 50%。另外 50%是关于执行、维护和处理突发事件。
总结
新的量化基金有几个限制,专业交易者可以利用并获利。高容量要求,低贝塔约束,依赖学术建议,认为算法交易是灵丹妙药就是其中的一些。量化对冲基金是新的哑钱,尽管操作它们的人可能很聪明,受过高等教育。零和游戏是无情的。
注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
这篇文章最初发表在价格行动实验室博客
如有任何问题或意见,欢迎在推特上联系: @mikeharrisNY
**关于作者:**迈克尔·哈里斯(Michael Harris)是一名交易者和畅销书作家。他也是 17 年前第一个识别价格行为无参数模式的商业软件的开发者。在过去的七年里,他一直致力于开发 DLPAL,这是一个软件程序,可以用来识别市场数据中的短期异常,与固定模型和机器学习模型一起使用。点击此处了解更多信息。
量子优势,或者量子计算机工作的实际演示
量子计算在科技界变得越来越明显。有十几家硬件公司,每家都在试图建立自己的量子计算机,从 Xanadu 这样的小型初创公司,到 D-Wave 或 Rigetti 这样的中型公司,再到谷歌、微软或 IBM 这样的大型企业。最重要的是,有几十家软件公司试图在现有的不完善的设备上实现量子算法。今天,我们生活在 NISQ 时代——嘈杂的中等规模量子——明年将有多达 128 个量子比特可用。
硬件公司正忙于扩大量子计算机的规模,提高计算的保真度,减少噪音。然而,每个人心里想的都是量子优势,这是一个实际的证明,量子计算机可以比经典计算机更好地解决现实世界的问题。
展示量子优势是硬件和软件公司的圣杯。谷歌最近宣布与美国宇航局合作,共同致力于此,里盖蒂设立了 100 万美元的奖金“用于量子云服务平台上量子优势的首次决定性展示”,普遍预期这一目标应该可以在未来 12 个月内实现。
量子优势并不意味着量子计算机会突然取代经典计算机。它更多的是证明,对于经典计算机难以解决的一些问题,量子计算能够提供令人信服的解决方案。到目前为止,当提供量子推进的解决方案后来再次被经典计算机击败时,有很多激动人心的事情,但也有很多破碎的梦想和倒退,例如尤因·唐在去年夏天的一些案例中展示了这一点(查看的论文或在量子中的故事)。
努力展示量子优势是我们公司波尔科技的主要目标之一。我们专注于优化问题,特别是在运输和物流方面,因为我们相信我们将能够在那里展示量子优势。对于在 NISQ 设备上演示量子优势的问题,我们有两个一般性的假设:
- 经典计算机难以解决且规模迅速扩大(例如指数级)的问题;
- 稀疏的数据集,来自难以生成或经典近似的概率分布。
例如,通过某些蒙特卡罗模拟、强力方法和全树搜索来满足这些类型的假设。现实世界的应用包括优化特定问题和稀疏数据的预测。这正是我们现在在波尔科技公司关注的问题。我们希望在接下来的 12 个月内展示量子计算的优势和广泛的商业应用。
我们认为,要实现这一宏伟目标,我们需要尽可能多地引进人才。这就是为什么两个月前我们决定启动 bqResearcher 计划来聚集量子计算社区,为这个单一目标而共同努力。我们的大部分研究是开源的,我们希望它保持这种方式,以便取得更快的进展。
最终,量子优势的结论性证明将成为计算本身历史上的一个伟大里程碑。
量子人工生命在这里
QUTIS(量子信息科学技术)组研究人员在 IBM 的云量子计算机 ibmqx4 中成功实现了量子人工生命。这是世界首例。被模拟的不仅仅是生命:生物体甚至在进化。目标是:在量子计算机上模拟自然进化。为什么我喜欢这条新闻?因为即使模拟的生物体非常简单,但这个主题涉及了很多领域和现象。更重要的是,实验显示了量子优势:量子计算相对于经典计算的明显优势。在接下来的内容中,我将给出几个实验涉及的主题的例子,以提供一些新闻背景。
人工生命
什么是艺术人生?人工生命 (Alife)可以被描述为通过使用模拟对自然生命或其某些方面的研究。生命分为三种:软生命(用软件建模)、硬生命(用硬件建模,像机器人)和湿生命(用生物化学建模;这包括合成 DNA 的产生)。soft alife 的一个例子是 Craig Reynolds 开发的著名 boids 程序,它是对鸟类群集行为的模拟。QUTIS 所做的是在量子计算机上实现的软存活。
演变
是的,量子计算机模拟中的简单生物甚至会进化。生物体具有基因型(编码遗传或可遗传信息)和表型(它们的外观,由它们的基因型和与环境的相互作用决定),并最终死亡,每一代的遗传信息都受到自然选择的影响。
量子计算
对量子计算的完整介绍超出了本帖的范围;不过,短一点的应该就够了。正如你可能知道的,“普通”计算机用比特工作,比特可以有两个值,通常称为 0 和 1。两位可以有四种位值组合:00、01、10 和 11。对于三位,这个数是 8。更一般地说, n 位可以有 2 的幂的 n 个值的组合。量子计算机用量子比特(量子比特)代替比特。一个量子位,当被测量时,会是 0 或 1,就像一个经典位一样。然而,在被测量之前,一个量子位可以处于两种状态的叠加状态。这意味着量子位有概率为 0,有概率为 1。一个 n 量子位的集合可以是所有 2 的 2 次方个经典值组合的叠加,直到测量完成:然后叠加崩溃,量子位全部为 0 或 1。因此,具有 n 个量子位的量子计算机可以同时执行 2 的 n 次方个计算*,而具有 n 个位的经典计算机一次只能执行其中一个。这就是量子计算机强大背后的理念。*
量子纠缠
好吧,孩子,这是一个巨大的主题。简而言之,经历量子纠缠的粒子具有依赖于彼此量子态的量子态,即使粒子相距甚远。结合量子叠加的想法,你会得到有趣的东西。比如,想象两个量子纠缠粒子叠加。现在把其中一个移到一百万光年之外,另一个保持在附近。测量你附近粒子的量子态,粒子会从叠加态坍缩到你测量的状态。这立刻使远处的粒子从它的叠加态坍缩,因为它与你刚刚测量的粒子是量子纠缠的。你似乎让事情发生得如此之远如此之快,以至于光都无法以如此快的速度传播到那里。这似乎违反了相对论,但实际上并没有。我可能会写一个帖子来更详细地解释这一点。
那么量子纠缠如何在量子生命实验中发挥作用呢?不同个体之间的关系是通过量子纠缠来实现的。例如,当一个个体通过自我复制从另一个个体“出生”时,这些个体的基因型之间存在关系,这在量子纠缠的两个个体的基因中实现。在经典计算机上,需要额外的变量来存储这些关系;量子计算机在这里显然有优势。
就像我说的,QUTIS Group 创建的模拟非常棒,因为它触及了如此多有趣的主题,并显示了量子至上。在未来,随着更大的量子计算机运行更复杂的模拟,研究人员可能会进化出更有趣的生物,甚至是智能生物。我们可以研究宇宙中生命和智慧的起源,同时学习更多关于量子计算机的知识!
量子计算?/!
零和一。这就是我们迄今为止对计算的想象。这就是经典计算。但是一个全新的概念正在改变我们对计算的看法。
在经典计算机中,一切都围绕着晶体管这个最基本的存储单元。众所周知,晶体管基本上是一个开关,不是开就是关,因此代表二进制 1 或 0。如今,晶体管的典型尺寸约为 14 纳米,比人类红细胞小 500 倍。随着这一规模的缩小,我们正在接近经典计算能够正常工作的极限。原因是经典物理在量子关系中不太适用。一个著名的例子是量子隧道效应,在这种效应中,电子会穿过一个传统上无法逾越的障碍。
但是科学家们正在通过建造量子计算机来利用这些不寻常的特性。
经典计算就像独唱——一行接一行的纯音。量子计算就像一首交响乐——许多音调相互干扰。― Seth Lloyd ,宇宙编程:量子计算机科学家挑战宇宙
正如经典计算机由比特驱动一样,量子计算机由量子比特驱动。这些量子比特有各种各样的属性,比如叠加和纠缠。
**叠加:**想象一次抛硬币。我们知道抛硬币的结果是二进制的,正面或反面。但我们也知道,一枚硬币可以停留在未定状态。当它在空气中时,它的状态还没有定义,或者我们也可以说它在两种状态中。这种同时拥有两种状态的原理,定义了量子位元最重要的属性,称为叠加态。我们大多数人都已经听说过经典的斯克罗登吉尔的猫的故事中的叠加,一只猫既是死的又是活的。当你试图测量一个量子位时,它会坍缩到一个确定的状态。如果我们有 4 个经典位,我们就有 2 个^4 = 16 个可能的值组合,你可以一次使用其中的任何一个组合。但是 4 个量子位可以同时存在于所有 16 种组合中。
**纠缠:**两个量子比特可以以这样一种方式相互绑定,即一个量子比特的状态变化会使另一个量子比特立即做出反应。这意味着使用一个纠缠的量子位,我们可以推导出另一个的性质。
就像使用逻辑门操纵经典比特一样,使用量子门操纵量子比特。量子门以叠加态和旋转概率作为输入,给出另一个叠加态作为输出,最终将这些叠加态压缩成实际的 0 和 1 序列。这允许同时进行一整套计算。
与经典计算机相比,量子计算机需要更少的迭代,尽管你不能用现在的量子计算机做很多事情。传统的数据库搜索可能需要 N 次迭代,而量子计算机只需要平方根 N 次迭代。1994 年,彼得·肖尔令人惊讶地发现了解决整数因式分解和离散对数问题的有效量子 T2 算法,此后,人们对该领域的兴趣大增。由于大多数当前的经典密码术假定这两个问题在计算上是困难的,实际建造和使用量子计算机的能力将允许我们破解大多数当前的经典密码系统。
几乎每个顶级公司都在研究量子计算机。**谷歌的 Bristlecone,**一种新的量子计算芯片,具有 72 个量子位,或量子位,使量子至上的竞赛更接近尾声,超过了 50 个量子位量子计算机的前纪录保持者 IBM。量子优势或“量子优势”是量子计算设备解决经典计算机实际上无法解决的问题的潜在能力。
现在重要的问题来了,我如何开始写量子算法。微软用它的量子开发工具包回答了这个问题。微软的量子开发工具包附带了一个名为 Q# 的专注于量子的领域特定语言,一个量子模拟环境,以及许多开源库和初学者样本。
要在需要约 30 个量子位的模拟环境中运行典型的量子算法,需要一台 RAM 约为 16 GB 的计算机,这个数字呈指数级增长。当你从 30 量子位增加到 40 量子位时,这个数字从 16GB 增加到大约 16TB。为了帮助解决这个问题,微软提供了一个托管在 azure 上的量子模拟器。
你今天就可以写出你的第一个量子算法。要开始,只需在你的系统上安装微软量子开发工具包https://marketplace.visualstudio.com/items?itemName = quantum . quantum-dev kit-vs code。
您可以将它用于 visual studio 社区或 visual studio 代码。现在克隆这个库https://github.com/microsoft/quantum,并试用这些样本。要运行这些示例,您只需要有 quantum-devkit 和。NET SDK。
Message Teleportation code running on my system. Transfering message between 2 qubits
量子计算的一些好读物。
罗纳德·德·沃尔夫讲座笔记:【https://homepages.cwi.nl/~rdewolf/qcnotes.pdf】T2
学习 Q#和了解微软量子开发工具包:https://docs . Microsoft . com/en-us/quantum/quantum-writeaquantumprogram?view = qsharp-preview&tabs = tabid-vs 2017
量子计算作者 Jozef grus ka:http://www2 . fiit . stuba . sk/~ kvasnicka/Quantum computing/grus ka _ QC . pdf
量子计算和人工智能喜结连理
2018 年,量子技术人员和大胆的开发人员正在使用量子算法来改造人工神经网络优化领域:机器学习和 AI 的蜜蜂膝盖。因此,我们可以满怀信心地说,多亏了量子算法,量子计算和人工智能的未来无可救药地纠缠在一起。因此,让我们深入探究在数字时代兴风作浪的量子算法。我将特别关注量子退火(与感觉押韵),这是一种独特的动物,它似乎在一个人工智能丰富的领域茁壮成长,而经典算法往往难以或完全失败:训练人工神经网络。
训练你的神经网络有困难?加入俱乐部…
相当令人惊讶的是,你可以训练人工神经网络,如 RNNs 和CNN变得明智,不会犯两次同样的错误。正是这种遵循埃丝特·戴森建议的能力使神经网络成为驱动机器学习和人工智能的智能引擎。也就是说,训练神经网络是一项众所周知的棘手任务。但这并没有阻止研究人员和编码人员在过去几年里努力工作,寻找新的方法来减少尖端优化算法的训练错误。减少误差问题的第一次尝试是众所周知的爬山法。让我们浏览一遍。
爬山
属于爬山俱乐部的优化算法总是在进行下一步之前检查梯度(或多或少是一个图形函数的斜率的陡度)。但是这冒着错过图表中真实活动的风险。登山者经常发现自己面临的两个敌人是高原问题和局部最小值问题。总之,这些问题就相当于徒步旅行者在海市蜃楼般的沙漠中迷路,或者被困在一个泥泞的小山谷中。但是让我们深入挖掘一下…
高原问题
当一个优化过程进入平台期时,这意味着它对于每个输入(x)得到大致相同的输出(y)。因为对于长的平坦延伸,函数的斜率为零或接近零,所以优化算法在找到边之前可能会耗尽时间。就像闪闪发光的沙漠海市蜃楼一样,平坦函数的长期延伸会产生一种错觉,即当你还没有接近它时,你已经达到了最佳状态(在这种情况下是全局最小值)。
source: safaribooksonline.com
局部最小值问题
局部最小值是一个函数图中相对较小的谷,其最深和最重要的谷位于别处。你可以把优化过程(当它在一个函数中寻找最小值的时候)想象成一个沙滩球:它会向山下滚去,最终停在眼前风景的最低点,即使在附近小山的另一边有一个更深的山谷。这就是问题所在。
source: safaribooksonline.com
最激动人心的解决方案
除了传统的爬山方法,还有很多其他的方法可以帮助你走出由局部最小值问题引起的可怕的山谷和由高原问题引起的沙漠海市蜃楼。但是为了手头的目的,让我们只关注最令人兴奋的解决方案:*模拟退火。*这是一种野生的优化动物,它正在以一种计算巧妙的方式处理山谷和高原,至少值得思考几段时间…
最热门和最酷的经典优化算法
开门见山地说,模拟退火从物理学中偷师,将时间和温度捆绑在一个优雅的算法中。是的,你没看错:一个带有温度参数的算法。当你运行一个模拟退火算法时,它从手边的函数的整个景观中开始一个完全随机的、狂热的选择序列。这是流程中最热的阶段。但是,随着温度参数随着时间的推移而下降,随机选择覆盖的景观范围越来越窄。最后,我们进入过程的酷阶段,因为算法开始瞄准(如果运气好的话)最深的谷或最高的峰,那里是优化的圣杯:全局最小值或最大值。
虽然模拟退火算法中的代码通常包含一些复杂的数学运算,但时间和温度之间的潜在联系是很容易理解的。想象一下,一个炽热的东西在未知的地方疯狂移动,击中了视线内的一切,并向我们报告了一张非常粗略的地形图。然后,你可以想象逐渐变冷的东西越来越慢,越来越小心地穿过越来越窄的地形区域,记录它们进一步潜入最深的山谷或爬上最高峰的细节……好吧,如果你仍然不确定我到底在说什么,这里有一个优秀的动画应该可以做到这一点。
量子退火(哦,多好的感觉)
当传统爬山法的其他替代方案都不理想时,模拟退火通常可以让你摆脱困境。但这是一种极其专业的方法,它至少有一个令人不寒而栗的缺点:你必须无限长时间地运行该算法,才能平稳地达到绝对零度,从而保证你在能源格局中达到真正的全球最小值或最大值。因为你可能没有永恒的空闲,你永远不会知道你的优化解决方案是否陷入了另一个陷阱。
进入量子退火。首先,重要的是要记住,量子退火算法的基本形式与模拟退火算法非常相似。为什么?因为量子隧穿强度在量子退火中的作用与温度在模拟退火中的作用相同。久而久之,量子退火炉中的量子隧穿强度急剧下降,就像模拟退火炉中的温度急剧下降一样。也很容易想象隧道强度和温度之间的相似性。久而久之和量子隧穿强度下降,系统变得越来越舒适,在能源景观的每个渐进更深的山谷,越来越不倾向于隧道的出路。最终,当它发现自己(理想情况下)处于能源领域最深、最舒适的谷底(也就是全球最小值)时,它会完全放弃挖隧道。
不是你祖母的量子计算机
你一定会注意到,相对传统的量子计算机和量子退火计算机之间的第一个区别是它们使用的量子位数量。虽然传统量子计算机的最新技术在 2018 年推出了几十个量子位,但领先的量子退火器拥有超过 2000 个量子位。当然,代价是量子退火器不是通用的,而是专门的量子计算机,在技术上只处理优化问题和采样问题。因为解决最优化问题被认为是通往人工智能乐土的关键途径之一,所以从现在开始我将把重点放在它上面。
令人眩晕的混乱状态
在我们将量子退火算法应用于量子退火器中的量子位池之前,它们是一团乱麻:一个最模糊且不相连的配置。这意味着我们一开始对量子系统一无所知,它可能处于任何 2^n 不同状态(其中 n 是量子比特的数量)。对于一台拥有 2000 个量子位的量子退火机来说,这是一个疯狂的可能状态数。如果你对此有任何疑问,试着在你最喜欢的计算器中输入 2 个⁰⁰⁰来寻求第二种意见。
量子许愿井
单个量子位总是从初始的多云叠加状态开始,这使它们处于最小可能的能量。物理学家喜欢把这种最低能量状态想象成量子势阱的底部,看起来有点像一个大字母 u。
U
0/1
然后量子退火出现,迫使叠加态分成两半,两个状态,两个底部:0 和 1。结果看起来更像一个大写字母 W:
W
0 1
量子退火者的下一步是开始在量子概率游戏中装载骰子以支持房子。
偏见
在外加磁场的帮助下,量子退火器推动每个量子位严重偏向 0 或 1: ,有利于上面 W 中的第一次或第二次倾斜。
连接器
当量子退火机通过磁场给骰子(也就是单个量子位)加载偏置时,他们也在忙着通过耦合器用理论线将成对的骰子绑在一起。具体来说,一个耦合器可以做两件事情中的一件。它可以保证一对量子比特始终处于同一状态:要么都是 0 ,要么都是 1 。或它可以保证两个相邻的量子位始终处于相反的状态: 0 和 1 ,或 1 和 0 。量子耦合器使用(惊喜,惊喜)量子纠缠将量子比特捆绑在一起,创建耦合。
塑造能源景观
作为一名使用 quantum annealer 的有抱负的开发人员,您的工作是通过编码一组偏差和耦合来加载所有的 quantum 骰子,这些偏差和耦合定义了您希望可靠的 annealer 解决的优化问题。另一种看待它的方式是,你正在雕刻,或者至少产生一个复杂的能量景观,它由峰和谷组成,代表了你的最优化问题中所有可能的结果。然后你就可以让量子 annealer 去搜索并找出能源领域最深的谷底,这也是最优解。如果你一直成功,那么你的量子退火能力可能有助于为子孙后代提供新一代的机器学习和人工智能。
量子计算和人工智能新闻
2017 年 8 月 31 日,大学太空研究协会(USRA) 宣布与美国宇航局和谷歌合作,将量子人工智能实验室(量子人工智能实验室)的量子退火计算机升级为 D-Wave 2000Q 。最新的 D-Wave 拥有几乎是其前身两倍的量子位和“绝热量子计算”的新诀窍,正在追求优化问题池中更大的鱼。USRA 团队甚至着眼于使用量子算法和 D-Wave 来解决“NASA 任务中涉及的挑战性计算问题”另一方面,合作伙伴谷歌已经盯上了人工智能:
我们对将量子计算应用于人工智能和机器学习特别感兴趣。
但不仅仅是谷歌和美国宇航局可以访问量子人工智能实验室。信不信由你,你也可以。如果你是一个合格的候选人,你可能会有一些时间和最新的 D-Wave 一起尝试你的天才想法。用实验室自己的话说,“通话开启。”
嗯,这就是我今天的全部内容。如果你喜欢这篇文章,我会非常兴奋,如果你点击拍手按钮:)或与你好奇的朋友分享。我在我的个人博客(jasonroell.com)上有更多类似的东西,或者你可以订阅我的媒体简介,让我一写完文章就发给你!(多牛逼?!)
无论如何,再次感谢你的阅读祝你有美好的一天!
量子计算解释!
在亚原子水平上,我们所知道的关于经典物理学的每一件事情都破裂了,不仅仅是小幅度的破裂,而是大规模的破裂。欢迎来到量子力学的世界,准备好大吃一惊吧。
在我们开始谈论量子计算之前,我们必须很好地理解什么是量子力学,它有什么特别之处,以及量子力学现象如何帮助我们执行高级计算。
关于量子力学的最初研究可以追溯到 17 世纪,当时科学家提出了光的波动理论 ( 光可以同时展示波动理论和粒子理论)。光量子的存在是由 马克斯·普朗克 在 1900 年提出的,这一观点被 阿尔伯特·爱因斯坦 进一步加强,他指出,光是由称为光子的微小粒子组成的,每个光子都具有能量。 一般来说,量子力学在原子和亚原子粒子的尺度上处理物质的行为及其与能量的相互作用。
随着量子力学的出现, 牛顿力学(或经典力学 ) 开始在基础层面消退。光本身的某些特定性质无法用经典物理学解释,氢光谱系列,例如,当氢气在一个管中加热并观察发射的光时,可以注意到氢原子的发射光谱包含多个光谱系列,而不是连续发射的光(或电磁辐射),是的,它更像是颜色的条带,与经典物理学的预期不同。丹麦物理学家 尼尔斯·玻尔 对此提出了一个解释,即波尔模型,在该模型中,他将原子描述为一个带正电荷的小原子核,周围是 电子,这些电子围绕着原子核以圆形轨道 运行——类似于太阳系的结构。每个轨道对应不同的能级。能量的变化,如电子围绕原子核从一个轨道转移到另一个轨道,是在离散的量子中完成的。术语量子跃迁指的是从一个离散能级到另一个离散能级的突然 运动,没有平滑过渡 。没有“中间”。
量子跳跃是特殊的,因为电子的运动不是渐进的,它只是从一个轨道上消失,然后出现在下一个轨道上,没有中间状态,并释放(或吸收)一定量的能量。这让事情变得有趣了。Bhor 解释说,这个层次的能量不能再细分,它被称为量子,一种特定的最小能量。这种能级的第一个见解是由一位名叫普朗克的物理学家提供的,所以我们称它为普朗克常数。所以,一般来说,原子中电子的能量是量子化的。
这只是开始,经典物理的可预测性被量子物理的潜力所颠覆。这是当时许多物理学家非常关心的问题。为什么电子遵循量子化轨道而没有中间态?
路易·德布罗意 1923 年的论文回答了这个问题。他解释说 物质可以表现出粒子性和波动性 就像光一样。电子的波动性质要求它们获得特定的波长,这是允许它们适应轨道的。但是在这个轨道上,由于电子的波动性质,电子可以存在于任何地方,而不仅仅是某个特定的点。这从根本上不同于经典物理学,但被实验证明。因为质量较大的物质,如我们人类,具有高动量,并且这种物质的波长会小得多,因为质量与德布罗意波长成反比。因此,德布罗意解释的效果在宏观层面上减弱了。
1927 年,戴维孙和热尔默进行的双缝实验证明,光和物质可以表现出经典定义的波和粒子的性质。托马斯·杨在 1801 年做了一个类似但更简单的双缝实验。当光线穿过屏障上的两个狭缝时,会在另一侧的屏幕上形成干涉图案。(穿过双缝的光不会在屏幕上形成双带图案)这些实验有趣的部分是,即使我们一次通过一个电子/光子,干涉图案也会在屏幕/探测器上形成。这怎么可能呢?这意味着,如果我们从一个源发送一个电子通过一个双缝(我们不知道电子通过哪个缝),电子出现在屏幕(或探测器)另一侧的位置是随机的(意味着它可以在干涉图案中的任何地方)。如果我们发送大量的电子,就会在另一边形成干涉图案。这意味着每个单个电子必须表现出波的性质,否则它不会干扰任何其他东西,在势垒一侧的单个电子波将在双缝势垒的另一侧产生两个波(就像单个水波穿过两个孔可以在另一侧形成两个波),这两个波相互作用形成干涉图案。
Erwin Schrodinger 发表了一个方程,其中 将运动的电子描述为一个穿过 传播的波。这个方程也被称为薛定谔方程,它帮助他获得了 1933 年的诺贝尔物理学奖。
德国物理学家和数学家梅克斯·玻恩阐明了概率密度函数,它将所有这一切描述为发现电子为波的一种 可能性。 这是在他研究了玻尔模型的电子轨道之后,这有助于他和沃纳·海森堡一起阐明量子力学的矩阵力学表示。一年后,海森堡提出了海森堡的测不准原理,认为即使在理论上,粒子的位置和速度也不能同时精确测量。
沃纳·海森堡和尼尔斯·玻尔一起设计了量子力学的哥本哈根解释,该解释指出 物理系统在被测量之前通常不具有确定的属性,量子力学只能预测测量将产生某些结果的概率。测量的行为将导致波函数坍缩,把概率变成一个可能的值。
阿尔伯特·爱因斯坦回应道
“上帝不和宇宙玩骰子”
尼尔斯·玻尔回答道
“别再告诉上帝该怎么处理他的骰子了。”
即使是有史以来最聪明的人也很难理解量子物理学的全部内容。但是在双缝实验中很明显,如果我们在任何一个缝上放置一个测量装置,试图找出电子通过哪个缝,干涉图样就会消失。
强烈建议观看此视频:
所以,在没有观察的情况下,把现实赋予宇宙是没有意义的。在测量间隔中,量子系统确实是所有可能性质的模糊混合物。这就是量子叠加,正常的物质宇宙只有在测量的瞬间才有意义。
就我们的电子而言,叠加可以描述为电子同时处于不同位置的可能性。根据测不准原理,这也适用于电子的自旋(它是角动量的一种固有形式)。电子可以在所有方向上自旋,直到我们测量它的自旋,测量时自旋要么与测量方向一致,要么与测量方向相反。这也称为加速旋转或减速旋转。
量子系统中的情况不同乍一看也难以把握,为了放松我们可能需要看一段猫的视频。薛定谔的猫呢?
让我们也看看这个…
简而言之,一只猫在一个封闭的盒子里,盒子里有某种东西(比如说炸药)可能会杀死它,也可能不会杀死它,这是叠加态,这意味着对外界来说,猫要么活着,要么死了。所以直到我们打开盒子,观察到猫有一半的概率是死的,一半的概率是活的。
这个实验还有一个更重要的含义,那就是在封闭的盒子里会发生什么。如果猫感觉到爆炸,它就会死,如果它感觉不到爆炸,它就会活着。cat 的状态与 explosive 的状态有某种联系。在量子世界中,这被描述为量子纠缠。****
量子纠缠是一种现象,通过这种现象,一个以上的粒子,共同产生或密切相互作用,可以开始一种关系,每个粒子的量子状态不能独立描述(如果猫死了,爆炸/如果爆炸的猫死了)。因此,粒子不能独立描述,它们成为一个连接的系统,测量一个会影响另一个的状态。即使当它们相隔很远时,这种属性也将被保留。
例如,考虑两个纠缠的电子,我们将考虑电子的自旋(可以考虑位置或动量,我们将自旋视为角动量)在产生时总和为零。现在我们可以把这些电子分开任意距离,并独立地测量它们。如果第一个电子测量自旋向上,那么另一个将总是自旋向下,反之亦然。而测量的效果是瞬间发生的,意味着比光速还快。
纠缠的量子粒子以概率状态存在,只有当其中一个粒子被测量时才会失去叠加态,而另一个粒子会瞬间受到影响,即使相隔任何距离,这种想法让当时的许多科学家疯狂。它甚至包括爱因斯坦,他称之为“超距幽灵行动”。他甚至提出了 EPR 悖论,它说两个粒子相互作用形成深层关系,信息被编码在一些关于可能状态的“隐藏参数”中。就像一个电子说,如果有人测量我,我会旋转,另一个说我会旋转。否则,它发送信息的速度将超过光速,从而打破相对论。
阿兰方面在 1980 年用基于约翰·斯图尔特·贝尔 1964 年提出的贝尔定理的贝尔检验实验推翻了 EPR 佯谬。是的,量子世界是真实的,幽灵般的行为确实存在。
现在让我们用量子计算的观点重新开始每一件事…让我们再做一次。
****量子计算研究直接利用叠加、纠缠等量子力学现象对数据进行运算的理论计算系统。
在经典计算机中,我们将任何数据转换为 0 和 1,即所谓的 位。 实际上是对高电压和低电压进行处理,然后将它们通过一系列称为逻辑门的门,这些门可以操纵数据来计算出结果。逻辑门如与、或、非、异或等。可以以不同的方式排列来处理这些位并产生输出。它可以做简单的操作,如复杂加密的加法。逻辑门是通过使用晶体管来实现的,现在晶体管依靠硅半导体的特性来执行操作,而不是使用机械开关。
当然,经典计算机速度快、效率高,但它们不擅长处理涉及指数复杂性的问题,如 整数因式分解 。尤其是整数进一步限定为质数时的质因数分解**(半质因数分解)。基本上,找到两个大素数的乘积是很容易的,但是在给定乘积的情况下,用经典计算机找到产生乘积的数需要大量的计算。事实上,这种复杂性是包括 RSA 在内的许多密码系统的基础。**
那么量子计算机如何解决这个问题呢?
在量子计算中,基本计算单位是一个量子位**,它可以表示信息。量子位与普通位有一些相似之处,例如它可以被测量为 0 或 1。但是量子比特的威力在于它像叠加和纠缠一样的量子力学性质。一个量子位可以同时处于零态和一态。一个量子位的状态用“ket 0”和“ket 1”符号来表示,记为 |0 > 和 |1 > ,基本的测量状态类似于经典的 0 和 1。**
真实量子计算机中的量子比特到底可以是什么?它可以是有自旋的电子,有极化的光子,杂质自旋,俘获离子,中性原子,半导体电路等等。
简单量子位的超位置可以用下面的布洛赫球来表示
这看起来可能有点复杂,但我们需要记住的要点是,单个量子位在任何时候都可以处于 |0 > 和 |1 > 的超级位置,它可以表示为
a | 0>+b | 1>+
其中 a 和 b 分别是被测量的量子位的振幅(与概率成比例)为 0 和 1,并且 a + b =1
因此,一个量子位可以处于两个状态的叠加位置,一旦它被测量,它将根据每个状态的概率返回两个状态中的一个。所以测量一个量子位本身对系统有影响,所以测量一个量子位类似于一个影响量子位状态的门。
如果我们考虑一个以上,比如说两个,量子位的事情变得更有趣,基本状态将是 00,01,10,11 但是量子位可以同时处于所有四个状态的超级位置。所以这应该表示为
a | 00>+b | 01>+c | 10>+d | 11>+
为了表示两个量子位,我们需要 4 个概率/振幅(a,b,c,d),如果我们有三个量子位,我们将需要 8 个。因此,如果我们有 n 个量子比特,我们将需要 2^n 数来代表这个量子系统的整体状态。因此,通过少量增加量子位的数量,我们将能够产生能够代表巨大状态的系统,这与经典计算机不同。
即使描述超位置所需的信息量随着量子位的数量呈指数增长,由于量子测量的基本限制,我们也无法访问所有这些信息。叠加态中电子的自旋可以是所有方向的,但是当我们测量时,它只能是向上或向下的一个方向。我们也不能预测结果,它是基于与状态相关的概率的(例如:一半时间上升,一半时间下降)。这意味着,为了充分发挥量子计算机的潜力,我们需要开发量子算法,探索存储在量子位超级位置的大量信息的存在,并在计算结束时,让系统处于我们可以确定地检测到的基态之一。
在量子计算机中,有可能存在两个值相反的量子位,但在我们测量之前,单个量子位的值是未知的。这是可能的,因为量子纠缠。假设我们有两个零态的电子量子位,然后我们通过施加电磁波使第一个电子/量子位处于叠加态,该电磁波具有与零和一态之间的能量差成比例的特定频率。现在,当我们试图通过施加第一电子/量子比特处于零状态时所需频率的电磁波来调整第二电子/量子比特时,处于超位置的第一电子/量子比特将对第二量子比特的自旋产生影响,并且第二电子/量子比特也将移动到叠加状态(非稳定状态)。所以这两个量子位的状态将会纠缠在一起,如果我们测量第一个并得到向上自旋,那么另一个将给出向下自旋,反之亦然。这种纠结,在任何远距离都会持之以恒。在我们测量它们之前,这两个量子位元只能被视为一个具有可能值的单一系统。这在经典计算机中是不可能的,因为有两个比特没有值,而是相反的值。
因此,量子位元数目的增加,将会成倍增加可能的纠缠态数目。需要注意的一个关键点是,量子纠缠可能非常脆弱(量子退相干),任何利用这一点的系统都应该具有非常小的外部干扰。
量子电路(量子计算的模型)的积木是量子逻辑门。它们就像经典计算世界的逻辑门,但与许多经典逻辑门不同的是, 量子逻辑门是可逆的 。这是因为量子力学要求量子系统永远不会随时间丢失信息,并且它必须总是能够重建过去。
你能想到任何通往量子世界的经典大门吗?
“与”门不会成功,因为 1 和 0、0 和 1 的输出都是 0。
是,没有什么能到达量子世界
非 0 = 1,非 1 =0
这是可逆的,如果输出为零,则输入为 1,如果输出为 1,则输入为零。这个门在量子世界中被称为泡利-X 门**。它映射 |0 > 到 |1 > 和 |1 > 到 |0 >**
****哈达玛门也作用于单个量子位,并产生叠加态。
****交换门交换两个量子位。即 |10 > 到 |01 > 以此类推。
****受控门作用于 2 个或更多的量子位,其中一个或多个量子位作为某种操作的控制。例如,受控非门(或 CNOT )作用于 2 个量子位,只有当第一个量子位为|1 >时,才对第二个量子位进行非运算,否则保持不变。
CNOT 门:
在 CNOT 门的情况下,我们可以看到每个输出都是不同的,没有模糊性,状态可以恢复。
在基于电子自旋的量子计算机中,CNOT 门很容易实现。由于控制比特和目标比特靠得很近,控制比特的自旋对目标比特有一定的影响,它决定了我们能否用一定的电磁波翻转目标。
CNOT 门也可以用来产生控制和目标的纠缠态。如果我们先用阿达玛门来控制,然后再用 CNOT 门,控制和目标就会叠加纠缠在一起。CNOT 门通常在量子计算中用来产生纠缠态。
CNOT 和任意量子位旋转可以在量子计算机中实现任何逻辑功能。
你可以在这里找到其他可用的量子门。
测量一个量子位也可以改变系统的状态,功能非常类似于门,但它不是一个实际的量子门。
为了让量子计算机工作,我们应该能够改变任意量子位的属性,我们应该能够通过在一个或多个量子位之间进行交互来运行量子逻辑门。
现在我们需要利用所有这些逻辑来创建一些有用的算法。使用量子计算机来执行计算简单的操作是没有意义的,因为经典计算机可以以更低的成本完成这一操作。由于基础设施本身是复杂的,并且量子计算机可以同时处理大量的状态,量子计算机的有效使用被限制在特定的领域,如寻找质因数、搜索大量数据等。这是计算密集型的。
****量子算法是一个循序渐进的过程,其中的每一步都可以在量子计算机上执行,这将涉及量子属性,如叠加和纠缠。已经有不同的算法可用,更多的算法正在开发中。
Shor 的整数因式分解算法 因其在密码学中的应用而成为最著名的算法之一。
格罗弗算法 也是众所周知的,用于搜索非结构化数据库或无序列表。
你可以在这里找到其他有趣的算法。
**下面我们来探讨一下 格罗弗算法的一个小变种 **,用于搜索的量子算法。
首先,考虑 N 个电话号码和姓名的列表,我们需要从中找到特定号码的名称
与提供指数级速度增长的普通量子算法不同,Grover 的算法仅提供二次速度增长。复杂度将是可能元素数量 n 的平方根的函数。与可能具有复杂度 n 的经典算法相比,这要高效得多。Grover 的算法使用振幅放大工作。
在我们的例子中,我们将只考虑四个数字,它们可以用两个量子位来表示,我们需要找到与 10 相关的名字
a | 00>+b | 01>+c | 10>+d | 11>+
其中 a、b、c 和 d 是幅度,a=b=c=d。
这就是 Grover 算法中的第一步就是把量子比特放在超位。
****第二步是应用一个 oracle 函数,该函数将我们正在寻找的项目的振幅翻转到相反的方向。在这种情况下,c 变成了-c,现在 a=b=d,c 不同,是负数。
****第三步是应用一个放大函数,放大每个振幅和相等叠加态振幅之间的差异。因为-c 的值与其他振幅有很大的差异,所以与 a、b 或 d 相比,c 的值迅速增加。
现在,如果我们测量量子位,第三个状态将以最大概率返回(步骤 2 和 3 可以再次应用以增加概率)。因此,使用这种技术,我们可以通过一次性将所有可用值加载到量子位中来解决搜索问题。可用的量子位越多,我们能处理的问题域就越大。
一切都很好,但是运行这一切的硬件呢?
量子计算机的当前实现是基于半导体的。从这些半导体产生的量子位应该远离任何外部干扰。否则,这些量子位的量子力学特性将会丢失。因此,这些量子计算机的温度保持在非常接近绝对零度,这种设置以及微观水平的计算会使量子计算机非常昂贵。精确的微波/电磁波可以用来改变量子位的状态。通常情况下,经典计算机与量子计算机一起使用来帮助处理。
IBM Q 是行业首创,旨在为商业和科学领域构建商用通用量子计算机。 IBM Q Experience 允许我们使用 online composer 或免费使用其 python 库来运行量子算法。这些系统中量子位元的数量相对较少,但肯定会快速增加。
D-Wave Systems 是这个领域的另一个主要参与者,他们的旗舰产品是 2000 量子比特 D-Wave 2000Q 量子计算机。D-Wave 产品被谷歌等公司广泛用于运行量子人工智能实验室和美国宇航局的研究。
D-Wave 机器使用量子退火来执行其操作。这对于优化问题的解决方案非常有用,可以快速搜索空间,找到成为解决方案的全局最小值。这种方法对于某些问题领域可能会更快,但使用量子退火的系统将会发现很难运行某些算法,如著名的 Shor 算法。
另一方面,IBM 提供的通用量子计算将服务于更广泛的问题领域,并允许我们设计更复杂的算法。但是用通用量子计算来设计这些算法可能会很复杂,并且在系统设计和一致性方面也有自己的挑战。
量子力学是一个本质上令人震惊的科学领域,它所提供的计算能力只是冰山一角。它在生物学(它可以通过叠加解释突变)、计算机硬件(解释半导体芯片的特性),甚至可以解释人类的期望或想法如何影响未来,正如全球意识项目所解释的,该项目实验证明“当人类意识变得连贯时,随机系统的行为可能会改变”。是的,人类思维与量子物理之间确实存在的奇怪关系。此外,它还可以用于 量子隐形传态 ,据中国科学家报道,他们已经将地球上一个光子的量子态传输到近地轨道卫星上的另一个光子。量子力学有潜力改变我们以经典方式知道和做的每一件事。
我希望你明白一些事情…
“如果你认为你懂量子力学,那你就不懂量子力学。”理查德·费曼
谢谢你的时间。
Python 程序员的量子计算笔记:复数
Image from — https://phys.org/news/2017-11-simple-beautiful-quantum.html
但是如果量子力学不是通常意义上的物理学——如果它不是关于物质、能量、波或粒子的——那么它是关于什么的呢?
从我的角度来看,它是关于信息和概率
和可观察到的事物,以及它们之间的相互关系。自德谟克里特斯以来的量子计算(第 110 页)
这些系列笔记,最初是我为自己写的,是我希望成为一个关于量子力学基本方面,更准确地说是关于量子计算的小系列。我不会试图对任何我不完全理解的事情做出任何流行科学的、不着边际的解释。当类似的事情发生时,我会诚实地写下我不理解的事实(可能会发生很多次)。但除此之外,这组特殊的音符还有一个非常特殊的用途。它们是从开发人员的角度编写的。这意味着,即使它们本质上是严格的,它们的一个主要焦点是放在实现部分,准确地说是使用 Python。
我为什么要写这些笔记?
我已经给出了上述论点的一个方面,但我只想在这里声明,我属于一类愚蠢的人,他们什么都不懂,除非他们试图向别人解释,还试图用手做。我写这些笔记的原因也是试图向我自己解释量子力学和量子计算的神秘而迷人的主题。
顾名思义,它们是纯粹的笔记。这意味着,他们可能有涂鸦,错误,不成熟的想法和解决方案。尽管如此,这些笔记确实有一个有用的特点。我可以回头看看它们并改正我的错误(并在我改正的时候更新它们),同时(希望)像我这样的人也能跟着做并从中受益。
另一方面,我不会给任何人任何其他的理由去遵循这些笔记。我不会告诉你“量子计算将会改变一切。你需要掌握它,它是下一个“数据科学”(我们没有证据,除了一类问题,QC 实际上提供了超越经典计算的任何好处)或“RSA 处于危险之中,让我们拯救它”或诸如此类的事情。量子力学和量子计算本身就是非常有趣和迷人的学习科目。我在学习它们的时候很开心。我只想尽可能地分享快乐。仅此而已。
我已经对高中水平的数学有了基本的了解,比如基础代数,基础集合论,三角学。任何其他数学形式都将在途中推导出来。
好吧,你相信了吗?那我们跳进去吧!
我们的旅程从复数开始
我们记得复数,对吗?在高中数学的某个阶段,到处都是那些看起来很有趣的数字和符号?它们是什么?更重要的是,为什么我们(事实上地球上所有的量子力学和量子计算文献)需要它们?让我们稍微回到基础。我们从下面的等式开始。
在计算机科学中,我们称这些方程为“多项式”。现在,这可能不是显而易见的,但是如果我们稍微思考一下,我们会发现,我们可以通过指定系数来唯一地表示一个多项式。作为一个例子,上面的一个是多项式 P(x) = {1,-1 }({ x 的最高次幂的系数,然后是下一个,…直到常数项})看着多项式我们可以说 P ⊂ ℝ,即p 的成员取自所有实数的集合。关于多项式,我们通常会问的另一件事是——“它的根是什么?”根是方程的解。他们可以是很多人。像下面这样解上面的方程
给了我们等式的两个根。例如+1 和-1,它们正好在ℝ.的范围内到目前为止一切顺利。比方说,当我们试图解决
这给了我们√3。啊!我们有麻烦了。我们有一个⊂ ℝ,它的根不是来自 r。数学上我们说——“ℝis不是代数闭的”。
当我们试图解决时,问题变得更糟
因为根是… √-1,在平方根符号下有一个负数违背了我们的标准代数直觉,然而我们试图求解的方程是有效的,因此我们需要一种方法来表达这些新的数字。这就是我们发展虚数概念的原因。虚数,记为 i ,定义为√-1。复数是这样一个数,它有两个分量,一个实数,一个虚数。
如果我们仔细研究,我们会发现,真正“代数闭”的数的集合是ℂ,也就是所有复数的集合。这是一个非常重要的属性。我们将会看到在进行量子计算时,我们如何从中受益。形式上我们说——“任何系数来自ℂ的多项式,都有ℂ".的根
查看以下麻省理工开放式课程的精彩视频,进一步了解复数在量子力学中的重要性。
复数代数
一个复数通常是这样表示的——a+Ib 这里我们说 a 是复数的实部, b 是复数的虚部。我们可以在一个复数上定义如下
设 z = a +ib 是一个复数,那么 Re{z} = a,Im{z} = b,这样我们就得到了实部和虚部。
我们可以定义两种基本运算,例如对复数的+和*(加法和乘法)。它们看起来如下
- 要将两个复数相加,我们只需分别将实部和虚部相加。所以,如果 a+ i b 和 c+ i d 是两个复数那么它们的和可以写成——(a+b)+I(c+d)。如果我们用 Z1 和 Z2 来表示它们,那么从复数之和的定义中可以清楚地看出 Z1+Z2 = Z2 + Z1
- 为了将上述两个复数相乘,我们所做的是简单的乘法,然后重新排列(记住 *i = -1)。看起来是这样的——(a+Ib)(c+Id)=(AC-BD)+I(ad+BC)。同样清楚的是,Z1 * Z2 = Z2 * Z1
一旦我们定义了加法和乘法,我们就可以问这样的问题:“什么是加法恒等式?”"什么是乘法逆运算?"等等。有些答案很直接。加法恒等式是 0+ i 0。a+ i b 的加法逆是-a +i (-b)但是乘法呢?嗯,稍微想一想,我们就能看出乘法恒等式是 1+ i 0。利用 Z * (1/Z) = 1+0 i 的恒等式我们可以求出乘法逆。我们可以验证,复数ℂ的集合在这两种运算下形成了 场 。(如果你不知道什么是 字段 ,那么你可能想看看这里的)
关于复数,我们还需要了解其他一些事情。
- 共轭——复数 Z 的共轭写为 Z 上面的一条杠,通过改变复数分量的符号来定义。所以 a+ i b 的共轭是 a- i b
- 一个复数的模数——设 a+ i b 是一个复数那么模数定义为√ *(a +b)。*我们把它写成复数旁边的两条平行线。比如— |Z|。利用共轭的定义和乘法是如何定义的,很容易说明√( Z *共轭(Z)) = |Z| = √ (a +b )
我们在定义复数代数的各个方面时所做的选择,以及它自己的性质,当我们第一次看到它们时,可能看起来有点武断,但如果我们研究复数的几何,那么它看起来一点也不武断或随意。我们将在这些笔记的下一页看到这一点。
第一页到此为止。在下一页,我们将看到复数的几何以及一些 Python 代码(毕竟这是给 Python 程序员的一个提示)。如果你喜欢这个音符,请尽可能多的鼓掌。这对我将是鼓舞人心的。
来源
- 计算机科学家的量子计算
- 量子纠缠的数学 —布兰道、哈罗等。
- 虚数视觉指南——更好的解释。
- 量子力学的本质第二部分:复数
- 麻省理工学院 8.04 量子物理 I,2016 年春季
这里是第二部分,如果你喜欢这个就继续吧:)
Python 程序员的量子计算笔记:复数的几何
Polar representation of 1+2i
你好,欢迎回来!在本系列的前一期中,我们看了复数代数。在现在的这幅中,我们将看到它的几何解释。我们还将探索一些 Python 代码来表示复数的各个方面。
如何在二维平面上表示一个复数
复数有一种直观简单的方式来表达自己,几何。从物理学的角度来看这也很有趣。这种表示复数的方式最初是由法国数学家 Jean-Robert Argand 于 1813 年提出的,因此它被称为 Argand 图以纪念他的贡献。
事情是这样的。如果我们有一个复数 z = a+ i b,那么我们可以用 X 轴表示 Re{z},Y 轴表示 Im{z}。看起来是这样的。
Argand Representation of a+ib
它说,如果我们从原点开始,然后在 X 轴上移动“a”的距离,然后沿着 Y 轴移动“b”的距离,那么我们就到达了由 a+ i b 表示的点,它非常简洁优雅。但它的用处不止于此。这与乘法规则相结合,将为我们提供一个非常有用的工具来毫不费力地执行旋转和缩放。但是为了做到这一点,我们需要理解如何以极坐标形式表示复数。
Polar form of complex number
与帖子相关的所有代码都可以在本笔记本中找到
从上图和使用基本的三角学可以清楚地看出
x = r * cos θ 和 y = r * sin θ。
然后利用简单的毕达哥拉斯法则我们也可以推断
r= |x+Iy | =√(x+y)
和
θ = arctan(y/x)
如果我们现在使用这些关系,那么我们可以重写
x+Iy = r * cos(θ)+Ir * sin*(θ)= r (T27)cos(θ)+Isin(θ))**
在这里,我们要停下来,记住数学最著名的公式之一,欧拉公式。它只是简单地说了以下内容—
Euler’s Formula
这是杰出的。因为它将指数函数与三角函数联系起来。(要想简单直观地证明这一点,你可以查看由而非小熊猫发布的这篇帖子。这基本上取决于泰勒级数展开。).利用这个公式,我们可以把最后一个方程改写成下面的形式
其中 Z = a+ i b(或者 x+ i y 或者随便你怎么说:),我们已经定义了 r 和 θ。
用复数乘一个东西是什么?
嗯,很简单,把一个数乘以一个复数,把它旋转复数的角度。让我再告诉你一遍——
- 将一个数乘以一个复数,将该数旋转复数的角度。
假设我们有一个复数 1+ i 2。它可以用下图来表示
现在我们想把它旋转 45 度。嗯,如果我们计算的话我们会看到,45°角的复数是 1+ i 。因此,如果我们将 1+2 i 乘以 1+ i ,我们将执行 45°旋转。但是…
我们是 Python 程序员
没错!我们不喜欢这么多手工的东西。我们宁愿用 Python 编写一个优雅的解决方案来为我们完成这项工作。女士们,先生们,我们提出的“旋转”功能旋转一个复数的任何给定的角度。
import mathdef rotate(number, degree):
n = number
return (math.e**(math.radians(degree)*1j)) * n
对之前给定的数字应用“旋转”。我们得到下面的图(我显示了原始数字和旋转后的数字)
Rotating a given number by 45º
等等,那个“1j”是什么?
Python 是一种非常强大的语言,像许多其他东西一样,它也支持开箱即用的复数。python 中定义复数的方式是在虚数部分附加一个“j”(为什么“ j ”?为什么不是那个熟悉的“我”?那个我没看懂)。事情是这样的
c = 1+2j
print("c, Re{c} = %d Im{c} = %d and Length : "%d" % (c.real, c.imag, abs(c)))
“abs”给出了复数的长度(意思是√ (x +y ))
“c.real”给出实部,“c.imag”给出虚部。
角度怎么弄?
内置的复杂数据类型非常方便,但也非常基本。它不支持一些高级操作。为此,我们有“cmath”(复杂数学的缩写)模块。为了得到一个复数的角度,我们将使用“cmath”中的“phase”函数
import cmathc = 1+2j
cmath.phase(c)
趣味活动:用 Python 证明欧拉恒等式
我们知道著名的欧拉恒等式(也被称为数学中最美的方程)
Euler’s Identity
下面是一行代码,使用 Python 验证了这一点
import math
print ((math.e**(math.pi*1j)).real + 1)
它将打印“0.0”
查看下面的笔记本,了解详细的代码示例
这次到此为止。我知道这是一个非常基本和简短的介绍复数,但是,我希望你喜欢它。您可以随时查阅高级资料(在资料部分列出)进行进一步阅读。
感谢您的阅读。如果你喜欢这篇文章,请尽情鼓掌,这会鼓励我写更多。我们将在第三部分再次见面,届时我们将讨论量子力学的一个中心思想:线性。
来源
- 计算机科学家的量子计算
- 虚数视觉指南——更好解释。
- 复数的几何 —汉斯·施韦德菲格
- 量子力学的本质第二部分:复数
联系我!(如果你愿意)我很乐意听到你的反馈。
用 Python 实现量子物理可视化
在这个博客上,我决定复习一些大学水平的量子化学,来推导电子轨道。额外有趣的部分是,我们将会可视化波函数和电子概率…用 Python!
薛定谔方程
1926 年,Erwin Schrodinger 提出了著名的波动方程,将系统的能量与其波动特性联系起来。因为它在氢原子上的应用相当复杂,我们将首先用波动方程来求解盒中粒子。用 1D 表示的薛定谔波动方程是
可视化盒子中的粒子
现在,为了简化我们的方程,我们假设盒子中有一个粒子。
Particle In A Box
盒子里的粒子问题并不对应于任何真实的化学系统。在我们的上下文中,它的用处在于它阐明了几个量子力学特征。势垒处的势能设为无穷大(即粒子不能逃逸),势垒内的势能设为 0。在这些条件下,经典力学预言,粒子在盒子的任何部分都有相等的概率,粒子的动能允许有任何值。考虑到这个假设,我们得到了粒子在势垒处和盒子内部的能量的不同方程。
在势垒处,V 是无穷大,因此粒子不存在:
在盒子内部,V 是零,因此波可以具有任何有限值:
在盒子里,我们可以重新排列方程式如下:
正如我们在上面看到的,波函数是这样的,如果微分两次,应该给出相同的函数乘以 e。正弦函数具有这种行为。
现在,我们需要评估常数α和α的值。对于α,我们使用势垒处的波动方程,其中波函数等于 0。
现在代入α的值:
我们可以通过要求波函数归一化来确定 A 的值。这是因为,粒子一定存在于盒子的某个地方。因此,在盒子中找到粒子的概率之和是 1:
代入这些值,最终的波和能量方程为:
使用 Python 可视化能量和波函数:
import matplotlib.pyplot as plt
import numpy as np#Constants
h = 6.626e-34
m = 9.11e-31#Values for L and x
x_list = np.linspace(0,1,100)
L = 1def psi(n,L,x):
return np.sqrt(2/L)*np.sin(n*np.pi*x/L)def psi_2(n,L,x):
return np.square(psi(n,L,x))plt.figure(figsize=(15,10))
plt.suptitle("Wave Functions", fontsize=18)for n in range(1,4):
#Empty lists for energy and psi wave
psi_2_list = []
psi_list = []
for x in x_list:
psi_2_list.append(psi_2(n,L,x))
psi_list.append(psi(n,L,x)) plt.subplot(3,2,2*n-1)
plt.plot(x_list, psi_list)
plt.xlabel("L", fontsize=13)
plt.ylabel("Ψ", fontsize=13)
plt.xticks(np.arange(0, 1, step=0.5))
plt.title("n="+str(n), fontsize=16)
plt.grid() plt.subplot(3,2,2*n)
plt.plot(x_list, psi_2_list)
plt.xlabel("L", fontsize=13)
plt.ylabel("Ψ*Ψ", fontsize=13)
plt.xticks(np.arange(0, 1, step=0.5))
plt.title("n="+str(n), fontsize=16)
plt.grid()plt.tight_layout(rect=[0, 0.03, 1, 0.95])
请注意,在一些区域中,ψ和ψ*ψ在相同的区域中都为零。这就是所谓的节点。轨道的能级不是连续的。它们存在于不同的层次,由节点的位置来表示。此外,随着 n 值的增加,盒子内部的波密度也增加。
可视化轨道
现在,为了得到关于量子数的波动方程,它需要以下 3D 格式:
现在,变量的分离取决于原子的类型,这太复杂了,无法在这篇博文中讨论。相反,我们将直接为绘图编写解决方案。下面,我们将使用氢原子的 R 和 Y 的函数,而不用推导它们。
首先,让我们看看 1s 轨道:
1s 波函数揭示了当我们远离原子核时,电子出现的概率呈指数下降。它也揭示了一个球形。
import matplotlib.pyplot as plt
import numpy as np#Probability of 1s
def prob_1s(x,y,z):
r=np.sqrt(np.square(x)+np.square(y)+np.square(z))
#Remember.. probability is psi squared!
return np.square(np.exp(-r)/np.sqrt(np.pi))#Random coordinates
x=np.linspace(0,1,30)
y=np.linspace(0,1,30)
z=np.linspace(0,1,30)elements = []
probability = []for ix in x:
for iy in y:
for iz in z:
#Serialize into 1D object
elements.append(str((ix,iy,iz)))
probability.append(prob_1s(ix,iy,iz))
#Ensure sum of probability is 1
probability = probability/sum(probability)#Getting electron coordinates based on probabiliy
coord = np.random.choice(elements, size=100000, replace=True, p=probability)
elem_mat = [i.split(',') for i in coord]
elem_mat = np.matrix(elem_mat)
x_coords = [float(i.item()[1:]) for i in elem_mat[:,0]]
y_coords = [float(i.item()) for i in elem_mat[:,1]]
z_coords = [float(i.item()[0:-1]) for i in elem_mat[:,2]]#Plotting
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x_coords, y_coords, z_coords, alpha=0.05, s=2)
ax.set_title("Hydrogen 1s density")
plt.show()
从上面的电子密度图中很难看出。然而,你可以看到它是球形的。当我们离中心越远,密度就越小。一般来说,截止点是当电子出现的概率为 99%时。
对于其他 spdf 轨道,也可以得到相同的密度图。希望这篇博客已经激发了你对量子物理和 Python 编程的兴趣!关于基于 python 的可视化的更多内容,请查看我的博客:基于 Python 的 Matplotlib 绘图
四分卫
这是另一个关于幻想作品的四集系列,部分链接到我之前的“破碎”系列。在这个系列中,我将关注每个团队的幻想作品。具体来说,每个位置的幻想 12 强球员和其他幻想 12 强球员在同一支球队打球的比例是多少。从这个系列赛开始,我将着眼于四分卫的位置。请关注本系列的下三篇文章,关于跑卫、外接球手和紧逼端。
问题
在其他三个技能位置上,fantasy QB1 与其他 12 强玩家的游戏比例是多少?换句话说,有百分之多少的 fantasy QB1 玩家也玩 fantasy RB1、WR1 或 TE1?
数据
为了这项研究,我找出了自 2000 年以来每个位置上排名前 12 的球员。从那里,我发现哪些 QB1 也和另一个 12 强幻想玩家在同一个队里玩。为了澄清,以下是 2016 年前五大 QB:
最后三列中的任何一列的“1”意味着 QB 也在该位置上与前 12 名球员一起比赛。最后三列中的“0”意味着 QB 没有在那个位置上与前 12 名球员一起比赛。例如,Aaron Rodgersplayed 使用了 12 强的梦幻接球手,但没有使用 12 强的梦幻跑锋或严密的末端。另一方面,柯克考辛斯打了一个前 12 名的梦幻紧密端,但没有打前 12 名的梦幻跑卫或接球手。自 2000 年以来,每一个排名前 12 的 QB 都是如此。
结果
在你深入阅读这个图表之前,让我解释一下发生了什么。首先,你会注意到我把前 12 名幻想四分卫分成了三个子类别:整体(第一类)、上半部分(第二类)和下半部分(第三类)。每个聚类有三个条形,每个条形代表一个技能位置(RB、WR、TE)。每个条形显示了每个位置前 12 名玩家的百分比,假设他们玩的是幻想 QB1。每个条形上方的数字是每个子类别中幻想 QB1 的预期数量,这些 QB1 将与该条形各自位置上的前 12 名幻想玩家一起玩。
例如,图表的这一部分对应于上面的第一个分类,它是整个子类别。这个集群显示了有多少 QB1 将在其他三个技能位置上与另一个 12 强幻想玩家一起玩。每个条形上方的数字是将在该条形位置与另一名前 12 名玩家一起玩的幻想 QB1 的预期数量。例如,我们可以预计大约五个幻想 QB1 也玩一个幻想 RB1(蓝色条)。此外,我们可以预计大约六个幻想 QB1 的发挥要么幻想 WR1 或 TE1(橙色和灰色酒吧)。
现在您已经理解了图表,我们可以看看第二和第三个子类别,即上半部分和下半部分。当我们将前 12 名分解为前 6 名和后 6 名时,分布稍微有些倾斜。例如,我们可以预计大约 3-4 个前 6 名 QB 使用 fantasy WR1,而只有 2-3 个后 6 名 QB 使用前 12 名 fantasy receiver。在紧尾位置,数字也是类似的,我们可以预计有三个前 6 名 QB 与 TE1 一起玩,而只有 2-3 个后 6 名 QB 与 TE1 一起玩。至于跑卫,划分相当均匀,前 6 名和后 6 名都有大约 2-3 名 QB1 使用 RB1。
解释和结论
这是什么意思?首先,我们可以期待更多的 QB1 玩家玩梦幻 WR1 或 TE1,而不是 RB1,这是有道理的。除非进攻是非常动态的,也就是去年的猎鹰队,否则传球比赛的成功通常会给跑动中的比赛带来打击。如果一个球队的 RB1 也是一个很好的传球接球手,就像猎鹰队进攻中的德文塔·弗里曼一样,那会很有帮助。然而,从这个意义上来说,去年似乎是一个异数,因为只有 5 个 QB1 与 fantasy WR1 一起比赛,但有 7 个 QB1 与 fantasy RB1 一起比赛。这可能是由于跑卫位置的“复兴”,特别是后场的 3 人后卫是很好的接球手。这种趋势还会继续吗?过去几年表明它不会,但它有一个机会,现在在联盟中打球的老黄牛。
我试图找到前 12 名 QB 和其他前 12 名玩家之间的额外相似之处,但总体来说,这似乎非常随机。在很大程度上,你可以依靠某个 QBs 来完成 QB1,同时也支持至少一个 WR1 或 TE1。亚伦·罗杰斯、汤姆·布拉迪和德鲁·布里斯都是 QB1 的常客,他们也一直支持 WR1 或者 TE1。卡森·帕尔默、埃利·曼宁和马特·莱恩都支持 WR1,但这并不总是让他们成为 QB1。然而,当他们作为 QB1 完成时,他们总是支持 WR1。有一个四分卫特别让我印象深刻:菲利普·里弗斯。在里弗斯手下,充电器从来没有幻想过 WR1(抱歉基南艾伦)。事实上,充电器上一次 WR1 是在 2000 赛季之前。然而,里弗斯是 TE1 的永久支持者。难道不是安东尼奥·盖茨(很快就是亨特·亨利)吗?
总的来说,我们可以预计大约一半的 QB1 支持 12 强梦幻接收机或紧端。我们还可以预计,前 12 名 QB 中约有 5 名将使用 fantasy RB1,但鉴于跑锋力量的转移,这一数字可能会增加。总而言之,顶级 QB 相对来说是可预测的,它们的顶级接收者或紧密末端通常会顺其自然。QB 排名的下半部分更不可预测,因此并不总是支持前 12 名的幻想接收机。至于苏格兰皇家银行,其在 12 家顶级 QB 中的分布相当均匀,甚至比接收方更难预测。和 QB1 一起玩的 RB1 通常也是通过空气获得产量的主力,或者他们的 QB 勉强进入前 12 名。
感谢阅读,请务必关注本系列的下一篇文章,关于跑卫,接下来是接球手和紧逼端。敬请期待!
原载于 2017 年 9 月 18 日【dynastyfootballfactory.com】。
在 Hadoop 中有效地查询数据,满足您对数据科学的渴望
Elephants in safari
我的公司的大数据越来越大,Hadoop 是 2015 年的热门话题,顺应这一趋势,我的公司决定从使用 Netezza 迁移到使用 Hadoop。因为我很久以前就在科技新闻中读到过 Hadoop,所以我对即将到来的迁移感到兴奋,并且想玩一玩这个新玩具。
从蜂巢到黑斑羚
在 2016 年末和 2017 年,我进入了我们的 Hadoop 环境,开始使用 Hive、Impala、Spark SQL 为我的分析项目广泛查询 HDFS 数据。在 Hive 中进行了几次查询后,我开始发现 Hadoop 比我预期的慢(比 Netezza 慢)。我的同事提醒我,Hive 是为大批量 map reduce 作业设计的,而不是为快速分析查询设计的。后来,由于内存问题和其他问题,我的 Hive 作业开始失败,我不得不使用许多设置,如’'设置 MapReduce . map . memory . MB = 9000;set MapReduce . map . Java . opts =-xmx 7200m;‘让我的蜂巢工作正常运转。在我的 Hive 作业中,我使用了两个以上的设置来实现正确的配置和期望的性能。
使用 Hive 设置促使我获得关于 Hadoop 架构和集群操作的知识。然而,分布式系统中的 DevOps 毕竟不是我的游戏。很快,我转向 Spark SQL 和 Impala 寻求更好的解决方案。在 Spark SQL 中,我面临类似的配置挑战(还记得 Spark config 设置命令吗?./bin/spark-submit --name "My app" --master yarn --conf spark.executor.memory=4 g myApp.jar
)而我在 Spark SQL(这是 Spark 1.6)中运行复杂查询时遇到了失败。尽管 Spark SQL 可以无缝连接查询数据和建模数据,如下面的代码片段所示:
data = sqlContet.sql("select outcomes, label1, lable2 from sampleTable") labeled_data = data.map(lambda line: LabeledPoint(line[0],line[1:])) training, test = labeled_data.randomSplit([0.6,0.4], seed=1) model=LogisticRegressionWithLBFGS.train(training, intercept=1,validateData=1)
我最终选择了 Impala 作为我的主要查询工具,因为我发现 Impala 不仅比 Hive 和 Spark SQL 快,而且只需要最小的性能调优开销。
当然,我不能不小心使用黑斑羚。为了获得良好的 Impala 性能,我需要仔细制定查询策略,并努力管理元数据。在长时间运行的作业中,黑斑羚不如 Hive 可靠,因此我会将黑斑羚的作业重写到 Hive 中,以用于生产目的。下面的链接是一篇比较 Hive、Impala 和 Spark SQL 的 IEEE 文章。这篇文章大部分支持我所经历的。
[## Hive、Impala 和 Spark 的性能比较 SQL - IEEE 会议出版物
大数据中的快速查询对于挖掘有价值的信息以提高系统性能非常重要。至…
ieeexplore.ieee.org](http://ieeexplore.ieee.org/document/7334737/)
查询工具选择及更多
这三种查询技术在大数据生态系统中都有自己的位置,但是当涉及到数据科学工作的迭代和探索方面时,我确实认为 Impala 等快速查询可以最有效地帮助数据科学家为他们的数据科学实验选择和整合数据源(然后使用 Spark SQL/Spark 进行建模,使用 Hive 进行生产级数据管道)。大的东西有很多小的部分。为了实现大的飞跃,我们需要快速测试小步骤的能力。在查询工具选择决策上,既要考虑其在大数据环境下的性能,也要考虑其在中等数据环境下的性能,既要考虑批处理模式下的性能,也要考虑交互模式下的性能。
数据科学家对数据、洞察和模型非常感兴趣,而 DevOps 或 DataOps 对他们的吸引力并不大。我认为减少开发工作对数据科学家来说是可取的,他们可以把更多的时间花在他们的增值上。我花在为 Hive 寻找合适的内存设置上的时间并不是很有趣。今天,我的公司在内部使用 Hadoop,我的公司可能很快就会开始在云中使用 Hadoop。许多大数据云平台承诺最小开发运维。这听起来很棒,但我愿意在接受之前仔细评估这个承诺。
在模型创建生命周期中,数据准备非常耗时。好的查询工具可以帮助我们更快地建立模型,因此我们应该给予查询工具更多的关注。在这里分享我的经验和观点,我也有兴趣从读者那里了解潜在的不同体验。在下面留下评论或者直接给我发 Twitter 消息@yuzhouyz。
为迈向数据科学而写作
最后更新于 2023 年 3 月
与更广泛的受众分享您的概念、想法和代码
新作者
首次与 TDS 分享您的作品之前,您需要了解的所有信息:
当前作者
为已经用 TDS 出版的作者提供的资源和建议:
我们的资源和常见问题快速指南
towardsdatascience.com](/how-to-make-the-most-of-your-experience-as-a-tds-author-b1e056be63f1)
为什么要成为投稿人?
走向数据科学公司经营一个独立的媒体出版物。我们正在寻找作家提出专注于数据科学、机器学习、人工智能和编程的最新内容。如果你喜欢写这些话题,请继续读下去!
用你的文章接触更广泛的读者。我们是世界上最受欢迎的数据科学博客之一,也是拥有超过 60 万追随者的最受欢迎的媒体出版物。
以下是我们为确保你的文章能被尽可能多的读者所接受而做的一些事情:
- 我们有一个自定义域(towardsdatascience.com,而不是 medium.com/towards-data-science),可以帮助你的文章带来更多的流量。
- 我们与 Medium 密切合作,确保 TDS 中的故事符合 Medium 的编辑和发行标准,因此 TDS 中的故事经常会进一步发行。
- 我们在出版物的页面和社交媒体上展示我们的内容: Linkedin 和 Twitter 。
- 我们发送以故事和作家为特色的时事通讯。
通过 中等合伙人计划 **挣钱。**作者可以选择对 TDS 上的故事进行计量,并通过媒体合作伙伴计划基于媒体成员的参与度来赚钱。“计量”是指让一个故事有资格在 Medium 的计量付费墙后面赚钱。
作为媒体合作伙伴计划的一部分,作者保留他们通过媒体帐户获得的 100%的收入。但是,中等合作伙伴计划不是由 TDS 管理的,我们不会直接向自愿投稿的投稿人支付费用。
您将仍然是您作品 的唯一所有者,并且可以随时删除它,甚至在我们发布它之后。我们的编辑和社区提供的反馈将出现在你文章的相关位置。你可以拒绝或回复他们。
提交规则
在提交你的文章之前,有一些基本的事情你需要知道。确保你很好地阅读了每一点,并理解它们,因为通过向 TDS 提交文章,你同意遵守所有这些。
- Medium 的 规则 和 服务条款 适用于面向数据科学(TDS),因为它是一个媒体出版物。在提交文章之前,请务必阅读。
- 我们发布的每篇文章都采用了 媒体的策展方针 **。**这意味着如果你的帖子质量不够高,不符合指导原则,我们不会将它发布到数据科学上。
- 请花几分钟时间熟悉一下我们的 作者使用条款和条件 ,以及我们的 隐私政策——它们规定了贡献者和 TDS 之间的关系。
- 请不要一次提交超过三个故事。为了确保及时回复所有作者,我们要求您一次最多只向我们发送三个故事,并等待我们的回复,然后再发送下一个故事。如果你写了一个更长的系列,你可以一次发完,但是请在你的第一个帖子里留个便条让我们的团队知道。
- 你可以对已发表的文章做一些小的编辑,只要他们尊重我们的规则和指导方针。此外,您可以随时从我们的出版物中删除您的文章。
- 您与我们分享的任何文章必须完全是您自己的原创作品;你不能把其他作家的话当成你自己的话来呈现,我们也不允许人工智能生成文本,即使你是促成其创作的人。
- 我们可能会直接编辑您的内容,以纠正基本的拼写错误,并更新最少的格式设置。此外,我们可能会删除来源不明的图片。
- 我们可以以任何理由删除你在数据科学上发布的任何文章。如果我们这样做,你的内容将不会丢失,但仍然托管在 Medium.com 和重定向到那里。
- 如果我们的编辑团队发现一处或多处违反我们的规则,我们可以从我们的出版物中删除您和您的所有文章,并将它们报告给 Medium。
指导方针
如何让你的文章准备出版!
我们的目标是在创新、信息和哲学之间取得平衡。我们想听听你的意见!但是我们确实要求,如果你不是一个专业作家,你在准备你的文章时考虑以下几点。我们想发表人们想读的高质量、专业的文章。
1.你的故事是一个需要被讲述的故事吗?
动笔之前,先问问自己:这个故事是不是一个需要讲的故事?
如果你已经读了很多文章讨论同一个问题或者解释同一个概念,在写另一篇文章之前要三思。如果你有一个激进的、新的观点,我们想听听你的意见……但是,我们需要你说服我们,你的文章是与众不同的,能打动我们的读者。
相反,如果你的文章涉及一个服务不足的领域或提出一个新的想法或方法,这正是我们所追求的!
2.你的信息是什么?
从一开始就让我们知道你的主要信息是什么。给你的作品一个简洁的介绍,告诉我们:
- 你的小说创意是什么?
- 我们为什么要关心?
- 你打算如何证明你的观点?
一旦你解决了这个问题,你就可以随心所欲地交谈了,但是要不断地回到中心信息,给我们一个可靠的结论。
请记住,《走向数据科学》不是你的个人博客,请保持敏锐和切题!
3.在互联网上,没有人知道你是一只狗
你有了一个新的想法或做事的新方法,你想告诉社区并开始讨论。太棒了,这也是我们想要的,但我们不会想当然地认为你知道你在说什么,或者我们应该不加批判地相信你说的话……你必须说服我们(你的观众):
- 主题很重要
- 有一个缺口需要填补
- 你有答案了
- 你的解决方案有效
- 你的想法是基于想法和证据的逻辑发展
- 如果你给我们一个教程,告诉我们为什么人们需要使用这个工具,为什么你的方法比已经发表的方法更好。
你可以通过解释背景、展示例子、提供实验或者只是展示你从各种来源提取的数据如何让你综合这个新想法来做到这一点。
有反对你的观点或发现的论点吗?解释为什么那个解释与你的想法相冲突,为什么你的想法在上面。
4.你有没有一个有深刻见解的小标题?
如果你向上滚动到这一页的顶部,你会看到一个标题和副标题的例子。你的文章需要有一个短标题和一个长副标题,告诉读者你的文章是关于什么的,或者为什么他们应该阅读它。你的标题有助于吸引潜在的读者,并使你的意图清晰。为了保持一致并给读者最好的体验,我们不允许标题或副标题全部大写。我们也要求你避免在你的标题和副标题中使用脏话。
当你的副标题位于标题正下方且格式正确时,它会出现在一些帖子预览中,这有助于提高你的点击率。要在 Medium 上正确设置字幕格式,请将其打出,突出显示文本,然后在弹出窗口中单击两个 t 中较小的一个。
5.是什么让你的帖子对读者有价值?
一篇成功的帖子有一个明确的目标,并且会兑现它的承诺。如果你的标题告诉我们你要解开一个复杂的算法,展示一个新库的好处,或者带领我们通过你自己的数据管道,确保这篇文章的其余部分能够完成。这里有一些建议可以帮助你计划和执行一篇精心制作的文章:
1。决定你的主题是什么——什么不是 如果你不确定你的帖子将会是关于什么的,当你的读者阅读它时,他们知道的机会很小。定义你的文章要解决的问题,并坚持下去:任何与你文章的核心无关的东西都应该被剔除。
2。根据你的主题制定一个清晰的计划 ,为你的文章勾勒出一个清晰的结构,并记住它将遵循的整体结构。请记住,你的主要目标是让你的读者参与进来并保持良好的导向,所以考虑格式以及如何将主题分成易于理解的部分永远不会太早。考虑沿途添加章节标题,使你的结构清晰可见。
3。使用清晰的、行动驱动的语言 如果你仍然在寻找作为数据科学作者的个人声音,一个好的开始就是保持事物的干净、清晰和易于理解。
如果你的文章充满了中性的、一般的动词(如 be、have、go、become、make 等。),尽量混入更精准的动作动词。当有意义时,使用具体的、生动的描述词,而不是沉闷的描述词(例如,根据上下文,你可以用“无摩擦”、“可访问”或“直截了当”来代替“容易”)。
在与 TDS 分享之前,不要忘记校对几次你的草稿——寻找拼写、标点和语法问题,并尽最大努力改正它们。如果你需要一些外部支持,像 Grammarly 这样的工具可能并不完美,但它们会有所帮助;请一个信任的朋友来看一看从来都不是一个坏主意,大声朗读或聆听你的帖子也不是一个坏主意。
如果你想在基础知识之外扩展你的工具包,互联网上有很多很好的写作资源。这里有一些想法可以帮助你开始:
- 为学术期刊写作的 10 个技巧。守护者
- 来自成功作家的 6 条最佳建议
- 史蒂芬·平克的风格感
4。包括你自己的图像、图表和 gif 图片让你的读者理解你的要点的最有效的方法之一就是用你引人注目的视觉效果来说明它们。
例如,如果你在谈论你建立的数据管道,文本只能带你到这里;添加图表或流程图可以使事情更加清晰。如果你正在讲述一个算法或另一个抽象的概念,用图表、图画或 gif 来补充你的口头描述,使它更加具体。(如果你使用的是其他人创作的图片,你需要仔细地找到并引用它们——阅读下面的图片指南,了解更多细节。)
一个强大的视觉组件会吸引你的读者的注意力,并引导他们阅读你的文章。这也将帮助你作为一个作者发展个人风格,在媒体上增加你的追随者数量,并在社交媒体上吸引更多的关注。
6.你的代码和方程式显示得好吗?
TDS 读者喜欢修改您与他们分享的想法和工作流,这意味着在您的帖子中包含代码实现和相关等式通常是一个好主意。
为了使代码片段更容易访问和使用,避免截图。相反,这里有两个解决方案供您选择:
- 使用介质的本机代码块&内联代码
- 嵌入 GitHub gists
为了与你的读者分享数学方程式, Embed.fun 是一个很好的选择。或者,您可以使用 Unicode 字符并上传结果方程的图像。
当你在文章中包含代码或等式时,一定要解释清楚,并围绕它添加一些上下文,以便所有层次的读者都能理解。
要了解更多关于在你的媒体文章中使用这些嵌入和其他内容,请查看这个资源。
7.检查你的事实
每当你提供一个事实,如果它不是不言自明的,让我们知道你从哪里学到的。告诉我们你的来源是谁,你的数据来自哪里。如果我们想进行对话,我们需要达成共识。也许你说的一些事情会引发一场讨论,但是如果我们想确保我们没有误解,我们需要回到原文,自己阅读,以防我们错过了拼图中的一个重要部分,这使得你说的一切都有意义。
8.你的结论是否切中要害,不具有推广性?
请确保你在文章的结尾包含一个结论。这是帮助你的读者回顾并记住你所讲述的要点或观点的好方法。你也可以用你的结论链接一篇原创帖子或者几篇相关文章。
请不要要求鼓掌,不要包含三个以上的链接到以前发表的文章。读者知道他们可以点击你的个人资料来查看你的所有帖子,他们知道他们可以关注你,所以没有必要请求它。
向您的媒体档案或社交媒体帐户添加额外链接是可以的,但请避免使用行动号召(CTA)按钮。
对于您的参考文献,请遵守以下格式:
【X】n .姓名,职务(年份),来源
例如,您的第一个参考应该是这样的:
[1] A. Pesah,A. Wehenkel 和 G. Louppe,(2018),NeurIPS 2018 元学习研讨会
9.你的标签够精确吗?
你的标签越具体,读者就越容易找到你的文章,我们也越容易对你的文章进行分类并推荐给相关读者。
我们可能会在发布前更改一两个标签。我们这样做只是为了让我们的不同部分与我们的读者相关。例如,我们希望避免将一篇关于线性回归的文章贴上“人工智能”的标签。
10.你有惊艳的形象吗?
一个伟大的形象会吸引和激发读者。这就是为什么所有最好的报纸总是展示令人难以置信的图片。
你可以这样做,为你的帖子添加一个精彩的特色图片:
- 使用。Unsplash 上的大部分内容都是可以不用征得同意就可以使用的。你可以在这里了解更多关于他们的执照。
Unsplash 上的每一张照片,现在都有介质版。
medium.com](https://medium.com/unsplash/medium-unsplash-2fee8d662dd1)
- 自己拿一个。几乎可以肯定的是,你的手机足以捕捉到你周围的凉爽图像。你甚至可能已经在你的手机上有了一张图片,这将是你文章的一个很好的补充。
- 做一个很棒的图。如果你的文章涉及数据分析,花些时间制作至少一张真正独一无二的图表。可以试试 R,Python,D3.js 或者 Plotly。
如果您决定为您的文章中使用的图像购买许可证,请注意我们只允许在以下许可证下使用图像:(I)不过期;以及(ii)可在 TDS 出版物上用于商业目的。您有责任确保遵守许可使用条款。您还必须在图像下方包含一个标题,如下所示,或按照许可提供商的其他要求:“图像通过【您的姓名】下的【许可提供商的姓名】获得。”最后,请给我们发电子邮件,告知我们所购买许可的收据或其他证据的副本,以及相应的许可使用条款。
如果你选择使用人工智能工具(如 DALL E 2、DALL E、Midjourney 或 Stable Diffusion 等)为你的文章创建图像,你有责任确保你已经阅读、理解并遵循了该工具的条款。您在 TDS 上使用的任何图像都必须获得商业使用许可,包括人工智能生成的图像。并非所有的人工智能工具都允许将图像用于商业目的,有些需要付费才能使用。
你用 AI 工具生成的图像不能侵犯其他创作者的版权。如果人工智能生成的图像与现有的版权图像或虚构角色(如哈利·波特、弗雷德·弗林斯通等)相似或相同。),不允许在 TDS 上使用。使用你的最佳判断,避免人工智能生成的图像复制或接近模仿另一个作品。如果有疑问,使用图像搜索工具——像谷歌镜头、 TinEye 或其他——来检查你的图像是否与现有作品过于相似。我们还可能要求您提供您在 AI 工具中使用的文本提示的详细信息,以确认您没有使用受版权保护的作品的名称。
您的文本提示不能使用真实人物的名字,如果您的图像中有真实人物(无论是名人、政治家还是其他任何人),也不能使用。
请记住引用你的图片来源,即使你没有法律义务这样做。如果您自己创建了一张图片,您可以在标题中添加(图片作者)。无论您决定采用哪种方式,您的图像源应该如下所示:
(Left) Photo by Marco Xu on Unsplash | (Middle) Photo by Nubia Navarro (nubikini) from Pexels | (Right) Image by Micha Sager from Pixabay
(Left) Photo by the author | (Middle) Photo from Toronto Machine Learning Summit (TMLS), 2018. Reposted with permission | (Right) Plato in his academy, drawing after a painting by Swedish painter Carl Johan Wahlbom, Public Domain.
你的图片应该有来源和链接。如果您自己创建了图像,您可以添加“按作者分类的图像”。
如果你创作了一幅受现有图片轻微启发的图片,请添加标题“图片由作者创作,灵感来自出处[包含链接]。”如果您已经编辑了现有的图片,请确保您有权使用和编辑该图片,并附上标题“图片来源[包含链接],经作者许可编辑。”
危险区🚩
未经所有者明确许可,请勿使用您在网上找到的图像(包括徽标和 gif)。将源添加到图像并不授予您使用它的权利。
11。你从哪里得到的数据?
走向数据科学团队致力于创建一个尊重数据科学作者、研究人员和读者的社区。对于我们的作者来说,这意味着尊重他人的工作,注意尊重与图像、出版材料和数据相关的版权。请始终确保您有权收集、分析和展示您在文章中使用的数据。
有很多很好的免费数据来源。尝试搜索大学数据库、政府开放数据网站和国际机构,如 UCI 欧文机器学习库、美国政府和世界银行开放数据。不要忘记那些保存着与物理、天体物理、地球科学、体育和政治等领域相关的特定数据的网站,如 CERN 、 NASA 和 FiveThirtyEight 。
TDS 是由商业实体 Medium 托管的商业出版物。因此,在将您的文章提交给我们之前,请验证您的数据集是 许可用于商业用途的 ,或者获得使用它的书面许可。请注意,并非我们列出的网站上的所有数据集都可以使用。无论您从哪里获得数据,我们都建议您仔细检查数据集是否允许商业使用。
如果你不确定自己是否有权将其用于商业目的,可以考虑联系所有者。许多作者收到一封精心设计的电子邮件后会得到快速、积极的回复。解释您打算如何使用这些数据,分享您的文章或想法,并提供 TDS 的链接。当你得到许可时,请将一份副本发送到 publication@towardsdatascience.com给我们。
如果您计划使用 web 抓取来创建自己的数据集,这一点尤其重要。如果网站没有明确允许出于商业目的的数据抓取,我们强烈建议您联系网站所有者以获得许可。没有明确的许可,我们不能发表你的作品,所以请通过电子邮件转发给我们一份。
有时候,简单的效果最好!如果您只是想要一个数据集来解释算法是如何工作的,您总是可以创建一个人工的或模拟的数据集。这里有一个快速的教程,和一篇文章,它使用了一个你可能会觉得有帮助的模拟数据集。
请记住添加一个链接到存储数据集的站点,并在您的文章中注明所有者/创建者。理想情况下,这是在第一次提到数据集时完成的,或者在文章末尾的资源列表中完成。请仔细遵循您在网站上找到的与归属相关的任何说明。如果您已经创建了自己的人工或模拟数据集,提及这一点也很重要。
我们知道解释许可证可能具有挑战性。你有责任确保在 TDS 发表的文章中展示你的数据和发现,但如果你遇到困难,请联系我们的编辑团队寻求帮助。我们宁愿在您项目的早期阶段与您合作,而不是因为数据集许可问题而不得不拒绝您完成的文章。
12.你尊重过媒体的指导方针吗?
我们发布的每篇文章都采用了 Medium 的监管指南。这意味着,如果你的帖子质量不够高,无法进行管理,或者没有遵循管理指南,我们不会将它发布到数据科学上。
我们的编辑策展团队每天审查数以千计的故事。我们有超过 35 名策展人,他们拥有各种各样的…
help.medium.com](https://help.medium.com/hc/en-us/articles/360006362473-Medium-s-Curation-Guidelines-everything-writers-need-to-know)
13。你的内容是原创吗?
虽然我们确实接受已经发布的内容(例如,在您的个人博客或网站上),但我们的重点是向读者推广和分享新的原创内容。这意味着,通过首先(或独家)在 TDS 上发布您的文章,您将有更大的机会出现在我们的出版物、我们的社交媒体渠道和我们的时事通讯中。
我们喜欢原创内容,因为这是我们的观众从未见过的东西。我们希望尽可能多地接触新材料,并保持 TDS 的新鲜和最新。
原创性也意味着你(和你的合著者,如果有的话)是你文章中每一个元素的唯一创造者。任何时候你依靠别人的话,你必须引用和引述他们适当,否则我们认为这是一个抄袭的例子。这当然适用于人类作者,但也适用于人工智能生成的文本。我们一般不允许任何由 TDS 上的 ChatGPT 之类的工具创建的语言;如果您的文章讨论了这些工具,并且您希望包括您生成的文本示例,请尽量减少这些示例,引用它们的来源和您使用的提示,并且非常清楚(例如,通过使用引号)人工智能生成部分的开始和结束位置。
14.在提交帖子之前,您收到任何反馈了吗?
养成在发表文章前向朋友寻求反馈的习惯。在那篇文章上花了这么大力气,你不会想让一个愚蠢的错误把读者推开。
15.您的媒体简介是否已正确完成?
请附上你的真实姓名、一张照片和一份简历。我们不发表匿名作者的文章——当读者将你的文字与一个真实的人联系起来时,更容易与他们建立信任。
使用你的个人资料来介绍你自己、你的专长、你的成就——优化它将有助于你与你的受众发展一种有意义的关系,而不仅仅是一篇帖子。如果你不确定你的简历应该包括什么,这里有一些有用的建议,告诉你如何确保简历既有效又有吸引力。
如果你是一家公司,并希望与我们一起发表,请注意,我们几乎只发表来自一个真实人物的媒体简介的文章。
16.你好点了吗?
花一分钟思考一下你目前为止所做的工作,以及你希望发表的文章。你给谁带来了什么价值?与你以前发表的文章相比,这篇文章在哪些方面更好或更差?
长篇文章、专栏和在线书籍
有很多话要说?很好。我们喜欢深入复杂的话题,我们的读者也是如此。以下是你如何在 TDS 上发表长篇文章、专栏和在线书籍的方法。
长格式帖子
我们喜欢长篇大论!如果你的文章阅读时间少于 25 分钟,我们建议你不要把它分成多个片段——保持原样。一篇文章可以让读者更容易地搜索和找到他们需要的所有信息,也不太可能错过你论点的重要部分。
要创建更流畅的阅读体验,您可以添加目录来引导读者阅读您的文章。添加高质量的图像和大量的空白也是一个好主意——长文本不一定是一堵文字墙。
我们会定期在我们的深度潜水页面添加最吸引人和最有想法的长篇帖子。
列
如果你的帖子的阅读时间超过 25 分钟,或者如果你打算在多篇文章中关注同一主题并持续更长时间,你可以创建自己的 TDS 专栏。只需要三个步骤:
- **为你的帖子添加自定义标签。**这个标签必须是独一无二的,并能反映你项目的主题。每次你发布带有那个标签的帖子,它都会被添加到你的专栏登陆页:towards data science . com/tagged/【你的标签】。
- 给你的帖子添加一个踢球者。就像在你的标题上面加了一个副标题。
- 将你的 kicker 链接到你专栏的登陆页面。
如果您在这个过程中遇到任何问题,请在这里告诉我们,我们将帮助您创建它。如果你想看看专栏是什么样的,可以看看 Callum Ballard 的音乐和 Kate Marie Lewis 的社交距离。
您可以创建一个 TDS 专栏,并邀请多位作者投稿。只要让你的同事知道你决定使用哪个标签,他们就可以在他们的文章中添加相同的标签。这里是我们团队的一些例子。
在线书籍
如果你有一个开放式的话题,打算写一段时间,专栏是一个很好的形式。另一方面,如果你的想法有一个有限的、确定的范围,并且从一篇文章到下一篇文章有一个清晰的进展感,你可能想创作一系列感觉更像在线书籍的文章。这是我们推荐使用的格式。
保持每篇文章(或“章节”)的阅读时间在 12 到 25 分钟之间,目标是一个系列至少有 5 篇文章(但可能不超过 16 篇)。您可以在每篇文章中添加指向前面或后面项目的链接,例如,在引言和/或结论中。
要发布您的在线图书,您可以一次性将所有文章提交给我们的编辑团队,或者在完成每篇文章后逐一提交。我们将对它们进行审查,并在它们出现时发布,因此请在您的草稿中添加一个快速的私人注释(最好添加到您的标题中,我们不太可能会错过它),让我们知道您的帖子是计划中的在线图书项目的一部分。
请确保每篇文章或在线书籍章节都遵循与 TDS 发布的任何其他帖子相同的准则和规则。如果你决定向第三方出版商出售或独家授权你的书,你必须确保他们同意你继续用 TDS 出版这本书。如果您没有此类同意,您有责任从 TDS 出版物中删除您的内容。
如何提交文章?
注意:如果你在 TDS 上的最新文章在 2020 年 1 月 1 日之前发表,请通过我们下面的在线表格提交你的下一篇文章。随着 TDS 近年来的发展,我们已经更新了我们的指南和作者术语,您需要在与我们一起发布下一篇帖子之前查看它们。
要成为作家,请使用我们的 表格 发送您的文章。请注意我们只在介质上工作。我们不校对你的博客、PDF 或谷歌文档上发表的文章。此外,由于我们收到的提交量很大,我们不能保证对提交的每篇文章都进行回复。
**如果您对我们的在线表格有问题,**您可以通过电子邮件向 publication@towardsdatascience.com 发送您文章的链接。请确保遵循下面列出的说明:
- 不要通过电子邮件向我们发送您已经通过我们的表格发送的文章。
- 虽然我们有一个开放的提交政策,我们不接受或发表所有提交给我们的文章。由于我们收到的邮件数量,我们无法保证回复每封邮件。
- 请注意我们只在介质上工作。我们不校对你的博客、PDF 或谷歌文档上发表的文章。
- 我们只发表遵循 媒体的策展方针 的文章。
- 请在电子邮件中附上您的简历或 LinkedIn 个人资料的链接。
- 使用您的专业或学术电子邮件地址。这有助于我们验证您的个人资料和简历。
最后,一旦你向我们发表了你的第一篇文章,我们将把你作为投稿人添加到 TDS 媒体出版物中,你将能够直接通过媒体提交后续文章 。
常见问题
- 我把文章提交给 TDS 会怎么样? ✨
- 我可以复制帖子吗?如果原文章是外媒,是。但是不要重复你已经在媒体上发表的文章。
- 我可以写我公司的产品吗?
- 我的帖子被拒绝了,你能告诉我为什么吗?
- 我可以付费出版吗?不
为数据科学快速研究熊猫
Pandas — Data Science Fundamentals
Pandas 是一个基于 NumPy 构建的开源 python 库。它允许您进行快速分析以及数据清理和准备。想到熊猫的一个简单方法就是简单地把它看作 Python 版的微软 Excel。
我喜欢熊猫的一个很酷的地方是,它可以很好地处理来自各种来源的数据,例如;Excel 表格、csv 文件、sql 文件甚至网页。
安装熊猫
如果您有 Anaconda ,您可以简单地从您的终端或命令提示符安装 Pandas,使用:
conda install pandas
如果您的计算机上没有 Anaconda,请使用以下命令从您的终端安装 Pandas:
pip install pandas
熊猫数据结构
系列
Series 是一维数组,与 NumPy 数组非常相似。事实上,Series 是建立在 NumPy 数组对象之上的。series 与 NumPy 数组的不同之处在于 Series 可以有一个访问标签,使用该标签可以对其进行索引。
import numpy as np
import pandas as pd
以下是创建熊猫系列的基本语法:
my_series = pd.Series(data, index)
从上面可以看出,data
可以是任何对象类型,比如字典、列表,甚至是一个 NumPy 数组,而index
表示系列将被索引的轴标签。
我们将从各种对象类型中创建一个系列。
注:需要注意的是,index
轴是可选的。意思是,你可以决定不传进去。如果没有索引被传递,Pandas 将创建一个默认值index
,其值[0, ..., len(data) - 1]
如下所示:
每当从 Python 字典创建 Series 时,Pandas 将键设置为 Series 的index
,并将值设置为相应的数据点,如上面的out[24]
所示。
Pandas 系列与 NumPy 数组的区别在于 Pandas 系列可以保存各种对象类型。
从系列中抓取信息
我们可以像使用 python 字典一样从一个系列中获取信息:
对数列进行算术运算
基于index
完成系列操作。当我们使用任何数学运算,如-、+、/、*,pandas 使用index
*的值进行计算。*结果值随后被转换成浮点数,这样你就不会丢失任何信息。
从上面来看,熊猫在这个系列中找不到匹配的,它给了它一个NaN
值。
数据帧
数据帧是二维数据结构,其中数据以表格形式排列,即以行和列排列。熊猫数据框使处理你的数据变得容易。您可以选择、替换列和行,甚至重塑您的数据。
以下是创建数据帧的基本语法:
pd.DataFrame(data,index)
让我们创建一个 5 行 4 列的随机数数据帧:
正如我们所见,上面的每个专栏实际上只是一个熊猫系列,它们都有一个共同的index
。因此,可以肯定地说,数据帧是共享相同index
的系列的集合。在下面的示例中,我们将从一个系列中创建一个数据帧:
从数据帧中选择列
使用括号符号[]
,我们可以很容易地从数据帧中抓取对象,就像处理 Series 一样。先来抢个专栏name
:
因为我们获取了单个列,所以它返回一个系列。继续使用type()
确认返回的数据类型:
如果我们获取多个列,结果将是一个数据帧:
向数据框架添加列
当创建一个新列时,您必须像它已经存在一样定义它。有数据框架的:
我们可以通过重新创建新列或从现有列添加新列,如下所示:
从数据帧中删除行/列
我们可以使用.drop()
功能删除一行或一列。为此,我们必须为行指定axis=0
,为列指定axis=1
。
值得注意的是,无论何时使用.drop()
方法,Pandas 都不会永久删除一行/一列,除非您告诉它这样做。这是因为熊猫不希望你意外丢失数据。
打电话df
确认。要永久删除一行/一列,您必须像这样设置inplace=True
:
选择数据帧中的行
要选择行,我们必须使用接受标签名的.loc[]
或接受行的索引位置的.iloc[]
来调用行的位置。
我们也可以像在 NumPy 中那样,通过指定我们想要的行和列,使用列符号:
来选择行和列的子集。假设我们想要第'c'
行的'Name’
:
条件选择
Pandas 允许您使用括号符号[]
进行条件选择。下面的示例返回其中'W'>0
: 的行
假设我们只想返回列'X'
的值,其中'W'>0
:
继续尝试这个:df[df['W']>0][['X','Y']]
,你应该得到这个:
上述一行抽象也可以通过将其分解为多个步骤来实现:
my_series = df['W']>0
result = df[my_series]
my_cols = ['X','Y']
result[my_cols]
使用多个条件,我们可以通过使用逻辑操作符& (AND)和| (OR)来获得数据帧中的值。例如,要返回值,其中'W'>0
和'X'>1
*,*使用:
重置数据帧的索引
当你的索引看起来不完全是你想要的样子时,你可以使用.reset_index()
很容易地重置它。这将我们的 DataFrame 索引重置为名为index
的列,Pandas 的默认索引值[0, ..., len(data) - 1]
是我们的新索引。
不出所料,.reset_index()
不会永久重置索引,直到您指定:.reset_index(inplace=True)
设置数据帧的索引
类似地,我们可以通过使用set_index()
函数来指定想要使用哪一列作为我们的索引标签。为此,我们将创建一个名为"ID'
的新列,并将其设置为我们的新索引:
不像
*.reset_index()*
重置旧的索引并使用默认的熊猫索引作为我们的新索引,*.set_index()*
完全覆盖旧的索引。
多级指标( MultiIndex) 和指标层次
多索引只是一个元组数组,其中每个元组都是唯一的。它可以从一个数组列表(使用MultiIndex.from_arrays
)、一个元组数组(使用MultiIndex.from_tuples
)或一组交叉的可重复项(使用MultiIndex.from_product
)中创建。
让我们从一个 turple 创建一个 MultiIndex:
我们可以继续使用.loc[]
从 MultiIndex 中获取行,如下所示:
正如我们所看到的,我们的数据框架df
的前两列没有名字。我们可以像这样用.index.names
给它们命名:
横切面的行列
使用.xs
方法,我们可以很容易地选择多索引中特定级别的数据。例如,假设我们想要获取所有级别,其中Num = 22
:
缺失数据
很多时候,当你使用 Pandas 读入数据并且有缺失点时,Pandas 会自动用一个NaN or Null
值来填充这些缺失点。因此,我们可以使用.dropna()
删除那些自动填充的值,或者使用.fillna().
填充它们
假设我们有一个数据框架:
使用.dropna()
方法,我们告诉 Pandas 删除任何有一个或多个缺失值的行或列。要删除一行,使用.dropna(axis=0)
和.dropna(axis=1)
删除一列。
注意,如果您没有指定轴,Pandas 默认假设您正在删除一行。
同样,使用.fillna()
方法,我们可以用我们想要的值替换数据帧中缺失的值。让我们用10
替换所有的NaN
值:
我们也可以选择只填充特定列或行中缺少的值。让我们用平均值替换列'A'
中缺失的值:
从上面可以看出,列'A'
的平均值是 2.0,因此它用 2.0 替换了第二行。
同样,.dropna()
和.fillna()
不会永久出现,直到您设置了inplace=True
分组依据
Grouby 允许您根据列对行进行分组,以便您可以对它们执行聚合函数(如求和、均值、中值、标准差等)。
使用.groupby()
方法,我们可以根据'Company'
列对行进行分组,并对其调用聚合函数.mean()
:
如你所见,我们的结果是每个公司的平均值。
计数
使用count()
方法,我们可以获得一个项目在数据帧中出现的次数。
形容
.describe()
方法用于获得数据帧的概貌。它为我们提供了每个数据帧索引的摘要。
如果你不喜欢这个布局,你可以使用.transpose()
方法得到一个不同的布局。
连接、合并和连接数据帧
串联
串联基本上将数据帧粘合在一起。当连接数据帧时,请记住,维度应该沿着要连接的轴匹配。拥有,数据帧列表:
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7]) df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
我们可以使用pd.concat()
方法连接它们:
因为我们没有指定希望在哪个轴上发生串联,所以默认情况下,Pandas 使用行轴。它把两行连接在一起。如果我们希望沿着列进行连接,我们必须设置axis=1
:
注意这里我们有一堆缺失的值。这是因为 DataFrame 没有包含我们希望它连接的所有索引的值。因此,当使用pd.concat()
时,确保您的数据正确包含轴上的所有信息。
合并
使用pd.merge()
函数,Pandas 允许您像合并 SQL 表一样合并数据帧。合并数据帧的语法是pd.merge(left, right, how='inner', on='Key'
。left
表示应该出现在左侧的数据帧,right
表示应该出现在右侧的数据帧,how='inner'
表示合并操作应该作为交集inner
还是并集Outer
来处理。最后,on='Key'
表示发生合并的键列。在合并功能发生之前,该键列在所有数据帧中必须是相似的。
有两个数据帧都有一个key
列,我们可以这样合并它们:
我们还可以通过简单地传递键来合并多个键:
加入
对于将两个可能索引不同的数据帧的列组合成单个数据帧,联接是一种更方便的方法。联接类似于合并,但不同之处在于联接方法发生在索引键而不是列上。
在数据帧中查找唯一值
唯一值就是数据帧中的不同值。在数据帧中查找唯一值有三种主要的有用方法。
使用.unique()
,我们可以找到以下数据帧的col2
中的所有唯一值:
我们可以选择使用.nunique()
来计算数据帧中唯一值的数量,而不是显示唯一值:
最后,我们可以决定使用.value_counts()
只返回一个惟一值在一列中出现的次数:
apply()方法
.apply()
方法用于调用数据帧上的自定义函数。想象我们有一个函数:
在上面的例子中,我们将函数传播给列中的每个元素。我们还可以将内置函数应用于数据帧。假设我们想要得到col3
中字符串的长度:
有时,您可能会定义一个最终只使用一次的函数。不用在几行代码中定义这样的函数,您可以简单地使用 lambda 表达式,这是该函数的简化版本。例如,我们可以用 lambda 表达式来表示上面ln[47]
中的平方函数:
获取数据帧属性
属性是数据帧的列名和索引名。假设我们不确定数据帧中的列名是否包含空格字符,我们可以简单地获得它们的属性:
对数据帧进行排序和排序
假设我们想要显示数据帧,其中某一列以升序显示,我们可以使用.sort_values():
很容易地对其进行排序
如您所见,col2
中的值是从最低到最高显示的。还要注意index
是如何连接到每一行的,这样信息就不会丢失。
查找空值
假设您有一个大型数据集,Pandas 使用.isnull():
使得定位空值变得非常容易
透视表
您可能已经熟悉 Excel 中的数据透视表。数据透视表是汇总另一个表中数据的表。它使您能够自动对存储在一个表中的数据进行分组、切片、筛选、排序、计数、合计或平均。有数据框架的:
我们可以使用语法从它创建一个数据透视表:.pivot_table(data, values='', index=[''], columns=['']).
其中values
表示我们想要组成数据点的列,index
是您想要对数据进行分组的列,columns
表示应该定义数据帧的列。你可以在这里阅读更多关于数据透视表的内容。
在上面的例子中,我们得到了一些NaN
值,因为对于那些特定的点没有匹配的值。
数据输入和输出
使用pd.read_
方法,Pandas 允许您从各种来源访问数据,例如:excel 表、csv、sql 或 html。
要引用任何文件,你必须确保它与你的 jupyter 笔记本在同一个目录下。
读取 CSV 文件
使用pd.read_csv()
我们可以将. csv 文件的内容输出为数据帧,如下所示:
写入 CSV 文件
我们可以创建一个数据帧,并使用.to_csv()
将其存储在一个.csv
文件中,如下所示:
要确认数据已保存,请继续阅读您刚刚使用pd.read_csv('New_dataframe')
创建的 csv 文件。
从 Excel 文件中读取
Excel 文件是很好的数据来源。使用pd.read_excel()
我们可以从 excel 文件导入数据。请记住,Pandas 只能导入 excel 文件中的数据,而不能导入宏、图像或公式。excel 文件中有宏、图像或公式会导致pd.read_excel()
方法崩溃。
假设我们有一个 excel 文件'excel_output.xlsx'
,让我们继续输出它的内容:
请记住,每个 excel 文件都包含一个或多个工作表。在我们的例子中,Sheet1
指的是我们想要读取的'excel_output.xlsx'
中的特定工作表。
写入 Excel 文件
就像我们对 csv 所做的那样,我们可以创建一个数据帧,并使用.to_excel()
将其存储在一个.xlsx
文件中,如下所示:
从 HTML 中读取
要从 HTML 文件中读取数据,需要安装 htmllib5、lxml 和 BeautifulSoup4。在您的终端运行中:
conda install lxml
conda install html5lib
conda install BeautifulSoup4
使用.read_html()
让我们告诉熊猫从这个 html 页面读取表格。由于该页面中有不同的表,我们可以使用索引号[0, ..., len(tables) - 1]
来访问我们想要的特定表。对于本例,我们将返回该页面中的第二个表。
本教程到此结束,恭喜!
如果您完成了本课,您应该对什么是 Pandas 以及如何使用它进行数据准备有很好的了解。你现在需要做的就是练习!练习!练习!。
有问题,遇到困难或者只是想打个招呼?请使用评论框。如果这个教程在某些方面对你有帮助,给我看一些👏。
快速绘画:世界上最大的涂鸦数据集
谷歌的一个团队开始让猜字谜游戏变得更有趣,最终获得了世界上最大的涂鸦数据集,以及一个强大的机器学习模型。他们是怎么做到的?
什么是快速绘制?
“快,画!”是一款最初在 2016 年谷歌 I/O 上推出的游戏,在这款游戏中,一名玩家会被提示画出一个物体的图片,另一名玩家需要猜测这是什么。就像猜字谜一样。
2017 年,谷歌研究中心的 Magenta 团队将这一想法向前推进了一步,使用这个带标签的数据集来训练草图-RNN 模型,试图实时预测玩家正在画什么,而不是要求第二个玩家进行猜测。游戏已经上线,现在已经收集了超过 10 亿张手绘涂鸦!
让我们来看看来自快速绘制的一些绘图。这里我们看到西兰花被很多玩家抽中。
How would you draw broccoli?
请注意,不同的玩家对海洋的描绘略有不同。
浏览数据集可能非常有趣。如果你发现一些看起来不合适的地方,你实际上可以在这一页上修改它。会让数据对大家更好!
快速绘制数据集
该团队已经开源了这些数据,并且采用了多种格式。你可以在他们的 GitHub 页面了解更多信息。
有 4 种格式:首先是存储在。ndjson)格式。这些文件编码了每个涂鸦的全套信息。它包含每幅画的每一笔的计时信息。
还有一个简化版,存储格式相同(。ndjson),它应用了一些预处理来规范化数据。简化版也可作为二进制格式,以便更有效地存储和传输。有一些如何使用 Python 和 NodeJS 读取文件的例子。
第四种格式采用简化的数据,并将其呈现为 numpy 格式的 28x28 灰度位图。npy 格式,可以用 np.load()加载。
为什么是 28x28?嗯,它是任何现有的用于处理 MNIST 数据的代码的完美替代品。因此,如果你在寻找比 10 个手写数字更新奇的东西,你可以尝试处理 300 多种不同类别的涂鸦。
在快速绘制中使用 RNNs
如果你想变得有趣,使用完整的数据集(公平的警告,它相当大!),你可能想使用递归神经网络(RNN)来完成这项工作,因为它会从笔画的序列中学习。在一个奇妙的事件中,有一个专门针对在快速绘制数据集上使用 RNNs 的指南,所以如果你有兴趣尝试一下,请查看教程。考虑到训练时间,第一次可能只对数据的一个子集这样做:)
快速绘图的数据探索与可视化
如果您想进一步研究数据集,可以使用 Facets 可视化 quickdraw 数据集。Facets 团队甚至冒昧地将其放在网上,并给了我们一些预置来玩!你可以在这里进入页面。我们可以加载一些随机的椅子,看看不同的玩家如何从世界各地画出椅子。
All the chairs
我们还可以看到哪些画被认为是椅子,哪些没有被选中。有许多预置视图也值得一试,它们可以作为进一步分析的有趣起点。
感谢阅读本集云 AI 冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注 Medium 上的me或订阅 YouTube 频道以捕捉未来的剧集。更多剧集即将推出!
快速实现 Yolo V2 与 Keras!
I do not hold ownership to any of the above pictures. These are merely used for educational purposes to describe the concepts.
多年来,实时多目标定位一直是数字图像处理领域的一个大争论。随着深度学习和卷积神经网络的发明,这些努力已经产生了非常有前景的结果,训练有素的模型能够非常准确地检测许多类别的对象,这种能力现在已经掌握在我们手中。
在这篇文章中,我打算介绍一个著名的模型,称为 Yolo,代表“你只看一次”,由 Joseph Redmo 等人提出,该模型已经朝着对象的快速多本地化及其使用 Keras 的实现迈出了一大步,Keras 是一个高级深度学习库。
让我们首先看一下分类、定位和检测这三个术语之间的区别。我们经常在图像处理领域听到这些术语,它们在应用中各不相同。
分类 —指识别图像中是否存在给定对象。常见的例子:猫或不猫。
定位 —不仅指识别图像中是否存在给定对象,还指使用边界框来区分对象的位置。
检测 —简单地说就是在一幅图像中进行多次定位。
Yolo 正在解决图像中物体的检测问题,随着 Yolo V2 论文的发表,这一技术在该领域迅速推广。让我们看看约洛·V2 算法的主要步骤。这些可以指出如下:
- 使用网格分割图像(例如:19x19)
将图像分割成一个由更小图像组成的网格,可以更容易地检测到每个单元内的物体。 - 在每个网格单元上执行图像分类和定位
每个单元的向量表示检测到物体的概率,边界框的尺寸和检测到的图像的类别作为该步骤的输出给出。 - 执行阈值处理,删除多个检测到的实例
阈值处理选择概率最高的单元,以便选择更正确的边界框 - 执行非最大值抑制以进一步细化方框
非最大值抑制技术提供了一种便捷的方法,使用一种称为并集交集的计算来进一步细化结果
附加点-锚定框用于检测一个网格单元中的多个对象。与其他算法相比,这是约罗 V2 算法的一个特点。
Yolo 的第一个实现是由 Joseph Redmon 等人使用 C 语言中称为 Darknet 的模型提出的,随着该方法的发展,还构建了当前更流行的 ML 库(如 Tensorflow 和 Keras)的实现。
我的 Github 库在这里展示了一个使用 Keras 的算法的快速实现。使用该代码,任何人都可以用自己的图像进行测试,并深入了解其工作原理。关于它的安装和执行的所有细节可以在回购中找到。
请在您的应用程序中自由使用代码,并分享传播知识!
快速 ML 概念:张量
机器学习的基本构件简介
Tensorflow、Tensorlab、深度张量化网络、张量化 lstm……很多机器学习技术的名称中都嵌入了“张量”这个词,这并不奇怪。但是张量是什么呢?它们与机器学习有什么关系?在快速 ML 概念的第一部分,我的目标是提供一个简短而简明的张量是什么的总结。
Photo by Olav Ahrens Røtne on Unsplash
不要让“张量”这个词吓到你。它只不过是一个简单的数学概念。张量是将标量、向量和矩阵推广到更高维的数学对象。如果你熟悉基本的线性代数,你应该不难理解什么是张量。简而言之,一维张量可以表示为一个向量。你可能已经猜到,二维张量可以用矩阵来表示。
尽管很容易将张量概括为多维矩阵,范围从0到 N 维,但记住张量是动态的很重要。即张量在与其他数学实体交互时会发生变换。另一方面,矩阵并不总是具有这种性质。引用自 Steven Steinke 的精彩文章关于张量和矩阵的根本区别:任何秩为 2 的张量都可以表示为矩阵,但并不是每个矩阵都真的是秩为 2 的张量。
张量运算
张量运算很简单。考虑以下张量:
a = np.array([[[4,1,2],
[3,5,2],
[1,6,7]]
[[2,1,0],
[5,4,3],
[6,8,9]]
[[1,2,3],
[2,3,4],
[5,5,5]]])
b = np.array([[[1,1,1],
[2,2,2],
[3,3,3]]
[[4,4,4],
[5,5,5],
[6,6,6]]
[[7,7,7],
[8,8,8],
[9,9,9]]])
很容易看出,两个张量的秩都是 3。也就是说,它们有三个轴。您可以通过 Python 中的以下代码来检查张量的维度
a.ndim
>>> 3
上述两个张量的相加产生一个张量,其中每个标量值是父张量中标量的元素相加。
print(a+b)
>>> [[[5,2,3],
[5,7,4],
[4,9,10]]
[[6,5,4],
[10,9,8],
[12,14,15]]
[[8,10,11],
[10,11,12],
[14,14,14]]]
如果你有兴趣了解更多关于张量运算的知识, Jason Brownlee 的优秀张量教程总结了包括张量点和 Hadamart 积在内的几种常见的张量运算。
机器学习中的张量
那么张量和机器学习有什么关系呢?
记住,大多数机器在没有任何数据的情况下无法学习。而现代数据往往是多维的。张量可以通过对多维数据进行编码,在 ML 中发挥重要作用。比如一张图片一般用三个字段来表示:宽度、高度、深度(颜色)。把它编码成 3D 张量是完全有意义的。然而,我们更多的是在处理成千上万的图片。因此,这就是第四个字段样本大小发挥作用的地方。一系列图像,如著名的 MNIST 数据集,可以很容易地存储在 tensor flow的 4D 张量中。这种表示方式可以轻松解决涉及大数据的问题。
Photo by Daniele Levis Pelusi on Unsplash
现实生活中的一个例子是,在大多数推荐系统中,基于模型的协同过滤方法,如矩阵分解,没有将上下文信息集成到模型中的灵活性。通过使用 N 维张量而不是传统的 2D 用户项目矩阵,研究人员开发了一个更强大的模型,提供上下文感知的推荐。近年来计算能力的提高也使得这些繁重的张量运算得以实现。
此时你可能会疑惑:为什么机器学习算法大多依赖向量和矩阵,而深度学习算法和神经网络大多依赖张量?一个简单的答案是,深度学习通常涉及数百个甚至数千个维度和领域。正如我们之前所讨论的,这最好用张量来表示,因为它们可以表示从零到 N 维的任何东西。在计算机视觉问题中,如默克分子活动挑战,图像可以很容易地被分解成几百个特征。因此,张量可以最好地被视为在机器学习和深度学习的背景下包装和存储数据特征的容器。
感谢你阅读我的文章。
纽约市 2017 年地层快速说明
我现在明白为什么张量流是一件大事了
这是一种简洁的线性代数和优化方法,可以利用多个后端。它还附带了一系列由谷歌致力于这项任务的大量数学家开发的预扫描算法。
您可以将它用于传统的机器学习、基于非传统优化的任务(例如样条拟合)以及任何作为线性代数的工作。预计快速计算的下一件事是将更多的运算转换成线性代数。向 Ted Dunning 大声欢呼,感谢他带给我这个家。
Tensorflow 可能是谷歌云的杀手级应用
看起来大多数其他部署 tensorflow 的方式都是一种痛苦。如果你是一个开发者,我想是时候升级谷歌云了。
模型操作正在成为一件事
很多关于将机器学习投入生产的东西。因为模型(当前制作的)本质上是在一个环境中训练的,并且是永恒的和无空间的,所以当前的技术需要一种可操作的方法。
特别是,将您的模型训练方法简化为自动化管道。然后,为每一个新的环境进行再培训(就像一个诊所或一辆卡车一样精细)。
**当输出预测的分布明显偏离训练集中的分布时,重新训练您的模型。**重大差异标准是一个判断问题。
监控有效性——你的模型改变了人们的行为方式,这破坏了它的有效性。这对好的参与者(例如,医生决定让谁住院)和坏的参与者(例如,黑客试图欺骗你的黑客检测器)都是如此。
特别是在训练数据稀少的情况下,您需要考虑预测和训练的替代方法。David Talby 举了一个通过电子邮件流检测银行欺诈行为的例子。简单的分类器不起作用,因为类别(坏消息与好消息)是如此不平衡,以至于所有标准方法都会过度适应好的类别,并说每条消息都是好的(也许百万分之一是坏的)。相反,他和他的团队有一个回归预测不良概率,向(现有的)人工审查团队显示消息,并根据人类的反应进行重新训练。
模型设计者必须结合因果关系或 GTFO
有足够多的经验法则和足够多的 GPU,使用标准模型类型很快就会实现自动化。已经有商业工具和开源工具在很大程度上实现了自动调优。特征工程和模型类型选择即将实现自动化。
制作一个建模管道,接受标记的数据,并在其上训练一个模型,而不需要任何人工来理解功能或模型或调整它们,这将是一个标准的工程任务,在 5 年内完成,并在 10 年内完全产品化。这在很大程度上是因为当前的技术是纯粹的、无上下文的模式学习者。随着人类学习如何使用这些技术,开发的启发和技术正在作为他们自己的优化算法被操作,允许解决方案空间的自动导航。
数据准备不会消失。更好的工具是存在的,对于迭代缓慢的东西,人类将站在数据准备的一边。对于快速发展的事物,数据工程师将建立在线和自动化系统,至少将人工处理减少到可管理的数量。
关于即将发生的事情就说这么多。因果关系是正在发生的事情。
这至少有两个方面:
- 选择与基础过程相对应的数学模型;和
- 对基础流程的部分进行建模,以创建一个包含已知因果关系的完整模型
第一个很好的例子是由给出的,他通过用三次样条拟合数据来模拟期货交易量和波动性之间的关系。在这种情况下,该模型至少更易于训练,但也限制了所需的再训练量(因为样条线段对其相邻线段的影响随着样条中链接的数量而消失)。随着时间的推移,这一过程还会随着环境和市场的潜在变化而永远持续下去,因此样条曲线是这一过程的一个更自然的模型,而不是试图用一个巨大的多项式来拟合所有的时间。
并非巧合的是,现在另一个流行词是“可解释性”。有些供应商专注于理解标准非线性模型(最著名的是神经网络)的动态技术。来自 H2O 的演讲很有趣,也很聪明,如果你需要关心你的通用模型在做什么,你可能会想使用这些技术。然而,如果您确实选择使用实际上对应于底层流程的模型,那么解释经过训练的模型应该会容易得多。
第二个的一个很好的例子是一位演讲者,他的公司( VNomics )制造实体卡车的“数字双胞胎”。人们对这个讲座很感兴趣,事实上,我希望它能安排成一个为期一天的研讨会,但与此最相关的是,他的公司有卡车每个部件的性能模型(例如,这个卡车模型有这个特殊的传动系统和这个制动系统模型)。这些模型被用作第一步,以将传感器读数提取到特征中,这些特征被输入到更一般的燃料经济性回归模型中。通过这种方式,模型(a)结合了正在发生的事情的知识,而不是仅仅将原始数据放入模型中,并依赖回归模型进行分类;以及(b)提取模型本身是可组合和可重用的,允许每辆卡车具有定制的特征提取器流水线,而无需编写新代码。
这些“数字双胞胎”模型的第二个强大之处在于,它们可以用作物理模型中 A/B 测试变化的基线(例如,轮胎充气的不同方式)。同样,如果你想解释你的模型是怎么回事,故意设计特征提取和产生数据的东西的变化会有帮助。
不性感的技术仍然很重要
能力差距越来越大,后来者正在被甩在后面
当我们中的一些人在关于机器学习的操作方面的演示中明智地点头时,其他人正在参加 40 分钟的演示,基本信息是“这实际上很难,你的团队需要时间来提升技术”以及人们描述云基础设施上的数据仓库看起来像什么。
如果您的团队发现大数据很难,或者您想带着计划进入项目,请联系我。我和我的团队很乐意为你安排计划、培训和执行。
参展商包括许多销售解决方案以支持数据科学团队的人,以及与开源工具没有明显区别的商业内存分布式数据库,但真的没有人销售真正的 on-ramp 解决方案。值得注意的是,除了木桶之外,没有任何东西将端到端的执行联系在一起。天文学家 io 没有参展,尽管我认为他们是唯一一个试图在 ramp 上提供真实主机的团体。
有许多针对数据准备和数据发现的解决方案,但很少关注数据平面安全和控制。数据发现、编目和控制领域的开源解决方案仍然是主要供应商的可怕挡箭牌,或者在 herd (来自 FINRA)的情况下,这显然是一个功能非常全面的解决方案,但几乎没有文档。
我怀疑这一领域的低成本选择将是与编排解决方案相关的目录,如 AWS 的 Glue,或天文学家. io 。
关注业务案例
经验继续证明,数据工程或分析工作必须发生在业务案例的上下文中,以及对数据作为资产的持续承诺中。人们倾向于将“大数据”和“深度学习”视为神奇的仙尘,工程人员可以将仙尘洒在业务上,以实现神奇的结果。
不幸的是,事实并非如此,有些供应商很乐意向您销售基于这一前提的解决方案。公平地说,他们中的许多人,他们的解决方案可能会加速您的工程团队的进展,使他们免受架构错误的影响,但是您仍然有一个半生不熟的数据平台在寻找应用程序。
如果你确实在数据中看到了机会,但不太确定如何计划,请联系我。我和我的团队可以帮助您制定战略和产品愿景,建立成功的工程团队,并指导您选择最适合您的供应商和解决方案。
快速回顾,进入具有代理的嵌入式模型
作为后续工作,我制作了一个 Jupyter 笔记本。这里收集的部分图片取自那里:【https://arxiv.org/pdf/1703.07464.pdf】https://github . com/rachuism/food-classifier-proxy-NCA/blob/master/visualization . ipynb 还有这里:
顾名思义,嵌入是为了让东西变得更小。在深度学习的情况下,它包括将项目(例如,电影、文本等)映射到低维实向量,使相似的项目彼此靠近。
所以让我们以一部电影的推荐系统为例。我们需要跟踪每个用户的口味来提取数据。但是,如果我们正在跟踪一组,例如,一百万部电影呢?对整个集合进行编码将如下所示:
Taken from Google’s developers course
这对于处理深度学习模型是非常低效的。相反,我们试图使用各种数学技术来减少这个空间的维数。下图显示了巨大的编码是如何“嵌入”网络的。
Taken from Google’s developers course
在我的模型的训练期间,嵌入大小被选择为 64。这就是为什么当张量被打印出来时,有 64 个元素塑造了它:
这个项目的另一个关键词是“代理”,在这个例子中,它是作为模型参数的一部分学习的。它努力将一个数据集表示成一个点。根据经验,在代理上公式化的学习问题表现出比其他度量学习方法更快的收敛。
作为一个帮助理解它的例子,让我们首先理解“三元组”的概念:有一个“锚”点 x ,我们想减少到另一个相似点 y 的距离,并增加到不同点z的距离。下图试图简化理解:
Taken from the aforementioned paper
让我们想象我们的定位点是孤立的红色圆圈,它离其余的圆圈较近,离星星较远。这是总结代理意图的最佳实例。在下面的方案中,右图显示了一个大点如何表示一组点。
Taken from the aforementioned paper
可以看出,代理充当每个点集的上限表示。在这些距离上计算损耗,试图保持 x 尽可能靠近 y 并尽可能远离z
资料组
该数据集由 20 个食物类别和每个类别的 100 张图像组成。所选的种类有苹果派、面包布丁、牛肉片、甜菜沙拉、巧克力蛋糕、巧克力慕斯、甜甜圈、贝奈特饼、本尼迪克特蛋卷、法式面包卷、汤团、虾和玉米粉、烤三文鱼、猪排、千层面、馄饨、煎饼、法式吐司、意大利肉酱面、泰式炒面。
链接到数据集(UPMC-20 国集团):http://visiir.lip6.fr/
培训和评估
下图解释了评估系统的工作流程。首先,将训练集提供给推荐算法,该算法产生可用于生成新预测的推荐模型。为了评估该模型,将保留的测试集提供给学习模型,其中为每个用户-项目对生成预测。**具有已知标签的预测(真值)**然后被用作评估算法的输入,以产生评估结果。
因为我只处理了 20 个类,所以我将其中的 50%用于训练集,50%用于评估
对于远程度量学习来说,类的数量很少,因为与类内变化相比,类内变化很大。这就是后来 NMI 抛出低值的原因。
预言。邻域成分分析
NCA 由一种监督学习方法组成,用于根据给定的数据距离度量将多元数据分类到不同的类中。(k 个最近邻居)。在“预测”步骤中,我使用:**sk learn . metrics . pairwise . pairwise _ distances(X)**来查找更接近我的查询的图像。
在这个例子中,我选择作为查询的图像是小菜一碟,经过一些转换(输入被调整为 256 × 256 像素,然后被随机裁剪为 227 × 227。像素的亮度已被缩放)看起来像这样:
UPMC20 dataset
对该照片的检索是来自同一类(蛋糕)的图像:
UPMC20 dataset
理解日志
纪元的数量已被设置为 20。有两个概念可以理解在“评估步骤”中损失是如何计算的
.log file
NMI:归一化互信息,定义为聚类和地面实况的互信息与其调和平均值的比值。它量化了通过其他随机变量获得的关于一个变量的信息量。
k 时回忆:*k 时回忆是前 k 项推荐中相关项目的比例。*所以在 R@1 的的情况下,它意味着相关项目出现在第一个位置的概率为 40%,在 R@8 的情况下,它意味着相关项目出现在前 8 个位置的概率为 84%。这就是为什么参数“K”越大,其召回率越大的原因。数学上可以定义为:召回@k =(推荐项目数@k 相关)/(相关项目总数)。
参考
附例详细说明
medium.com](https://medium.com/@m_n_malaeb/recall-and-precision-at-k-for-recommender-systems-618483226c54)
不要大惊小怪使用代理的距离度量学习https://arxiv.org/pdf/1703.07464.pdf
伦理人工智能设计的快速押韵
我最近在读丹尼尔·卡内曼的《思考的快慢》,其中一部分讲述了如何写出令人难忘的信息。要点——人们记得押韵的东西。
我想我应该写几首关于伦理人工智能的押韵诗,希望下次你开始一个项目时会想到。
开始了。
喂你的人工智能偏向数据
稍后会显示出这种偏见
阿勒格尼州立大学曾经创造了一种算法来帮助警察,建议他们巡逻的路线以及他们应该停下来搜查的人。它偏向于检查黑人人口较多的社区。
为什么?这并不是因为黑人天生就有什么不好的地方。这是因为该算法是基于人类警察生成的数据集进行训练的。那些警察,不管是有意还是无意,都有自己的种族偏见。给人工智能输入同样的数据,它也会有偏差。
我们希望人工智能做出理性的决定,并帮助人类识别和避免偏见。因此,当你训练一个人工智能时,确保你使用的是无偏见的数据。
延伸阅读
显示你的算法不透明
如果它的意思不明显
想象一下,你申请了一笔抵押贷款,而自动验证系统拒绝了你。你问它为什么,你得到的答案是;
那不是很透明…你想要的是简单明了的英语(或者任何最适合你的语言!),对其得出结论的原因的通俗易懂的描述。
如果处理得当,这对企业也有好处。算法如何工作的复杂性通常是一个区别点。我们被 Spotify、网飞和亚马逊这样的企业所吸引,部分原因是它们的算法能够很好地了解我们是谁,并做出明智的推荐。共享简单语言的含义和意图而不是代码保留了这一优势。
延伸阅读
无方向性的情报不好
如果我们自己的价值观不被理解
我们为什么要造 AI?为了人类的利益。即使我们变得自私,这也是为了至少一个人的利益。如果我们追求智慧或者追求智慧本身,却不知道我们人类的价值观是什么,也没有办法将其编码到系统中,那么它与我们的价值观相一致的机会就像是在瞎猜。
这个主题领域被称为人工智能对齐
延伸阅读
分享就是关怀
好吧,我扯掉了这个。但如果一个人或一家企业创造了能产生大量财富的人工智能,而这种财富是没人能追上的,特别是因为他们可以用这笔财富来打造一个更有能力的系统,那这笔财富就应该被分享。如果我们现在就这样做,那就太好了,就算没有人工智能(这是一厢情愿的想法),但如果我们考虑到一种技术可以创造比没有人工智能时我们所能创造的财富多几个数量级的财富,这个问题就会变得更加严重。
进一步阅读
你还没有释放你的人工智能
你还有责任
除非在非常特殊的情况下,你在人工智能中创造意识,而我们没有达到这种状态的路线图,否则创造者对人工智能的所作所为负有伦理和道德责任。Virginia Eubanks 在这方面做了一些很好的工作——我们将自动化作为抽象的道德层。
进一步阅读
你对合乎道德的人工智能有什么看法吗?请在下面发布!
对这个话题感兴趣吗?
订阅我在 media上的博客
Quora x 柏林独角兽
CEO Adam D’Angelo describing Quora to the audience at Unicorn Berlin
在德国首都回答你的问题
在一个名为“ Unicorn ”的地方参加活动,你永远不知道会听到什么。
我很想看看柏林的合作空间,并从 Quora 首席执行官亚当·德安杰洛那里收集一些智慧的珍珠,他是联邦德国创业银行组织邀请来演讲的。我目前正在支持拜耳的 Grants4Apps 团队,该团队将创新的数字健康创业公司与制药机会联系起来。所以我喜欢抓住柏林的数字脉搏,此刻,它正涌动着到的能量。
但是回到晚上的嘉宾。也许你听说过 D ’ angelo——一家叫做脸书的小公司的前首席技术官?如果你在德国这里搜索 Quora,你会收到一个等待列表邀请,但是下载应用程序。这是一个聪明的论坛,有至少 2 亿访问者的知识丰富、不断增长的社区来回答你的问题。
以下是来自 D’Angelo 的转述要点——这些要点引起了我的注意,可能对创新者和初创公司有所帮助。尤其是不限制自己想象力的重要性。
在产品上
个性化和机器学习:对用户有益的也对企业有益。Quora 特别重视这两个话题。但事实证明,很难教会机器识别讽刺。为了给用户创造一个安全的地方来提问,并期待高质量的答案,人类的努力(即 Quora 的 200 名员工,加上其用户对事情的报道)填补了机器学习还不能达到的地方。
国际化 b4 货币化
基本上,扩大你的用户群,然后担心美元。投资人要看用户。由于英语市场的激烈竞争,D’Angelo 希望专注于使英语产品尽可能的好和有用。通过他们在其他语言上的工作(到目前为止是西班牙语和法语),他们已经开始理解语言和文化的细微差别是如何影响用户兴趣和行为的。语言生态系统必须可持续发展。
投资建议?
来自 WestTechVentures 的主持人 Alexander klpin 厚脸皮地询问“投资建议”,例如,D’Angelo 在 Instagram 上有一些不错的预感。事实证明,最佳实践可以归结为依靠一个良好的网络,并坚持你所知道的游戏。
D’Angelo 以一种自我宣称的“随机”(但我要补充的是非常成功)的方式,在他有密切私人关系的地方进行投资。他根据他认识的人筛选选择,并且(对我们来说很可悲)远离生物技术,因为他认为其他人更了解这个领域。他坚持自己的优势:消费互联网和社交网络。很公平。目前为止创造了奇迹。
Smaller group conversation with Adam D’Angelo
问&一个见解
自然有机会,观众们向这位说话温和的技术大师提问。他们想知道至少四件事:
问:你是如何克服用户的痛点的?
答:通过听他们说。Quora 非常依赖 A/B 测试和用户研究作为良好的信息来源。做你的市场调查,真正了解你的市场。D’Angelo 回忆说参加了一次维基会议,这次会议极大地塑造了他的观点…
与许多实际用户交谈,记住有时他们的“想象力仅限于当前的挫折。”但是不要让你的梦想成真。
双 Q:作为 CEO 最艰难的时刻是什么?聊天机器人的兴起对你的产品有什么影响?
答:2011 年,Quora 的发展速度超过了其技术基础设施的承受能力。这导致了成长的烦恼,因为某些项目不得不被牺牲。人们在这些领域投入了感情,所以很糟糕。(我猜这是真的,因为他回答的时候声音真的很颤抖。我想所有观众都注意到了。)问题的第二部分:他对聊天机器人持“等等看”的态度,称带屏幕的设备比纯音频设备更有机会。他兴奋地强调,Quora 的重要趋势是机器学习和人工智能。
问:在脸书和 Quora 工作过,是什么让一个团队成功?
答:个人需要擅长他们所做的事情:工程和设计等。但他们也要善于在一个团队中,否则团队无法存在。你如何解决问题很重要。团队应该围绕使命和价值观保持一致,团队中的一个人应该对决策负责,即使这意味着艰难的权衡。
问:最后,Quora 关注错别字吗?
甲:目前没有。显然,答案的质量不是基于拼写,而是基于社区提供的内容。因为用户被鼓励使用他们的真实姓名和学术证书,这增加了讨论的真实性。Quora 团队似乎对如何分析回复更感兴趣,也许是训练一台机器来阅读、分类和引用它们。
活动结束后,人们聚在一起喝酒和交流。我遇到一个人,他刚从多伦多搬到柏林,在一家金融科技加速器工作。柏林一直吸引着国际人才和演讲者。
对于即将到来的独角兽活动,请查看:【http://unicorn.berlin/events/
如果你要去柏林露天科技,亚当·安吉洛将于 7 月 12 日 13:15 在 1 号演播室发表演讲。信息此处。
The memorable, iconic logo of Unicorn Berlin
R-CNN,快速 R-CNN,更快 R-CNN,YOLO —目标检测算法
了解对象检测算法
介绍
计算机视觉是一个跨学科领域,近年来(自 CNN 以来)获得了巨大的牵引力,自动驾驶汽车占据了中心舞台。计算机视觉的另一个组成部分是对象检测。目标检测有助于姿态估计、车辆检测、监视等。对象检测算法和分类算法之间的区别在于,在检测算法中,我们试图在感兴趣的对象周围绘制一个边界框,以在图像中定位它。此外,在对象检测情况下,您可能不一定只绘制一个边界框,可能有许多边界框表示图像中感兴趣的不同对象,并且您事先不知道有多少个边界框。
您无法通过构建一个标准卷积网络,然后构建一个全连接层来解决这个问题的主要原因是,输出层的长度是可变的,而不是恒定的,这是因为感兴趣对象的出现次数是不固定的。解决这个问题的简单方法是从图像中提取不同的感兴趣区域,并使用 CNN 对该区域中物体的存在进行分类。这种方法的问题是感兴趣的对象在图像中可能具有不同的空间位置和不同的纵横比。因此,你将不得不选择大量的区域,这可能会在计算上爆炸。因此,像 R-CNN、YOLO 等算法已经被开发来寻找这些事件并快速找到它们。
R-CNN
为了绕过选择大量区域的问题, Ross Girshick 等人。提出了一种方法,我们使用选择性搜索从图像中提取 2000 个区域,他称之为区域建议。因此,现在,你可以只处理 2000 个区域,而不是试图对大量的区域进行分类。这 2000 个区域建议是使用下面写的选择性搜索算法生成的。
Selective Search:
1\. Generate initial sub-segmentation, we generate many candidate regions
2\. Use greedy algorithm to recursively combine similar regions into larger ones
3\. Use the generated regions to produce the final candidate region proposals
R-CNN
要了解更多关于选择性搜索算法的信息,请点击此链接。这 2000 个候选区域提议被扭曲成正方形,并被馈送到卷积神经网络,该网络产生 4096 维特征向量作为输出。CNN 充当特征提取器,输出密集层由从图像中提取的特征组成,提取的特征被馈送到 SVM 中,以对候选区域提议中的对象的存在进行分类。除了预测区域提议内对象的存在之外,该算法还预测四个偏移值,以提高边界框的精度。例如,给定一个区域提议,该算法将预测到一个人的存在,但是该区域提议中的那个人的脸可能已经被切成两半。因此,偏移值有助于调整区域提议的边界框。
R-CNN
R-CNN 的问题
- 训练网络仍然需要大量的时间,因为你必须对每幅图像的 2000 个区域提议进行分类。
- 它不能实时实现,因为每个测试图像需要大约 47 秒。
- 选择性搜索算法是一种固定算法。因此,在那个阶段没有学习发生。这可能导致产生坏的候选区域提议。
快速 R-CNN
Fast R-CNN
前一篇论文(R-CNN)的同一作者解决了 R-CNN 的一些缺点,以建立更快的对象检测算法,它被称为快速 R-CNN。该方法类似于 R-CNN 算法。但是,我们不是将区域建议提供给 CNN,而是将输入图像提供给 CNN,以生成卷积特征图。从卷积特征图中,我们确定建议的区域,并将其扭曲成正方形,通过使用 RoI 池层,我们将它们重新调整为固定大小,以便可以将其输入到完全连接的层。根据 RoI 特征向量,我们使用 softmax 层来预测建议区域的类别以及边界框的偏移值。
“快速 R-CNN”比 R-CNN 更快的原因是,你不必每次都向卷积神经网络馈送 2000 个区域提议。相反,每个图像只进行一次卷积运算,并从中生成特征图。
Comparison of object detection algorithms
从上面的图表中,您可以推断出快速 R-CNN 在训练和测试会话中明显快于 R-CNN。当您在测试期间查看快速 R-CNN 的性能时,与不使用区域建议相比,包含区域建议会显著降低算法的速度。因此,区域建议成为影响快速 R-CNN 算法性能的瓶颈。
更快的 R-CNN
Faster R-CNN
上述两种算法(R-CNN 和快速 R-CNN)都使用选择性搜索来找出区域建议。选择性搜索是一个缓慢而耗时的过程,会影响网络的性能。因此,任等人。提出了一种对象检测算法,消除了选择性搜索算法,并让网络学习区域建议。
类似于快速 R-CNN,图像作为输入被提供给卷积网络,该网络提供卷积特征图。不是在特征图上使用选择性搜索算法来识别区域提议,而是使用单独的网络来预测区域提议。然后,使用 RoI 池层对预测的区域提议进行整形,然后使用 RoI 池层对提议区域内的图像进行分类,并预测边界框的偏移值。
Comparison of test-time speed of object detection algorithms
从上面的图表中,你可以看到更快的 R-CNN 比它的前辈快得多。因此,它甚至可以用于实时物体检测。
YOLO——你只能看一次
所有先前的对象检测算法都使用区域来定位图像中的对象。网络不会看到完整的图像。取而代之的是图像中包含物体的概率较高的部分。YOLO 或你只看一次是一个对象检测算法,与上面看到的基于区域的算法有很大不同。在 YOLO,单个卷积网络预测边界框和这些框的类别概率。
YOLO
YOLO 的工作原理是,我们把一幅图像分割成一个 SxS 网格,在每个网格中我们取 m 个边界框。对于每个边界框,网络输出该边界框的类概率和偏移值。具有高于阈值的分类概率的边界框被选择并用于定位图像内的对象。
YOLO 比其他物体检测算法快几个数量级(每秒 45 帧)。YOLO 算法的局限性在于它会与图像中的小对象进行斗争,例如它可能难以检测到一群鸟。这是由于算法的空间限制。
结论
计算机视觉会议每年都在观察新的激进概念,我想我们正一步一步地走向人工智能令人瞠目结舌的表现(如果还没有的话!).只会变得更好。我希望这些概念在这篇文章中变得清晰,谢谢:)
参考
- https://arxiv.org/pdf/1311.2524.pdf
- 【https://arxiv.org/pdf/1504.08083.pdf
- https://arxiv.org/pdf/1506.01497.pdf
- https://arxiv.org/pdf/1506.02640v5.pdf
- http://cs 231n . Stanford . edu/slides/2017/cs 231n _ 2017 _ lecture 11 . pdf
r 代表 GTFS——获得每条线路每小时的行驶次数
我最近一直在 R 中处理 GTFS 文件,想分享一些我到目前为止学到的东西。
几周前,我的一个客户问我们是否可以根据一条线路每小时的行驶次数给他们的公交线路涂上颜色。为此,我首先要计算这个数字。
在本文中,我将解释如何使用 r 从 GTFS 中获取给定线路的出行次数。然后,我将展示如何将该信息导出到 Excel 并制作图表。
你可以从我的 GitHub 库获得完整的代码作为 HTML 或 R Markdown 。
什么是 GTFS?
如果你已经熟悉 GTFS,你可以跳到下一部分。
GTFS 代表“通用交通馈送规范”,是一个面向交通机构的世界知名开源标准。如果你属于公交行业,我敢肯定你已经知道你可以用它来管理信息的基本知识(这是公交机构如何与谷歌地图进行通信,等等)。如果你没听说过,想了解更多,推荐你看看他们的规格这里。
图书馆
如果您想完全按照本文中详细描述的脚本进行操作,您必须确保安装了以下库:
library(tidyverse)
library(pryr)
library(dplyr)
library(ggplot2)
您只需复制代码,在 RStudio 中运行它,就万事大吉了。
将数据导入 R
对于这篇文章,我使用了 GTFS 的 PTO(称为 EMT)公开提供的在这里。尽管如此,如果您愿意,您可以使用自己的 GTFS 来跟踪这篇文章。
一旦我们下载了文件,我们要做的第一件事就是把它导入到 r。因为 GTFS 文件实际上是。zip 文件,我们将使用下一个脚本对其进行解压缩,并将文件作为数据帧导入:
zip <- "/Users/santiagotoso/Descktop/transitEMT.zip"
outDir <- substring(zip, 1, nchar(zip)-4)dir.create(outDir)
setwd(outDir)
unzip(zip, exdir = outDir)trips <- read_csv("trips.txt")
routes <- read_csv("routes.txt")
stop_times <- read_csv("stop_times.txt", col_types= cols(arrival_time = col_character(), departure_time = col_character()))
第一行代码是映射 zip 文件的位置(您应该根据自己文件的信息来更改它)。然后,在第二行代码中,我们定义了以。zip 文件:我们获取整个字符串并保留除最后 4 个字符之外的所有内容。zip)。像那样,‘outDir’其实就是“/Users/santiagotoso/Descktop/trans item”。
在第三行中,我们创建一个目录,按照‘outDir’中的定义进行放置和命名。最后,我们解压文件并读取。txt 文件在里面。
现在我们有四个数据帧,每个数据帧对应这个练习的一个相关文件:行程、路线和停留时间。
请注意,当导入“停止时间”时,我们强制将“到达时间”和“离开时间”变量转换为字符。其原因是,有些行程发生在午夜之后,格式类似于 26:45 小时。这变成了 R 中的 NA,我们通过将它们设为字符来避免这种情况。我们稍后会处理它们。
到目前为止我们有什么?
如果你习惯于和 GTFS 一起工作,你可能不需要这个部分。如果您仍在学习如何使用 GTFS 文件,现在花一点时间看看我们拥有的每个文件的信息可能会有所帮助,它们如何相互连接,以及哪个文件包含我们需要的信息,以获得一条线路每小时的行程数。
- trips.txt: 该文件存储每个行程的高级信息。是 id,路线,方向,service_id,形状等。请注意,形状是由行程定义的,而不是由路线定义的。
- routes.txt: 该文件存储每条路线的信息。是 id,长短名,颜色等。
- stop_times.txt: 该文件存储每次行程的详细信息。更准确地说,每个行程的停靠点顺序以及每个停靠点的经过时间。它没有关于路线本身的信息,但是它通过 trip_id 与 trips.txt 相关。
总之,我们可以解释这三个文件之间的关系,如下图所示。
连接数据框
正如我们可以从上一节推断的那样,我们将从“stop_times”数据框中获得每小时的出行次数。棘手的是,在“stop_times”中,没有变量告诉我们行程的路线。要获得这些信息,我们首先要通过“旅行”。此数据框保存“行程标识”(出现在“停靠时间”)和“路线标识”(出现在路线中)之间的关系。
为了在同一个数据框中获得我们需要的所有信息,我们将从“停止时间”一直到“路线”遍历上图。
stop_times <- stop_times *%>%*
left_join(trips) *%>%*
left_join(routes) *%>%*
select(route_id, route_short_name, trip_id, stop_id, service_id, arrival_time, departure_time, direction_id, shape_id, stop_sequence)
首先,我们把停车时间和行程联系起来。此时,数据帧具有 route_id 和 trip_id。然后我们用“路线”把它连接起来。
最后,我们选择相关变量继续。你可以用’ head()'函数来看看最终的数据帧。
head(stop_times)
现在,我们有所有站点的通过时间(检查“stop_sequence”列)。但是我们只需要第一站来计算每小时的行程数。此外,考虑到旅行是往返的,我们只需要一个方向。如果没有,我们可能会复制每小时的旅行次数。
另外,请注意“到达时间”和“离开时间”是字符。这不允许我们用它们进行数学运算。
最后,‘service _ id’列告诉我们,在 GTFS 覆盖的时间段内,有许多不同的服务在运行。在计算每小时的行程数之前,我们需要选择一个。
在下一节中,我们将看到如何解决所有这些问题。
过滤和转换数据
选择具有更多行程的服务标识
为了解决上面列出的问题,我们可以首先从寻找我们想要使用的“service_id”开始。我们可以通过许多不同的方式来完成,如果您使用自己的数据,最有可能的是您已经知道要分析哪个服务。就本文的目的而言,只需要更多的旅行。
trips *%>%*
group_by(service_id) *%>%*
count(service_id) *%>%*
arrange(desc(n))
第一行按“服务标识”对行程进行分组。然后,我们计算每个“service_id”的旅行次数,最后,我们对它进行排序。
该数据集中最大的服务似乎是“LA ”,因此我们将在之后对其进行过滤。下面,我们将变量“bigger_service”定义为上面所示数据的第一行。
bigger_service <- trips *%>%*
group_by(service_id) *%>%*
count(service_id) *%>%*
arrange(desc(n)) *%>%*
head(1)
按服务标识、停止顺序和方向标识过滤
现在,我们可以过滤“停止时间”,以便只保留与我们的目的相关的信息。
为此,我们将只保留更多行程(LA)的“service_id ”,只保留每次行程的第一站和每次行程的一个方向。
stop_times <- stop_times %>%
filter(
stop_sequence == 1 &
direction_id == 0 &
service_id == bigger_service$service_id)
head(stop_times)
将字符转换成数字
现在,我们只保留了与我们的目的相关的数据,我们需要将“到达时间”和“离开时间”(或至少其中之一)转换成数字,以便我们对它们进行数学运算。
事实上,由于我们要计算每小时的旅行次数,我们并不真的需要分钟。我们只需要获得小时值,以便能够在以后对它们进行分组。这样,像“07:28:00”和“07:45:00”这样的字符将变成数字“7 ”,这足以让我们计算出从早上 7 点到早上 8 点每小时有两趟车。
如果我们只需要记下小时数,这就容易了。当我们发现超过 24 小时的数字时,棘手的部分就来了。在这种情况下,“25:00:00”实际上是指凌晨 1 点。为了解决这个问题,我们将进行改造。
stop_times <- stop_times %>%
mutate(
arrival_time = ifelse(
as.integer(substr(arrival_time, 1, 2)) < 24,
as.integer(substr(arrival_time, 1, 2)),
as.integer(substr(arrival_time, 1, 2)) - 24),
departure_time = ifelse(
as.integer(substr(departure_time, 1, 2)) < 24,
as.integer(substr(departure_time, 1, 2)),
as.integer(substr(departure_time, 1, 2)) -24)
)
head(stop_times)
现在看起来相当不错。请注意,我们必须运行“ifelse”条件来处理大于 24 的数字。如果是的话,我们从他们那里拿走了 24 个。就像这样,25h 变成 1h,这正是我们要找的。
另外,我们只记录了到达和离开的时间。现在,我们可以根据这些变量中的一个进行分组,并计算每个时间窗口中的旅行次数。
那么,每条线路每小时的行驶次数是多少?
我们的最后一步是计算每条线路每小时的行驶次数。感谢我们经历的所有麻烦,现在这将变得非常容易。
output_data <- stop_times *%>%*
group_by_at(vars(route_id, route_short_name, arrival_time)) *%>%*
count(arrival_time)head(output_data)
就在那里!我们现在知道了每条线路每小时的行驶次数。
尽管如此,我们可以把它变得更好。为此,我们将再次更改“arrival_time”的格式,从“6”更改为“6:00”。
output_data <- stop_times *%>%*
group_by_at(vars(route_id, route_short_name, arrival_time)) *%>%*
count(arrival_time) *%>%*
mutate(time_window = paste(arrival_time, '00', sep = ':')) *%>%*
select(route_id, route_short_name, arrival_time, time_window, n)head(output_data)
在下面几节中,我们将了解如何将这些数据下载到一个. csv 文件(可以用 Excel 打开),并使用 ggplot()为其中一条线制作条形图和折线图。
导出到 csv 文件
这个很简单:
write_csv(output_data, "/Users/santiagotoso/Descktop/transitEMT/trips_per_hour.csv" )
你只需要改变路径到你想要的方向。
创建每小时旅行次数的图表
在本节中,我们将看到如何创建一个条形图和折线图来显示一条特定线路每小时的行程数。
为此,我们要做的第一件事是过滤某一特定行的信息。例如,我将选择第 1 行。
line <- output_data *%>%*
filter(route_id == '001')View(line)
在绘制代表数字的字符(或者在这种情况下代表时间)时,重要的一点是对它们进行因式分解,以便它们作为数字进行排序。如果我们不这样做,它们将被排序为字符串(字符),这意味着我们将首先有 10:00,然后 11:00 等等,而不是 6:00。为了说明这一点,我在下面展示了如果我们现在进行因式分解之前(注意 x 轴),我们的图表会是什么样子:
为了避免这种不良行为,我们需要先分解“时间窗口”。
line$time_window <- factor(line$time_window, levels = unique(line$time_window))
条形图
现在我们已经分解了 x 轴,我们将使用 ggplot()制作一个条形图。
g_bar <- ggplot(data = line,
aes(x = time_window, y = n)) +
geom_bar(stat = 'identity')g_bar
就我个人而言,我喜欢我的图表更干净,更鲜艳一点。如果这也是您的情况,您可以使用下面的代码获得更好的结果。
g_bar <- ggplot(data = line,
aes(x = time_window, y = n)) +
geom_bar(stat = 'identity', fill = 'steelblue', color = 'steelblue') +
geom_text(aes(label = n),
vjust = -0.3,
color = "black",
size = 3) +
scale_fill_brewer(palette="Dark2")+
labs(title = paste('Trips by hour for route', line$route_short_name, sep = ' '),
x = "Time window",
y = '') +
theme(panel.grid = element_blank(),
panel.background = element_blank(),
axis.line.x = element_line(colour = "grey"),
axis.line.y = element_blank(),
axis.text.x = element_text(angle = 90, hjust = 1),
axis.text.y = element_blank(),
axis.ticks.x = element_line(colour = "grey"),
axis.ticks.y = element_blank(),
plot.title = element_text(hjust = 0.5)
)g_bar
折线图
我们将直接制作漂亮的图表,但请记住,您可以做更简单的版本,复制条形图的代码并将其更改为折线图。
g_line <- ggplot(data = line,
aes(x = time_window, y = n, group = 1)) +
geom_line(color = 'steelblue') +
geom_point(color = 'steelblue') +
geom_text(aes(label = n),
vjust = -0.8,
color = "black",
size = 3) +
scale_fill_brewer(palette="Dark2")+
labs(title = paste('Trips by hour for route', line$route_short_name, sep = ' '),
x = "Time window",
y = '') +
theme(panel.grid = element_blank(),
panel.background = element_blank(),
axis.line.x = element_line(colour = "grey"),
axis.line.y = element_blank(),
axis.text.x = element_text(angle = 90, hjust = 1),
axis.text.y = element_blank(),
axis.ticks.x = element_line(colour = "grey"),
axis.ticks.y = element_blank(),
plot.title = element_text(hjust = 0.5)
)g_line
结论
我们看到了如何将一个 GTFS 导入到 R 中并研究它。然后,我们研究了数据框架之间的关系,只保留了获得我们所寻求的洞察力所需的数据。
如图所示,用于从 GTFS 获得每小时旅行次数的数学和方法非常简单,不需要很深的数学知识,也不需要 R 语言。这是一个非常好的方式来开始学习 R,并探索你可以从你的 GTFS 中获得的一些见解。
你怎么想呢?对你有帮助吗?请让我知道你在下面评论的想法。
记住,你可以从我的 GitHub 库中获得原始代码、html 或 R Markdown 。
这篇故事最初发表于:https://www . LinkedIn . com/pulse/r-gtfs-getting-number-trips-per-hour-each-line-toso/?已发布=t