TowardsDataScience 博客中文翻译 2021(三百三十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

通过 Tala 的提升建模帮助逾期借款人还款

原文:https://towardsdatascience.com/helping-late-borrowers-repay-with-uplift-modeling-at-tala-a1541aceffe4?source=collection_archive---------32-----------------------

Tala 的数据科学团队如何通过提升建模改善借款人体验和业务 KPI

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

图片来自塔拉

这篇文章是对我关于隆起建模力学的深入研究的后续,有一个成功的例子。在这里,我描述了我们在 Tala 的数据科学团队如何应用提升模型来帮助逾期借款人偿还贷款。Tala 提供世界上最容易获得的消费信贷产品,通过一个智能手机应用程序,立即为从未有过正式信用记录的人承保,然后发放贷款。

介绍

在机器学习可以为企业创造价值的许多方式中,提升建模是鲜为人知的一种。但是对于许多用例来说,它可能是最有效的建模技术。在任何情况下,如果企业可以针对不同的客户有选择地采取代价高昂的行动,希望影响他们的行为,那么提升建模应该是找到受该行动影响最大的客户子集的有力候选。这对于在商业策略中最大化投资回报是很重要的。

在本帖中,我将概述我们在 Tala 通过抬升建模解决的业务问题、抬升模型的基础以及我们如何构建抬升模型、如何解释抬升模型的预测、如何扩展抬升概念以提供直接的财务见解,以及在生产中监控抬升模型性能的注意事项。

Tala 的用例:逾期借款人

当借款人贷款逾期时,他们会将自己的财务健康以及向他们放贷的企业的健康置于风险之中。Tala 联系逾期借款人并鼓励他们偿还贷款的主要手段之一是通过电话。然而,这是一个昂贵的过程,必须与电话呼叫将带来的预期收入增长相平衡:如果我们打电话给借款人,他们付款的可能性有多大?

从数学上来说,我们感兴趣的是由于打电话给借款人而提高的支付概率。这被定义为如果借款人被要求偿还和如果他们没有被要求偿还的可能性的差异。

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

作者图片

隆起建模的前提是,它可以帮助我们确定借款人谁将有最大的还款概率增加,如果给一个电话。换句话说,那些更有说服力的人。如果我们能够确定这些借款人,我们就可以更有效地优先考虑我们的资源,以最大限度地提高借款人和 Tala 的财务健康。

关注机会

现在我们知道了隆起建模的目标,我们如何实现它呢?提升模型依赖于随机、受控的实验:我们需要一个有代表性的样本,包括所有不同类型的借款人,一个是接到电话的治疗组,另一个是没有接到电话的对照组。

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

图片来自塔拉

一旦我们获得了这个数据集,我们观察到治疗组的借款人还款比例明显高于对照组。这提供了证据,证明电话是“起作用的”,因为平均而言,电话有效地鼓励了所有借款人的还款。这就是所谓的平均治疗效果 (ATE)。量化 ATE 是 A/B 测试的典型结果。

然而,可能只有治疗组中的一部分借款人对我们观察到的大部分 ATE 负责。举个极端的例子,也许治疗组中一半的借款人负责整个 ATE。如果我们有办法提前确定这部分借款人,他们会更容易对治疗做出反应,那么我们就能够将我们的电话资源集中在他们身上,而不是浪费时间在那些电话对他们几乎没有影响的人身上。我们可能需要找到其他方法来吸引不响应者。确定因人而异的治疗效果的过程取决于这些人的不同特质,这意味着我们在寻找条件平均治疗效果 (CATE)。这就是机器学习和预测建模发挥作用的地方。

构建和解释提升模型

在机器学习中,我们可以通过特征描述借款人之间的差异,这些特征是特定于一个借款人的各种数量。我们设计了与借款人付款历史相关的功能,以及过去电话通话和与 Tala 应用程序交互的结果。这些特征试图描述借款人还款的意愿和能力,以及他们对与 Tala 建立和维持关系的承诺。借款人会听取并向我们学习,并给我们机会向他们学习吗?

有了上面描述的特性和建模框架,我们就可以构建我们的提升模型了。我们使用了一种叫做 S-Learner 的方法。有关这方面的详细信息,请参见我之前关于隆起建模的博文。一旦构建并测试了 S-Learner,我们就在训练集上训练一个单独的回归模型,其目标变量为提升(给予治疗和不给予治疗的预测概率的差异),并且使用相同的特征来训练 S-Learner(除了治疗标志,它被认为是 S-Learner 方法中的一个特征)。使用该回归模型的测试集 SHAP 值,我们能够深入了解哪些模型特征对隆起预测的影响最大。

虽然这里的功能名称是匿名的,但对最具预测性的功能的解释都是有意义的,因为那些表现出支付意愿、有借款经验并可能想再次借款、愿意接受电话联系的借款人是值得鼓励通过电话还款的借款人。

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

隆起模型的 SHAP 值,表示影响预测的前五个匿名因素。特征是基于借款人的支付和通话记录。图片作者。

设计使用和监控模型的策略

知道预测的概率上升是我们模型导向策略的第一步。然而,我们感兴趣的不仅仅是某人付款的可能性有多大,还包括由于电话推广而可能增加的付款额。为了确定这一点,我们将概率的提高与借款人所欠金额和可能支付金额的信息结合起来。这将预测的概率上升转化为对由于电话呼叫而导致的收入上升的估计,使我们能够根据给借款人打电话的价值对借款人进行排名。

通过计算实际收入增长,可以看出根据预测收入增长对借款人进行排名所代表的机会,实际收入增长是不同预测收入增长箱的治疗组和对照组之间平均收入的差异。这种分析类似于此处详述的上升十分位数图表的想法。我们为此使用了模型测试集。

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

收入增长十分位数图:根据预测收入增长对账户进行排序时,治疗组和对照组之间平均收入的差异。图片作者。

结果表明,预测的收入增长有效地识别了电话呼叫更有价值的客户。通过呼叫所有借款人可获得的增量收入的一半以上可以通过仅呼叫以这种方式排名的前 10%的借款人来获得,而增量收入的 90%可以通过呼叫前一半的借款人来获得。事实上,当考虑每个借款人的平均电话联系成本时,显示为绿线,很明显只有前 50%的借款人打电话是有利可图的。

考虑到使用预测收入增长来指导电话拓展的明显机会,我们部署了该模型来指导我们的战略。为了监控部署后的模型性能,我们创建了两个小组,使我们能够在预测增长的整个范围内检查电话呼叫的真实增长。我们这样做是通过给随机选择的 5%的借款人打电话,不管他们的预期增长是多少,并且不给另外的 5%打电话。基于这些测试的结果,我们能够得出结论,使用这里和我的同伴博客文章中显示的相同类型的模型评估指标,模型在生产中按预期运行。

总之,提升建模允许 Tala 将还款工作集中在最容易接受这些工作的借款人身上,从而节省时间和金钱。我希望 Tala 关于隆起建模的经验对你的工作有所帮助。

原载于 2021 年 1 月 14 日【https://tala.co】

帮助您的孩子像数据科学家一样思考

原文:https://towardsdatascience.com/helping-your-kids-think-like-data-scientists-f218e7c24631?source=collection_archive---------39-----------------------

使用这些简单的活动来促进年轻学生的数据科学思维。

数据科学的未来取决于下一代。虽然数据科学工具箱中的许多工具非常复杂,远远超出了大多数儿童的理解能力,但我们可以通过一些方式开始在当今的年轻人中巩固数据科学思维、方法和实践。这是有利的,因为它有助于儿童在早期发展批判性思维技能。然而,这样做的困难在于,许多孩子不喜欢整天看数字,更重要的是,试图灌输对数学或哲学意义上的线性回归或聚类的理解是完全不可能的。只要有一点创意,就有可能减轻教授数据科学原理的困难,我决定在下面分享一些我自己的方法。

线性回归变得简单

线性回归是一种用于模拟两个变量之间关系的技术。它既简单又复杂。简单是因为它的应用和数学公式很容易表达。复杂是因为有许多规则决定了您是否正确地应用了线性回归。

Y = a + bX

其中 a 是截距(x = 0 时 Y 的值),b 是指直线的斜率(或直线的一步中预期的变化量),X 是你的自变量(也叫“解释变量”),Y 是你的因变量(你所测量的)。用通俗的话来说,这最好描述为:“给定我们对一个特定事件的全部知识,Y 与 X 的关系是什么?”回归对于估计未来值也很有用。如果你们的关系非常好,你可以在你的已知数据之外继续建立你的生产线。虽然这种方法看似简单,但上述信息对孩子来说并不容易消化。

然而,这里有一种非定量的解释线性回归的方法,这是我自己设计的,步骤如下:

  1. 拿一张纸和三到四种不同颜色的笔、蜡笔或马克笔(如果你想增加难度,可以添加更多颜色)。
  2. 在那张纸上画一个 X 和 Y 轴(你可以把它们标成我在图 1 中的样子)。

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

图一。活动设置示例显示 XY 线,并指向其上的图形(图片由作者制作)。

  1. 现在,您可以要求您的数据科学学生从图形的一端到另一端绘制一条线,同时在一条线上捕捉相同颜色的大多数点(参见图 2 中的示例)。
  2. 让他们描述变化(关系)是积极的还是消极的,然后你可以让他们计算在这些点上发生了多少变化。为了好玩,你可以让他们数出不在线上的点的数量,以及每个点在图上有多远。

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

图二。通过点绘制的线的例子说明了我们的两个变量之间的关系(图片由作者制作)。

对于非常年轻的学习者来说,这项技术可能需要相当长的时间才能掌握正确,但这是一种有趣的学习方式。毕竟,他们仅仅是在一堆点上画线而已!为了把事情搞混,你可以让它们从直线变成曲线(曲线回归)。本练习的要点应该是识别点内的模式、准确绘制线和捕捉最多的点,以及了解不在线附近的其他点如何影响整体结果。

集群变得简单

现在来看集群。有几种聚类方法。K-means 聚类,ward 的层次凝聚聚类,基于密度的聚类方法,最近邻,等等。虽然这些方法看起来很复杂,但它们都有一个目标,那就是根据给定数据集中的相似特征对信息进行分组。我个人认为最容易教的是最近邻聚类,因为它假设附近的值比那些相距较远的值更可能相似。K-means 聚类可能是我第二喜欢教的,因为它强调根据均值的相似性进行聚类(因此 5 个组每个都有自己的“质心”或分组值,所有相似的值都放在该组中)。

这里有一个简单的活动来帮助教授最近邻聚类和 k-means 聚类。最好使用一个写字板或者一个带手写笔的电子平板,但是纸和笔也可以。

  1. 用 4 或 5 种不同的颜色在一张纸上画尽可能多的点。您应该尽量保持每种颜色的点数相同,或者分成两组,每组多一个或两个点数(例如,6 个红色点数、5 个蓝色点数、4 个绿色点数、3 个紫色点数;参见图 3)。

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

图 3。举例说明你如何考虑在一张纸上随机分配你的分数(图片由作者制作)。

  1. 一些颜色相同的点应该彼此靠近。
  2. 指导您的数据科学学生用相同的颜色圈出彼此距离最近的点(表示最近的邻居;图 4a),并在具有相同颜色的组周围形成更大的圆(对于 k-均值;图 4b)。

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

图 4。在左边(4a ),我们可以看到在最近邻聚类技术下这些点是如何绘制的。在右边(4b ),我们看到如何使用 k-means 聚类技术绘制点(图片由作者制作)。

在此活动中,您不仅让学生了解了如何识别相似且彼此接近的点,还让他们了解了如何根据这些点的共同相似性对它们进行分组。你可以通过添加更多的颜色,增加点的数量,使点更密集(这将使组之间更难区分)来混合东西。

建模变得简单

在线性回归部分,我们讨论了一点建模,但是还有更多。建模的核心是构建现实生活事件的数学表示。这可能类似于监测温度的变化。由于我们已经使用了线性回归,我们也将使用它来练习建模。

  1. 使用您在线性回归活动中所做的相同设置。
  2. 让您的数据科学学生画线后,让他们评估线的终点当前位于何处(高值或低值)。
  3. 根据他们对直线和两个变量之间关系的了解,让他们画出直线下一步应该移动的点,然后让他们朝着新的点画直线(见图 5)。

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

图 5。一个事件建模的例子。在这种情况下,我们看到,随着冰淇淋数量的不断增加,需要吃冰淇淋的人数也在增加(图片由作者制作)。

  1. 为了使活动更加困难,你可以使一些点更加分散。

这项活动需要在年轻时就有敏锐的批判性思维,因为它需要对 X 轴和 Y 轴之间的关系有牢固的理解,以及在给定先验信息的情况下对线下一步应该移动到哪里的即时估计。通过以更随机和分散的模式绘制点,可以增加这一练习的难度,您也可以合并变量,例如全年的温度,这将需要曲线来拟合数据。此外,通过将点放置在远离预期位置的位置,然后仍然要求一条线(例如,由于点在图表上的分散性较大,因此很难确定线应该位于何处),也可能会在此练习中引入误差。

虽然上述练习不会使个人成为数据科学专家,但它有助于在早期增强数据科学技术知识,并增强批判性思维。人类擅长识别模式,人们越早开始运用这种技能,一旦他们接触到更难的概念、术语和方法,这种技能就会越强。

赫尔辛基城市自行车:探索性数据分析

原文:https://towardsdatascience.com/helsinki-city-bikes-exploratory-data-analysis-e241ce5096db?source=collection_archive---------24-----------------------

第一部分

介绍

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

插图由: pch.vector 上的 Freepik

什么是赫尔辛基城市自行车?

赫尔辛基城市自行车是赫尔辛基和埃斯波大都会地区向公众提供的共享自行车。赫尔辛基城市自行车系统的主要目标是解决所有分销网络中存在的所谓的最后一英里问题。城市自行车于 2016 年作为试点项目推出,赫尔辛基只有 46 个自行车站。在受到市民欢迎后,赫尔辛基市决定逐步扩大自行车网络。在 2017 年至 2019 年期间,每年约有一百个台站加入网络。到 2019 年,自行车网络达到完整状态,2020 年仅增加 7 个站点。截至 2020 年,赫尔辛基和埃斯波共有 3510 辆自行车和 350 个站点。

自 2016 年以来,已经进行了超过 10,000,000 次乘坐。行程总距离为 25.291.523 公里。客观地说,2530 万公里是到月球距离的 65 倍。所有居民骑自行车的总时间约为 280 年零 4 个月。

为了使用城市自行车,市民购买一天、一周或从 4 月到 11 月的整个自行车季节的使用权。所有通行证包括不限次数的 30 分钟自行车骑行。额外支付 1€/小时的费用,您可以使用自行车更长时间。自行车被取走并送回位于赫尔辛基和埃斯波周围的站点。

探索性数据分析

数据集结构

基础数据集具有以下结构。

底层数据集可以在 这里 下载。

一般的游乐设施是什么样的?

自 2016 年以来,城市自行车系统有了显著增长,然而,城市自行车的使用方式没有发生实质性变化。如果我们看看过去 5 年中的个人出行,我们会发现平均乘车时间约为 13 分钟,而平均行驶距离约为 2242 米 (1.4 英里)。鉴于数据的右偏分布,平均值略有偏差,大多数行程实际上持续 4-8 分钟,距离为 1700 米(约 1 英里)。

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

**左:**2016-2020 年出行距离分布。**右图:**2016-2020 年间的乘坐时长分布。图片由作者提供。

正如我们在上面看到的,绝大多数游乐设施都不到 30 分钟。然而,3.2%的用户最终超过了半小时的限制。那些超过 30 分钟限制但没有超过 60 分钟限制的用户集体付费是 €261.715 自 2016 年城市自行车推出以来。

城市自行车什么时候使用?

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

2016 年至 2020 年间的每日自行车出行次数。图片由作者提供。

上面你可以看到自城市自行车系统推出以来的每日自行车出行次数。正如我们所见,扩大网络覆盖范围对市民出行数量有着巨大的影响。也可以看出,2020 年是自行车使用率下降的第一年。有多种可能的解释。这种下降可能是由于新冠肺炎疫情或因为城市自行车网络达到了其增长阶段的结束。

如果我们看下面的热图,我们可以看到一个很好的日常使用模式。最密集的自行车使用发生在工作日的 6:00 至 8:00 和 16:00 至 18:00。这表明自行车在工作日的开始和结束时被通勤者积极地使用。

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

该热图显示了 2016 年至 2020 年期间工作日和一天中的小时数。图片由作者提供。

然而,在周末,使用模式是不同的。看起来赫尔辛基斯的市民更喜欢晚一点开始周末。最活跃的时段是 15:00-17:00。有趣的是,周末午夜时分,城市自行车的使用率更高。这可能意味着在周末,当其他形式的公共交通不再可用时,城市自行车被用作替代品。

由于通勤者积极使用城市自行车,很自然地认为 Covid 疫情和向远程工作的过渡对城市自行车的使用产生了一些影响。下图显示了过去三年(2018 年至 2020 年)的自行车使用模式。

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

2018-2020 年自行车使用热图。图片由作者提供。

这些图表已经说明了 2020 年自行车使用模式的一些差异。除了自行车总使用量的减少,高峰时间的出行次数也减少了。

哪个站最受欢迎?

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

左:2016 年以来出发最受欢迎的前 20 个车站右:2016 年以来返回最受欢迎的前 20 个车站。图片由作者提供。

可以预料,并非所有的站都被同等地使用。2016 年,紧邻 Kamppi 地铁站(赫尔辛基市中心)的车站是最受欢迎的。然而,自 2017 年以来,itmerentori 已成为无可争议的使用冠军。将 itmerentori 和 nlahdenkatu 视为最受欢迎的车站可能会令人惊讶,但是,这种受欢迎程度是由它们在城市自行车网络中的位置来解释的。虽然这些车站并不在赫尔辛基的中心,但它们都聚集在自行车网络的“中心”周围。2016 年,当有不到 50 个站时,Kamppi 处于网络的结构中心。然而,随着网络向赫尔辛基北部扩展,自行车网络的中心也向北移动。因此,itmerentori 和 nlahdenkatu 站在整个网络中发挥了更“重要”的作用。

可能影响该列表的一个边界条件是给定站点中的自行车可用性。如果没有自行车可用,那么数据集将不会反映自行车的需求,而是反映自行车的可用性。itmerentori 和 nlahdenkatu 站之所以热闹,是因为它们是出发和返回的热门车站。这确保了自行车随时可用,并增加了车站的使用率。

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

2020 年热门始发站热图。互动版可以在 这里找到 。图片由作者提供。

另一个有趣的观察是,自行车站的受欢迎程度在一年中没有实质性的变化。这种趋势在上面的动画热图中得到了说明。

哪些旅行最受欢迎?

下表显示了前 6 个最常见的始发地-目的地对。前两行说明了城市自行车在阿尔托大学校园中的重要作用。自从阿尔托大学旁边的地铁站开放以来,城市自行车成为连接校园住宅和交通枢纽的重要交通流。

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

2016 年以来的热门出发地-目的地对。图片由作者提供。

下面的热图显示了 2016 年和 2020 年的始发地-目的地配对及其出现频率。如前所述,扩大城市自行车网络对整体使用模式有巨大影响。

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

左:【2016 年始发地-目的地热图右:【2020 年赫尔辛基城市自行车网络始发地-目的地热图。图片由作者提供。****

与芬兰国旗的任何相似之处纯属巧合。

天气会影响城市自行车的使用吗?

一个直观的假设表明,气温和城市自行车的使用之间应该有联系。下图说明了大多数游乐设施发生在气温在 10 到 21 度之间的时候。

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

乘坐次数与平均温度。图片由作者提供。

然而,没有足够的证据可以肯定地得出骑自行车与气温有关的结论。鉴于可能影响游乐设施的潜在因素众多,无法确定这些测量值之间的具体因果关系。例如,在赫尔辛基,气温可能很高,但可能伴随着降雨或高风速。图表中显示的趋势可能是其他外部因素的结果。不幸的是,底层数据集不包含关于其他环境因素的信息。

此外,重要的是要注意,城市自行车是从四月到十月,而不是全年。这意味着自行车的使用,一般来说,总是会发生在大致相同的温度范围内。较冷的温度将与自行车使用量通常较低的骑行季节的开始和结束相一致。另一方面,夏季和七月假期的气温将会变暖。有趣的是,在这个时间段内的所有假期中,只有**https://fi.wikipedia.org/wiki/Juhannus(仲夏)对城市自行车的使用有明显的影响(如下图)。**

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

2017–2020 年的每周乘坐次数。图片由作者提供。

结论

在这篇文章中,我们通过描述性统计的视角来观察赫尔辛基的城市自行车系统。本文仅仅触及了可以在底层数据集上执行的所有可能分析的表面。那些对自己的探索感兴趣的人可以在 Kaggle 上找到数据集。文章的第二部分 将赫尔辛基城市自行车系统作为一个复杂的交通网络进行分析。

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

Jupyter 笔记本

这篇文章背后的代码可以在这里找到:

赫尔辛基城市自行车:网络分析

原文:https://towardsdatascience.com/helsinki-city-bikes-network-analysis-512cc7f121cd?source=collection_archive---------26-----------------------

第二部分

本文的 第一部分 从描述性统计的角度看赫尔辛基城市自行车系统。在本文中,城市自行车系统将作为一个复杂网络来分析

介绍

在过去的几十年里,运输系统通常被作为网络来分析。这种抽象允许减少可用的信息量,并主要关注底层系统的内部结构。

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

左图:柯尼斯堡地理地图。右图:卡米洛·西特,现代城市规划的诞生(1986)

这个想法当然不是 数学 或者 城市规划 中的。然而,计算技术和 GIS 框架的最新进展使得图论思想在地理移动性领域的新的实际应用成为可能。

在交通运输的背景下,术语网络指的是位置系统内的路线框架,被识别为节点。路由是两个节点之间的单个链接,这两个节点是更大网络的一部分,该网络可以指有形的路由(如公路和铁路)或不太有形的路由(如空中和海上走廊)。

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

赫尔辛基城市自行车网络 2020。图片由作者提供。

运输网络通常表示永久性的物理轨道,如公路和铁路,或者定期服务。与集体交通(定期巴士和火车)不同,个人交通(步行、自行车共享)按需发生,在空间上更加灵活。由于这一点,共享移动系统拥有巨大的自我组织https://en.wikipedia.org/wiki/Self-organization#:~:text=Self-organization%2C also called (,control by any external agent.**的潜力。需要强调的是,城市自行车网络的边缘不是预先确定的,它们是由用户生成的。于是,网络的结构 从穿过城市的人流中浮现 **。居民的重复出行逐渐形成了使用模式,并形成了自行车共享网络的结构。反过来,该信息可以用于网络发展的反馈回路中。自行车需求的上升或下降可以提供对某些地区更广泛的社会、经济和地理因素的洞察。下图显示了 2020 年赫尔辛基不同地区的自行车使用情况。

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

2020 年按用途划分的始发站。互动版可以在 这里找到 。图片由作者提供。

正如所料,赫尔辛基市中心是地理流动性最活跃的地区。然而,正如本文第一部分所指出的,赫尔辛基的地理中心和赫尔辛基自行车网络的中心并不相同。

赫尔辛基城市自行车网络的中心在哪里?

网络中心性度量

根据定义,复杂网络是高度异构的结构。这通常导致网络的某些部分比其他部分信息更丰富。例如,在社交网络中,一些人可能有大量的联系,可以比其他人更快地传播信息。因此,在社交网络分析%20that%20connect%20them.)的上下文中,代表它们的节点被认为更重要(中心)。在交通网络的背景下,人口流入量高于其他地区的城市区域可被视为中心区域。然而,给定网络的中心性可能会随着时间的推移而改变,这是底层系统增长和演变的结果。因此,中心性的定义不是绝对的,而是取决于特定的上下文和抽象的目的。考虑到这种相关性,已经提出了几种集中于节点之间不同类型关系的中心性度量。

程度中心性

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

节点 I 的 C D( i )度中心性

度中心性 是理解和计算最简单的中心性度量。节点的“度”是指给定节点所连接的节点的数量。在城市自行车的上下文中,这指的是用户从目标站点前往的自行车站点的数量。正如我们在下图中看到的,位于赫尔辛基市中心的车站有更多的连接。越靠近网络的外围,节点的度数逐渐减小。

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

图片由作者提供。

赫尔辛基城市自行车网络中一个节点的平均度162 。这意味着一个自行车站平均连接到 162 个不同的站点。中心度最高的站是:

**Haukilahdenkatu:**    312 connections
**Paciuksenkaari**:     272 connections
**Huopalahdentie**:     267 connections 
**Laajalahden aukio**:  262 connections
**Munkkiniemen aukio**: 262 connections
**Töölöntulli**:        260 connections
**Tilkanvierto**:       259 connections
**Paciuksenkatu**:      258 connections
**Pasilan asema**:      258 connections 
**Esterinportti**:      256 connections 

Haukilahdenkatu 站在这个名单的首位,这一事实表明来自不同地区的大量市民定期往返于这个车站。

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

图片由作者提供。

这可能意味着该车站要么靠近大型交通枢纽,要么靠近重要的兴趣点。快速谷歌搜索会发现它位于一个大型教育机构和一个劳动改造中心的街对面。这解释了旅行的规律性和来自不同郊区的人口流入。

中间中心性

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

其中 gjk 是连接单元 jk 的测地线的数目, gjk ( i )是单元 i 占据中间位置的那些测地线的数目。

中间中心性捕获了给定节点有多少处于其他节点之间。该度量计算网络中所有节点之间的最短路径,并根据经过目标节点的最短路径数为每个节点分配一个度量。下图通过中间中心性展示了城市自行车站点。

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

图片由作者提供。

具有最高介数中心性的节点代表 Lehtisaarentie 站。这是地理限制影响空间网络结构的一个典型例子。该站位于 Lehtisaari 岛上,将阿尔托大学校园与 Munkkiniemi 和赫尔辛基连接起来。由于赫尔辛基群岛的特殊性,从一个城市到另一个城市的交通流量主要通过位于两者之间的岛桥系统。这使得 Lehtisaari 岛和 Lautasarri 岛成为连接埃斯波市和赫尔辛基的重要交通枢纽。

接近中心性

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

接近中心性是一种检测能够在网络中有效分配流的节点的方法。接近中心性计算为其所有 测地线距离 的归一化平均值。在城市自行车的上下文中,具有高接近中心性的节点将指示可能充当网络内的多功能中间站的站。

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

图片由作者提供。

如上图所示,大量车站直接连接到 Haukilahdenkatu 车站。这导致 Haukilahdenkatu 站在网络中具有最高的接近中心度。具有高接近中心性的其他节点位于托洛和帕西拉地区。对于网络优化,特别是对于较大的网络,接近中心性可能是有趣的度量。在更大的自行车共享网络中,用户可能会在中间自行车站停车,以避免额外的费用。然而,正如我们在本文前面所看到的,长途旅行在赫尔辛基并不常见。

特征向量中心性和 PageRank

特征向量中心性度量节点在网络中的重要性,同时考虑其邻居的重要性。与到低得分节点的同等连接相比,到高得分特征向量中心性节点的连接对得分的贡献更大。换句话说,如果具有大量连接的节点的所有连接都是低得分节点,则该节点可能具有低特征向量得分。特征向量中心性的一个流行变体是 Google 的 PageRank 。从本质上讲,PageRank 是归一化特征向量中心性与随机跳跃 s 相结合的变体。因此,Pagerank 产生与特征向量相当的结果也就不足为奇了(下图)。使用这种方法,中央火车站、Pasila、Lehtisaarentie 和 Haukilahdenkatu 等车站将作为网络的中心节点出现。

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

图片由作者提供。

特征向量和 PageRank 在城市环境中的应用是一个持续争论的主题。有人提出,这些在城市环境中应用的指标往往会导致误导性的结果,因为它们忽略了许多可能有助于城市内节点重要性的城市品质。虽然这些限制在服务路线是预先确定的集体运输系统中可能是一个问题,但这肯定不是个体运输的情况。如前所述,个人交通网络的结构是由用户生成的,因此其中已经嵌入了一些关于城市质量的信息。事实上,用户有选择权,选择走一条路而不是另一条路,这就产生了一种琐碎的投票机制,对城市的不同区域进行评级。因此,在这种网络中,对网络结构的研究也是对用户行为及其更好的城市品质的研究。此外,单个交通网络中的特征向量中心性不仅可以突出显示重要的单个节点,还可以突出显示城市中地理位置重要的区域。这是可能的,因为它不仅承认单个站的重要性,而且承认与其相邻的站的重要性。特征向量中心性表明,城市自行车站点(节点)的重要性与其说来自它们的固有属性(位置、站点大小),不如说来自它们与网络中其他节点 的 关系。中心站和与其相邻的节点一起形成小的活动飞地。复杂网络环境中这种节点分组的识别通常被称为社区检测。

社区检测

网络中的社区指的是内部紧密连接的节点组。社区发现通常是理解复杂网络结构的关键过程。在城市自行车网络的情况下,社区检测可以帮助更好地了解自行车使用模式,并确定适当的定价模型。有许多算法可用于社区检测。

组合方法

大多数现有的社区检测策略迭代地执行以下操作之一:合并两个小社区(凝聚的),将一个大社区分成两个(分裂的),在两个不同的社区之间移动节点。在 麻省理工学院明智城市实验室 开发的 组合 算法将所有三种策略组合成一个序列。创建初始单个社区后,对于每个源社区,计算所有源节点的最佳可能重新分布,然后应用最佳分组。这些步骤反复重复,直到达到给定的适合度标准。下图说明了应用于赫尔辛基城市自行车网络的组合方法。

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

应用于赫尔辛基城市自行车网络的社区检测组合方法。图片由作者提供。

这一分组揭示了两个截然不同的社区,它们大致按照现有的市政区划分开。这可能不是非常有用的信息,因为这种划分仅仅通过看地图就可以假定。基于本文的第一部分,直观的理解表明,自行车更有可能在短距离的城市内使用。因此,如果存在其他社区,它们应该在更局部的范围内被发现。

卢万法

由于先前的社区检测方法没有产生深刻的结果,我们可以应用专门关注网络的 模块性 的不同方法。 Louvain 社区检测由于其漂亮的简单性和计算效率而成为很好的候选。它有效地处理了所有社区检测任务中存在的图 的 最大割的 NP 完全可计算性问题。将 Louvain 方法应用于赫尔辛基城市自行车网络揭示了四个不同的社区。

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

卢万社区检测方法在赫尔辛基城市自行车网络中的应用。图片由作者提供。

这意味着这四个社区内的自行车使用率高于这四个社区之间的自行车使用率。具有高介数中心性的节点通常是社区可能被分成模块的地方。如果我们回到我们的中间中心图,这种关系将变得更加明显。社区的边界大致通过具有高介数中心性的节点。此外,考虑到赫尔辛基群岛的地理特征,这种划分并不令人惊讶。大块陆地和它们被大片水域分割开来,对群落的形成有重大影响。必须强调的是,所有交通网络都是空间网络,其结构和演变与物理限制密切相关。一个有趣的发现是,Leppavara 地区尽管是 Espoo 市的一部分,但它与 Munkiniemi 和 pitjnmaki 的联系比与 Otniemi 或 Tapiola 地区的联系更紧密。类似的趋势也可以在索宁附近的一些站点看到,这些站点与 Herttoniemi 区域的连接更加紧密。

****流体群落

流体群落算法是一种基于在非均匀环境中引入多种流体的思想的群落检测算法,在非均匀环境中,流体将在环境拓扑的影响下膨胀并相互推动,直到达到稳定状态。该算法执行以下操作。首先,它定义了图中随机节点的每个起始社区。然后,该算法以随机顺序在所有节点上迭代,基于每个节点自己的社区及其邻居的社区来更新每个节点的社区。这个过程反复执行,直到收敛。

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

应用于赫尔辛基城市自行车网络的社区检测的流体方法。图片由作者提供。

我们可以看到,流体群落检测方法确认了用 Louvain 方法识别的群落,并识别了一个额外的群落。

  • Eastern Espoo(Magenta 社区)是一个独特的社区,受地理条件的限制,沿着地铁线向西延伸。
  • leppvaara、pitjanmaki、Munkiniemi 和 Etelä Haaga(绿色社区)形成了另一个自行车社区,尽管市政分区将这些地区分开。
  • 瓦利拉、Kapyla 和 Oulunkyl 地区形成了另一个群体(粉色社区),通过中央公园与绿色社区隔开。这个社区沿着赫尔辛基北部的铁路延伸。
  • 赫尔辛基南部(蓝色社区)包括赫尔辛基的地理中心和主要车站,如 Kammpi、中央火车站,并向南部海岸线延伸。
  • 与此同时,Herttoniemi 位于另一个飞地(黄色社区)的中心,该飞地沿着地铁线从 Sornainen 延伸到 Vuosaari。

结论

在文章的这一部分,赫尔辛基城市自行车网络作为一个复杂网络进行了简要分析。对网络应用了多种中心性测量,并确定了重要的中心。树社区检测算法揭示了网络中节点的不同可能分组。文章的下一部分将着眼于如何应用机器学习方法来进一步增强对网络内关系的理解。

Jupyter 笔记本

这篇文章背后的代码可以在这里找到:

**https://github.com/Geometrein/helsinki-city-bikes

参考

这就是 SQLAlchemy 如此受欢迎的原因

原文:https://towardsdatascience.com/here-is-the-reason-why-sqlalchemy-is-so-popular-43b489d3fb00?source=collection_archive---------8-----------------------

将 flask 应用程序直接连接到 postgresql 数据库的权威指南,它将帮助您理解为什么 SQLAlchemy 是将 python 应用程序连接到关系数据库的首选方式

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

卡斯帕·卡米尔·鲁宾在 Unsplash 上的照片

介绍

有两种方法可以将 python 应用程序连接到关系数据库:低级方法和高级方法。低级方法包括在本地机器上安装和设置关系数据库管理系统,并编写实际的 SQL 命令来执行数据库操作。另一种方法是使用对象关系映射器(简称 ORM)。ORM 是一个数据库抽象层,是您和数据库引擎之间的中介。它允许您定义常规的 Python 对象和方法,并将其翻译成低级 SQL 数据库指令。SQLAlchemy 是 python 中处理关系数据库的 ORM 选择。

SQLAlchemy 如此受欢迎的原因是因为它实现起来非常简单,可以帮助您更快地开发代码,并且不需要 SQL 知识就可以开始。这也是为什么网上几乎所有的编程教程和课程都在教授高级方法。大多数执业软件工程师似乎也更喜欢使用 SQLAlchemy。

本文是一篇教程,介绍如何在不使用 SQLAlchemy 的情况下将一个简单的 flask 应用程序连接到 postgresql 数据库。是的,你没看错,所以我来告诉你:一旦你理解了如何使用数据库这种低级方法,你不仅会对 SQLAlchemy 有更深的理解,而且会真正理解在你使用它时幕后发生了什么!

我们的研究将涉及构建一个 web 应用程序,它通过一个表单接收用户输入,并将其存储在 postgresql 数据库中。我们开始吧!

步骤 1:项目设置

创建一个项目目录,在终端中导航到该目录,然后为项目创建一个虚拟环境。激活虚拟环境后,安装 flask 和 psycopg2。psycopg2 是 python 中最流行的 PostgreSQL 适配器。它允许您直接从 python 代码访问本地机器上的 postgresql 数据库。确保将您在虚拟环境中安装的所有 python 包写入 requirements.txt 文件。

$ py -3 -m venv venv
$ venv/Scripts/activate
$ pip install flask
$ pip install psycopg2
$ pip freeze > requirements.txt

你也可以继续创建一个名为 app.py 的空 python 脚本,一个名为 templates 的文件夹,以及一个名为index.html的空白 html 文档。项目文件夹的结构应该如下所示:

|- app.py
|- requirements.txt
|- templates
   -index.html
|- env

步骤 2:创建数据库

您需要在本地机器上安装 postgres。你可以从 https://www.postgresql.org/download/.下载适合你操作系统的版本

安装完成后,运行 postgres 的 SQL Shell(psql)并进入数据库服务器。如果您使用默认设置安装 postgres,您可以将所有字段留空(每次只需按 enter 键,以便选择器移动到下一个字段),并且只需输入您选择的密码。当 SQL Shell 终端在前面加上数据库名称(默认情况下应该是默认的 postgresql 数据库,postgres=#)时,您将知道您在数据库服务器中。

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

SQL Shell (psql)截图(作者自己的)。

如果你愿意,你可以使用默认的“postgres”数据库作为你项目的数据库,但是我更喜欢创建我自己的数据库。要在服务器上创建数据库,请在 SQL shell 中运行下面显示的命令。这个命令指示服务器创建一个名为 python_app 的数据库。确保不要忘记命令末尾的分号,否则命令不会执行。

postgres=# CREATE DATABASE python_app;

服务器将用一条确认消息作出响应,表明它创建了一个数据库。要查看服务器上的所有数据库,请运行下面显示的命令。您应该看到 python_app 被列为存储在服务器上的数据库之一。

postgres=#\l

这就是我们将在 SQL Shell 中完成的所有工作。其余的数据库操作(创建表和添加条目等)将在我们的 python 应用程序中执行。

步骤 3:从 python 应用程序连接到数据库,并创建一个用户表

在您的 app.py 文件中,导入 psycopg2 模块。您还希望从 psycopg2 导入 Error 对象,以便可以直接在 python 代码中处理任何数据库错误。

psycopg2 模块公开了一个 connect()方法,该方法将用于在 SQL Shell 中登录 postgres 数据库服务器的参数的键值对作为参数:主机、数据库、端口、用户、密码。connect()方法的输出是一个 connection 对象,它允许您创建到 postgres 数据库的连接。一旦建立了连接,您需要某种方式来告诉数据库要执行哪些 SQL 命令。这就是光标对象的用武之地。connection 对象公开了一个 cursor()方法,该方法可用于创建一个 cursor 对象,该对象的任务是执行您希望数据库执行的任何 SQL 命令。

使用 python 代码连接到 postgres 数据库的工作流如下:

  1. 创建连接对象
  2. 使用 connection 对象创建一个游标对象
  3. 使用游标对象执行 SQL 命令
  4. 关闭游标对象和数据库连接

由于此工作流涉及到与外部系统的连接,因此一个好的做法是在 try-catch-finally 块中实现此工作流,以便您可以处理由于连接问题或代码中的错误而引起的任何异常。

在数据库上执行 SQL 命令是一个两步过程:首先通过 cursor 对象的 execute()方法将查询字符串传递给它。然后,您必须使用连接对象的 commit()方法将 SQL 命令提交给数据库,以使更改反映到数据库中。您可以将“cursor.execute()”理解为“git add x ”,将“connection.commit()”理解为“git push”。

我发现首先将查询字符串定义为一个变量,然后将其作为一个参数传递给 execute 方法更容易,但是如果您愿意,也可以将完整的查询作为一个参数来编写。

在数据库中创建一个用户表的代码如下所示。要告诉数据库创建一个表,您可以使用命令关键字“CREATE TABLE ”,后跟表的名称,然后在参数中输入组成表的列的名称。每一列都有定义其预期数据类型和约束的关键字。

如果代码运行成功,postgres 服务器上的 python_app 数据库现在应该包含一个 users 表。要确认这一点,您可以打开 SQL shell 并访问 python_app 数据库,然后运行\dt命令来查看该数据库中的所有表。如果您想查看您定义的所有列及其约束,您可以运行\d users命令。同样,如果出于某种原因,你想从数据库中删除这个表,你可以运行DROP TABLE users;命令。最后,如果您发现自己在默认的 postgres 数据库中,您可以通过运行`\c python_app``命令轻松切换到 python_app 数据库。

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

SQL Shell 的屏幕截图,确认已经创建了 users 表(作者自己的)。

步骤 4:创建一个简单的 flask 应用程序来呈现注册 web 表单

首先实例化一个 flask 应用程序对象。接下来,定义一个路由和视图函数,该函数将处理对 webform 的 url”的请求。当用户提交表单时,这个视图函数应该在收到 GET 请求时呈现表单,在收到 POST 请求时处理表单。处理部分暂时留为空白,因为我们将在下一步中定义它。

您的 app.py 文件代码应该如下所示:

您的index.html文件应该包含以下代码:

在终端中运行命令$ python app.py以调试模式打开 flask development server。在您的浏览器中访问网址[http://127.0.0.1:5000/](http://127.0.0.1:5000/)应该会打开注册表。

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

报名表截图(作者本人)

我们现在有了一个在浏览器中呈现的表单,它允许用户向服务器提交输入,但是在用户按下 submit 按钮后什么也没有发生。让我们改变这一点。

步骤 5:将用户输入存储在数据库中

首先定义一个名为“add_new_user”的函数,它接收一组用户数据(姓名、电子邮件、散列密码)并将其写入数据库。

然后修改视图函数,以便当接收到“POST”请求时,它调用“add_new_user”函数,以便将数据保存到数据库中。

当您填写注册表单并按 submit 时,该信息应该被写入您本地机器上的 postgres 数据库!为了确认这一点,打开 SQL shell 并访问 python_app 数据库。要查看给定数据库表中的数据,您需要运行查询。因为我们想要查看存储在 users 表中的所有数据,所以我们将运行SELECT * FROM users;

您应该看到您在表单中输入的详细信息被捕获为 users 表中的一个新条目。

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

数据库中新条目的截图(作者自己的)

完整代码

为了方便起见,完整的 app.py 代码如下所示:

与 SQLAlchemy 的比较

这是使用 SQLAlchemy 的相同应用程序的外观:

结论

现在你知道了。一个简单的 flask 应用程序,它直接连接到 postgres 数据库来存储用户信息。如您所见,使用这种方法写入数据库是一个非常繁琐的过程。尽管非常可行,但它并不十分 pythonic 化。

SQLAlchemy 允许您继续以您习惯的方式编写代码,即使是在使用数据库时。您定义了一个表示特定实体类型的类,并直接映射到数据库中的一个表。您定义的所有类属性都映射到表中的列,然后该类的任何实例都作为表中的新条目存储在数据库中。使用 SQLAlchemy 会产生更简单、更清晰的代码,编写起来会更快。现在您知道为什么 SQLAlchemy 是 python 中处理数据库的实际方式了吧!

以下是 OpenAI Codex 将如何革新编程(和世界)

原文:https://towardsdatascience.com/heres-how-openai-codex-will-revolutionize-programming-and-the-world-e8432aafc5f7?source=collection_archive---------4-----------------------

观点,人工智能|新闻

“Codex 接近于我们大多数人真正希望从计算机中获得的东西——我们说我们想要什么,他们就做什么。”—山姆·奥特曼

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

布鲁克·卡吉尔Unsplash 拍摄的照片

直到现在,如果我们想与计算机交流,我们必须学习它的语言。我们必须适应它。从现在开始,计算机将适应我们

OpenAI 又做到了。去年 7 月,他们发布了同类产品中的首款 GPT-3 。这个人工智能系统展现了前所未有的语言能力。模仿莎士比亚的诗歌天才,用李尔·韦恩的风格写一首关于哈利波特的说唱歌曲,或者写一些生产力文章,这些都是 GPT 3 的能力。

当时,GPT-3 是有史以来最大的神经网络。对于 OpenAI 和世界其他地方来说,考虑到其他人迅速效仿他们的例子,很明显,大型预训练语言模型是人工智能对人类语言秘密的答案。

然而,GPT 3 号拥有一些甚至连 OpenAI 的研究人员都没有想到的能力。沙里夫·沙米姆是第一批注意到 GPT-3 编码技巧的人之一。他成功地让系统构建了一个生成器,由为他编写代码。世界正处于我们这个时代最重要的人工智能革命之一的边缘。

上个月,OpenAI 与微软和 GitHub 合作,推出了 GitHub Copilot ,这是一个人工智能对程序员,旨在帮助开发人员完成枯燥的日常任务。阅读文档?副驾驶会帮你做的。编写单元测试?副驾驶会帮你做的。这个系统就像一个超级强大的自动完成功能。它是由 OpenAI 的最新明星:Codex 推动的。

GPT 3 的弟弟 Codex 是另一种语言模型。但是,法典委员会不是像 GPT-3 那样的万金油,而是大师。编码大师。它精通数十种编程语言,可以理解自然语言,并解释它来创建计算机可以理解的明确命令。

昨天,OpenAI 通过一个新的 API 发布了新版本的 Codex(我们可以通过在一个等待列表上签名来访问它)。他们还创造了一个新的挑战,在这个挑战中,人们将与 Codex 一起编码(你可以在这里注册)。除此之外,两位知名 OpenAI 研究人员 Greg Brockman 和 Ilya Sutskever 进行了一次现场演示,展示了 Codex 的能力,并暗示了它目前的潜力以及未来的前景。

在这篇文章中,我将回顾 OpenAI 在演示中展示的令人印象深刻的 Codex 技能集示例。最后,我将谈谈我对这项技术的影响以及它如何重塑未来的想法。

为什么食品法典委员会不仅仅是另一个 GPT-3

GPT 3 号是先驱。当它问世时,大多数人从未听说过语言模型、Transformer 架构、无监督学习或预训练技术。它向世界展示了人工智能系统的语言能力。它成为了一个人工智能名人,非常像 IBM Watson,或者在它之前的 AlphaZero。

但是在它的哥哥的阴影下写法典是不公平的。Codex 本身就是一个人工智能超级明星。这不仅仅是 GPT-3 在数量上的改进。Codex 对我们世界的影响更接近于 iPhone 在 2007 年的表现,而不是 AlphaZero 在 2017 年的表现。我们的生活方式与前 iPhone 时代截然不同,Codex 承诺以一种可以媲美的方式改变世界。

GPT 3 号的主要缺点之一是内存不足。上下文窗口——当您与它交互时,它可以访问的以前的信息量——很小,导致系统提交错误。它会在长篇论文中对其论点进行分歧,进入无休止的循环,或提出不一致的论点。Codex 通过增加内存存储解决了这个问题——从 4KB 增加到 14KB,是 GPT-3 的 3 倍多。这使它能够更好、更广泛地理解手头的任务。

GPT-3,令人印象深刻,生活在一个虚拟的世界里,永远被限制在不可感知的 1 和 0 的现实的边界内。正如 OpenAI 的首席技术官 Greg Brockman 所说,“通过读者的思想”,GPT 3 号只能以间接的方式影响世界。相比之下,Codex 可以通过从英语提示中创建命令来让计算机做一些事情,从而直接影响世界。法典委员会可以采取行动,在现实世界中产生(我希望是有益的)后果。

“Codex 精通十几种编程语言,现在可以解释自然语言中的简单命令,并代表用户执行它们——这使得为现有应用程序建立自然语言界面成为可能。”

食典委能做什么的 3 个例子——重点

看了现场演示后,我只能说 Codex 看起来令人印象深刻。不是因为它可以用几种语言编写代码,也不是因为它做得相当好。而是因为它对英语提示的推断可以被定性为深刻、细致、有创造性和精确——尽管我们永远不应该忘记它不能像我们一样理解语言。

看着 Codex 解释自然语言命令让我惊讶了好几次。模棱两可的命令,非正式的语言,甚至隐喻。Codex 克服了这些障碍,用一个绰绰有余的 JavaScript 实现了它的目标。它只是简单地将一个英文提示——类似于传统程序中的注释——作为输入,然后编写代码并将其发送到计算机,计算机在屏幕上显示输出。

以下是三个例子的精选(来自的演示的博客文章)和我的印象。

1.你好世界

他们想展示基本功能,所以除了“hello world”之外,没有其他方法可以开始演示输入以粗体显示,输出以常规字体显示。

**Say Hello World.**
Hello World**Now say it with feeling!**
Hello World!!!**Even louder please.**
HELLO WORLD!!!

我们首先注意到的是模型可以自我引用。它可以在内存中(在同一会话中)存储以前的命令,并充分使用它们。它理解“它”指的是“Hello World”,这需要对语法和上下文有一定的理解。最后一个提示更加复杂,因为它有一些省略号。一个独立的“请大声点”命令没有任何意义。在实践中,这就好像我们在与法典进行对话,它可以记住并在未来使用。

然后,他们想“向全世界传播这个信息”,所以他们要求 Codex 创建一个网页,然后用一个服务器来托管这个网页。他们要求观众在 openai.com/c 订阅,参加演示,这样法典委员会就可以给我们发送一个“你好,世界”的信息而且,为了让邮件更有趣,他们还添加了比特币的价格。为了发送这封邮件,他们使用了 Mailchimp API——Codex 通过阅读中间的两个句子就学会了使用它。

**Look up the current Bitcoin price, and save it to a variable.****Here's a new method you can use.
codex_chimp.send(subject, body)-> sends Mailchimp email blast****Now send everyone an email, telling them (a) hello world and (b) the current Bitcoin.**

几秒钟后,我收到了这封电子邮件。太神奇了。

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

OpenAI Codex 发给我的电子邮件

2.创建游戏

对于这个例子,他们决定编写一个更大、更复杂的程序。他们没有用一行命令来测试 Codex,而是创建了一个游戏:主角是一个人,他必须通过在屏幕上左右移动来躲避落下的巨石。首先,他们导入一个人的图像,调整大小以适应屏幕,并将其放在屏幕的底部。

他们想让这个人用键左右移动,所以他们提示 Codex:“现在用左右箭头键控制它。”Codex 如何正确解释这个命令?“使之可控”是什么意思?这是一种非常模糊的方式来表达“当按下左/右键时,向左/右移动 X 个像素。”

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

Codex 正确地解释了一个相当模糊的命令——open ai demo(已编辑)

不过,Codex 设法解释了指令,并生成了代码,以便在按键时将图像向左和向右移动 10 个像素。处理像这样的细微订单是食品法典委员会最显著的能力之一。如何编写 JavaScript 代码是不是很多人都有的技能,但任何人都知道用键左右移动人意味着什么。法典缩小了我们的欲望——我们甚至经常无法用自然语言精确表达——和我们的期望之间的差距。

此外,系统必须持有正在进行的事情的概念,以遵循指令。我们可以使用屏幕来帮助理解正在发生的事情,但是模型只能访问以前的代码。

然后,他们包括一个人必须躲避的巨石的图像。然而,由于它太大了,他们要求食品法典委员会“把它变小”系统不仅要理解“小”的含义,还要对这个形容词的相对性质有一个相当好的理解。一只蚂蚁对我们来说很小,但对一个原子来说却不小。房子对地球来说很小,但对我们来说不是。然而,对于手头的任务,法典委员会将巨石转换成了合理的大小。

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

Codex 改变了巨石的大小,使其相对较小——open ai 演示

最后,在调整了巨石的大小后,他们希望它从空中落下,并在击中屏幕底部后出现在随机位置。他们要求食品法典委员会“将它的位置设置在屏幕的顶部,一个随机的水平位置。现在让它从天而降,缠绕。”这将巨石的图像向下发送,直到它到达底部,然后再次出现在顶部。

注意“从天上掉下来”这句话是一个比喻。没有天空,也没有真正的坠落。Codex 必须明白“下落”意味着图像在特定方向上(向下)不断移动。它必须明白“天空”指的是屏幕的顶部。

3.与您的电脑交谈

为了进一步强调 Codex 的潜力,他们决定使用一个真实世界的例子。在一天结束时,大多数人不知道如何编程,或者甚至不关心人工智能系统可以帮助他们做到这一点。但是,正如我在开始时所说的,Codex 的承诺并不局限于人工智能/技术世界。codex——及其未来的继任者——将改变我们与计算机的互动方式。

在这个例子中,他们使用 JavaScript Microsoft Word API 来允许 Codex 对 Word 文档进行修改。最重要的是,他们包括一个语音识别系统。

想象一下:你对着电脑说话,语音系统识别你的声音并将其转换成文本。文本被发送到 Codex——它已经知道如何使用 Microsoft API——它将命令转换成 JavaScript 代码,并对文档执行您想要的操作。

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

Codex 通过语音命令在 Microsoft Word 文档中进行更改— OpenAI 演示(已编辑)

Codex 学习如何利用 API 的简单性是另一大优势。编程世界正在变得“API 化”,所以随着时间的推移,这些系统将变得更加有用。

“技术发展到足够好还需要很长时间,但最终我们可能会忘记计算机的其他用途。随着更多的事情变得 API 化,编写代码的 AI 系统可以轻松地让世界上发生很多事情。”—山姆·奥特曼

想象一下在一个可编程的世界里,法典能做什么。自从计算机科学开始以来,编程语言已经变得越来越高级。法典是人类和计算机语言之间缺失的一环。我们将能够表达一个想法,计算机将理解我们的意思,没有不确定性。任何人都能够以一种对我们来说很自然的方式与计算机交流。

法典是 J.A.R.V.I.S .的原始版本。

“你在这里看到的是未来的味道。随着神经网络在将指令转化为正确的 API 代码方面变得越来越擅长,只要告诉它做什么,就有可能用你的软件做越来越复杂的事情。”——伊利亚·苏茨科夫

关于法典的思考

改善人机交流

从打卡到 Python,人机交流的历史从来没有偏袒过我们。我们总是不得不牺牲商品来适应机器。由于这个原因,与计算机通信工作密切相关的人被认为是高技能、高价值的工作者。即使在今天,当编程被认为是一项必须知道的技能时,大多数人也不知道如何创建程序来让计算机做事情。

然而,由于像 Codex 这样的系统,这种情况在未来几年可能会改变。他们可能不会取代程序员,但肯定会成为一种催化剂,使外行人能够进入编程世界,并与我们的朋友计算机发展健康的关系。

高度可解释性

对神经网络的一个合理的批评是它们缺乏责任性和可解释性。这些系统做了惊人的事情,但也有灾难性的失败。失败本身不是问题。主要问题是神经网络是黑箱。无论什么进去,都留在里面。我们没有办法偷看一眼,更好地了解正在发生的事情。调试极其困难。

在这里,法典与 GPT-3 形成对比。这两个系统都被训练成黑盒,但在测试时,Codex 让我们看到它根据我们的提示编写的代码。我们不仅仅是从计算机中得到输出,还有 Codex 解释了什么。它允许我们检查代码,删除代码,或者在必要时让系统重写代码。这一点对开发者来说很关键。没有一个专业程序员会使用代码隐藏的代码生成系统。

消除编程中枯燥的一面

Greg Brockman 谈到了编程的两个方面。首先,你需要明白你要解决的问题,以及如何把它分成更小的块。然后,您需要将这些片段映射到现有的代码中。正如布罗克曼在博文中写道,“后一种活动可能是编程中最没有乐趣的部分(也是入门门槛最高的部分),也是 OpenAI Codex 最擅长的地方。”

Codex 并不意味着让程序员离开他们的工作,而是减少他们必须做的无聊任务,让他们专注于他们工作中需要更高水平认知努力的那些方面。将问题改编成计算机能理解的语法是很无聊的。面对一个看似无法解决的问题,一点一点地理解它,并朝着解决方案迈出一小步,这就是编程的乐趣所在。

“*【抄本】*用起来真的很好玩,给我带回了早期编程的快乐。”—山姆·奥特曼

我们日常生活的彻底改变

山姆·奥特曼说过这项技术应用在尿布上。但这是未来的第一个暗示,似乎有可能的是,法典及其继任者将横向改变我们的生活方式。一件事是彻底改革人工智能。另一件非常不同的事情是彻底改变世界,让我们每个人每天做的小事都发生改变。

Codex 不仅仅是发生在人工智能中的事情,世界上大部分人甚至不会注意到。如果成功的话,它将最终改变我们与计算机的互动方式。就像 iPhone 彻底改变了我们与手机的交互方式一样。

订阅我的免费每周简讯 明日之心 获取更多关于人工智能的内容、新闻、观点和见解!

您也可以在这里 成为中等会员 直接支持我的工作,获得无限权限!😃

推荐阅读

[## GPT-3 —全面概述

towardsdatascience.com](/gpt-3-a-complete-overview-190232eb25fd)

以下是如何在数据块中显示 HTML

原文:https://towardsdatascience.com/heres-how-to-display-html-in-databricks-c36d9cb47607?source=collection_archive---------20-----------------------

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

阿列克谢·图伦科夫在 Unsplash 上的照片

以及它如何增强你的分析

当我在一个 Python/R 项目上工作并希望交付输出时,我希望它非常闪亮。然而,有时分析的交付支持将是笔记本本身,或者是出于时间限制,或者是为了方便。

我一直认为我必须使用静态降价和一些图表来说明我的结果。但是,如果你像我一样使用数据块,有一个简单的解决方案,DisplayHTML 函数。这个函数将允许你在笔记本上显示比简单的代码行和图形更多的东西。

对于那些不知道它的人来说,Databricks 是一个统一的数据和分析平台,由 Apache Spark 的创始人创建。免责声明,我与这家公司没有任何关系,我只是为他们的产品工作。

在这篇文章中,我将详细说明使用这个功能可以显示什么,并给出几个例子。

你可以随时参考 Databricks 可视化文档来获得基础知识。

displayHTML 的第一个也是最常见的用途是显示文本。指出指导方针、你的结果的摘录或引导读者通过你的发现可能是有用的。

要做到这一点,您可能已经猜到了函数的名称,您只需要使用众所周知的 HTML 语言。我们将在下一部分看到你需要的最有用的 HTML 标签。

HTML 基本标签

1。标题和段落

使用标题将你的文本分成带有标题和副标题的小节。这将使你看起来像一个真正的文本,而不仅仅是一连串的句子。

标题的标签是,xxx 是一个数字,数字越小,文本越大。

displayHTML("""
<h1>This is heading 1</h1>
<h2>This is heading 2</h2>
<h3>This is heading 3</h3>
""")

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

查询输出。作者截图

HTML 标签

允许你写不同的段落

displayHTML("""
<p>Write in one paragraph.</p>
<p>And in another paragraph.</p>
""")

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

查询输出。作者截图

2。内嵌标签

你也可以使用内嵌标签,如粗体、斜体和其他标签。

displayHTML("""
<b> Bold </b> 
<i> Italic </i>
<mark> Marked text </mark> 
<del> Deleted text </del> 
<ins> Inserted text </ins> 
<sub> Subscript text </sub> 
<sup> Superscript text </sup>
""")

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

查询输出。作者截图

3。列表

当然,您可以使用

  • 标签在列表中显示项目,如下所示:
displayHTML("""<p>If you want to display a list</p>
<ul>
  <li> You </li>
  <li> can </li>
  <li> do </li>
  <li> it </li>
</ul>
""")

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

查询输出。作者截图

4.颜色;色彩;色调

使用段落和样式标签以几种不同的颜色显示文本。

displayHTML("""<p style=”color:red”>Let’s try a color</p>
<p style=”color:blue”>and another one.</p>""")

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

查询输出。作者截图

5.外部资源

你不必局限于纯文本,因为你也可以引用外部资源,可以是纯 URL,甚至是图片。

正如在官方文档中提到的,如果你引用一个外部资源,你应该总是使用 https://而不是 http://来避免呈现错误。

displayHTML("""
<p> This is a <a href=”https://www.medium.com"> link</a> to medium.com </p>
""")

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

查询输出。作者截图

6.形象

您还可以显示图像,但前提是这些图像存储在与数据块相连的数据库中,例如之前分析的图形保存为 jpg 格式。

displayHTML("""<img src =’files/image.jpg/’>""")

奖励:表情符号

最后但同样重要的是,如果你想让你的测试更精彩一点,可以添加表情符号:)

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

作者图片

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

查询输出。作者截图

If 语句和参数

现在我们已经完成了基本命令,不要忘记我们仍然处于 python 环境中,这意味着我们可以有条件地显示文本。

假设您想要显示一个基于计算结果的建议,那么您可以使用一个 if 语句并向 displayHTML 函数传递一个参数。在 Python 中,可以使用{}和将变量传递给函数。最后格式化。

以下函数允许您根据结果值显示不同的消息。

if my_result>50:
  sentence = "the result passed the condition with a value of"
  +   str(my_result)else:
  sentence = "Unfortunately a result of <b>" + str(my_result) +   
  "</b>is too low"displayHTML( """{} """.format(sentence))

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

查询输出。作者截图

动态内容

能够以闪亮的方式编写测试是很好的,但是如果我们想要一些更动态的东西呢?幸运的是,displayHTML 并不局限于您可以使用来自 D3.js 的 D3 可视化来创建数据或模型结果的动态图形。

D3.js 是一个 JavaScript 库,用于在 web 浏览器中生成动态的、交互式的数据可视化

下面是一个使用 python 库 mpld 3(Matplotlib 和 D3.js 的组合)可以做什么的示例。这可以帮助您创建动态和非常好看的图表来增强您的报告。

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

查询输出。作者截图

限制

目前存在的一个限制是每个单元格只能使用一个 displayHTML 函数。这意味着如果你想显示各种图像或文本,这个函数会变得非常拥挤。然而,这不应该限制你太多,一个笔记本电池(输入和输出)的最大大小是 16MB,远远不够。

在一些包中,正如我们在 mpld3 中看到的,你可以显示动态图形来呈现函数的输出。这在数据块中有时会变得有点复杂,因为根据格式的不同,它可能不会自动工作,并且您可能必须使用 JS 代码,如果您对它不是很熟悉,这可能会有点棘手。

也就是说,正如您在本文中看到的,这个 displayHTML 工作得非常好,并且显著地修饰了您可以交付的工作。

我希望这篇文章对您有所帮助,并且您能够在将来应用它。如果您有任何反馈,请随时联系我们。

以下是如何在 Deepnote 上使用 Jupyter 笔记本的方法

原文:https://towardsdatascience.com/heres-how-to-use-jupyter-notebooks-on-steroids-with-deepnote-c35251222358?source=collection_archive---------22-----------------------

在本教程中,了解 Google Colab 的完美替代品

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

照片由石页·康让Unsplash

这个想法

你可能知道并经常使用的最好的数据科学工具可能是 Google Colab。你有什么不喜欢 Colab 的——轻松访问 Google Drive 和文件系统以获得数据,免费访问 GPU 以完成更繁重的深度学习任务,以及像在 Google Docs 和其他类似应用程序中一样与他人协作的能力。

问题出在更小但却被极大忽视的事情上,比如当实时协作成为你和你的团队的一个需求时——你和你的队友面对面协作的方式。使用 Colab,不幸的是,您无法实时看到彼此的变化。

你需要的是刷新你的浏览器标签。然后需要再次加载笔记本,之后你们就可以看到彼此的变化了。如果一个队友在一个单元格上给你留言,你也需要这样做。

另一个要问自己的问题是——您是否曾经想要添加一个数据源用于您的项目,而使用 API 或将其上传到您的驱动器会带来额外的麻烦?还是每次合上笔记本都不重新安装 google drive?

我来说说 Deepnote 的便利吧。

Deepnote 作为一个替代品表现如何?

就像 Colab 一样,Deepnote 是一个运行在浏览器中的 Jupyter 笔记本,具有一些附加功能。

其中一些包括:

  • 与 GitHub、谷歌云平台、亚马逊 S3、谷歌驱动等平台的简单集成。
  • 熊猫数据帧的一键可视化
  • 易于共享和实时协作
  • 从笔记本构建报告的更好方法

最好的特点是—

  • 能够保持单个项目在整个月、每个月不间断运行

够兴奋了吧?让我们来发现运行一个新的 Deepnote 项目的基本原理!👇

创建新项目

登录后,只需导航至您的控制面板,然后单击“新建项目”按钮:

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

作者图片——如何在 Deepnote 中创建新项目

你将被带到一个屏幕,询问你是否想要连接到一个现有的 GitHub 库并从那里导入你的代码,或者只是从你的本地机器上传一个你选择的笔记本。选择任何一个立即开始。为了这个教程,我用我在这个教程中的 Jupyter 笔记本来描述在熊猫中使用许多日期时间函数的基本技巧。

在侧面板中,有用于上传数据文件和其他文件的文件视图:

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

作者图片——如何在 Deepnote 中上传文件

您还可以选择在一个地方查看所有的全局变量,因此当您稍后想要清理项目以共享或发布报告时,可以从侧面板轻松完成。

安装依赖项并制作需求文件

如果你在笔记本上输入一行代码,比如:

!pip install <dependency-name>

它会自动将它安装到您当前的环境中。

现在,如果您想将这个包移动到您的 requirements.txt 文件中,您通常会这样做:

pip freeze > requirements.txt

或者如果你像我一样使用pipenv,你会这样做:

pipenv run pip freeze > requirements.txt 

但是 Deepnote 让它变得更容易,并为你提供了一个更快捷的方法来做到这一点。此外,在安装任何新的包之后,您还可以选择将它添加到您的需求文件中,而不需要上述额外的步骤。

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

作者图片—安装新的软件包

真的就这么简单!

在代码中使用环境变量

环境变量(有时也称为秘密)可以用来存储 API 密钥、数据库秘密、bot 令牌等信息。

这些通常只在环境变量的帮助下在代码中使用,而不是硬编码,以避免像 GitHub 那样的版本控制。你通常会以的形式知道。env 文件。

我还有一篇完整的博客文章,专门描述如何在代码中有效地利用环境变量。

在此找到它们:

使用 Deepnote,只需点击侧面板中的 Integrations 选项卡,然后点击环境变量,即可插入环境变量。

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

按作者分类的图像—添加环境变量

然后,您将获得在项目中包含环境变量的选项,然后可以从项目中包含的任何脚本或笔记本中访问这些变量。

实现项目共享和实时协作

我在上面的介绍中描述了在 Deepnote 笔记本中使用实时协作是多么容易。您在任何单元格旁边所做的评论都会立即显示给与您共享该笔记本的所有人。

添加新的合作者就像输入队友的 Deepnote 电子邮件并将权限更改为“编辑”或“完全访问”一样简单

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

按作者分类的图片-共享您的项目

配置共享数据集

借助 Deepnote 中的“共享数据集”,可以很容易地在一个团队中就一个共享数据源的单个项目开展工作。

这是 Integrations 选项卡中的另一个有用功能,您可以上传自己的数据集,项目中的所有协作者都可以访问它。

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

按作者分类的影像-创建共享数据集

从 Google Drive 轻松访问文件

当试图访问文件时,您必须非常熟悉将 Google Drive 安装到您的 Colab 项目中的过程。这个过程很简单,如果当你没有任何选择,只能再次安装 Google Drive 来运行你的笔记本时,当运行时被搁置一段时间后断开连接,这有点不方便。

在 Deepnote 中,您只需通过集成连接您的驱动器。这样,每次你打开硬件时,你所有的文件都可以被访问**。**

以下是将 Google Drive 连接到项目的方法:

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

按作者分类的图片—连接驱动器

一旦你做到了这一点,从驱动器中访问文件和数据集就是用几行简单的代码完成的。

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

现在,您只需通过屏幕截图中显示的文件夹结构连接数据集即可使用。它的路径总是“datasets/your-integration-name/”,您可以从那里简单地访问您的共享文件。

使用:

!ls /datasets/drive-integration

给出输出:

‘Arxiv Text Summarization’

因为我们用共享数据创建了一个文件夹。

最后,让我们讨论两个最有趣的特性…

只需一次点击即可可视化数据框:

简单地打印df.head()df就可以得到数据帧中简单的熊猫信息。

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

作者图片——可视化熊猫数据框架

为了以 Deepnote 提供的方式可视化它,只需点击这个带有df语句的单元格上的小 visualize 按钮。

之后,您将看到代码单元格下方的一个完整的可视化子窗口:

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

按作者分类的图像-数据框的可视化单元格

用你的笔记本写一份报告

向您的经理演示或进行强调演示时,您的 Jupyter 笔记本在展示您的辛勤工作时具有无限的功能。Deepnote 让你更容易用两种方式以报告的形式展示你的笔记本:

  1. 文章方式—以 PDF 格式分享,
  2. 仪表板方式——像使用一块空白画布一样使用您的报告,然后用它制作一个漂亮的仪表板。

从侧边栏中,只需选择发布编辑器,你将被带到一个页面,以获得一篇文章或一个仪表板布局。

例如,下面是我的熊猫约会探索笔记本的文章布局:

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

按作者排序的图像-笔记本中的文章报告预览

对于不需要它的代码单元格,您还可以选择在报表中隐藏代码或单元格的输出。

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

按作者分类的图像—文章布局选项

只需重命名您的文章,然后点击发布,使其对任何人都是可共享和可见的。

几句临别赠言…

是时候表扬一下你自己了,因为你一路陪着我!

我希望这是一个有用的教程,可以帮助你开始更好地在云上运行笔记本电脑。对于未来,我希望这能启发你创建一些精彩的数据探索项目,并通过 Deepnote 笔记本和报告进行分享。

感谢您的阅读!我们下次再见在我的另一篇文章里!

如果你想留在圈子里,阅读我的更多数据科学文章,我恳请你考虑成为一名中等会员。只需每月 5 美元,你就可以获得我所有的文章,同时支持我的写作。😃 👇

https://ipom.medium.com/membership

也在推特上找我。

下面是如何用 Java 在 Excel 中自动调整数据表的范围

原文:https://towardsdatascience.com/heres-how-you-can-auto-adjust-your-datatable-range-in-excel-with-java-d00502d336d?source=collection_archive---------35-----------------------

使用 Apache Poi 3.15 JAR lib 的分步说明

由于一些国家正处于向❝Endemic❞国家过渡的过程中,过去两年应对疫情冠状病毒的工作不可避免地在公共医疗保健部门的信息传输和当前低效率的数据流方面留下了很大的改进空间。因此,当❝Pandemic❞的事情在我居住的地方安定下来后,公司领导的大量请求几乎立即淹没了我的电子邮件收件箱时,我并不感到惊讶。长话短说,我的任务是在当前定期手动更新&编辑 Excel 报告的工作流程中改进和引入自动化。

考虑到这一点,与其他许多致力于不断创新和强化技术文化的公司不同,*另一方面,我的工作场所目前没有运行过于复杂的技术解决方案所需的设置。*因此,由于编程语言的平台无关性,这最终导致我本能地选择以 Java 应用程序的形式实现我的最终交付成果。

虽然我之前的文章主要关注的是 Java 编程语言中的 Excel & Outlook 数据提取(考虑到前面提到的完全相同的约束):

相反,本文旨在展示 Apache POI 的另一项功能——这是一个操作 Microsoft Office 文档的开源 Java 库。更具体地说,我计划演示它的一个鲜为人知的功能**,即嵌入在 Microsoft Excel 电子表格中的数据表范围的自动调整。**

注意事项:

  • 该功能针对扩展名为的 excel 文件。xlsx)仅。这与第一部分不同,第一部分的功能对两者都适用**。xlsx 和。xls** 扩展。
  • 使用的 Java 库依赖项列表与第一部分没有什么不同(即所有 JAR 依赖项的版本也是一致的):

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

作者图片|用于读写 Microsoft Excel 文件的 Java 库列表|请注意,所使用的 apache poi 的具体版本是 3.15。不同版本的 apache poi 有不同的依赖版本。

用例解释:

为了最大限度地减少繁琐的 excel 报表手动更新,我从工作场所的用户那里收到的一个常见请求是定期将输入的记录追加并输入到同一个 Excel 数据表中。

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

Image by Author |说明 Excel 中呈现的数据表的示例|请注意,表格范围为 $A 1 : 1: 1:J$31 。因此,在第 31 行之后追加的新记录不会输入到数据表中。

第一部分.追加新的传入数据行

在我的特定用例中,由于传入的数据记录是以 CSV 格式指定的,所以我实现的 Java 代码读入一个 CSV 文件,并附加到在所选 excel 文件中检测到的第一个电子表格中:

为了使用户能够轻松地运行它,它已经被合并到一个 Java Swing 应用程序**(该应用程序与上一篇文章** 中构建和说明的应用程序相同)。我强烈建议其他人查看它,因为这篇文章是对的直接跟进,如下图所示:

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

作者截图|在**【更新 excel 中的数据表】**选项卡中,应用模块的第一部分允许用户选择一个要更新的 Excel 文件和另一个包含最新数据记录的 CSV 文件

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

作者截图|选择**【追加数据>>】后,应用程序读入 2 个文件输入。CSV 中的数据记录成功附加到 excel 文件中。如上所述,文件日志输出消息“附加数据”。**

第二部分。更新数据表范围

虽然新的数据记录已经包含在第一部分的 excel 表中,**excel 表读取的数据范围保持不变。**因此,数据透视表、图表等。它们基于相同的数据表呈现数据,也保持不变。

为了反映最新的数据范围,下面的代码片段继续读入 excel 文件的数据表范围。如果 excel 表格的最后一个行号大于数据表的当前范围,该表应扩展其范围,以包括电子表格的最后一个行号。

与之前类似,这个功能被整合到 Java Swing 应用程序中,可在 my GitHub 获得。用户可以一次输入多个 excel 文件来更新所有数据表:

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

作者截图|请注意,应用程序的输出有一个表 datatable 范围,其中包含先前附加到文件中的记录

以下是运行 Java 应用程序的步骤说明:

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

作者截图|选择带有附加数据记录的 excel 文件。更新表格范围后,应用程序会提示用户保存一个输出 ZIP 存档,其中包含所有相应的更新 excel 文件。

如果您想要该应用程序的副本,目前可从 my GitHub 获得。先前的可运行 JAR 应用程序现在被重命名为**“DataDocUtility _ v1,而本文中引用的 JAR 应用程序被声明为"DataDocUtility _ v2"**。只要双击它,Java Swing GUI 就会自动显示出来。以防您忘记,第一篇文章可从获得😛:

此外,本演示中使用的所有示例 数据文件 输出文件 以及 源代码 都可以在我的 GitHub 资源库中找到。请随意为您自己的用例分叉/调整代码☺

非常感谢您的阅读,如果您发现此内容有用,请在 Medium 关注我。会非常感激的!😃

https://geek-cc.medium.com/membership

以下是将职业转向数据科学的真相。

原文:https://towardsdatascience.com/heres-the-honest-truth-about-making-a-career-switch-into-data-science-2e5a42d24879?source=collection_archive---------2-----------------------

有志成为数据科学家的必读书目。

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

马库斯·温克勒在 Unsplash 上的照片

2018 年初,我很想成为一名数据科学家。我认为这个标题听起来很有声望,我认为构建“机器学习模型”听起来很不错,而且这是一个很热门的职业。

如果以上任何一点引起了你的共鸣,那么我鼓励你继续阅读。

经常有人问我,如何从完全不相关的职业转向数据科学,比如会计或化学工程。

这个问题我想了很多。一,因为当我想进入数据科学时,这是我过去常常问自己的问题。第二,因为我认为对数据科学有一种强烈的误解,而这正是本文的主要目的。

闯入数据科学的真相。

数据科学的真实情况是:

1。不是每个数据科学家都做“数据科学”的工作。

“数据科学”一词涵盖了如此广泛的技能和工作职责,以至于一家公司的数据科学家可能看起来与另一家公司的数据科学家完全不同。根据我的经验,几乎没有任何数据科学家纯粹花时间构建机器学习模型。许多数据科学家还扮演数据工程师和/或数据分析师的角色。

2。不是每个从事“数据科学”工作的人都有数据科学家的头衔。

另一方面,我认识很多从事数据科学项目的数据分析师和数据工程师,比如预测模型、异常检测模型和推荐系统。

所以,你可以从中得到一些启示:

  1. **思考数据科学家角色的哪一部分让你感兴趣,而不是职位本身。**你喜欢建立机器学习模型的想法吗?你想深入统计的世界吗?现在,我意识到,虽然我最初想成为数据科学家的理由并不是无效的,但它们也让我一开始就陷入了错误的心态——理解这一点将为你的职业生涯提供更多的方向和意义。
  2. 任何与数据相关的工作都是进入数据科学的良好开端。除了找“数据科学”的岗位,我还推荐看看数据分析师岗位、Python 开发者岗位、产品分析师岗位等等。原因是你仍将发展核心数据科学技能,如 SQL 和 Python,这也为你自己打开了许多机会。

下一步是什么?开始一个项目。

一旦你发现数据科学激发了你的兴趣,接下来要做的就是开始你自己的项目。我个人认为,完成一个个人项目比完成一个在线证书更有价值 100 倍,因为它让你为数据科学家的实际工作做更好的准备。

我也明白想出一个项目创意可能很难,所以我会在下面留下一些想法:

  • 如果你是一个篮球迷,你能收集数据,看看什么因素最能代表一个球队赢得比赛吗?是 3 分命中率最高的球队吗?是主队吗?等等…
  • 如果你喜欢烹饪,看看你是否能找到一个食谱数据集(或收集你自己的数据),并创建一个模型,为缺失的成分建议一种替代成分。
  • 如果你想进入深度学习的世界,你能创建一个检测某人是否戴着面具的模型吗?(YouTube 上有很多教程!)
  • 对于更多的项目想法,我会检查如下:

</12-data-science-projects-for-12-days-of-christmas-aff693f5ed2b>

如果你还没有为一个项目做好准备…

如果你觉得自己还没有准备好开始自己的项目,这里有一些切实可行的后续步骤,可以用来指导你的学习:

  1. 从统计数据开始。我认为统计学非常重要,因为大多数机器学习概念和数据科学应用都围绕着统计学。如果你害怕统计,数据科学可能不适合你。我会查看佐治亚理工学院名为统计方法的课程,或者汗学院的视频系列
  2. 学习 Python 和 SQL 。如果你更像 R 型的人,那就去吧。我个人从未和 R 合作过,所以我对此没有意见。您对 Python 和 SQL 掌握得越好,数据收集、操作和实现就越容易。我也熟悉 Python 库,如 Pandas、NumPy 和 Scikit-learn。我还建议您学习二叉树,因为它是 XGBoost 等许多高级机器学习算法的基础。
  3. 学习线性代数基础知识。当你处理任何与矩阵相关的事情时,线性代数变得极其重要。这在推荐系统和深度学习应用中很常见。如果这些听起来像是你将来想要学习的东西,不要跳过这一步。
  4. 学习数据操作。这至少占了数据科学家工作的 50%。更具体地说,了解更多关于特征工程、探索性数据分析和数据准备的知识。

最后,这里有几个资源可以帮助你开始:

💔-ways-to-get-real-life-data-science-experience-before-your-first-job-545db436ef12>

感谢阅读!

我希望你发现这很有见地!这是一篇固执己见的文章,但我认为许多人会同意我关于数据科学家的两个真理:

1.不是每个数据科学家都做“数据科学”的工作。

2.不是每个从事“数据科学”工作的人都有数据科学家的头衔。

一如既往,我祝你学习一切顺利!😃

不确定接下来该读什么?我为你挑选了另一篇文章:

又一个!

特伦斯·申

  • 如果你喜欢这个, 跟我上媒 了解更多
  • 有兴趣合作吗?让我们连线上LinkedIn
  • 报名我的邮箱列表 这里

这是遍历熊猫数据框架的最有效的方法

原文:https://towardsdatascience.com/heres-the-most-efficient-way-to-iterate-through-your-pandas-dataframe-4dad88ac92ee?source=collection_archive---------0-----------------------

数据帧迭代速度提高 280 倍

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

(图片由作者提供)

Pandas 是数据科学社区中最受欢迎的 Python 库之一,因为它为数据探索和可视化提供了大量具有灵活数据结构的 API。Pandas 是清理、转换、操作和分析数据的首选库。

庞大 API 的存在使 Pandas 易于使用,但当处理大规模数据集时,它无法在所有 CPU 核心上扩展计算。Dask、Vaex 是开源库,它们可以缩放计算以加快工作流程。

要素工程和要素探索需要遍历数据框。有多种方法可以遍历数据框,**iterrows()**是其中之一。使用**iterrows()**遍历数据帧的计算时间较慢。

有时候,仅仅为了加快迭代过程,从 Pandas 转移到其他可扩展的库是一项单调乏味的任务。在本文中,我们将讨论各种数据帧迭代技术,并对它们的时间数进行基准测试。

Iterrows():

Iterrows()是 Pandas 的内置函数,用于遍历数据框。应该完全避免使用它,因为与其他迭代技术相比,它的性能非常慢。Iterrows()在迭代时进行多次函数调用,并且迭代的每一行都具有数据框的属性,这使得它更慢。

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

(图片由作者提供),Iterrows()用法

iterrows()花费 790 秒遍历一个有1000 万条记录的数据帧。

有各种各样的技术(将在下面讨论)比 iterrows()表现得更好。

Itertuples():

Itertuples() 是 Pandas 的内置函数,用于遍历数据框。与 iterrows()相比,Itertuples()调用函数的次数相对较少,并且开销也小得多。Itertuples()通过将每一行数据转换为元组列表来遍历数据帧。

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

(图片由作者提供),Itertuples()用法

itertuples()花费 16 秒遍历一个包含 1000 万条记录的数据帧,比 iterrows()大约快50 倍

阅读下面提到的文章,深入理解为什么 iterrows()比 itertuples()慢

https://medium.com/swlh/why-pandas-itertuples-is-faster-than-iterrows-and-how-to-make-it-even-faster-bc50c0edd30d

Numpy 数组迭代:

迭代打败了使用熊猫的整个目的。矢量化永远是最佳选择。熊猫自带的**df.values()**功能可以将数据帧转换成列表格式的列表。

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

(图片由作者提供),Numpy 数组迭代

花了 14 秒遍历一个包含 1000 万条记录的数据帧,比的 iterrows()快了 56 倍

字典迭代:

现在,让我们来看看遍历数据框的最有效的方法。熊猫自带**df.to_dict('records')**函数,将数据帧转换成字典键值格式。

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

(图片由作者提供),字典迭代

遍历一个包含 1000 万条记录的数据帧花费了 8.8 秒,比 iterrows()快了大约90 倍

基准:

我比较了使用上述技术遍历数据帧的基准时间数。

这一表演被记录在谷歌的一个实验室里。

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

(图片由作者提供),基准迭代时间

结论:

不建议使用**itertools()**来遍历数据帧,因为它会带来很大的开销并进行大量的函数调用。Itertuples 将数据帧转换为元组列表,然后遍历它,这使得它相对更快。

矢量化永远是首选和最佳选择。您可以将数据框转换为 NumPy 数组或字典格式,以加快迭代工作流。遍历字典的键-值对是最快的方法,对于 2000 万条记录,速度提高了大约 280 倍。

参考我关于加速 Python 工作流的其他文章:

参考资料:

[1]https://medium . com/swlh/why-pandas-ITER tuples-is-fast-than-ITER rows-and-how-to-make-it-even-fast-BC 50 c 0 edd 30d

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一小部分会员费,不需要你额外付费。

https://satyam-kumar.medium.com/membership

感谢您的阅读

以下是我对 Sklearn.resample 的了解

原文:https://towardsdatascience.com/heres-what-i-ve-learnt-about-sklearn-resample-ab735ae1abc4?source=collection_archive---------8-----------------------

解释上采样、下采样和一些要避免的错误

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

安德里亚斯·布鲁恩在 Unsplash 上拍摄的照片

对于数据科学家来说,处理不平衡的数据集可能是一个棘手的问题。处理不平衡数据集的方法之一是使用 sklearn.resample 进行重采样,即向上采样少数类或向下采样多数类。

Sklearn.resample 是 Scikit learn 用于上采样/下采样的函数。

根据 sklearn 文档,函数 sklearn.resample,r 以一致的方式对数组或稀疏矩阵进行采样,默认策略实现引导程序的一个步骤。简单来说, sklearn.resample 不仅仅是神奇地为数据集生成额外的数据点,它基本上是为你的数据集创建一个随机重采样(有/无替换)。这种均衡过程防止机器学习模型倾向于数据集中的多数类。

接下来,我在一个例子中展示了上采样。在下面的例子中,我们创建了一个包含 3 列的数据框架:年龄、性别和商店。

#import libraries
import pandas as pd
from sklearn.utils import resample,shuffle#create a dataframe
df = {'age':['a','b','c','a','b'],'sex':['e','f','g','f','e'],'store':[1,2,3,3,2]}df = pd.DataFrame(df)df.head()

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

df.head()

我们首先分离少数民族阶层,然后对少数民族阶层进行抽样。少数民族班级的人数被上采样到其他班级的人数。

#set the minority class to a seperate dataframedf_1 = df[df['store'] == 1]#set other classes to another dataframeother_df = df[df['store'] != 1] #upsample the minority class
df_1_upsampled = resample(df_1,random_state=42,n_samples=2,replace=True)#concatenate the upsampled dataframe
df_upsampled = pd.concat([df_1_upsampled,other_df])
df_upsampled

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

df _ 上采样

多酷啊!😉 😊现在我们有更多的数据来训练我们的模型。此外,当我们训练模型时,可以观察到数据中的 3 个商店类别(1、2 和 3) 中的每个类别的数量相等。

然而,当您进行上采样或下采样时,请避免这些错误!

  1. 在机器学习问题中,确保只有在分成训练、测试(如果你愿意,还可以验证)之后,才进行上采样/下采样**。如果您在拆分为定型和测试之前对数据集进行了向上采样,那么您的模型很有可能会出现数据泄漏。参见下面的示例。**
from sklearn.model_selection import train_test_splitX = df_upsampled.drop('store',axis=1)
y = df_upsampled.storeX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1,shuffle=True)X_train.head()

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

x _ 火车

X_test.head()

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

x _ 测试

*注意数据泄露!*我们在 X_trainX_test 中有完全相同的数据点。这样做可能会让我们对我们的 机器学习 模型的实际表现产生错误的认识。

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

Claudio Schwarz | @purzlbaum 在 Unsplash 上的照片

2.在您的机器学习模型建立之后,建议在您的非上采样训练数据集上测试您的指标。在非上采样数据集上测试你的指标,比在上采样数据集上测试它,给你一个更真实的模型评估。就我个人而言,我总是喜欢保留一个未经上采样的训练数据集版本。

结论:
上采样/下采样
是处理不平衡数据的非常好的方法。然而,重要的是要了解它们是如何工作的,以便能够正确使用它们。还要注意,由于额外的信息,上采样机制会在系统中引入偏差。

还可以了解一下 imbean 库的 SMOTE 操作符。它基于knarestneighbors算法工作,综合生成落在已经存在的寡不敌众的组附近的数据点。点击阅读更多信息

我希望这对你有帮助。期待您的评论,同时您也可以在 twitterLinkedin 上关注我。

如果你喜欢这篇文章,你可以考虑给我买杯☕️.咖啡

谢谢😊

这就是为什么我们可能需要重新思考人工神经网络

原文:https://towardsdatascience.com/heres-why-we-may-need-to-rethink-artificial-neural-networks-c7492f51b7bc?source=collection_archive---------4-----------------------

人工智能|新闻|评论

一项新的研究证明人工神经元过于简单

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

Jr Korpa 在 Unsplash 上拍摄的照片

如果我告诉你一个生物神经元用一个完整的人工神经网络来表示比用单个人工神经元来表示更好呢?

在大规模训练数据集和巨大计算资源的帮助下,深度学习在 2010 年代初取得了前所未有的成功。很快,人工智能、机器学习和深度学习成为了一场技术革命的中心。与它们一起的是另一个概念:人工神经网络(ann)。

大多数人不知道的是,这两个概念一点都不新。艾未未出生于 1956 年。ML 和 DL 分别在 19591986 推出。人工神经网络——一个从当时不成熟的神经科学领域借用的术语——出现在 1943 年,伴随着沃伦·s·麦卡洛克和沃尔特·皮茨的开创性工作。

他们的工作现在被认为是有史以来第一个关于人工智能的研究。作为人工智能的一个子领域,人工神经网络经历了不感兴趣和默默无闻的时代,直到深度学习革命将它们提升到人工智能历史上的最高峰。

第一个人工神经网络

正是在计算机科学的早期——人工智能甚至还没有名字——第一个人工神经网络诞生了。神经科学家几十年前就已经在模拟生物神经元,但麦卡洛克和皮茨的工作是第一次用命题逻辑来描述生物神经元。

熟悉人工神经网络的人会认出这张照片:

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

MCP 神经元。作者图片

这是大约 80 年前构思的麦卡洛克和皮茨神经元模型(MCP)。在很大程度上,这是每个现代入门课程或深度学习书籍中教授的相同模型。这不是因为 MCP 是一个不需要细化的精确模型,而是因为自 1943 年以来,深度学习在这个元素级别上没有发生一点变化。

MCP 神经元旨在仅代表生物神经元的简化神经生理学版本:一系列输入进入神经元进行处理,然后产生输出或不产生输出。它有一个阈值激活功能——如果输入的和为负,输出为 0。否则就是 1。

当前的人工神经网络具有加权输入和更复杂的非线性激活函数,以允许有意义的学习和更精确的 I/O 映射。但它们只是 MCP 模型的略微改进版本。基础是一样的;一些深思熟虑的输入被转换成输出。神经元学习得好不好与这些模型不像——甚至不太像——真实的生物神经元这一事实无关。

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

当前人工神经网络神经元模型。作者图片

主要的简化,也是最伤害 MCP 模型的一个简化是,人工神经网络中的每个神经元都被折叠成空间中的一个点。这足以模拟一些神经元的行为,但其他更复杂的神经元的生物物理性质过于微妙和复杂。

电流通过树突、胞体,并通过空间和时间流向轴突。并非所有树突的功能都一样。并非所有的输入都参与产生输出,电压沿树突下降。树突树形态、突触模式和不同类型的受体都会影响神经元的行为。还有许多更基本的机制和过程构成了最终提升我们智慧的基础。

这些特征在 MCP 或当前的 ANN 模型中都没有描述。

当 MCP 神经元被构思出来的时候,神经科学已经知道神经元具有不可简化为空间点神经元的特性。麦卡洛克和皮茨简化了复杂性,以便建立一个基于逻辑的模型。

在这个过程中,他们奠定了整个领域的基础,这个领域再也不会屈尊去审视自己的前提,并将它们与神经科学的相关发现进行对比。

生物神经元的复杂性

MCP 模式创建于近 80 年前。从那时起,神经科学得到了巨大的发展,我们对神经元的理解已经到了不能再继续称人工神经元为“神经元”的地步。让我们回顾一些关于这个主题的最相关的研究,以说明人工智能与认知科学的分歧有多大。

神经元和树突——处理器中的处理器

在 80 年代,Christof Koch 和其他人发现树突形态和突触模式可以影响神经元内部处理输入的方式。长期以来,科学家认为树突表现一致,被动地汇总输入。科赫的实验得出的结论是,神经元远比这复杂。

最近,神经科学家研究了单个树突的作用,发现它们本身也充当处理单元:树突有自己的阈值来产生尖峰(称为树突尖峰),这与整个神经元的阈值不同。

也就是说,神经元并不像 MCP 模型所暗示的那样是简单的“逻辑门”。树突本身似乎能够充当逻辑门。因此,生物神经元是一个处理系统,而处理系统又由独立的处理系统组成。

为了在人工神经网络中表现这一点,神经元之间的连接需要有不同的形态,这将影响神经元每次产生输出时的作用。这些连接会在内部充当处理系统:到达神经元的每个输入连接都会在内部产生或不产生尖峰信号,从而彻底改变神经元的整体输出。

这意味着人工神经元可以更好地理解为一个分层网络,其中的层(树突)起到非线性中间 I/O 映射的作用。然后,根据“连接树”的形态对所得到的中间输出求和,以产生最终输出。

基于这些惊人的发现,艾伯特·吉登和他的同事去年在《科学》杂志上发表了一篇突破性的论文。他们在人类锥体神经元中发现了一种新的 I/O 特征,这种特征是目前的模型无法描述的。来自这些神经元的树突产生一种类型的尖峰,其中强度在阈值水平的刺激下最高,当输入电流增加时最低。

他们的发现证明了一些树突可以充当 XOR 逻辑门——当且仅当其中一个输入为真时,输出为真。1969 年明斯基和 Papert 证明了单层感知器——人工神经网络的基本早期类型——不能进行这种类型的计算。现在,很明显单个生物树突可以。复杂程度高了两级。从单个树突到单个神经元,再到简单的人工神经网络。

如果树突可以在人工神经网络水平上工作,那么生物神经元比人工神经元复杂多少?

模拟一个生物神经元需要 1000 个人工神经元

几天前,大卫·贝尼格夫和他的同事在Neuron杂志上发表了一篇论文,证明了这些年来一直提出的观点:人工神经元根本不能准确地代表生物神经元。

为了证明这一点,他们决定使用现代机器学习技术来模拟人类金字塔神经元的 I/O 行为。他们想要测试两件事:当在真实 I/O 对上训练时,人工神经网络是否可以精确预测神经元输出,以及人工神经网络需要多大才能准确捕捉生物神经元的整体复杂性。

他们发现,至少需要一个 5 层 128 单元的 TCN——时间卷积网络——来模拟毫秒分辨率(单个尖峰精度)的金字塔神经元的 I/O 模式。他们修改了深度和宽度,发现 8 层 256 个单元的 TCN 可以实现最佳性能。

做一个粗略的比较:这意味着单个生物神经元需要 640 到 2048 个人工神经元才能被充分模拟。这并不意味着一个生物神经元有这么多的计算能力或复杂性。然而,这是一个明显的迹象,表明这两种类型的神经元在形式和实质上比以前认为的更加分离。

研究人员能够确定生物神经元如此难以模拟的确切机制:树突形态和一种称为 NMDA 的特定类型突触受体的存在。两者都是长期以来在神经科学中众所周知的神经元的结构和功能方面,但在现代人工智能和人工神经网络中完全被忽略。

这些结果引发了一些问题:为什么人工智能社区没有试图重塑其基础,以更好地适应他们试图模拟的现实?在那些基础被推翻并从头开始重建之前,AI 在实现 AGI 的探索中注定要失败吗?在这样一个元素级别改变 AI 会有什么后果?

让我们看看这一切是如何展开的。

人工智能和神经科学——分叉路径

我们大脑中的神经元——尽管不是全部——比它们的人造对应物要复杂得多。尽管最近在神经科学领域有所发现,但通过检查人工智能和深度学习建立的假设是否仍然成立,来处理这个问题是合理的。

可能的情况是,人工智能仍然可以在不改变任何东西的情况下完美地工作。尽管数字神经结构和生物神经结构之间存在明显差异,但它将继续朝着 AGI 前进。然而,在人工智能领域,似乎几乎没有人会在意甚至去检查它。

原因是,从很早的时候起,神经科学和人工智能就分道扬镳了——尽管这两个领域都在试图回答紧密相关的问题。神经科学与智力、大脑和思维有关。神经科学家决定向内看,看我们所知的唯一智能实例;我们。相比之下,人工智能关注的是使用人工手段复制智能。他们关心设计和建造能够感知世界并据此行动的智能代理。

神经科学是一门旨在发现真理的纯科学。它是由好奇心和求知欲驱动的。人工智能——至少是短期人工智能——在很大程度上是由金钱和有用性驱动的。业内人士并不担心,如果我们仔细分析,所有深度学习的基础可能会崩溃。他们关心人工智能不断吸引资金,他们的模型似乎以某种方式工作,即使不合理。

神经科学不断审查其基础,但人工智能选择了另一种方式:他们做出假设,然后头也不回地往前走。

这两个领域的工作和发展水平是不一样的,但说人工智能中的每个人都从技术和金钱驱动的角度看待它是不公平的。人们非常努力地工作,以推动该领域成为一门科学。那些仍然将领域视为解决智能和完成 AI 创始人最初使命的手段的人:人工通用智能。

他们承认有用的人工智能和具有挑战性的人工智能之间的区别,前者适用于简单、狭窄的任务,并被部署在任何地方,而后者需要重大突破才能达到下一个水平。在后一种情况下,有一个关于什么是最佳路径的持续辩论。虽然一些认为深度学习是一种方式——它可能需要一些调整,但最终会奏效——,其他认为它本身永远不够。

但这是他们应该争论的吗?

AI 社区关注的是错误的问题吗?

当且仅当所有较低级别的辩论结束并达成一致时,才应该进行这种辩论。然而,事实并非如此。深度学习被认为是人工智能未来之路的最低可能基石仍然存在疑问:人工神经元可能与生物神经元太不相似,永远不会产生复杂的认知过程和类似人类的智能。

我们可以通过更大的模型、巨大的计算能力和庞大的数据集来弥补人工神经元的复杂性不足,但这种效率太低,无法成为这一探索的最终步骤。

然而,这些是人工智能行业的优先事项。他们如何在保持效率的同时,做出不损失带宽的芯片?他们要么堆积 GPU,要么制造/购买专门的 芯片(只有最有钱的人才买得起)。他们如何提取和管理越来越多的数据集?无监督学习和自动标注。他们如何创建和训练更大的模型?他们要么是一家大型科技公司,要么需要向一家公司申请资金

他们一直在寻找解决方案,但这种趋势是可持续的吗?好像不是吧。我们可能需要回到基础。不仅因为我们无法像这样建设 AGI,还因为我们开始感受到否认当今人工智能低效的间接负担。

但是这里有一个问题:如果他们发现他们真的需要做出改变,我们所知的整个人工智能领域将需要一个完全的恢复。他们就是不愿意接受这一点。人工智能行业的领导者甚至可能知道人工智能的瓶颈是不可逾越的。但他们可能只是喜欢表现得好像这无关紧要,这样他们就不必面对在错误假设的基础上建立这一切的成本。

不过,这里有一个重要的澄清。一些人工智能系统工作得很好,不会污染那么多。人工智能仍然是一个非常有用的技术学科,为许多行业带来了大量创新。我不否认。但这是规则的例外。创造更强大的人工智能的竞赛正在进行,每个主要的参与者都在那里,为分一杯羹而战。

正如我之前所说的,进步不应该以任何代价来获得。

人工神经网络应该更多地基于神经科学,原因有两个,一个着眼于未来,一个着眼于现在:首先,生物和人工神经元之间的复杂性差异将导致结果的差异——AGI 不会没有改革——其次,我们追求这一目标的低效率正在损害我们的社会和地球。

值得吗?

后果——对人工智能和世界

即使人工智能社区不考虑我在这里概述的事实,人工智能作为一个肥沃的产业,仍然会每年带来大量新的研究项目和有用的应用。

尽管人工智能没有更接近神经科学,但狭义人工智能系统仍将成功完成它们为之而生的简单任务。无论人工智能社区是否接受生物神经元比人工神经元复杂得多,人工神经网络仍将受到欢迎。无论最终是否实现,人工智能行业仍将从追求 AGI 中受益匪浅——接近 AGI 的人工智能也可以改变世界,不管是好是坏。继续提高发达国家特权阶层生活水平的愿望也将继续存在。

但是代价是什么呢?

人工智能中的伦理问题正处于鼎盛时期,模型似乎没有变得更好。就在几天前,纽约时报报道脸书的人工智能系统将一群黑人标记为灵长类动物。谷歌制造的另一个人工智能在 2015 年显示了同样的有害偏见。难道我们要忽略这一切,像谷歌从训练数据集中删除大猩猩那样,给问题贴上创可贴吗?

让人工智能变得可解释、可诠释、可问责是解决这些问题的关键。这些都是人工智能的热门领域,但他们的目标是解决问题后验。如果人工神经网络背后没有强有力的理论支撑,我们怎么能做到呢?没有任何神经模型可以解释神经网络的行为。我们用它们来预测和预报,因为它们有效,但我们不知道为什么。

随着地球的一半被烧毁,另一半淹没在 T2 意想不到的洪水中,气候灾难即将来临。而人工智能也帮不上忙。它的总体碳足迹站不住脚

2019 年,来自马萨诸塞大学阿姆赫斯特的研究人员研究了大型语言模型(LLM)的环境影响——如今以 GPT-3 为先锋越来越受欢迎——发现训练这些大型模型之一会产生约 30 万公斤的二氧化碳排放;同样是 125 个纽约-北京的往返航班,Payal Dhar为自然而言。一些大型科技公司(谷歌脸书)正在努力减少这个问题,并逐渐转向可再生能源。

与这个问题相关的是人工神经网络效率极低。为了学习最简单的任务,他们需要巨大的计算能力。这就是这些系统产生如此大的碳足迹的原因。低效率导致更高的资源开发,从而产生更多的污染。

人类大脑只污染了其中的一小部分,而且在学习或做同样的事情时消耗的能量也不尽相同。大脑是一个极其高效的器官。当大脑使用如此少的能量时,我们怎么能做如此复杂的事情呢——更不用说它比计算机还慢。这种极端差异的原因可能是亚神经元结构的复杂性比人工神经网络高很多倍吗?是的,可能是

LLM 是为最大的玩家保留的,是那些吸引投资者和大众媒体注意的人。原因是这些模型总是被一种传播给公众的宣传所包围:“机器人现在比人类更能阅读GPT-3 […]出奇地擅长模仿人类一个机器人写了整篇文章。你害怕了吗,人类?

过度承诺和交付不足是 AI 的行业商标。但并不是所有的人工智能社区都参与销售他们没有的东西,唯一的目的是产生宣传和吸引资金。

用华盛顿大学计算语言学教授艾米丽·m·本德的话来说:“相关的过度承诺会把氧气从房间里吸出来,用于所有其他类型的研究。”除了法学硕士,还有一些被资助机构和媒体忽视的重要研究。

“因为这些大的声明是存在的,并且因为 LLM 通过操纵形式成功地推平了基准,所以其他更仔细界定范围的工作,可能基于非常具体的应用环境,而不会做出疯狂的过度声明,则更难发布。”

艾米莉·本德

也许有些被遗忘的研究正试图提醒那些只看到闪闪发光的 LLM 的人,我们做的都是错的。也许有些人对我描述的这些问题一无所获。

如果人工神经网络的基础很差,只有 LLM 似乎很重要,而且只有大型科技公司才能建造和部署它们,那么就存在一个非常现实的风险,即人工智能行业实际上是一个专注于错误目标的寡头垄断。没有人能够提高他们的声音,让那些负责的人知道他们是多么的错误。

不管你怎么看,人工智能,尤其是人工神经网络,似乎有一些至关重要的问题需要解决。即使我们从根本上重新思考它们,这些问题也不太可能马上得到解决。

如果我们想了解更大的图景,并揭示可能暗示我们一直在走向局部极大值的新路径,那么查看神经科学并承认其发现是第一步。

也许解决办法是不要试图给计算机灌输智能。进化找到了更好的方法。我们正试图以数字方式复制物理领域的成果。为什么不尝试创建硅基物理人工神经网络?使用计算机是图灵的提议,但自 20 世纪 50 年代以来,我们已经走过了漫长的道路。也许神经形态计算有我们应该寻找的答案。

人工智能社区可能不会从头开始重建一切,但至少他们应该采取这两个行动:首先,承认当前人工智能范式(主要是人工神经网络)的局限性和缺点,并在未来的研究和承诺中考虑它们。第二,努力在理论和实践上做出相应的调整。

他们可能会决定像今天一样继续使用人工智能和人工神经网络,但至少不会是因为故意的无知,而是因为诚实的不愿意。

如果你喜欢这篇文章,可以考虑订阅我的免费周报https://mindsoftomorrow.ck.page!每周都有关于人工智能的新闻、研究和见解!

您也可以直接支持我的工作,使用我的推荐链接 这里 成为媒介会员,获得无限权限!😃

这就是为什么你应该考虑成为一名数据分析师

原文:https://towardsdatascience.com/heres-why-you-should-consider-becoming-a-data-analyst-ffe177e2db1b?source=collection_archive---------3-----------------------

数据行业的失败者

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

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片

当我第一次想成为数据科学家时,我并不知道行业内不同的职业道路。

我不知道数据分析师和数据科学家之间的区别,并将每一个与数据相关的角色归类到“数据科学”的总称下

随着我开始更加熟悉数据领域,我坚定地坚持成为一名数据科学家和构建机器学习模型的最终目标。

机器学习似乎是一份很有吸引力的工作,我看不上那些不使用花哨的数据科学算法的解决方案。不仅仅是我——分析通常被视为二等公民,而不是人们通常优先考虑的技能。

几乎所有的数据科学课程或训练营都以学习机器学习技术为中心。很少(如果有的话)强调分析。

然而,在数据行业工作了一年多之后,我逐渐意识到每一个与数据相关的角色都同样重要。

没有数据工程师,我们就没有数据来建立模型。没有机器学习工程师,我们就无法生产这些模型。没有数据分析师,我们就无法从数据中获取价值。

数据行业为各类人才提供了发展空间。

如果你是一个拥有强大软件工程技能的高技术人员,你可能会喜欢 MLOps。如果你有良好的沟通技巧,并且有商业或营销领域的背景,数据咨询可能是你正确的职业道路。

从我记事起,我就经常说“我想成为一名数据科学家”,当人们问我为什么时,我无法回答。为什么是数据科学?"如果你热爱数据,为什么不选择分析或数据工程?为什么特别是数据科学?”

我对成为一名数据科学家如此感兴趣的原因是因为这个领域的大肆宣传,以及媒体对这个行业的描绘。然而,在数据行业还有其他同样有回报的工作。

在本文中,我将带您了解数据分析领域,并帮助您了解这个角色是否适合您。

为什么公司需要分析师?

数据分析师擅长收集原始数据,并能够从中获得洞察力。

他们有耐心和好奇心去挖掘大量的数据,直到他们从中找到有意义的信息——之后,他们清理并向利益相关者展示他们的发现。

数据分析师使用许多不同的工具来得出答案。他们使用 SQL、Python,有时甚至使用 Excel 来快速解决问题。

分析师的最终目标是在数据的帮助下解决业务问题。这意味着他们要么需要具备必要的领域知识,要么与已经具备所需行业专业知识的人密切合作。

数据分析师天生好奇。如果他们看到数据趋势的突然变化(像月末的销售小高峰),他们会想办法确定是否可以在全年观察到相同的模式。

然后,他们试图将这些与行业知识和营销努力结合起来,并为公司提供如何迎合受众的建议。

数据分析师的最佳特质是他们能够提出正确的问题。他们的领域知识,加上他们快速的数据提取技能,使他们成为公司需要快速建议如何进行的最佳人选。

数据分析师可以回答类似“*这个月我们在哪里削减开支?”,“我们的竞争对手在做什么?”*和“我们可以做哪些不同的事情?”

数据分析师经常面临非常抽象、肤浅的问题。业务问题被交给他们,没有明确的最终目标是什么。

如果你是一名数据分析师,你会听到类似“*你能帮助我们识别消费者行为的趋势吗?我们如何更好地向他们营销?”*几乎每天。

接下来,分析师需要进一步探究并询问更具体、更详细的问题,以便理解分析的最终目标。

一个好的数据分析师,就像一个好的数据科学家一样,明白他们分析的最终结果只会和用来创建它的数据一样有用。不干净和嘈杂的数据导致无足轻重的见解,这对业务造成的伤害大于好处。

弥合业务和数据之间的鸿沟

一些公司普遍抱怨数据科学家技术含量太高,无法推动商业价值。

这些公司建立的机器学习模型往往不符合业务需求,最终没有得到使用。

数据分析师可以通过识别最有用的数据点来帮助弥合这一差距,这些数据点可以被提取出来以帮助实现业务价值的最大化。

成为数据分析师所需的技能

数据分析师来自各种背景。我知道一些商业顾问学会了编码并转型到了分析领域,正如我知道一些数据工程师获得了领域知识并完成了转型。

不管你来自什么样的背景,你都有必要具备很强的 Python 过程化编程技能。你需要能够处理不同格式的数据,收集数据,清理数据,并从中找出意义。

你还需要知道像 SQL 这样的查询语言,并且应该能够快速组合和分析大型数据库中的数据。

作为一名分析师,数据可视化、演示和沟通技巧将对你有很大帮助,你需要以一种人们容易理解的方式来分解你的发现。

最后——总是问为什么。如果你天生好奇,总是质疑事物,数据分析对你来说是一个很好的职业选择。

您正在处理的数据集中的每一行都对应于一个人生活的某个方面。例如,当处理消费者支出数据以确定趋势时,我经常在脑海中创建一幅他们的图片。在把他们的行为拼凑在一起后,我想象他们的角色,并试图把它和我在现实生活中认识的人联系起来。

如果你喜欢讲故事,喜欢更深入地发掘别人不容易发现的见解,那么数据分析是一份有趣的工作。

如何创建你的个人电报机器人来学习新的语言

原文:https://towardsdatascience.com/heres-your-personal-telegram-bot-to-learn-new-language-4c874252c744?source=collection_archive---------26-----------------------

总是鼓励你,随时准备和你一起学习

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

照片由捕捉人心。 on Unsplash

10-20 年前,学习一门新语言是很困难的。对于那些到了一定年龄的人来说,你可能还记得,学习一门新的语言要么是购买带有录音的语言书籍,要么是去上课,老师让学生轮流发单词的音。

如今,像 Duolingo 这样的应用程序可以让你按照自己的节奏学习新语言,这要好得多。然而,有时你只是想知道如何说一个特定的单词/短语,并想知道你说得对不对。我们可以将这个过程自动化,而不是先搜索翻译再搜索发音,同时从创建自己的人工智能机器人中获得满足感。

介绍我的唤醒机器人…

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

老师在日语里是老师的意思。从 GIF 录音中,可以看到界面很简单:

  1. 用户从两个选项中选择一个——“如何发音 JP 单词”或“如何用 JP 发音(EN)”。
  2. 用户输入单词/短语,机器人发回带有发音的录音。
  3. 如果用户选择“如何用日语说(EN)”,他/她可以对着麦克风说出这个单词/短语,机器人将验证用户是否说对了。

虽然该机器人现在适合日语,但它可以很容易地配置为其他语言。设置很简单,而且是免费的。

我们现在将看到如何在您的本地环境以及云环境中设置 bot。

先决条件

设置需要两个主要因素。

1.电报机器人

要创建你的电报机器人,只需访问机器人父亲(详情见这里)。整个过程不到一分钟,虽然你可能需要更多的时间来想一个好的用户名,但还没有被采用。最重要的是,请注意您的令牌,我们稍后将需要它来控制我们的 bot。

2.谷歌云账户

该机器人使用一些谷歌云 API 来展示其魔力:

  • 用于单词发音的文本到语音转换 API
  • 用于检查用户发音的语音到文本 API
  • 翻译 API,用于将英语转换为选择的语言

最棒的是,谷歌云为新注册用户提供了 300 美元的免费试用版,而且上述 API 大部分都是免费的,所以你可以免费试用。

本地设置

要在您的本地环境中设置 bot 进行测试,您只需要 5 个简单的步骤。

1.启用 API

登录您的 Google Cloud 控制台后,启用 3 个 Google Cloud API(文本到语音语音到文本翻译)

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

我们三个火枪手的截图

2.创建存储桶

语音转文本 API 需要一个 Google 云存储桶来读取文件。因此,要创建一个 bucket,请前往 Google Storage 并创建一个。不要担心许多选项,您可以只保留默认设置。记下存储桶的名称,因为我们稍后会用到它。

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

3.下载服务帐户密钥

为了让我们从本地环境与 Google Cloud 交互,我们需要一个服务帐户密钥。

首先,创建服务帐户密钥。在“授予此服务帐户对项目的访问权限”下选择角色时,选择基本- >所有者。您可以跳过创建服务帐户的第 3 步。

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

之后,您可以创建一个密钥,并作为 JSON 下载到您的本地环境中。记下保存文件的目录。

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

4.Git 克隆并安装必要的包

这里的码基是这里的。Git 克隆到您的本地环境。

git clone [https://github.com/jiahao87/sensei_bot.git](https://github.com/jiahao87/sensei_bot.git)

必要的包列在 requirements.txt 中。在创建新环境并相应地安装软件包之前,将目录切换到 sensei_bot 文件夹。

pip install -r requirements.txt

5.安装ˌ使成形

我们的最后一步是将我们的配置输入到代码库中的 config.py 文件中。

相应地填写 BOT_TOKENGOOGLE _ APPLICATION _ CREDENTIALSBUCKET_NAME

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

完成最后一步后,我们现在可以通过运行我们的主脚本 app.py 来启动我们的机器人。

python app.py

如果一切正常,您应该会看到类似下面的消息,并且您可以开始在 Telegram 中与您的机器人进行交互。😄

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

Google 云设置

除非你计划 24/7 全天候开启你的电脑,否则你需要通过三个简单的步骤将你的机器人托管在云中

1.设置虚拟机(VM)

我们的第一步是通过谷歌云控制台设置一个计算引擎虚拟机实例。

a)登录谷歌云控制台后,启用计算引擎 API

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

b)启动谷歌云壳

您应该会在控制台页面的右上角看到一个类似于下面红框中按钮的按钮。点击它,会弹出一个终端。我们将使用这个终端来启动我们的虚拟机。

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

c)创建一个计算引擎虚拟机实例

将以下内容复制并粘贴到 Google Cloud Shell 中,创建一个名为 sensei-bot 的 VM 实例。

gcloud compute instances create sensei-bot \
--machine-type f1-micro \
--zone us-central1-a \
--image-family ubuntu-1804-lts \
--image-project ubuntu-os-cloud \
--scopes [https://www.googleapis.com/auth/cloud-platform](https://www.googleapis.com/auth/cloud-platform)

2.启用 API 并创建云存储桶

对于步骤 1步骤 2 ,遵循本地设置下的先前步骤。如果您已经这样做了,请随意跳过这一步。

3.Git 克隆和配置

让我们通过 SSH 进入我们的 sensei-bot 实例来配置我们的 VM。

转到计算引擎页面并为您的实例点击 SSH 按钮。您的 VM 实例的终端应该会弹出。

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

键入以下脚本来安装包并 git 克隆我们的代码库。

sudo apt update
sudo apt-get -y install python-dev build-essential
sudo apt -y install python3-pip
python3 -m pip install -U pip
export PATH="$HOME/.local/bin:$PATH"
pip3 install --upgrade setuptools
sudo apt-get -y install ffmpeg tmux
git clone [https://github.com/jiahao87/sensei_bot.git](https://github.com/jiahao87/sensei_bot.git)
cd sensei_bot
pip3 install -r requirement.txt

输入您的 BOT_TOKENBUCKET_NAME 修改 config.py :

nano config.py

由于我们的实例在 Google Cloud 本身中,我们已经在gcloud compute instances create脚本中提供了允许访问云 API 的指令,所以我们可以将Google _ APPLICATION _ CREDENTIALS保持不变,作为 None

修改完 config.py 后,按Ctrl+x y Enter保存修改并退出编辑器。

通过执行以下命令,使用 tmux 打开一个新窗口:

tmux

您现在可以通过运行以下命令来启动您的 bot:

python3 app.py

其他配置

为了让机器人真正个性化,我们在 config.py 中添加了一个名为 TELEGRAM_ID 的参数,只允许指定的用户与机器人对话。毕竟,即使云 API 是免费的,也有一个配额,你不会想因为别人在和你的机器人说话而超过这个配额。

想知道你的电报 ID,可以看看这个 wikiHow

但是,请注意,这并不是为了生产级的安全性,尽管它满足了我们的目的。

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

发送给未授权用户的消息截图

最后,人们也可以探索将 LANGUAGE_CODETEXTTOSPEECH_NAME 改为其他语言。你可以在这里看到谷歌支持的语言。根据语言的独特特征,可能需要对代码进行一些修改。

通过上面的指南,我们希望你现在能够在本地和谷歌云上部署你的个人机器人来学习新的语言。也可以随意修改代码,因为可以添加更多的功能,例如每天通知新单词/短语,甚至让机器人成为高级语言学习者的会话。

感谢阅读,我希望这篇文章是有用的:)也请随时评论您可能有的任何问题或建议。

参考

https://core.telegram.org/bots

Python 3.8 中的 Hessian 矩阵和优化问题

原文:https://towardsdatascience.com/hessian-matrix-and-optimization-problems-in-python-3-8-f7cd2a615371?source=collection_archive---------6-----------------------

如何在没有 TensorFlow 或 PyTorch 的情况下执行经济优化

建议

与 Python 3.8 的兼容性测试,在 MacOS 11.3 和 Linux Ubuntu Server 20.04 LTS 环境下执行。

使用的库:Numpy,Sympy。

pip3.8 install numpy sympy

Hessian 矩阵用于牛顿型方法中的大规模优化问题,因为它们是函数的局部泰勒展开的二次项的系数。偏导数在经济学中扮演着重要的角色,在经济学中,大多数描述经济行为的函数都假设经济行为取决于不止一个变量。例如,一个社会消费函数可以描述消费商品的花费取决于收入和财富;边际消费倾向就是消费函数相对于收入的偏导数。

Hessian 矩阵也通常用于在图像处理和计算机视觉中表达图像处理算子(参见高斯拉普拉斯(LoG)斑点检测器)。海森矩阵也可以用于正常模式分析,以计算红外光谱中不同的分子频率。

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

christofer engstrmUnsplash 上拍摄的照片

数值函数的 Hessian 矩阵是其二阶偏导数的方阵,记为 H(f)。在数学中,多变量函数的偏导数是它对其中一个变量的导数,其他变量保持不变。

示例:

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

梯度向量可以解释为“最快增加的方向和速率”。

如何用 sympy 求偏导数?

如果函数的梯度在点 p 不为零,梯度的方向就是函数从 p 增加最快的方向,梯度的大小就是那个方向的增加率,最大的绝对方向导数。

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

在有序集合 E 中,部分 A 的一个元素是 A 的最大元素或最大值,如果它属于 A 并且大于 A 的任何其他元素。对于有序集合的任何部分,最大值的存在通常是不确定的。另一方面,在存在条件下,这样的元素是唯一的。类似地,最小元素或最小值(如果存在的话)是比的任何其他元素都小的的元素。

目标是通过求解以下方程来确定最大或最小候选值:

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

Python 3.8 中的实现非常简单,需要 Sympy 库中的“solve”函数。

现在,我们需要执行二阶导数来获得 hessian 矩阵:

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

顺便说一下,这是程序的主要功能,它仲裁所有指令块之间的变量分配:

在我们的程序中,我们将施瓦兹定理应用于多变量函数的二阶偏导数,使得:

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

然而,我们不会证明这个定理,也不会试图在本文中解释它。下面是一个 numpy.matrix 格式的 hessian 矩阵示例,用于函数:

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

Hessian matrix that organizes all the second partial derivatives of the function x**2–1.5*x*y + y**2 is : 
[[2 -1.50000000000000]
[-1.50000000000000 2]]Determinant in the critical point {x: 0.0, y: 0.0} is : 1.75000000000000

行列式是一个标量值,它是一个方阵的元素的函数。

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

它允许表征矩阵和由矩阵表示的线性映射的一些属性。特别地,行列式非零当且仅当矩阵可逆,且矩阵所表示的线性映射是同构的。

因此,对于正半定和负半定 Hessian,该测试是不确定的(Hessian 半定但不确定的临界点可能是局部极值或鞍点)。

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

图片由 Louis Brulé Naudet 提供。

在我们的例子中,对于临界点(0;0),行列式为 1.75 > 0,f’xx > 0,那么,临界点是一个局部极小值,所以函数是严格凸的。

Tensorflow 或其他机器学习库无疑是强大的,但它们仍然过度消耗资源,并且可能成为低性能机器的障碍,本文旨在解释一种构建 Hessian 矩阵的新方法,使用一种更轻便的科学计算工具:sympy。

Louis Brulé Naudet 拥有巴黎萨克莱大学的法律和经济学/管理学双学位。

https://louisbrulenaudet.com

回归模型中的异方差性

原文:https://towardsdatascience.com/heteroscedasticity-in-regression-model-21d9f5a93e59?source=collection_archive---------6-----------------------

使用统计模型检查异方差性

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

图片来自 Unsplash

简介

通常,回归分析是对可能具有跨不同自变量值的高方差的内置特征的数据进行的。这类数据的一个缺陷是异方差,它表示拟合值周围的可变方差。当我们观察异方差时,通常需要验证模型,有时在这种情况下回归数据可能不可靠。

什么是异方差?

当我们执行回归时,数据点分散在拟合线周围。对于一个好的回归模型,散射应该尽可能小。当散射是均匀的时,这个模型称为均匀散射模型。如果不是,模型就是异方差的。典型的异方差分布类似于锥形,如下所示

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

异方差数据的锥形分布。作者图片

从上图可以看出,很明显,在独立变量(n)的值较低时,散射非常紧密,而当 n 的值较高时,方差较高。

什么原因导致异方差?

大多数情况下,数据本身就是这种锥形分布的原因。有时,因变量的方差在整个数据集内变化且不恒定是很自然的。例如,在时间序列数据的情况下,因变量的初始值可能非常接近,但在最近的时间内,分散可能会扩大。在 20 世纪 50 年代,美国所有 50 个州的苹果价格可能非常相似,但在最近一段时间可能会有很大差异。换句话说,最近的数据点之间的变化可能比早期数据之间的变化更大。

用 python 实现

对于上面显示的数据集,我们可以通过使用 python 的 statsmodels 库来检查异方差性。 Statsmodels 包含 het_white 模块,这是针对异方差性的 white 拉格朗日乘数检验。文档显示可以对任何样本数据进行测试,输出 p 值作为异方差检验的指标。零假设取为“残差数据无异方差”。

让我们先检查一下同质数据。

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

拟合线周围的均匀散射。作者图片

我创建了一个合成数据集作为异方差数据的样本。

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

拟合线周围的非均匀散射。作者图片

我们可以对这个数据进行 White 的检验[1]来检验是否存在异方差。

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

作者图片

在这种情况下,p 值非常小,因此我们拒绝零假设,并确认数据集中存在潜在的异方差。

修正异方差

异方差使得回归模型不太可靠,因为残差不应该遵循任何特定的模式。为了使模型稳健,散射应该在拟合线周围是随机的。处理异方差的一个非常流行的方法是转换因变量【2】。我们可以对变量执行对数转换,并用 White 的测试再次检查。为了演示,我们删除了 y 轴上的一些低值。

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

转换变量。作者图片

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

作者图片

当进行怀特检验时,p 值变高,表明数据变得同方差。然而,当执行数据转换时,原始数据的定义不再存在,而是被新的变量所取代。

结论

异方差会降低回归模型的稳健性。本质上,预测误差因自变量的不同范围而异,表明模型并不完美。在本文中,我们使用 statsmodel 演示了异方差的原因及其在 python 中的检测实现。在进行任何回归分析后,应始终检查残差图,并确保残差的可变性不遵循任何模式,或者换句话说,残差的散布应在整个回归线上是均匀的。

Github 页面

参考文献

[1] 异方差没什么可怕的

[2] 多元回归分析中的异方差性:什么是异方差性,如何检测异方差性,如何解决异方差性,以及在 R 和 SPSS 中的应用

Python 的隐藏宝石

原文:https://towardsdatascience.com/hidden-gems-of-python-76020b14e42f?source=collection_archive---------1-----------------------

我甚至不知道 Python 有哪些特性

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

UnsplashKsenia Makagonova 拍摄的照片

这些天我有了一个新的消遣——阅读 Python 文档只是为了好玩!当你在闲暇时阅读一些东西,你会注意到一些有趣的花絮,否则你会错过的。所以,这是让我“哦!你可以用 Python 来做吗?”

1.功能属性

类似于设置类和对象的属性,也可以设置函数的属性。

我们在第 10 行设置了属性‘optional _ return ’,在第 11 行设置了属性‘is _ awesome’。在后面的第 19 & 20 行中,我们已经在函数之外访问了这些属性。代码的输出将是:

Final answer is 2197
Show calculations --> 13
Is my function awesome? --> Yes, my function is awesome.

当您希望选择检索某个中间变量,而不是在每次调用函数时用 return 语句显式返回它时,这就很方便了。还要注意,属性可以从函数定义内部或从函数定义外部设置。

2.For-else 循环

在 Python 中,可以为循环的添加一个 else 子句。只有在执行过程中在循环体中没有遇到 break 语句,才会触发 else 子句。

All elements at least 3 letters long

注意 else 对于缩进在的层次上,而对于不在的层次上。这里,没有元素的长度短于 3。所以,永远不会遇到 break 语句。因此, else 子句将被触发(在循环的被执行后)并打印如上所示的输出。

有人可能会说,这可以通过使用一个单独的变量来实现,该变量跟踪是否遇到了 break 语句。也许它也能减少下一个阅读代码的人的困惑。以下是实现相同结果的等效方法:

不过,我想知道还是好的。

3.“int”的分隔符

很难在视觉上区分 10000000 和 10000000 这样的整数(它们甚至是不同的数字吗?).我们不能像在英语中一样在 Python 中使用逗号,因为 Python 会将其解释为多个整数的元组。

Python 有一个非常方便的处理方法:我们可以使用下划线来提高可读性。因此,1_000_000 将被解释为单个 int

<class 'int'>
<class 'int'>
True

4.eval()和 exec()

Python 能够动态读取一个字符串,并像处理一段 Python 代码一样处理它。这是通过使用 eval ()和 exec ()函数实现的(‘eval’用于评估表达式,‘exec’用于执行语句)。

b = 5
c is 9

在第 3 行, eval ()函数将输入字符串作为 Python 表达式读取,对其求值,并将结果赋给变量‘b’。在第 6 行, exec ()函数将输入字符串作为 Python 语句读取并执行。

您甚至可以将动态创建的字符串传递给这些函数。例如,您可以创建 1000 个名为 x_0,x_1,…,x_999 的变量,而不必在代码中手动编写每个变量声明。这可能看起来像是一个完全没有意义的特性,但事实并非如此。

在更广泛的编程环境中,不仅仅是 Python,eval/exec 的使用非常强大,因为它允许您编写动态代码,使用运行时可用的信息来解决甚至无法在编译时表达的问题。[……]exec 实际上是嵌入在 Python 中的 Python 解释器,因此如果您有一个特别难解决的问题,您可以解决它的方法之一是编写一个程序来编写一个程序来解决它,然后使用 exec 运行第二个程序。

你可以阅读更多史蒂文·达普拉诺的美丽解释。

5.省略

省略号或“…”是 Python 的内置常量,类似于等内置常量。它可以以不同的方式使用,包括但不限于:

5.1 未成文代码的占位符

与 *pass 类似,*省略号可以在代码没有写完整时用作占位符,但需要一些占位符来保证语法准确性

5.2 替代’无’

当想要表示一个空的输入或返回时,通常选择 None。但有时 None 可以是函数的预期输入或返回之一。在这种情况下,省略号可以作为占位符。

给定 n,函数 nth_odd() 计算第 n 个奇数。给定第 n 个奇数,函数 original_num ()计算原始数 n。这里, None 是函数 original_num ()的预期输入之一,因此我们不能将其用作参数 *m 的默认占位符。*代码的输出将是:

This function needs some input
Non integer input provided to nth_odd() function
9 is 5th odd number
16 is not an odd number

5.3 NumPy 中的数组切片

NumPy 使用省略号对数组进行切片。下面的代码显示了分割 NumPy 数组的两种等效方法:

[ 0  2  4  6  8 10 12 14]
[ 0  2  4  6  8 10 12 14]

因此,'…‘表示需要多少’:'就有多少。

省略的布尔值

无(的布尔值为假)相反,省略号的布尔值被视为真。

TL;速度三角形定位法(dead reckoning)

总之,到目前为止我发现的有趣的特性是:

  1. 函数属性:像对象一样给函数分配属性
  2. For-else 循环:跟踪循环是否在没有 break 语句的情况下执行
  3. int 的分隔符:32_534_478 是一个 int
  4. eval ()和 exec ():将字符串作为 Python 代码读取并运行
  5. 省略号:通用内置常量。

离别赠言

Python 不仅是一种有用的语言,而且是一种非常有趣的语言。我们在生活中都很忙,但是为了更好地了解这门语言并没有坏处。我很想知道一些你可能发现的复活节彩蛋。

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

图片由 u/ANewMuleSkinner 发布在 reddit

资源

您可以在下面的 Python 文档页面上阅读更多关于我上面提到的内容:

[1] 功能属性

For-else

[3] 评估/执行

省略号

隐马尔可夫模型:综述

原文:https://towardsdatascience.com/hidden-markov-models-an-overview-98926404da0e?source=collection_archive---------15-----------------------

实践教程行业笔记

有许多工具可用于分析顺序数据。隐马尔可夫模型(HMMs)是最简单、最灵活、最经得起时间考验的模型之一。它们最初是为信号处理而开发的,现在在生物信息学中无处不在。

在数据科学社区中,有一种倾向是支持像 LSTMs 这样的机器学习选项。虽然这些工具非常强大,但它们也是出了名的复杂和难以理解。因此,你经常会看到数据科学家努力使用复杂的方法,而简单的方法会更好。

本文旨在解决这一问题,让技术人员了解经常被忽视的 HMM 的概念和应用。在 Zeitworks 我们非常依赖最先进的机器学习技术,但作为经验丰富的数据科学家,我们也知道有时 HMM 是这项工作的工具。

激发真实世界的例子

以下是我使用 hmm 解决的一些问题:

  1. zei networks我们使用计算机事件日志研究人类工作流程。其中一部分是获取用户的原始事件日志(击键、访问的 URL 等。)并确定他们每次都在做什么(背景研究、文档审查等)。).有时你可以孤立地从一个事件中猜测,但通常你也需要看看前后的事件才能有信心。
  2. 你有一本小说中某一页的照片,你想将文本数字化。照片已经被分割成单词的图像。大部分都可以用 OCR 解码,但是有些字因为原页面上的污垢而模糊不清(那是“快”还是“嘎嘎”?).你想用周围的词来挑选最佳选项。
  3. 当一个人在玩电子游戏时,你有一系列每秒钟拍摄的大脑扫描。在游戏中,他们的化身在建筑物中进进出出,你的目标是仅使用大脑扫描来猜测它是在室内还是室外。任何给定的扫描都是非常不明确的,但是头像通常会在里面/外面停留几秒钟。你预计化身在(外)侧的时间跨度很大,大脑扫描平均看起来稍微更偏向(外)侧。

为这些问题中的每一个建立一个定制的解决方案是可能的,但是这是一个非常大的任务,有脆弱或易受攻击的风险。通常,特别是如果工作部分是探索性的,你想要更轻的东西。hmm 提供了一个框架,它足够通用,可以涵盖所有这些情况,足够灵活,可以包含大量领域知识,并且足够简单,可以理解。

数学模型

让我们从商业现实过渡到数学理想化。上述业务问题有几个共同点:

  1. 有一个离散的潜在现实世界的“状态”,随着时间的推移而变化。在示例(1)和(3)中,状态很少改变。在示例(2)中,状态是页面上的单词,并且它几乎在每个时间步都发生变化。我们把这个现实世界的状态叫做 s。
  2. 在每个时间步长,您都有一个“观察”,可以用来以一定的置信度猜测状态(对于 OCR 示例,置信度通常很高,但是对于大脑扫描,置信度很低)。让我们把这个观测称为 O。注意,虽然状态 S 是离散的,O 可以是离散的,也可以是连续的。
  3. 这个想法是使用时间 T 时的观察值 O 来猜测状态 S,然后使用 T 前后的观察值来改进我们的猜测。

整体情况看起来是这样的,状态一个接一个,每一个都产生一个观察结果:

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

HMM 中状态和观察值之间的依赖结构

具体来说,在你的头脑中保持下面的画面。状态 S 是可以掷出的骰子,观察值 O 是哪一面出现。为简单起见,假设有两个骰子,其中一个是公平的,另一个有 50%的机会是 6。掷出公平骰子后,有 10%的几率我会换到另一个骰子,在掷出装载的骰子后,有 20%的几率我会换。我做了很多次掷骰子——从来没有告诉你我用的是哪个骰子——而你的工作就是猜测骰子什么时候是公平的或者是装满的。你需要的最后一条信息是,在第一次掷骰子时,我使用公平骰子还是装载骰子的可能性有多大;让我们称之为 50/50。这种情况可以归纳为三个表格:

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

一个简单的 HMM 的数学描述与骰子,一个加载和一个公平。

为了用数学术语表达这一点,我们需要:

  • 每个州的初始概率,P[S⁰=s].这个矢量通常被称为π。
  • 转移概率矩阵

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

为了简单起见,我称之为 Pr[a → b]

  • 给定状态下观察值的概率分布,Pr[O=o|S=s]。因为骰子 O 是离散的,概率分布放在一个表格里。但是数学上 O 可以是任何东西;对于算法,我们只需要一个函数,它接受状态(从 1 到 k 的整数)和观察值(可以是任何值)并返回一个非负数。

我应该指出,如果我们忘记观察,状态 S 构成一个更简单的模型,称为“马尔可夫链”。几乎随机分析中的所有东西要么是马尔可夫链,要么是马尔可夫链的变体;hmm 是一种变体,其中链的状态对我们的知识是隐藏的(因此得名),并且必须通过不完美的观察来猜测。

hmm 的局限性及优化

我想讨论一下 HMM 模型中一些很少是 100%真实的理想化情况,以及对此你能做些什么。如果您只想了解如何使用 HMMs,可以跳过这一部分:)

最大的理想化是所谓的“马尔可夫假设”,即下一个状态只依赖于当前状态。我喜欢把它比作一只患了健忘症的青蛙,在睡莲叶间跳跃;他不知道他在当前的发射台呆了多久,也不知道他之前在哪里,所以他只根据他从当前位置看到的东西来选择下一个发射台(或者根本不跳)。您可以通过一个 n 阶马尔可夫链来部分解决这个问题,其中您的“状态”实际上是一个滑动窗口,覆盖了包括当前状态在内的最后 n 个状态。在自然语言中使用 hmm 时,你会经常看到这种情况。这在计算上变得有风险,因为你现在要跟踪 k^n 不同的“州”。

HMMs 的下一个假设是状态是真正离散的。通常情况下,状态是由人来决定的,地面上的现实可能并不完全符合其中一种状态。hmm 没有混合状态的概念,但是它们支持关于状态的不确定性;当模型表明两种状态的可能性相当时,可能是信号很弱,但也可能是世界不适合我们的盒子。

最后是最重要的 Pr[O|S],给定潜在状态下你观察到的概率。在我们的玩具骰子示例中,它只是一个查找表。不过,在我引用的现实世界的例子中,制作 Pr[O|S]本身就是一个项目,包括建模假设和拟合历史数据。HMM 对 Pr[O|S]的复杂程度没有限制,但它确实假设 O 仅依赖于当前的 S,而不依赖于任何先前的 S 或 O。这一假设当然不成立——因为 S 中没有捕捉到真实世界的动态,所以观察值通常是相关的——但在实践中这很少会有问题。

计算状态:维特比算法

现在让我们把这个模型付诸实践吧!你可以用 HMM 做很多事情,但是在商业中 90%的时间是这样的:给定一系列 N 次观察,猜猜状态是什么。为此,我们使用著名的维特比算法,该算法计算给定我们的观察的基础状态的最优序列。

当我说“最优”时,我指的是“最有可能”——1)从基础马尔可夫链中获得状态序列,然后 2)该序列生成已知观察值的概率。

为了做到这一点,考虑一个相关的子问题:找到直到时间步 i 的最佳序列,该时间步 I在特定状态 s* 结束。让我们定义σ(i,s)为该序列的概率。想想骰子的例子:关键的见解是,直到 i+1 结束的最佳序列是公平的,或者是{直到 I 结束的最佳序列是公平的}+{公平},或者是{直到 I 结束的最佳序列是装载的}+{公平}。如果我们知道到时间 I 为止的最佳序列,那么 i+1 就很容易了!在数学中,这告诉我们:*

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

我们可以将所有σ(i,s)排列在一个表格中,如下所示:

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

一旦这个表被填充,我们几乎完成了维特比算法!我们可以通过查看哪个 s 最大化σ(N,s)来找到最优序列中的最后一个状态。然后我们逆向工作——在计算σ(N,s)时,我们用哪个 x 来表示σ(N-1,x)?您可以通过画一个从σ(i,s)到σ(i-1,x)的箭头来形象化这个过程,如下所示:

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

这样,我们可以重建整个最佳序列。如果我们想表达这是伪代码,我们可以写:

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

只有一个小的实现细节我必须注意。所述的算法将会遇到数值问题,因为概率变得如此之小。这很容易通过对概率的对数进行操作,并计算 Log[σ(i,s)]而不是σ(i,s)的表来解决。最大化 Log[σ(i,s)]等价于最大化σ(i,s)。

离别赠言

当我告诉科技行业的人我们在 Zeitworks 做什么时,我得到的典型回应是“哦,你可以用 LSTM 来做这个!”。虽然这些现在确实很流行,但是还有很多分析序列数据的工具,它们各有所长。

lst ms——以及其他深度学习模型——在现实世界模式不可理解的情况下大放异彩。这些是“数据驱动”的工具;有了足够的数据来训练,有了足够的旋钮来转动,它们可以学习模仿人类从未记录下来的复杂模式。作为交换,它们很难解释,如果问题发生变化也很难概括,并且依赖于大量的数据。

hmm 则相反。它们是“模型驱动的”:一种对人类友好的世界叙事,被浓缩成方程式。这些方程中的参数符合数据,但它们是有意义的数字,有现实世界的解释,而不是一个数字巫术。模型驱动的工具不如数据驱动的工具强大,但是作为交换,它们训练起来很便宜,很容易理解,而且你可以把专业知识融入其中。

数据驱动和模型驱动工具是互补的,而不是对立的。它们是解决不同问题的理想选择,在 Zeitworks,我们将两者结合在一起。但是做到这一点取决于批判性地思考你的武器库中所有工具的能力,理解它们的优势,以便你可以将它们与正确的任务相匹配。

我在本文中的目标是让您理解 hmm。它们是强大的模型——尽管在数据科学界经常被低估——它们通常是这项工作的最佳工具。

下一篇 : 训练嗯

蟒蛇的隐藏宝藏

原文:https://towardsdatascience.com/hidden-treasures-of-python-78ae604f7e33?source=collection_archive---------23-----------------------

很少使用的库以及如何使用它们

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

来自 Unsplash

Python 编程语言中有成千上万的库,所以本文的标题基本上可以涉及到几乎所有的库,只有几百个库除外。描述所有的 Python 库可能需要一个真正的图书库。不过,在本文中,我们将重点介绍几个用于解决特定任务或娱乐的工具。

为了实践我们的库,我们将从 Kaggle 下载一个数据集— 动物护理和控制收养的动物

import pandas as pd
df = pd.read_csv('animal-data-1.csv')
print('Number of pets:', len(df), '\n')
print(df.columns.tolist())**Output**:Number of pets: 10290 ['id', 'intakedate', 'intakereason', 'istransfer', 'sheltercode', 'identichipnumber', 'animalname', 'breedname', 'basecolour', 'speciesname', 'animalage', 'sexname', 'location', 'movementdate', 'movementtype', 'istrial', 'returndate', 'returnedreason', 'deceaseddate', 'deceasedreason', 'diedoffshelter', 'puttosleep', 'isdoa']

1.缺少编号

库安装 : pip install missingno

Missingno 是一个特殊的库,用于显示数据帧中缺失的值。当然,出于这个目的,我们可以使用任何可视化库中的 seaborn 热图或条形图。然而,在这种情况下,我们必须首先使用df.isnull().sum()创建一个包含每列中缺失值的序列,而 missingno 在幕后完成所有工作。该库提供了几种类型的图表:

  • matrix显示数据帧中多达 50 列的数据完成密度模式,它类似于 seaborn 缺失值热图。此外,通过右侧的迷你图,它显示了数据完整性的大致形状,强调了具有最大和最小空值的行。
  • bar chart以列为单位显示无效可视化。
  • heatmap测量范围从-1 到 1 的无效相关性。本质上,它显示了一个变量的存在与否对另一个变量的存在有多么强烈的影响。没有丢失值或正好相反,完全为空的列被排除在可视化之外,没有有意义的相关性。
  • dendrogram与热图一样,度量列之间的空关系,但在这种情况下不是成对的,而是在列组之间,检测缺失数据的簇。那些在图表上位置更近的变量显示出更强的零相关性。对于少于 50 列的数据帧,树状图是垂直的,否则,它翻转成水平的。

让我们在 pet 数据集上使用默认设置来尝试所有这些图表:

import missingno as msno
%matplotlib inline
msno.matrix(df)

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

msno.bar(df)

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

msno.heatmap(df)

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

msno.dendrogram(df)

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

我们可以对数据集进行以下观察:

  1. 一般来说,缺少的值很少。
  2. 最空的列是deceaseddatereturndate
  3. 大多数宠物都有芯片。
  4. 无效相关性:
  • 被植入芯片和死亡之间有一点负面影响,
  • 略显积极——被植入芯片与被归还,被归还与死亡。

有几个选项可以自定义缺失无图表:figsizefontsizesort(按完整性对行进行排序,升序或降序)、labels(可以是TrueFalse,表示是否显示列标签)。有些参数是特定于图表的:矩阵图和条形图的color,矩阵图的sparkline(是否绘制)和width_ratios(矩阵宽度到迷你图宽度),条形图的log(对数刻度),热图的cmap颜色图,树状图的orientation。让我们将其中一些应用到上面的图表中:

msno.matrix(
            df, 
            figsize=(25,7),
            fontsize=30, 
            sort='descending',
            color=(0.494, 0.184, 0.556), 
            width_ratios=(10, 1)
            )

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

最后,如果还有什么我们想要调整的,我们总是可以将 matplotlib 的任何功能添加到缺少的图形中。为此,我们应该添加参数inline并将其赋给False。让我们给矩阵图添加一个标题:

import matplotlib.pyplot as plt
msno.matrix(
            df, 
            figsize=(25,7),
            fontsize=30, 
            sort='descending',
            color=(0.494, 0.184, 0.556), 
            width_ratios=(10, 1),
            inline=False
            ) 
plt.title('Missing Values Pet Dataset', fontsize=55)
plt.show()

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

缺少文件

2.有平面的

库安装 : pip install tabulate

这个库用于用 Python 漂亮地打印表格数据。它允许智能和可定制的列对齐,数字和文本格式,通过小数点对齐。

tabulate()函数采用表格数据类型(dataframe、列表或字典列表、字典、NumPy 数组)、一些其他可选参数,并输出一个格式良好的表格。让我们在 pet 数据集的一个片段上练习一下,从最基本的漂亮打印的表格开始:

from tabulate import tabulate
df_pretty_printed = df.iloc[:5, [1,2,4]]
print(tabulate(df_pretty_printed))**Output**:-  -----------  -----------------------  ------
0  Jadzia       Domestic Short Hair      Female
1  Gonzo        German Shepherd Dog/Mix  Male
2  Maggie       Shep Mix/Siberian Husky  Female
3  Pretty Girl  Domestic Short Hair      Female
4  Pretty Girl  Domestic Short Hair      Female
-  -----------  -----------------------  ------

我们可以在表中添加一个headers参数。如果我们赋值headers='firstrow',则使用第一行数据,如果headers='keys',则使用数据帧/字典的键。对于表格格式化,我们可以使用一个tablefmt参数,该参数可以从众多选项中选择一个(以字符串形式赋值):simplegithubgridfancy_gridpipeorgtbljiraprestopretty等。

默认情况下,制表将包含浮点数的列靠小数点对齐,整数靠右,文本列靠左。这可以通过使用numalignstralign参数(rightcenterleftdecimal用于数字,或None)来覆盖。对于文本列,可以禁用默认的前导和尾随空格删除。

让我们自定义我们的表格:

print(tabulate(
               df_pretty_printed, 
               headers='keys',
               tablefmt='fancy_grid',
               stralign='center'
               ))**Output**:╒════╤══════════════╤═════════════════════════╤═══════════╕
│    │  animalname  │        breedname        │  sexname  │
╞════╪══════════════╪═════════════════════════╪═══════════╡
│  0 │    Jadzia    │   Domestic Short Hair   │  Female   │
├────┼──────────────┼─────────────────────────┼───────────┤
│  1 │    Gonzo     │ German Shepherd Dog/Mix │   Male    │
├────┼──────────────┼─────────────────────────┼───────────┤
│  2 │    Maggie    │ Shep Mix/Siberian Husky │  Female   │
├────┼──────────────┼─────────────────────────┼───────────┤
│  3 │ Pretty Girl  │   Domestic Short Hair   │  Female   │
├────┼──────────────┼─────────────────────────┼───────────┤
│  4 │ Pretty Girl  │   Domestic Short Hair   │  Female   │
╘════╧══════════════╧═════════════════════════╧═══════════╛

这里唯一要记住的是,漂亮打印的表格最好在笔记本电脑和计算机上显示,但有时在较小的屏幕上可能会有问题(智能手机和 iPhones)。

将文件制成表格

3.维基百科(一个基于 wiki 技术的多语言的百科全书协作计划ˌ也是一部用不同语言写成的网络百科全书ˌ 其目标及宗旨是为全人类提供自由的百科全书)ˌ开放性的百科全书

库安装 : pip install wikipedia

维基百科图书馆,顾名思义,方便从维基百科获取信息。使用它可以完成的一些任务包括:

  • 搜索维基百科— search()
  • 获取文章摘要— summary
  • 获取完整的页面内容,包括图片、链接、维基百科页面的任何其他元数据,
  • 选择页面语言— set_lang()

在上面印刷精美的表格中,我们看到了一种叫做西伯利亚哈士奇的狗。作为练习,我们将把语言设置为俄语(我的母语🙂)并搜索相应维基百科页面的一些建议:

import wikipedia 
wikipedia.set_lang('ru') 
print(wikipedia.search('Siberian Husky'))**Output**:'Сибирский хаски', 'Древние породы собак', 'Породы собак по классификации кинологических организаций', 'Маккензи Ривер Хаски', 'Ричардсон, Кевин Майкл']

让我们取第一个建议,取该页摘要的第一句话:

print(wikipedia.summary('Сибирский хаски', sentences=1))**Output**:Сибирский хаски — заводская специализированная порода собак, выведенная чукчами северо-восточной части Сибири и зарегистрированная американскими кинологами в 1930-х годах как ездовая собака, полученная от аборигенных собак Дальнего Востока России, в основном из Анадыря, Колымы, Камчатки у местных оседлых приморских племён — юкагиров, кереков, азиатских эскимосов и приморских чукчей — анкальын (приморские, поморы — от анкы (море)).

现在,我们将从该页面获得一张哈士奇图片的链接:

print(wikipedia.page('Сибирский хаски').images[0])**Output**:[https://upload.wikimedia.org/wikipedia/commons/a/a3/Black-Magic-Big-Boy.jpg](https://upload.wikimedia.org/wikipedia/commons/a/a3/Black-Magic-Big-Boy.jpg)

想象这个美丽的生物:

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

来自维基百科

维基百科文档

4.Wget

库安装 : pip install wget

Wget 库允许下载 Python 中的文件,而不需要打开它们。我们还可以添加一个保存该文件的路径作为第二个参数。

下面下载上面哈士奇的图片:

import wget
wget.download('[https://upload.wikimedia.org/wikipedia/commons/a/a3/Black-Magic-Big-Boy.jpg'](https://upload.wikimedia.org/wikipedia/commons/a/a3/Black-Magic-Big-Boy.jpg'))**Output**:'Black-Magic-Big-Boy.jpg'

现在,我们可以在与此笔记本相同的文件夹中找到该图片,因为我们没有指定保存它的路径。

由于互联网上的任何网页实际上都是一个 HTML 文件,这个库的另一个非常有用的应用是抓取整个网页,包括所有的元素。让我们下载数据集所在的 Kaggle 网页:

wget.download('[https://www.kaggle.com/jinbonnie/animal-data'](https://www.kaggle.com/jinbonnie/animal-data'))**Output**:'animal-data'

产生的animal-data文件如下所示(我们将只显示前几行):

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Animal Care and Control Adopted Animals | Kaggle</title>
    <meta charset="utf-8" />
    <meta name="robots" content="index, follow" />
    <meta name="description" content="animal situation in Bloomington Animal Shelter from 2017-2020" />
    <meta name="turbolinks-cache-control" content="no-cache" />

获取文档

5.骗子

库安装 : pip install Faker

该模块用于生成假数据,包括姓名、地址、电子邮件、电话号码、工作、文本、句子、颜色、货币等。faker 生成器可以将区域设置作为参数(默认为 en_US 区域设置),以返回本地化数据。为了生成一段文本或一个句子,我们可以使用缺省的 lorem ipsum 或者,我们可以提供我们自己的单词集。为了确保所有创建的值对于某个特定的实例都是惟一的(例如,当我们想要创建一长串惟一的假名时),应用了unique属性。相反,如果有必要产生相同的值或数据集,就使用seed()方法。

让我们看一些例子:

from faker import Faker
fake = Faker()print(
      'Fake color:', fake.color(), '\n'
      'Fake job:',   fake.job(),   '\n'
      'Fake email:', fake.email(), '\n'
      )*# Printing a list of fake Korean and Portuguese addresses*
fake = Faker(['ko_KR', 'pt_BR'])
for _ in range(5):
    print(fake.unique.address())     *# using the `unique` property*print('\n')*# Assigning a seed number to print always the same value / data set*
fake = Faker()
Faker.seed(3920)
print('This English fake name is always the same:', fake.name())**Output**:Fake color: #bde2f9 
Fake job: Transport planner 
Fake email: chad52@yahoo.com 

Rua Marcos Vinicius Costela, 66
Vila Nova Gameleira 2ª Seção
86025006 da Costa / MG
충청남도 평창군 언주1거리 (우진장읍)
Núcleo de Peixoto, 87
Havaí
90291-013 Campos / MS
Lago da Luz
Minas Brasil
85538436 Porto da Mata / TO
인천광역시 중랑구 서초중앙0로

This English fake name is always the same: Kim Lopez

回到我们的数据集,我们发现至少有两只不幸的宠物有着不太好听的名字:

df_bad_names = df[df['animalname'].str.contains('Stink|Pooh')]
print(df_bad_names)**Output**: identichipnumber animalname            breedname speciesname 
1692              NaN    Stinker  Domestic Short Hair         Cat    
3336  981020023417175       Pooh  German Shepherd Dog         Dog  
3337  981020023417175       Pooh  German Shepherd Dog         Dog  

     sexname           returndate                     returnedreason  
1692  Male                    NaN                              Stray  
3336  Female  2018-05-14 00:00:00  Incompatible with owner lifestyle  
3337  Female                  NaN                              Stray

最后 2 排的狗实际上是同一只,因为与主人的生活方式不兼容而被送回收容所。用我们的新技能,让我们拯救这两种动物的名声,给它们重新起个更体面的名字。因为这只狗是德国牧羊犬,我们将为她选择一个德国名字。至于猫,根据这个维基百科页面,家养短毛是美国最常见的品种,所以我们会为它取一个英文名字。

*# Defining a function to rename the unlucky pets*
def rename_pets(name):
    if name == 'Stinker':
        fake = Faker()
        Faker.seed(162)   
        name = fake.name()
    if name == 'Pooh':
        fake = Faker(['de_DE'])
        Faker.seed(20387)
        name = fake.name()
    return name*# Renaming the pets*
df['animalname'] = df['animalname'].apply(rename_pets)*# Checking the results*
print(df.iloc[df_bad_names.index.tolist(), :] )**Output**: identichipnumber            animalname     breedname speciesname
1692             NaN         Steven Harris  Domestic Short Hair  Cat          
3336 981020023417175  Helena Fliegner-Karz  German Shepherd Dog  Dog   
3337 981020023417175  Helena Fliegner-Karz  German Shepherd Dog  Dog       

     sexname           returndate                     returnedreason  
1692    Male                  NaN                              Stray  
3336  Female  2018-05-14 00:00:00  Incompatible with owner lifestyle  
3337  Female                  NaN                              Stray

对于一只猫和一只狗来说,史蒂文·哈里斯和海伦娜·弗利格纳-卡兹听起来有点太夸张了,但绝对比他们以前的名字好得多!

Faker 文档

6.数字计算器

库安装 : pip install numerizer

这个小 Python 包用于将自然语言数字转换成数字(整数和浮点数),并且只包含一个函数— numerize()

现在让我们在数据集上尝试一下。一些宠物的名字包含数字:

df_numerized_names = df[['identichipnumber', 'animalname', 'speciesname']][df['animalname'].str.contains('Two|Seven|Fifty')]   
print(df_numerized_names)**Output**: dentichipnumber animalname speciesname
2127              NaN      Seven         Dog
4040  981020025503945  Fifty Lee         Cat
6519  981020021481875   Two Toes         Cat
6520  981020021481875   Two Toes         Cat
7757  981020029737857    Mew Two         Cat
7758  981020029737857    Mew Two         Cat
7759  981020029737857    Mew Two         Cat

我们将把这些名字的数字部分转换成实数:

from numerizer import numerize
df['animalname'] = df['animalname'].apply(lambda x: numerize(x))
print(df[['identichipnumber', 'animalname','speciesname']]\
        .iloc[df_numerized_names.index.tolist(), :])**Output**: identichipnumber animalname speciesname
2127              NaN          7         Dog
4040  981020025503945     50 Lee         Cat
6519  981020021481875     2 Toes         Cat
6520  981020021481875     2 Toes         Cat
7757  981020029737857      Mew 2         Cat
7758  981020029737857      Mew 2         Cat
7759  981020029737857      Mew 2         Cat

编号器文档

7.表情符号

库安装 : pip install emoji

通过这个库,我们可以根据由 Unicode Consortium 定义的表情符号代码,将字符串转换成表情符号,如果指定了use_aliases=True,还可以补充别名。表情包只有两个功能:emojize()demojize()。默认英语(language='en')可以更改为西班牙语(es)、葡萄牙语(pt)或意大利语(it)。

import emoji
print(emoji.emojize(':koala:'))
print(emoji.demojize('🐨'))
print(emoji.emojize(':rana:', language='it'))**Output**:🐨
:koala:
🐸

让我们给我们的动物表情符号。首先,我们将检查它们独特的物种名称:

print(df['speciesname'].unique())**Output**:['Cat' 'Dog' 'House Rabbit' 'Rat' 'Bird' 'Opossum' 'Chicken' 'Wildlife' 'Ferret' 'Tortoise' 'Pig' 'Hamster' 'Guinea Pig' 'Gerbil' 'Lizard' 'Hedgehog' 'Chinchilla' 'Goat' 'Snake' 'Squirrel' 'Sugar Glider' 'Turtle' 'Tarantula' 'Mouse' 'Raccoon' 'Livestock' 'Fish']

我们必须将这些名称转换成小写,给每个名称添加前导和尾随冒号,然后将emojize()应用于结果:

df['speciesname'] = df['speciesname']\
 .apply(lambda x: emoji.emojize(f':{x.lower()}:', use_aliases=True))
print(df['speciesname'].unique())**Output**:['🐱' '🐶' ':house rabbit:' '🐀' '🐦' ':opossum:' '🐔' ':wildlife:' ':ferret:' ':tortoise:' '🐷' '🐹' ':guinea pig:' ':gerbil:' '🦎' '🦔' ':chinchilla:' '🐐' '🐍' ':squirrel:' ':sugar glider:' '🐢' ':tarantula:' '🐭' '🦝' ':livestock:' '🐟']

让我们将家兔、乌龟和松鼠重命名为表情库可以理解的同义词,并再次尝试对它们进行表情符号化:

df['speciesname'] = df['speciesname']\
                      .str.replace(':house rabbit:', ':rabbit:')\
                          .replace(':tortoise:', ':turtle:')\
                          .replace(':squirrel:', ':chipmunk:')
df['speciesname'] = df['speciesname']\
  .apply(lambda x: emoji.emojize(x, variant='emoji_type'))
print(df['speciesname'].unique())**Output**:['🐱' '🐶' '🐇️' '🐀' '🐦' ':opossum:️' '🐔' ':wildlife:️' ':ferret:️' '🐢️' '🐷' '🐹' ':guinea pig:' ':gerbil:️' '🦎' '🦔' ':chinchilla:️' '🐐' '🐍' '🐿️' ':sugar glider:' '🐢' ':tarantula:️' '🐭' '🦝' ':livestock:️' '🐟']

剩下的物种是或统称(野生动物和家畜),或者没有一个表情符号对等物,至少现在还没有。我们将让它们保持原样,仅删除冒号,并将它们转换回标题大小写:

df['speciesname'] = df['speciesname'].str.replace(':', '')\
                                     .apply(lambda x: x.title())
print(df['speciesname'].unique(), '\n')
print(df[['animalname', 'speciesname', 'breedname']].head(3))**Output:**['🐱' '🐶' '🐇️' '🐀' '🐦' 'Opossum️' '🐔' 'Wildlife️' 'Ferret️' '🐢️' '🐷' '🐹' 'Guinea Pig' 'Gerbil️' '🦎' '🦔' 'Chinchilla️' '🐐' '🐍' '🐿️' 'Sugar Glider' '🐢' 'Tarantula️' '🐭' '🦝' 'Livestock️' '🐟'] 

  animalname  speciesname                breedname
0     Jadzia           🐱      Domestic Short Hair
1      Gonzo           🐶  German Shepherd Dog/Mix
2     Maggie           🐶  Shep Mix/Siberian Husky

表情符号文档

8.皮阿兹特罗

库安装 : pip install pyaztro

PyAztro 似乎是为了娱乐而不是工作而设计的。这个图书馆为每个星座提供了一个占星术。该预测包括那天的标志描述、该标志的日期范围、心情、幸运数字、幸运时间、幸运颜色、与其他标志的兼容性。例如:

import pyaztro
pyaztro.Aztro(sign='taurus', day='tomorrow').description**Output**:"If the big picture is getting you down, narrow your focus a bit and try to enjoy the smaller aspects of life. It's a good day to remember what you're truly thankful for in life and to spread the word."

好建议!事实上,我不会等到明天,现在就把注意力集中在数据集上,研究一些相关的信息😀

有一只猫和一只狗叫白羊座:

print(df[['animalname', 'speciesname']][(df['animalname'] == 'Aries')])**Output**: animalname  speciesname
3036      Aries           🐱
9255      Aries           🐶

还有很多叫狮子座的宠物:

print('Leo:', df['animalname'][(df['animalname'] == 'Leo')].count())**Output**:Leo: 18

让我们假设那些是他们相应的黄道十二宫😉有了 PyAztro,我们可以查看明星们今天为这些动物准备了什么:

aries = pyaztro.Aztro(sign='aries')
leo = pyaztro.Aztro(sign='leo')print('ARIES: \n',
      'Sign:',             aries.sign,          '\n',
      'Current date:',     aries.current_date,  '\n',
      'Date range:',       aries.date_range,    '\n', 
      'Sign description:', aries.description,   '\n',
      'Mood:',             aries.mood,          '\n', 
      'Compatibility:',    aries.compatibility, '\n',
      'Lucky number:',     aries.lucky_number,  '\n',
      'Lucky time:',       aries.lucky_time,    '\n',
      'Lucky color:',      aries.color,       2*'\n',

      'LEO: \n',
      'Sign:',             leo.sign,            '\n',
      'Current date:',     leo.current_date,    '\n',
      'Date range:',       leo.date_range,      '\n', 
      'Sign description:', leo.description,     '\n',
      'Mood:',             leo.mood,            '\n', 
      'Compatibility:',    leo.compatibility,   '\n',
      'Lucky number:',     leo.lucky_number,    '\n',
      'Lucky time:',       leo.lucky_time,      '\n',
      'Lucky color:',      leo.color)**Output**:ARIES: 
 Sign: aries 
 Current date: 2021-02-22 
 Date range: [datetime.datetime(2021, 3, 21, 0, 0), datetime.datetime(2021, 4, 20, 0, 0)] 
 Sign description: Throw away your old to-do list and start over. There may be some stuff on it that just holds you back because you know you'll never do it and you might pop off some cool new projects while you're at it. 
 Mood: Refreshed 
 Compatibility: Scorpio 
 Lucky number: 67 
 Lucky time: 1am 
 Lucky color: Sky Blue 

 LEO: 
 Sign: leo 
 Current date: 2021-02-22 
 Date range: [datetime.datetime(2021, 7, 23, 0, 0), datetime.datetime(2021, 8, 22, 0, 0)] 
 Sign description: Try something new and different today - eat out somewhere you've never been, experiment with new techniques to clean your house or just pick an activity at random and give it a go! 
 Mood: Curious 
 Compatibility: Taurus 
 Lucky number: 75 
 Lucky time: 11am 
 Lucky color: Teal

这些预测在 2021 年 2 月 22 日有效,所以如果你想查看我们宠物当天的星座(或者你自己的),你必须重新运行上面的代码。很明显,除了signdate_range之外,所有的属性在 GTM 午夜都在改变。

皮阿兹托文件

当然,还有许多其他有趣的 Python 库,如 PyAztro,包括:

  • 艺术 —用于将文本转换为 ASCII 艺术,比如:ʕ •`ᴥ• ʔ
  • —用于绘图,
  • 象棋 —用于下棋,
  • 圣诞老人——随机配对秘密圣诞老人礼物和接收者,

甚至

  • 火绒——用于使用火绒。

我们可以肯定,有了 Python,我们永远不会感到无聊!

结论

总之,我希望数据集中的所有宠物都能找到他们可爱和有爱心的主人,以及 Python 用户——发现更多令人惊叹的库,并将其应用到他们的项目中。

如果你喜欢这篇文章,你也可以发现下面这些有趣的:

https://medium.com/mlearning-ai/11-cool-names-in-data-science-2b64ceb3b882 https://medium.com/geekculture/creating-toyplots-in-python-49de0bb27ec1 https://python.plainenglish.io/the-little-prince-on-a-word-cloud-8c912b9e587e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值