TowardsDataScience 博客中文翻译 2019(一百七十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

剑桥分析公司的脸书广告对 2016 年美国总统大选的影响

原文:https://towardsdatascience.com/effect-of-cambridge-analyticas-facebook-ads-on-the-2016-us-presidential-election-dacb5462155d?source=collection_archive---------8-----------------------

剑桥分析公司(Cambridge Analytica)是一家广告公司,是 SCL 集团的一个分支,成立于 2013 年,但截至 2018 年 5 月 1 日已经停业。该公司有一个政治和商业部门,从他们的网站上看,政治部门“将预测数据分析、行为科学和创新的广告技术结合到一个获奖的方法中。”该公司在共和党初选中为特德·克鲁兹竞选团队工作,并成功帮助他获得第二多的选票,仅次于唐纳德·特朗普。该公司随后在大选中为特朗普竞选团队工作,并帮助他获胜。《剑桥分析》在特德·克鲁兹共和党初选中采用的策略之一是根据脸书用户的个性向其投放有针对性的广告。然而,该公司被迫删除了 2015 年通过脸书获得的所有数据(在川普和希拉里之间的大选之前),因此最有可能的是,这种策略只被克鲁兹竞选团队使用。这篇文章将阐述前面提到的三种策略(行为科学、数据分析、创新广告技术)在运行微目标脸书广告时是多么的重要。此外,本文将描述广告的成功是如何被媒体、首席执行官 Alexander Nix 以及揭发者和前雇员 Christopher Wylie 限制和夸大的,原因各不相同。

在分析脸书广告的效果之前,重要的是要更详细地了解该公司的动机,以及它为什么成为主流新闻话题。该公司旨在通过向不同的人展示同一问题的不同广告来说服用户以某种方式投票。说服是通过收集脸书页面上用户喜好的信息,并使用这些数据创建预测个性的模型来完成的。亚历山大·科岗领导的全球科学研究机构剑桥分析公司被发现违反了脸书的服务条款,因此脸书要求科岗提供数据的所有公司,包括剑桥分析公司,在 2015 年删除所有脸书的数据。数据删除发生在特朗普和克林顿之间的 2016 年大选开始之前,因此剑桥分析公司声称,他们没有使用 GSR 的任何数据来帮助特朗普的竞选活动。当一名前雇员转变为揭发者克里斯托弗·威利(Christopher Wylie)接近媒体时,关于该公司的新闻曝光了。Wylie 和媒体关注了两个方面。一个方面是剑桥分析公司获取用户脸书数据行为的合法性,第二个方面是脸书广告的有效性及其道德问题。鉴于许多调查仍在进行中,法律影响超出了本文的范围,但将对脸书广告的成功进行评估。

要理解剑桥分析公司的脸书广告策略,你必须理解行为科学、数据分析和创新广告技术是如何结合在一起的。行为科学是指与人类或动物、行为和行动相关的研究领域。剑桥分析公司的最终目标是说服用户投票支持他们的客户,这包括显示最有可能导致行为改变的信息。下面的例子摘自 Alexander Nix 在 Concordia 峰会上的发言,说明了在传达信息时牢记行为科学的重要性。想象你正在沙滩上散步,看到了下面左边的标志。

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

Image sources: http://massrealestatelawblog.com/wp-content/uploads/sites/9/2012/07/public-beach-sign.jpg https://encryptedtbn0.gstatic.com/images?q=tbn:ANd9GcQUmyDglOdnQ6JC2AqpK6b0veP97Zw5LwScJIdTVZsoX-YyXMoa

左边的标志可能会让你转身离开,但如果你看到右边的标志,你会有更强烈的冲动这样做。这两个标志的动机都是为了确保你离开该地区,但右边的标志引起了更强烈的共鸣,可能是对所有人来说,因为害怕受到鲨鱼的攻击。在这个例子中,在看到右边的信息后,每个人可能都有最强烈的冲动采取行动离开海滩。然而,在政治领域,根据预先存在的信仰和价值观,不同的人可能更容易被不同的信息所说服,以支持同一个候选人或问题。剑桥分析公司因此假设,如果他们有一个衡量某人个性的标准,他们可以策划一个对他们来说最有说服力的广告。因此,他们将能够通过使用个性化的、有针对性的广告来说服许多具有不同个性的不同人对某一特定问题或候选人持有相同的观点。

为了通过使用行为科学来说服潜在的投票者以某种方式投票,人们需要一些关于广告目标是谁的信息。为了做到这一点,Cambridge Analytica 首先必须找到一种方法来获取数百万用户的原始数据。然后他们必须利用这些数据来预测用户的个性。这就是数据分析——从原始数据中提取有用信息的科学——的用武之地。《剑桥分析》求助于心理学家、剑桥大学研究员亚历山大·科岗。克里斯多佛·怀利当时是该公司的一名员工,负责处理与科岗的关系,科岗成立了一家名为全球科学研究(GSR)的公司。然后,科岗创建了一项调查,询问受访者的个性,并使用第三方在线调查供应商 Qualtrics 通过向每个人支付几美元来招募参与者。该调查要求受访者同意访问他们的脸书数据,包括他们喜欢的页面。

至关重要的是,科岗还可以访问受访者朋友的页面赞,因为这是脸书为开发者提供的一项功能。科岗在向英国议会“数字、文化、媒体和体育委员会”提交的证词中提到,从 2006 年到 2015 年,脸书 API 的核心功能是,只要用户的朋友没有关闭某些安全设置,你就可以收集他们的数据。没有更改脸书上某些隐私设置的被调查者的朋友,默认情况下也放弃了访问他们的页面赞。大约 270,000 人参加了此次调查,这使得科岗能够访问大约 3,000 万人的数据。这种挖掘数据的方法不是数据泄露,因为用户同意将他们的数据交给 GSR,参加调查的用户的朋友可能已经更改了他们的隐私设置,以确保 GSR 不会提取他们的数据。然而,也许脸书可以更好地向用户传达这种隐私设置的存在。目前,脸书在其服务条款中提到了这一点,这可能是大多数人没有仔细阅读。或许脸书可以在这方面再下功夫,让用户做一个小测验,确保他们在创建账户之前完全理解服务条款的内容。剑桥分析公司然后使用每个用户的脸书数据来预测他或她的个性。他们旨在通过对个人用户的五个关键人格特征进行评分来量化人格:开放性,责任心,外向性,宜人性,神经质,这是指大 5 或海洋人格模型。每个人在每个属性上的得分是通过检查每个用户的脸书页面喜好并根据页面喜好创建个性预测模型来确定的。

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

剑桥分析网站上提到的最后一个策略是创新广告技术。它指的是该公司旨在接触用户的更个性化的方式,包括脸书广告。Nix 将这种技术描述为向数百万用户显示相同信息的一揽子广告的对立面。他解释了“今天的交流变得越来越有针对性。这个房间里的每一个人都是个性化的。因此,创新广告技术(Nix 称之为 Concordia summit 上的演示,addressable ad tech)依赖于使用行为科学和数据分析后获得的结果,并通过高度个性化的渠道向观众展示,其中之一是脸书广告。

瑞典乌普萨拉大学的应用数学教授大卫·森普特在他的书《寡不敌众》中分析了剑桥分析公司模型的准确性。该公司使用回归模型来预测个性,他将回归模型描述为“利用我们已经掌握的关于一个人的数据,并使用这些数据来预测我们不知道的关于他或她的一些事情的模型。”(Sumpter,第。45).基于用户的个性,不同的广告出现在同一个问题上,希望说服不同的用户相同的信息。下面是亚历山大·尼克斯在协和女神峰会上的演讲中的一个例子。

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

这两个广告的动机都是为了说服观众支持第二修正案,该修正案允许人们拥有和携带武器的权利。高度新批判主义和责任感的人,倾向于担心很多,更喜欢秩序,所以左边的信息会引起更多的共鸣。封闭和随和的人把别人的需要放在自己的前面,但不喜欢新的体验,所以右边的信息会引起更大的共鸣。Christopher Wylie 认为这越界了,不再是说服,而是操纵。他声称,该公司在“道德灰色地带”运营,“试图通过抓住选民的弱点来操纵他们。”然而,“使用不正当的方法来颠覆公众的选举偏好并不是什么新鲜事,”在美国,这已经成为“选举的重复伴侣”,所以人们不应该对使用所谓的操纵策略感到惊讶。

基于个性的微目标用户的想法似乎比传统的营销方法更微妙,在传统的营销方法中,相同的信息显示给每个人。Sumpter 在他的书《寡不敌众》中分析了剑桥分析公司回归模型的准确性。他使用了由心理学家 Michal Kosinski 和他的同事创建的公开可用的数据集,他们创建了一个包含 2 万名脸书用户的匿名数据库。在 2 万名脸书用户中,19742 名是美国用户,其中 4744 名注册了他们喜欢的政党民主党或共和党,还喜欢了 50 多个脸书页面。Sumpter 首先旨在测试回归模型的准确性,因此创建了一个基于脸书·佩奇喜好预测政党忠诚度的模型。他的结论是,回归模型“对铁杆民主党人和共和党人非常有效”,但“没有揭示出 76%的用户没有把他们的政治忠诚放在脸书身上”。52–53).他还描述了为什么仅仅因为这个模型揭示了,例如,民主党人倾向于喜欢哈利波特,并不一定意味着其他哈利波特迷喜欢民主党人。因此,民主党采用的旨在让哈利波特迷投票的策略,不一定对他们有利。Sumpter 遇到的另一个限制是,“回归模型只有在一个人获得了 50 个以上的‘喜欢’时才有效,要做出可靠的预测,需要几百个‘喜欢’”(sum pter pg。53).他发现,在那个数据集中,只有 18%的用户“喜欢”50 个以上的网站。然而,这个问题似乎仅限于 Sumpter 使用的数据集,因为 2013 年的一项研究显示,美国人均脸书页面赞数为 70,而且这个数字一直在稳步上升。

可以说,剑桥分析公司专门用来预测性格的回归模型的最大局限性是,他发现脸书喜欢的性格预测模型的准确性。Sumpter 使用的数据集包含每个人在海洋人格模型上的得分信息。首先,Sumpter 创建了一个回归模型,根据脸书·佩奇的喜好来确定性格。然后他从数据集中随机选择两个人,根据模型对每个人的神经质水平做出的预测,根据神经质程度对他们进行排名。Sumpter 然后根据数据集中给出的两个个体的实际数据,将此与基于神经质的排名进行比较。他发现模型产生的排名与正确排名的匹配率只有 60%。然后,他在其他四种性格特征上尝试了这种方法,得到了大约 60%非常相似的结果。预测最准确的特征是开放性,但即使如此,预测的准确率也只有 67%。

亚历山大·科岗和亚历山大·尼克斯证实了从人们喜欢的脸书·佩奇来预测他们性格的困难。亚历山大·科岗在英国议会“数字、文化、媒体和体育委员会”的证词中表示,声称回归模型导致准确的结果是“科学上荒谬的”。在他提交给议会的书面证据中,他表示,该算法预测的每个人格特质的分数比随机猜测每个特质的分数更准确。然而,这比仅仅猜测每个人在每个属性上都正好处于中间更不准确,例如,同样内向和外向,同样封闭和开放,等等。此外,该模型只对 1%的人正确预测了所有五种性格特征,但对 6%的人预测错误。

科岗声称,他不知道从他的应用程序中收集的数据会被用来创建这样的回归模型。他认为,有一种更有效的方法来获取数据,在脸书做有针对性的广告。剑桥分析公司利用亚历山大·科岗生成的数据,根据海洋模型来预测人们的性格。因此,剑桥分析公司只能在科岗收集信息的 3000 万人中投放广告。他认为,更好的方法是利用脸书广告平台。脸书广告平台使开发者能够建立类似于人工选择的受众的受众。科岗描述了如何更容易地获得某些人的细节,这些细节准确地代表了特定的人格特征,然后使用脸书的工具来创建一个相似的观众,以达到与原始群体具有相同人格特征的一群人。

首席执行官亚历山大尼克斯自己证实了这些结果。他在给英国议会“数字、文化、媒体和体育委员会”成员的证词中声称。他认为科岗的数据集不是很有用,这只是他们 2016 年美国总统大选整体战略的一小部分。他在 Concordia 峰会上的演讲中,尼克斯公开吹嘘自己有能力运用脸书数据来调整一个对选举产生重大影响的极其强大的工具,我们该如何回应他的这一承认呢?答案来自尼克斯自己的证词,他声称自己过去在向潜在客户推销自己的公司时使用了夸张手法。这一观点得到了科岗的证实,他提到“尼克斯正试图推广(人格算法),因为他有强大的经济动机来讲述剑桥分析公司如何拥有秘密武器的故事”。54).

尼克斯不是唯一一个夸大该公司对 2016 年大选影响的人。考虑到主流媒体的头条新闻,大多数人可能会相信那些预测脸书·佩奇性格的回归模型,推而广之,剑桥分析公司的模型非常准确。因此,我们如何引起标题的共鸣,如《连线》杂志的“脸书如何比你的朋友更了解你”,《美国消费者新闻与商业频道》和《每日电讯报》的“脸书比你的家庭成员更了解你”,以及《纽约时报》的“脸书比任何人都了解你”?所有这些文章都引用了同一个研究,由吴友友、米哈尔·科辛斯基和大卫·斯蒂尔韦尔进行,题为“基于计算机的人格判断比人做出的判断更准确”克里斯托弗·威利(Christopher Wylie)在向英国议会“数字、文化、媒体和体育委员会”作证之前提交的书面证据中也引用了同样的研究,并表示这是该公司方法成功的证据。这项研究首先让参与者参加一个有 100 个问题的测试,以确定他们在海洋人格模型上的分数。然后,该研究将使用每个人的脸书页面喜好创建的回归模型的预测能力与个人的朋友、亲戚、同事和配偶的预测能力进行了比较。他们通过让这些人回答一份有十个问题的问卷来衡量其他人的预测能力。他们发现回归模型与 100 项测试的相关性比其他人在 10 项问卷中的答案更好。然而,研究人员自己也承认,“我们的研究是有限的,因为人类法官只能使用一份关于五大特征的 10 项长的问卷来描述参与者。实际上,他们掌握的知识可能比问卷中评估的要多。”(悠悠)

因此,这些文章得出的结论,如美国消费者新闻与商业频道一篇文章的第一行“大学研究人员发现,通过使用你的脸书“喜好”来判断你的性格,计算机可以比你最亲密的朋友家人更好地确定你的性格”,与现实相比,是远远夸大的。布莱恩·康纳利(Brian Connelly)研究工作场所的个性,他也是多伦多大学管理系的副教授,斯卡伯勒声称,尽管引用的研究论文“有趣且具有挑衅性”,但“媒体正在耸人听闻地报道这些发现”(Sumpter。Pg。55).他说,反映这项研究结论的准确新闻标题应该是“初步调查结果表明,脸书和你的一个密友一样了解你(但我们坚持要看看脸书是否能预测你的行为)”。55).

然而,在克里斯托弗·威利(Christopher Wylie)的推动下,媒体声称剑桥分析公司的微观目标对帮助特朗普当选产生了巨大影响。在克里斯托弗·威利(Christopher Wylie)提交给英国议会“数字、文化、媒体和体育委员会”(Digital,Culture,Media and Sport committee)的书面证据中,他引用了一系列研究作为证据,“强调了使用社交媒体、自然语言或互联网点击流数据进行心理分析或大众说服的功效。”然而,在这些研究中,只有少数几个涉及到预测脸书喜欢的人的性格。在这些人当中,没有一个人得出结论说这样的模型会“打破脸书”,或者它们如此强大,以至于应该被称为“心理战工具”,正如 Wylie(《卫报》)所描述的那样。此外,Wylie 还声称,他成为告密者的原因之一是因为公司的脸书战略帮助 Trump 赢得了选举。他声称“唐纳德·特朗普让你意识到这有更广泛的影响”(《卫报》),但没有提到脸书的数据在大选前被该公司删除了。

媒体夸张的一个突出例子是 2018 年 3 月 21 日特雷弗·诺亚在“每日秀”上的一个片段。诺亚认为剑桥分析公司的模型非常准确,并播放了一系列片段来支持这种说法。第一个片段来自 CNN 的一个故事,主持人说“根据你在脸书的喜好,可以预测你的水平高于你妻子对你的评价,也高于你父母或朋友对你的评价。”第二封信来自 Christopher Wylie,他表示,该公司“将试图找出我们认为你存在的任何精神弱点或脆弱性,并试图扭曲你对周围现实的感知。”诺亚随后暗示,特朗普竞选团队使用了这些数据,并表示剑桥分析公司(Cambridge Analytica)的运营水平高于传统广告,并播放了一段视频,视频中称“唐纳德·特朗普(Donald Trump)总统竞选团队雇佣的数据公司利用从数千万不知情的脸书用户那里秘密获取的信息,直接瞄准潜在的美国选民”,“整个行动围绕着欺骗、虚假的基层支持和一种似乎接近电子洗脑的战略”。诺亚没有展示这些片段的完整背景,只是展示了一些小片段,此外,剑桥分析公司删除了,或者至少声称删除了所有脸书的数据,并且根本没有使用这些数据来帮助川普,这一点根本没有提到。所有剪辑中的说法都是夸张的,并且没有提供这些说法背后的科学依据。

鉴于有证据表明该公司的回归模型不像声称的那样准确,有必要研究一下这种夸张背后的一些潜在原因。简单和耸人听闻的故事和标题可能会获得更好的收视率,因为这类文章过于简单,点击诱饵的性质。此外,关于唐纳德·特朗普从剑桥分析公司的脸书广告中获益的说法也是不准确的,因为该公司很可能在特朗普和希拉里之间的大选开始之前就删除了脸书的数据。然而,与更平衡的故事相比,批评特朗普的两极分化的故事可能会获得更高的收视率。此外,Wylie 离开公司时并不友好。他创建了一家名为 Eunoia Technologies 的竞争公司,该公司主要从事微定位和心理建模,就像剑桥分析公司一样。他也收到了《全球科学研究》的数据,随后被要求删除。然后,他“未能成功地向一个亲英国退出欧盟的派别推销他的服务,但确实从一个加拿大立法实体获得了一份 10 万美元的合同”(Freeze),并“向共和党政治活动家科里·莱万多夫斯基(Corey Lewandowski)推销了可以代表唐纳德·特朗普(Donald Trump)2016 年总统竞选活动部署的微瞄准工具”(Mac)。因此,他有动机质疑剑桥分析公司的道德,并为公司创造负面宣传,这可能解释了他在描述公司努力的影响时的夸张。

剑桥分析公司(Cambridge Analytica)经营的脸书广告对 2016 年美国总统大选的影响被首席执行官 Alexander Nix、媒体和 Christopher Wylie 夸大了。回归模型还不太准确,脸书的微目标广告策略可能没有用于川普的竞选。虽然剑桥分析公司(Cambridge Analytica)在脸书投放的广告可能对 2016 年美国大选没有太大影响,但这只是社交媒体微定向广告领域的开始。脸书每月有 23 亿活跃用户,每天有 15 亿活跃用户,脸书是一个独一无二的工具。事实上,你的朋友可以通过一个小测验提取你在脸书的数据,这可能会让很多人感到惊讶。因此,随着世界各地脸书用户数量的持续增长,脸书负有向用户明确传达隐私选项的重要责任。这仅仅是使用微定位脸书广告的开始,如果你在选举前看到脸书的政治广告引起你强烈的共鸣,不要感到惊讶。

作品被引用

伯格尔哈尔。"恶意国内:剑桥分析反乌托邦."计算机,2018 年第 51 卷第 5 期,第 84–89 页。,doi:10.1109/mc.2018.2381135。

戴维斯,哈利。“特德·克鲁兹利用公司收集了数百万不知情的脸书用户的数据.”《卫报》,《卫报新闻与媒体》,2015 年 12 月 11 日,www . The Guardian . com/us-News/2015/dec/11/senator-ted-Cruz-president-campaign-Facebook-user-data

别动,科林。“克里斯托弗·威利(Christopher Wylie)策划的商业计划揭示了举报人对大数据的野心和焦虑.”《环球邮报》《环球邮报》2018 年 5 月 5 日www . The Globe and Mail . com/politics/article-business-plan-hatched-by-Christopher-wylie-sheds-light-on-whistle/。

肯尼迪,梅里特。““他们不在乎”:举报者称剑桥分析公司旨在破坏民主.” NPR ,NPR,2018 年 3 月 27 日,www . NPR . org/sections/the two-way/2018/03/27/597279596/they-don-t-care-believer-says-Cambridge-analytic a-seeks-underb-democr。

拉夫迪贾斯汀。“普通脸书用户喜欢多少页面?” — Adweek ,Adweek,2013 年 4 月 11 日,www . Adweek . com/digital/how-number-pages-do-the-average-Facebook-user-like/。

麦克莱恩。“剑桥分析公司的告密者希望他的新公司与特朗普竞选团队的经理合作.” BuzzFeed News ,BuzzFeed News,2018 年 3 月 28 日,www . BuzzFeed News . com/article/Ryan MAC/Cambridge-analytic a-Chris-wylie-eunoia-trump-campaign。

麦克考斯兰、菲尔和安娜·谢克特。"与川普有关的顾问从脸书数百万人那里收集数据."NBCNews.com,NBC 环球新闻集团,2018 年 3 月 17 日,www . NBC News . com/News/us-News/Cambridge-analytic a-harved-data-millions-unscened-Facebook-users-n 857591。

新闻,4 频道。“前剑桥分析公司首席执行官亚历山大尼克斯面临国会议员(完整版).” YouTube ,YouTube,2018 年 6 月 6 日,www.youtube.com/watch?v=weQ9E6e3aJot = 5747s

新闻卫报。"剑桥分析报告密者克里斯托弗·威利出现在国会议员面前——观看直播."YouTube ,YouTube,2018 年 3 月 27 日,www.youtube.com/watch?v=X5g6IJm7YJQ&t = 4872s。

尼克斯,亚历山大。 YouTube ,协和女神,2016 年 9 月 27 日,www.youtube.com/watch?v=n8Dd5aVXLCc

史密斯,戴夫。"微型杀伤性武器:我们的“喜欢”如何劫持民主."走向数据科学,走向数据科学 2018 年 10 月 17 日,走向 sdata Science . com/weapons-of-micro-destruction-how-our-like-劫持-民主-c9ab6fcd3d02

寡不敌众:从脸书和谷歌到假新闻和过滤泡沫——控制我们生活的算法。布鲁姆斯伯里适马,2018。第五章

特雷弗·诺亚每日秀。“电子洗脑:剑桥分析公司阴险的脸书战略|每日秀.” YouTube ,YouTube,2018 年 3 月 21 日,www.youtube.com/watch?v=t7epj5tK54M

基于计算机的性格判断比人类做出的更准确。2015 年 1 月 27 日,美国国家科学院,www.pnas.org/content/112/4/1036?, PNAS sid = fef de0 d 1-d260-40e 6-84d 3-a 1992208031 a。

英国,RT。“现场:剑桥分析研究员亚历山大科岗向国会议员作证。” YouTube ,YouTube,2018 年 4 月 24 日,www.youtube.com/watch?v=hpzc26bzp1M&t = 5106s

基于马尔可夫聚类的有效社区发现

原文:https://towardsdatascience.com/effective-community-detection-with-markov-clustering-d5c6abee11b2?source=collection_archive---------24-----------------------

这个帖子最早出现在amethix.com

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

“如果智能是一块蛋糕,蛋糕的大部分是无监督学习,蛋糕上的糖衣是监督学习,蛋糕上的樱桃是强化学习”。

这句来自脸书人工智能首席执行官 Yann LeCun 的名言强调了人类是如何依赖*无监督学习的。*利用马尔可夫聚类进行有效的社区发现。他们用这种方法来理解他们周围的世界。事实上,孩子们在没有太多监督的情况下就学会了辨认物体和说话。相比之下,复杂的深度学习算法需要数百万仔细注释的数据。这对于在物体检测和语言生成等任务中达到类似人类的性能是必要的。

这篇文章为你提供了一个利用马尔可夫聚类进行有效社区发现的好方法。

在这个领域中,一个人可以将聚类视为以无监督方式从数据中学习有趣模式的最有用的工具之一。

聚类方法

无论是对电子邮件进行分类还是进行客户细分,聚类在大多数时候都是可行的方法。这种方法包括将数据集分成组(或聚类),使得属于同一聚类的对象比属于不同聚类的项目更相似。可以根据特定的度量来计算这种相似性,该度量当然可以随着要解决的问题而改变。

数据科学家在表格数据的探索性数据分析中使用聚类算法,如 k-means、层次聚类或 DBSCAN。还有另一种类型的数据也很常见:网络。在网络分析行话中,研究人员将聚类网络数据称为社区检测。在这种情况下,集群代表*社区。*分别参考【1】和【2】获得关于聚类网络的社区检测和最新算法的更多细节。

这篇文章的目的是揭示一种被称为**马尔可夫聚类(MCL)的特定算法的一些最重要的特性。**研究人员设计这种算法主要是为了执行社区检测。但是,也可以使用 MCL 对表格数据进行聚类。在参考文献[3]中提供了 MCL 算法的更多技术解释,并且在[4]中详细描述了该方法在聚类生物序列中的应用。现在让我们刷新一些图论的概念,这将有助于理解 MCL 技术的工作机制。

图和随机漫步

在之前的帖子中提到过,自然界中的许多系统都可以用来表示。图只不过是由边连接起来的一组节点。社交网络可能是最熟悉的图表例子。节点代表用户,而连接任意两个节点的边代表两个用户相互交互的事实。

分析图表并从模拟中获得洞察力的一种常见方法是所谓的随机漫步。这里有一个例子来阐明随机漫步的含义。假设有一个游客,他从家乡出发,准备去几个城市旅游。人们可以把城市看作是图中的节点。只要有可能从一个城市直接到达另一个城市,这样的节点就通过边连接。让我们假设前面提到的游客被惊喜惊呆了。她没有提前计划她的旅行,她随机选择了下一个城市。

数学表示

从数学的角度来看,游客的旅行是一个被称为随机行走的随机过程。一个自然的问题可能会出现:从长远来看,我们的游客下一步会去哪些城市?这个问题的答案取决于这些城市之间的联系。例如,如果城市形成分离良好的集群(连接组件),并且游客在这些集群中的一个内开始她的旅行,她可能永远无法到达其他集群中的任何城市。
模拟图上的随机行走准确地代表了 MCL 算法背后的思想。

MCL 算法

MCL 算法的目的是找到一个聚类结构。这是通过模拟图上的随机游走直到达到平衡来实现的。
我们需要采取的第一步是获得上述图表。

  • 在网络数据的情况下,要执行的唯一任务是计算邻接矩阵 a。这样的矩阵完美地描述了网络。这种矩阵的定义是:如果从顶点 i 到顶点 j 有一条边,Aij= 1,否则为 0
  • 在表格数据的情况下,必须构建一个相似矩阵。这是通过计算所有现有记录(即表的行)之间的成对相似性来实现的。这种相似性矩阵表示一个加权图。这种图的节点表示观察值,边具有对应于它们之间的相似性得分的权重。

扩张和通货膨胀

通过适当缩放邻接矩阵或相似矩阵,可以获得马尔可夫矩阵。这是一个概率矩阵,表示一个节点到达它所连接的另一个节点的机会。
最后,一旦建立了马尔可夫矩阵,就可以通过交替使用两个叫做展开膨胀的操作符来模拟图上的随机游走。

扩展允许随机漫步机走更长的路径。例如从一个节点到另一个节点需要大量的步骤。
膨胀通过支持可能性较大的遍历而不是可能性较小的遍历来改变转移概率。

扩张和膨胀的结合将提高每个集群内部的行走概率。此外,它将减少集群之间的行走。这是因为同一个集群内的路径比不同集群之间的路径更长。

这样的行为长期会出现。扩展和膨胀操作的迭代导致图形分离成不同的连接部分。因此,与许多需要用户预先指定预期聚类数的聚类算法(有时会出错)不同,MCL 算法提供了一种将数据划分为聚类的方法,这种方法是从图拓扑本身自然产生的。

Python 中的一个实际例子

让我们看看如何在 Python 中使用 MCL 算法,以及如何通过马尔可夫聚类来执行有效的社区检测。
首先用pip install markov_clustering[drawing]networkx包安装实现算法所需的包,进行图形分析和可视化。

然后执行下面的代码

# Import libraries
import markov_clustering as mc
import networkx as nx

# Load network data
G = nx.karate_club_graph()

# Build adjacency matrix
A = nx.to_numpy_matrix(G)

# Run MCL algorithm
result = mc.run_mcl(A)
clusters = mc.get_clusters(result)

# Draw clusters
mc.draw_graph(A, clusters, node_size=50, with_labels=True, edge_color="silver")

在上面的代码中,我们使用 MCL 算法来检测 Zachary 的空手道俱乐部中的集群,也称为社区,这是一个测试社区检测算法的流行基准。扎卡里空手道俱乐部是一个大学空手道俱乐部的社交网络。该网络捕获了一个空手道俱乐部的 34 名成员,记录了在俱乐部外互动的成对成员之间的联系。

在研究过程中,管理者(节点 0)和指导者(节点 33)之间产生了冲突,导致俱乐部分裂为两个子图。一半的成员围绕着教官组建了新的社团,另一部分的成员则找到了新的教官或者放弃了空手道。

如下图所示,MCL 算法很好地检测到了网络中两个不同社区的存在,这两个社区的成员大多与管理员或教师有交互:

在这篇文章中,我们看到了如何通过组合简单的概念,如随机漫步、图形、相似矩阵,来构建一个称为马尔可夫聚类的社区检测算法。此外,我们强调了如何构建一个相似性图,然后在这样的图上运行一个有效的社区检测算法(如马尔可夫聚类或其他最先进的方法)来发现表格数据中的聚类。

跟随播客【https://datascienceathome.com/】
别忘了加入我们新的不和谐频道的对话。那里见!

参考

[1] S. Fortunato,“图形中的社区检测”,《物理报告》,第 486 卷,第 3-5 期,第 75-174 页,2010 年 2 月。

[2] Z. Yang 等,“人工网络上社区发现算法的比较分析”,《科学报告》第 6 卷,文章编号:30750 (2016)

[3] S. Dongen,“图的聚类算法”,技术报告,CWI(数学和计算机科学中心),荷兰阿姆斯特丹,2000 年。

[4] A. J. Enright 等人,“大规模检测蛋白质家族的有效算法”,核酸研究,第 30 卷,第 7 期,第 1575-1584 页,2002 年。

原载于 2019 年 8 月 21 日https://amethix.com**

其他人的有效数据可视化

原文:https://towardsdatascience.com/effective-data-visualization-for-other-humans-695e54a5dc71?source=collection_archive---------9-----------------------

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

Credit: Markus Spiske — Unsplash

TL;灾难恢复—执行不当的数据可视化可能会向您的受众传达误导和潜在有害的信息。我们有责任维护我们传达给受众的信息中数据的完整性。

我们都知道数据的驱动力。它为组织制定明智的决策和影响结果提供了见解。目标很简单。开发解决方案,以技术和非技术受众都能有效利用的方式组织和呈现数据。今天,我们将讨论数据可视化的一些基础知识,以便有效地交流从数据中获得的见解,从而有效地吸引观众。

像任何科学一样,在您的方法中定义一致的方法将有助于简化您的过程,以利用数据可视化来最大化其有效性。想象一下,一篇长长的研究论文打印在一个内容结构复杂的无格式文档上。读者不会从这种格式的论文中获得多少教育价值。

规范化可视化数据的方法

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

Credit: Olia Gozha — Unsplash

让我们从基础开始。

你想了解的任何东西都可以分解成可观察到的片段。这种科学形式在数据科学和统计学中很常见。简而言之,我们正在探索收集、发现和分析关于我们想要研究和观察的事物的大量信息的实践。

作为人类,传输到我们大脑的大部分信息都是视觉的。因为我们处理图像的速度比处理文本的速度快得多,所以利用数据可视化可以优化我们从数据中获得的价值。

[## 30 分钟内 39 项关于人类感知的研究

这些是我 2016 年 4 月在 OpenVis 上的演讲笔记。最初这个演讲应该叫做…

medium.com](https://medium.com/@kennelliott/39-studies-about-human-perception-in-30-minutes-4728f9e31a73)

为了从我们的数据中有效地呈现洞察力,挑战的一部分是决定哪种可视化技术将为最终用户提供最大的价值。系统地,我们可以对数据进行分类,并实例化一种标准化的方法。

我们将使用一个简单的例子,收集 1950 年美国 45 个职业的声望和特征的样本数据。这些数据可以从 Python3 的 datasets 包中的 Rdatasets 项目中公开获得。

import statsmodels.api as smdf = sm.datasets.get_rdataset('Duncan', package='carData').data
df

以下是返回的结果数据集:

 **[type]  [income]  [education]  [prestige]**
accountant          prof      62         86        82
pilot               prof      72         76        83
architect           prof      75         92        90
author              prof      55         90        76
chemist             prof      64         86        90
minister            prof      21         84        87
professor           prof      64         93        93
dentist             prof      80        100        90
reporter              wc      67         87        52
engineer            prof      72         86        88
undertaker          prof      42         74        57
lawyer              prof      76         98        89
physician           prof      76         97        97
welfare.worker      prof      41         84        59
teacher             prof      48         91        73
conductor             wc      76         34        38
contractor          prof      53         45        76
factory.owner       prof      60         56        81
store.manager       prof      42         44        45
banker              prof      78         82        92
bookkeeper            wc      29         72        39
mail.carrier          wc      48         55        34
insurance.agent       wc      55         71        41
store.clerk           wc      29         50        16
carpenter             bc      21         23        33
electrician           bc      47         39        53
RR.engineer           bc      81         28        67
machinist             bc      36         32        57
auto.repairman        bc      22         22        26
plumber               bc      44         25        29
gas.stn.attendant     bc      15         29        10
coal.miner            bc       7          7        15
streetcar.motorman    bc      42         26        19
taxi.driver           bc       9         19        10
truck.driver          bc      21         15        13
machine.operator      bc      21         20        24
barber                bc      16         26        20
bartender             bc      16         28         7
shoe.shiner           bc       9         17         3
cook                  bc      14         22        16
soda.clerk            bc      12         30         6
watchman              bc      17         25        11
janitor               bc       7         20         8
policeman             bc      34         47        41
waiter                bc       8         32        10

回顾此处可用的数据类型,我们有一组 45 个职业观察值*(行)*,包含以下特征:

  • 职业:所担任角色的标识。
  • 类型:具有以下级别的因子:教授、专业和管理;wc,白领;bc,蓝领
  • 收入:1950 年美国人口普查中年收入 3500 美元或以上(2017 年美元约合 36000 美元)的职业在职者的百分比。
  • 教育:1950 年高中毕业生占在职人员的百分比(如果我们愤世嫉俗的话,我们会说这在 2017 年大致相当于博士学位)
  • 声望:在一项社会调查中,认为该职业声望“好”或更好的受访者的百分比

理解这一切。

如果您是一名开发人员,并被要求使用上述数据的图形或图表来提供见解,这个简单的请求可能是一项令人生畏的任务。您希望在数据集中向最终用户传达什么?这张表格对声望和职业之间的关系提供了什么样的见解?

我们可以缩小我们的关注点,通过将我们的集合解构为更小的片段,使用数据可视化来帮助我们理解数据的复杂性。

选择正确的视觉很重要

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

Credit: Harry Quan — Unsplash

不管图表内容的准确性如何,选择错误的图表可能会向您的受众传达误导和潜在有害的信息。我们有责任维护我们发送的信息的完整性。此外,使用错误的视觉效果会错误地分类原本准确的信息。我们可以通过在正确的数据可视化下对数据进行分类来最小化这些错误。

用于比较数值的条形图

比较不同类别数量的一个实用方法是使用条形图。在我们的数据集中,我们可以在职业集合中比较职业类型的数量。

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

The x-axis represents the different categories, and the y-axis indicates the unit of measurement.

条形图易于解释,并允许最终用户快速比较不同离散类别数据的数量或频率。离散数据指的是我们计数的东西,而不是测量的东西。比如我们有六个 wc 职业类型。我们没有 6.3333 wc 职业类型。

下面是 Python3 中用于生成条形图的代码。

from matplotlib import pyplot as plttypeCounts = df['type'].value_counts()
typeCounts.plot(kind='bar', title='Type Counts')plt.xlabel('Type')
plt.ylabel('Number of Occupation Type')
plt.show()

用于可视化连续数据分布的直方图

连续数据是指沿标尺的测量值。与离散数据相反,C 连续数据,或者说定量数据,是由测量的T21【而不是我们统计的数值来表示的。对于我们的数据集,记录了收入、教育和声望的百分比值,以量化数据样本中某个类别的度量。**

使用直方图,我们可以有效地向我们的观众展示哪个百分比组的高中毕业率最高。使用直方图,我们可以有效地显示我们的连续数据集的分布或形状。

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

Our distribution of high school graduates shows more occupations were more common in the lower percentage groups of students who graduated from high school.

下面是 Python3 中用于生成直方图的代码。

from matplotlib import pyplot as pltdf['education'].plot.hist(title='High School Graduates', bins=19)
plt.xlabel('Percentage')
plt.ylabel('Frequency')
plt.show()

用于比较相对数量的饼图

当您试图比较整体的各个部分时,饼图会很有用。与条形图相比,饼图可用于定义特定类别的完整上下文的可视化表示。我们可以通过将这些值分类来比较相对数量。有效使用时,饼图可以有效地显示整个数据集的比例。

从条形图中比较职业类型之间的频率,我们可以使用饼图生成更有效的比例可视化。

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

In comparison to the bar chart, proportions are easier to identify in a pie chart

用于比较定量值的散点图

我们可以把定量数据归类为你可以归类的东西。换句话说,这是包含独特性质的信息,您可以识别数据集并将其分类为可见的部分。

当您想要可视化和探索数字特征之间的关系时,散点图是引人注目的。此外,散点图有助于识别属于异常值的数据点,即明显超出观察数据集范围的值。让我们通过可视化声望与收入水平的对比来看看职业数据。

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

Notice the top left and bottom right are mostly empty. Higher income generated higher prestige evaluated, and low-income occupations made less prestige.

通过这种方法,您可以使用散点图有效地演示两个变量是如何相关的。你可以充分地想象一种关系的程度,并向观众突出一个变量如何影响另一个变量。

下面是生成散点图的相应代码:

from matplotlib import pyplot as pltoccupations = df[['prestige', 'income']]
occupations.plot(kind='scatter', 
                     title='Occupations', x='prestige', y='income')plt.xlabel('Prestige')
plt.ylabel('Avg Income %')
plt.show()

数值变化的折线图

我们经常想在一段时间内评估我们的数据集。折线图是一种非常有用的可视化技术,可以显示数值如何随着一个系列而变化。

对于这个例子,我们将从数据集包的 Longley 数据集中分析 1947-1962 年间的美国宏观经济变量。

import statsmodels.api as smdf = sm.datasets.longley.load_pandas().data
df **[TOTEMP]  [GNPDEFL] [GNP]   [UNEMP]  [ARMED]  [POP]    [YEAR]**
0   60323.0     83.0  234289.0  2356.0  1590.0  107608.0  1947.0
1   61122.0     88.5  259426.0  2325.0  1456.0  108632.0  1948.0
2   60171.0     88.2  258054.0  3682.0  1616.0  109773.0  1949.0
3   61187.0     89.5  284599.0  3351.0  1650.0  110929.0  1950.0
4   63221.0     96.2  328975.0  2099.0  3099.0  112075.0  1951.0
5   63639.0     98.1  346999.0  1932.0  3594.0  113270.0  1952.0
6   64989.0     99.0  365385.0  1870.0  3547.0  115094.0  1953.0
7   63761.0    100.0  363112.0  3578.0  3350.0  116219.0  1954.0
8   66019.0    101.2  397469.0  2904.0  3048.0  117388.0  1955.0
9   67857.0    104.6  419180.0  2822.0  2857.0  118734.0  1956.0
10  68169.0    108.4  442769.0  2936.0  2798.0  120445.0  1957.0
11  66513.0    110.8  444546.0  4681.0  2637.0  121950.0  1958.0
12  68655.0    112.6  482704.0  3813.0  2552.0  123366.0  1959.0
13  69564.0    114.2  502601.0  3931.0  2514.0  125368.0  1960.0
14  69331.0    115.7  518173.0  4806.0  2572.0  127852.0  1961.0
15  70551.0    116.9  554894.0  4007.0  2827.0  130081.0  1962.0

回顾此处可用的数据类型,我们有一组 16 个观察值,包含以下六个特征:

  • 总就业人数:总就业人数
  • GNPDEFL : GNP 缩减指数
  • GNP : GNP (国民生产总值)
  • 失业人数
  • 武装:武装力量的规模
  • POP :人口
  • :年(1947-1962)

让我们为样本数据创建人口变化的可视化。通过这种方法,您可以快速向受众传达数据中的趋势或模式。

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

From this chart, we can see the population sizes increase from year to year and shows an increasing trend.

下面是生成折线图的相应代码:

df.plot(title='Population', x='YEAR', y='POP')plt.xlabel('Year')
plt.ylabel('Population')
plt.show()

用于可视化分布的箱线图

也称为盒须图,您可以将这种方法用于只有一个变量的数据集。这个数据称为单变量数据。

让我们以纯文本和箱线图的形式来看看 Longley 数据集中的失业数据集。

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

Transforming patternless text into a perceptible visual form.

**[Unemployment]**
0         2356.0
1         2325.0
2         3682.0
3         3351.0
4         2099.0
5         1932.0
6         1870.0
7         3578.0
8         2904.0
9         2822.0
10        2936.0
11        4681.0
12        3813.0
13        3931.0
14        4806.0
15        4007.0

箱线图跨四分位数分布数据,并显示第 25 和第 75 百分位之间的数据。在图的方框内,我们可以看到第 50 个百分位数值内的数据范围,以及绿线中显示的中值和

以下是箱线图的相应代码:

import pandas as pd
import statsmodels.api as sm
from matplotlib import pyplot as pltdff = sm.datasets.longley.load_pandas().data
df = pd.DataFrame({'Unemployment': dff['UNEMP']})
print(df) # tableplt.figure()
df['Unemployment'].plot(kind='box',title='Unemployment')

比较和缩放您的视觉效果

为了从数据中获得最大价值,您需要通过比较数据之间的关系来最大限度地发挥信息的价值。让我们利用到目前为止我们探索的一些技术来优化我们的数据可视化的有效性。

比较变量分布

如果我们用箱线图来比较两个或更多变量的分布会怎么样?拥有多个变量被称为双变量 (2)变量或多变量 (2+)变量。

让我们比较一下样本中失业、总就业和 GNP 数据的分布。

 **[Unempl..]  [Total Emp]   [GNP]**
0         2356.0      60323.0    234289.0
1         2325.0      61122.0    259426.0
2         3682.0      60171.0    258054.0
3         3351.0      61187.0    284599.0
4         2099.0      63221.0    328975.0
5         1932.0      63639.0    346999.0
6         1870.0      64989.0    365385.0
7         3578.0      63761.0    363112.0
8         2904.0      66019.0    397469.0
9         2822.0      67857.0    419180.0
10        2936.0      68169.0    442769.0
11        4681.0      66513.0    444546.0
12        3813.0      68655.0    482704.0
13        3931.0      69564.0    502601.0
14        4806.0      69331.0    518173.0
15        4007.0      70551.0    554894.0

让我们从一个常见的问题开始。以下是相应的箱线图。注意到我们的方框图中有什么可能误导人的地方了吗?

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

No good! This data is not scaled correctly, giving misleading results.

这个情节告诉你什么?我也不确定。这张图不好,因为我们的数据不成比例。

让我们看看下图中的缩放版本。

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

Scaled proportionally

当比较数据时,观察中的变量必须具有相同的度量和尺度。确保按比例缩放数据。这个数据不是特别有用,但它是为了在相同的尺度上演示数据。

以下是多元盒图的相应代码:

import pandas as pd
from matplotlib import pyplot as plt
import pandas as pd
dff = sm.datasets.longley.load_pandas().datadf = pd.DataFrame({'Unemployment': dff['UNEMP'],
                  'Total Emp': dff['TOTEMP'],
                  'GNP': dff['GNP']})scaler = MinMaxScaler()
df[['Unemployment', 'Total Emp', 'GNP']] = scaler.fit_transform(df[['Unemployment', 'Total Emp', 'GNP']])df.plot(kind='box', title='Distribution', figsize = (10,8))
plt.show()

有效地突出一种趋势

有时对于数据集,您会希望通过数据可视化来强调特定的趋势。之前,我们讨论了如何散点图你的数据。对于许多数据点,使用趋势线是一种有效的技术,可以使数据中的趋势变得清晰。

在这里,我们将构建一个散点图,以及我们时间段内总就业人数的趋势线。

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

趋势线

在这里,我们让最终用户清楚地看到,总就业人数和我们的时间段之间存在一个共线性。共线性关系是一种变量,它的值随着另一个变量的增加而减少。

以下是相应散点图和趋势线的代码:

dff = sm.datasets.longley.load_pandas().datadf = pd.DataFrame({'Year': dff['YEAR'],
                  'Total Emp': dff['TOTEMP']})df.plot(kind='scatter', title='Total Emp vs. Year', x='Year', y='Total Emp')plt.plot(np.unique(df['Year']), 
         np.poly1d(np.polyfit(df['Year'], 
                              df['Total Emp'], 
                              1))(np.unique(df['Year'])),  
         color='orange')plt.show()

结论

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

Credit: Frank Mckenna — Unsplash

我们不断创新解决方案,以简化我们数据中的复杂性,并揭示以其他方式无法观察到的模式。为了有效地管理数据,我们探索了将数据解构为人脑可以有效消化的可管理片段的方法。

对于软件开发人员、分析师、产品经理和研究人员来说,我们如何将我们的发现传达给受众,这最终会推动我们为更大的整体所做工作的价值。

谢谢你。

如果你希望更深入地研究数学和数据可视化,我推荐你参加微软的 EdX DAT256:机器学习的基本数学。

参考

[## Longley 数据集—stats models v 0 . 10 . 0 RC2+14 . gceea 76 ce 6 文档

朗利数据集包含各种美国宏观经济变量,这些变量被认为是高度共线的。它已经被使用…

www.statsmodels.org](http://www.statsmodels.org/dev/datasets/generated/longley.html) [## CLPS 1091 S01:研究方法和设计

我们都健忘。我相信我们都有过这样的时刻,当我们走进一个房间,却忘了我们为什么去那里…

blogs.brown.edu](https://blogs.brown.edu/clps-1091-s01-spring-2017/2017/05/02/humans-visual-creatures/) [## 数据集包—stats models v 0 . 10 . 0 RC2+8 . g 551671 aa 1 文档

Rdatasets 项目提供了对 R 的核心数据集包中可用的数据集和许多其他常见 R…

www.statsmodels.org](https://www.statsmodels.org/dev/datasets/index.html) [## 课程| DAT256x —模块 04 | edX

机器学习的基本数学](https://courses.edx.org/courses/course-v1:Microsoft+DAT256x+1T2018/course/) [## 伟大的数据可视化看起来像什么:12 个复杂的概念变得简单

也许今天是艰难的一天。也许你醒晚了。你错过了你的锻炼,然后你的公共汽车,然后关闭电梯…

blog.hubspot.com](https://blog.hubspot.com/marketing/great-visualization-examples) [## 直方图—了解直方图的属性、它们显示的内容以及何时和如何使用…

直方图-了解直方图的属性,它们显示的内容,以及何时和如何使用它们

statistics.laerd.com](https://statistics.laerd.com/statistical-guides/understanding-histograms.php) [## 什么是散点图以及何时使用它

散点图是强大的数据可视化工具,可以传达大量信息。本教程将解释…

chartio.com](https://chartio.com/learn/dashboards-and-charts/what-is-a-scatter-plot/)

有效的微服务:10 个最佳实践

原文:https://towardsdatascience.com/effective-microservices-10-best-practices-c6e4ba0c6ee2?source=collection_archive---------0-----------------------

权威指南

正确实施微服务架构的 10 个技巧

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

Effective Microservices: 10 Best Practices

在之前的一篇文章中: 微服务架构:简要概述以及为什么你应该在你的下一个项目中使用它 **,**我已经详细讨论了微服务架构以及在现代软件开发中使用它的优点/缺点。那么,微服务架构到底是什么?以下是我的定义:

微服务架构是关于将软件系统分解成可独立部署的 autonomus 模块,这些模块通过轻量级、语言不可知的方式进行通信,它们共同实现业务目标**

软件系统是复杂的。由于人脑只能处理一定限度的复杂性,大型软件系统的高复杂性导致了许多问题。大型复杂的软件系统很难开发、增强、维护、现代化和扩展。多年来,有许多尝试来解决软件系统的复杂性。70 年代期间,的模块化软件开发被的戴维·帕纳斯埃德格·w·迪杰斯特拉引进来应对复杂情况 20 世纪 90 年代, 分层软件架构 被引入,以应对商业应用的复杂性。自本世纪初 、面向服务的架构 脱颖而出,开发复杂的业务应用。 微服务架构 是处理现代软件应用复杂性的最新方法论。一个问题可能会出现:为什么我们突然需要一种新的软件开发方法?简而言之,在过去的十年里,与软件开发相关的整个生态系统发生了显著的变化。如今,软件使用敏捷方法开发,使用 CI/CD 部署在 Container+Cloud 上,保存在 NoSQL 数据库上,在现代浏览器或智能手机上呈现,机器通过高速网络连接。由于这些因素,微服务架构在 2012 年诞生。**

微服务或整体:

主要有两组人对微服务和整体服务持相反的观点。对于一个团体来说,微服务架构完全是关于货物崇拜炒作驱动的开发**,这只是技术上瘾的开发人员的游乐场。对于另一群人来说,微服务架构是“统治一切的架构”,它可以消除任何软件系统的复杂性。在我看来,微服务和整体架构是相辅相成的。对于从长远来看是精益的应用程序,整体架构是正确的方法。另一方面,对于大型复杂或有可能变得大型复杂的应用,微服务架构是正确的解决方案。现代软件开发如此庞大,以至于微服务架构和整体架构将以 SQL 和 NoSQL 共存的方式共存。**

最佳实践:

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

以正确的方式设计微服务架构是非常具有挑战性和困难的。与为所有人提供一个解决方案的整体架构相反,微服务架构为不同的问题提供不同的解决方案。如果选择了错误的解决方案,那么微服务架构只是一个定时炸弹,注定要爆炸。设计糟糕的微服务架构比一整块还糟糕。为微服务架构定义一套最佳实践也很有挑战性。我曾经在一些会议上看到一些著名的受人尊敬的软件工程师提出了微服务架构的最佳实践,但这是适得其反的。

在这里,我提出了一些最佳实践,这些实践将有助于开发有效的微服务应用程序,其中目标项目应该存在 6 个月以上,团队规模为中型到大型(6 个以上的开发人员)。完全公开,还有一些关于微服务架构最佳实践的其他帖子,例如 微服务架构的特征by马丁福勒微服务模式 by 克里斯理查森 或采用 微也有一些很棒的演讲,例如 微服务模式和反模式斯蒂芬·蒂尔科夫大卫·施米茨微服务原则***萨姆·纽曼微服务失败的 10 个技巧*** 此外,我还整理了一些书籍,这些书籍对于设计微服务至关重要,包括:****

*** [## 5 本最佳微服务书籍

以正确的方式设计微服务架构的必备书籍

towardsdatascience.com](/5-best-microservices-book-db981ef9c433)

1。领域驱动设计:开发微服务的最大挑战是将一个大型复杂的应用程序分割成小的、自治的、可独立部署的模块。如果微服务没有以正确的方式划分,那么将会有紧密耦合的微服务,它们将具有整体式服务的所有缺点和微服务的所有复杂性,也称为分布式整体式服务。幸运的是,在这方面已经有一个非常有用的解决方案。Eric Evans【当时的软件工程顾问,在不同公司的商业应用中遇到了反复出现的关于软件复杂性的问题,并在 2004 年出版的《 领域驱动设计:解决软件核心的复杂性 》一书中总结了他的宝贵见解。该书概述了三个核心概念:

  • 软件开发团队应该与业务部门或领域专家紧密合作。
  • 架构师/开发人员和领域专家应该首先进行战略设计:找到有界的上下文和相关的核心领域和无处不在的语言、子域、上下文图。
  • 然后,架构师/开发人员应该进行战术设计,将核心域分解成细粒度的构建块:实体、值对象、聚合、聚合根

关于领域驱动设计的详细讨论超出了本文的范围,但是你应该阅读 DDD 的原著 领域驱动设计:解决软件核心的复杂性Eric Evans或者稍微现代一点的 DDD 的书 实现领域驱动设计 【红皮书】Vaughn Vernon 如果将一个大型系统划分为核心域和子域,然后将核心域和子域映射到一个或多个微服务,那么我们将得到理想的松耦合微服务。

****2。数据库每微服务:将复杂的应用拆分成微服务模块后,下一个挑战出现了,数据库怎么办?我们是否应该在微服务之间共享数据库。问题的答案是双刃剑。一方面,在微服务之间共享数据库会导致微服务之间的强耦合,这与微服务架构的目标正好相反。即使数据库中很小的变化也需要团队间的同步。此外,在一个服务中管理数据库的事务和锁定也非常具有挑战性。但是管理多个分布式微服务之间的事务/锁定是一项艰巨的任务。另一方面,如果每个微服务都有自己的数据库/私有表,那么在微服务之间交换数据就打开了挑战的潘多拉魔盒。因此,许多杰出的软件工程师提倡在微服务之间共享数据库,作为一种实用的解决方案。然而,在我看来,微服务是关于可持续和长期的软件开发。因此,每个微服务都应该有自己的数据库(或私有表)。

3。微前端:不幸的是,大部分后端开发人员对前端开发有一种落后的看法,认为前端开发很简单。由于大多数软件架构师是后端开发人员,他们很少考虑前端,并且前端通常在架构设计中被忽略。在微服务项目中,后端通常与数据库非常好地模块化,但只有一个整体前端。在最好的情况下,他们考虑一个最热门的温泉(反应,角,Vue)来开发整体前端。这种方法的主要问题是,前端单片和后端单片一样糟糕,正如我之前描述的。还有,当前端因为浏览器的变化而需要现代化的时候,那么它就需要一个大爆炸式的现代化(这就是为什么那么多公司还在使用过时的 Angular 1 框架的原因)。网络很简单,但是非常强大,并且提供了内在的超越性。有许多方法可以开发基于 SPA 的微前端:使用 iFrame、Web 组件或 via (Angular/React)元素。

4。持续交付:微服务架构的一个关键 USP 就是每个微服务都可以独立部署。如果您有一个包含 100 个微服务的系统,并且只有一个微服务需要更改,那么您可以只更新一个微服务,而不涉及其他 99 个微服务。但是在没有自动化的情况下独立部署 100 个微服务(DevOps,CI/CD)是一项艰巨的任务。为了充分利用这种微服务特性,需要 CI/CD 和 DevOps。使用没有 CI/CD、DevOps、自动化的微服务架构,就像买了最新的保时捷,然后用手刹开。难怪 CI/CD 被微服务专家 马丁福勒 列为使用微服务架构的三大先决条件之一。

5。可观察性:微服务架构的主要缺点之一是软件开发变得简单,但却牺牲了运营。有了一个整体,监控应用程序就简单多了。但是有许多微服务在容器上运行,整个系统的可观察性变得非常关键和复杂。甚至日志记录也变得复杂起来,要将来自许多容器/机器的日志聚集到一个中心位置。幸运的是,市场上已经有很多企业级的解决方案。例如, ELK/Splunk 为微服务提供日志记录。 Prometheus/App Dynamics 提供行业级监控。微服务世界中另一个非常重要的观察工具是跟踪。通常,对一个微服务的一个 API 请求会导致对其他微服务的多个级联调用。为了分析微服务系统的延迟,需要测量每个微服务的延迟。 Zipkin/Jaeger 为微服务提供出色的跟踪支持。

6。统一技术栈:微服务架构告诉我们,对于一个微服务,要采取最适合那个微服务的编程语言和框架。不应该从字面上理解这种说法。有时,微服务可能需要新的技术堆栈,例如,对于 CPU 繁重/高性能任务,可能会选择 C++/Rust 等编程语言。如果一个微服务配合机器学习,也许 Python 是更好的选择。但是在没有任何坚实理由的情况下使用不同的编程语言/框架会导致太多的编程语言和框架而没有任何真正的好处。想想这样一个场景,一个微服务是用 Spring Boot + Kotlin+ React + MySQL 开发的,另一个是用 JakartaEE+Java+Angular+PostgreSQL 开发的,下一个是用 Scala+Play Framework+VueJS+Oracle 开发的,那么维护不同的编程语言、数据库、框架将需要大量的工作,而不会有太大的收益。

****7。异步通信:微服务架构中最具挑战性的设计决策之一是服务之间如何通信和共享数据。当每个微服务都有自己的数据存储时,这就更加重要了。通常,一个微服务可以独立存在,但它不能单独实现所有的业务目标。所有的微服务一起工作来实现业务目标,并且一起工作,它们需要交换数据或触发其他微服务来完成任务。微服务之间最简单和最常见的通信方式是通过同步 REST API,这是一个实用但短期的解决方案。如果服务 A 调用服务 B,服务 B 调用服务 C,服务 C 同步调用服务 D,那么延迟就会增加。此外,由于微服务大多是分布式系统,它们可能会失败。同步微服务通常会导致故障级联,即一个服务中的故障会导致其他服务中的故障。微服务之间的同步通信也导致了微服务之间的紧密耦合。对于长期解决方案,微服务应该异步通信。微服务之间的异步通信有多种方式:通过消息队列(如 Kafka ),通过异步 REST (ATOM)或 CQRS。

****8。微服务优先:许多专家认为,对于新项目,最好从松散耦合的整体架构开始,因为微服务架构需要大量的初始工作来设置操作。在他们看来,一旦项目变得足够成熟,“精心”设计的整体可以很容易地转化为微服务。然而,在我看来,这种方法在大多数情况下都会失败。实际上,Monolith 内部的模块是紧密耦合的,这使得它很难转变为微服务。此外,一旦应用程序投入生产,在不分解应用程序的情况下将其转变为微服务将会困难得多。因此,我的建议是,如果最终有计划使用微服务架构,就从微服务开始。

****9。基于库的基础设施:在微服务软件开发的早期,网飞主要使用 Java 编程来开发微服务。他们还开发了许多库(网飞 OSS 栈包括 Hystrix,Zuul )。许多公司效仿网飞,开始使用 librariesNetflix OSS。后来,许多公司(包括网飞)发现,由于庞大的体积和冷启动问题,Java 并不是开发微服务的事实语言。网飞后来采用了多语言微服务模式,并决定不再进一步开发网飞 OSS,这导致了跟随者公司陷入困境。因此,与其在特定语言库(如基于 Java 的网飞操作系统)上大量投资,不如使用框架(如服务网格、API 网关)更明智。

10。组织方面的考虑:差不多 50 年前(1967 年), 梅尔文·康威 给出了一个观察,一个公司的软件架构是受组织结构限制的(康威定律)。尽管这一观察已有 50 年历史,但麻省理工学院和哈佛商学院最近发现,该定律在现代仍然有效。如果一个组织计划开发微服务架构,那么它应该相应地制定团队规模(两个“美式”披萨团队:7 个 2 人)。此外,该团队应该是跨职能的,理想情况下将有前端/后端开发人员,运营工程和测试人员。只有更高的管理层也相应地改变他们的观点和视野,微服务架构才会起作用。***

如果你觉得这很有帮助,请分享到你最喜欢的论坛上( Twitter,脸书,LinkedIn )。高度赞赏评论和建设性的批评。感谢阅读!

如果你对微服务架构感兴趣,也可以看看我下面的文章:

***** [## 微服务架构及其 10 个最重要的设计模式

微服务架构、每个微服务的数据库、事件源、CQRS、Saga、BFF、API 网关、扼杀者、电路…

towardsdatascience.com](/microservice-architecture-and-its-10-most-important-design-patterns-824952d7fa41) [## 透过宣传看:模块化整体软件架构真的死了吗?

现代软件开发中模块化整体软件体系结构的真实性检验

medium.com](https://medium.com/@md.kamaruzzaman/looking-beyond-the-hype-is-modular-monolithic-software-architecture-really-dead-e386191610f8) [## 微服务架构:简要概述以及为什么您应该在下一个项目中使用它

微服务架构的背景以及微服务架构相对于整体架构的优势

towardsdatascience.com](/microservice-architecture-a-brief-overview-and-why-you-should-use-it-in-your-next-project-a17b6e19adfd)*****

R 中有效的通知机制

原文:https://towardsdatascience.com/effective-notification-mechanisms-in-r-82db9cb8816?source=collection_archive---------29-----------------------

在这里,我们探索不同的 R 通知机制,并看看每种机制的优缺点。

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

Photo by Prateek Katyal on Unsplash

想象一下,运行一个聚类算法需要 4-5 个小时才能完成,现在你要么等待它完成,要么随着你的耐心减少,每小时检查一次,看看这个过程是否已经完成。

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

想象所有这样的场景,然后想象一个通知机制,它会让你知道进度或者一旦完成就通知你。

我们是来讨论这个问题的。

让我们从最简单的通知机制开始这篇短文,这个机制被亲切地称为“beepr”。

beepr

顾名思义,它只是在函数被调用时发出声音。代码是这样的:

library(beepr)
beep()

你也可以从 10 种你想要的声音中选择。这是一个非常简单易用的软件包,关于可用声音的更多细节,你可以参考这里

RPushbullet

这是我个人最喜欢的一个,RPushbullet 利用push pulletAPI 跨设备发送通知。它可以是任何东西,浏览器/android/ios,只要你在设备上安装了 pushbullet 你就好。

**Step 1:** Install pushbullet app in your phone/browser
**Step 2:** Access pushbullet settings from your browser and get the token/key for your account.
**Step 3:** Run
*library(RPushbullet)
pbSetup()* **Step 4:** Once you run the above step you will be asked to enter the token and select the registered device in the r console itself, do that.
**Step 5:** Run a similar code with your message and you are done
*pbPost("note", "Clustering Completed", "Clustering completed in 4hrs 13mins")*

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

这不仅仅是笔记,你也可以发送链接,文件作为一个信息和通知将显示在注册的设备。

通常这是我发现最有用的一个。它非常容易安装,也是所有解决方案中最实用的,不管你的代码是运行在服务器上还是桌面上。

notifier

这是一个基于桌面的通知包,可以用来在 macOS,Windows 和 Linux 上发送桌面通知。这里有一篇关于 macOS 实现这个的文章。但不幸的是,我无法让它在我的 Windows 10 机器上工作,它总是出现这样或那样的错误。但是步骤很简单,如果你能做到,请告诉我。

#install.packages("devtools") if devtools is not installed
devtools::install_github("gaborcsardi/notifier")library(notifier)
#composing the first notification message

notify(
  title = "Here goes the Title",
  msg = c("Hello","World")
  )

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

这张图是 macOS 用的,取自这里。这也是在桌面环境中获得通知的一种非常方便的方法,但是如果您的代码在服务器上运行,这种方法就没什么用了。

邮件

通过 mailR 包,你可以从 r 发送电子邮件。但是我不喜欢使用这个,你必须在脚本中传递用户 id/密码,这不太安全。但你仍然感兴趣的是下面的代码。

install.packages(“mailR”)
library(mailR)send.mail(from = “[sender@gmail.com](mailto:sender@gmail.com)”,
 to = c(“[recipient1@gmail.com](mailto:recipient1@gmail.com)”, “Recipient 2 <[recipient2@gmail.com](mailto:recipient2@gmail.com)>”),
 replyTo = c(“Reply to someone else <[someone.else@gmail.com](mailto:someone.else@gmail.com)>”),
 subject = “Subject of the email”,
 body = “Body of the email”,
 smtp = list(host.name = “smtp.gmail.com”, port = 465, user.name = “gmail_username”, passwd = “password”, ssl = TRUE),
 authenticate = TRUE,
 send = TRUE)

如果需要的话,你可以参考这篇文章以获得更多的细节和解决谷歌不太安全的应用程序问题的方法。

RDCOMClient — Outlook

这是另一个特别有帮助的方案,如果你在日常生活中必须展望未来的话。安装和运行起来非常简单

library(RDCOMClient)
## init com api
OutApp <- COMCreate("Outlook.Application")
## create an email 
outMail = OutApp$CreateItem(0)
## configure  email parameter 
outMail[["To"]] = "test@test.com"
outMail[["subject"]] = "some subject"
outMail[["body"]] = "some body"
## send it                     
outMail$Send()**#edit to add attachment** outMail[["Attachments"]]$Add(path_to_attch_file)**#edit to change “from” (send from secondary mailbox)** outMail[["SentOnBehalfOfName"]] = "yoursecondary@mail.com"

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

加上发送附件和从另一个邮箱发送的额外优势,这在各种情况下都很有用。

现在就这些了,现在有了这些,在 R 中实现通知就容易多了,希望能让我们的生活轻松一点。

寻找深度学习论文的有效方法

原文:https://towardsdatascience.com/effective-way-for-finding-deep-learning-papers-daa27415ad16?source=collection_archive---------12-----------------------

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

Woman holding book on bookshelves — Photo by Becca Tapert on Unsplash

最近,我看到了一段吴恩达教授的精彩视频,他在斯坦福大学的计算机科学课上解释了如何在人工智能领域出类拔萃。

我将在下面改写他的话。

深度学习发展得足够快,即使你已经学习了深度学习的基础,当你从事特定的应用时,你也需要阅读研究论文,以掌握最新的想法。

吴教授分享了一个简单而有效的阅读计划技巧。它包括以下步骤:

  • 选择一个你感兴趣的主题(例如语音识别、文本摘要、用 GANs 生成图像)。
  • 列出 10-20 篇论文/文章/博客文章。
  • 逐渐将此列表扩展到 50+篇论文。

此外,他还提出了几个寻找资源的地方,包括 Twitter机器学习 subredditNIPSICMLICLR (后 3 个是机器学习会议)。

遵循这个技巧,我想到了一个问题:

找到合适的论文集需要花费多少时间和精力?

在奉献了几个小时并最终成功地找到了一套我渴望的论文和文章后,我决定分享我的经验并在这一旅程中帮助他人。

如何开始?

第一步是决定一个特定的主题/问题。就我而言,我有兴趣了解更多关于深度学习如何应用于任何类型贷款(抵押贷款、个人贷款、信用卡等)的信用风险评估。)

一旦你有了主题,最好把所有与它相关的关键词列下来。对我来说,这些是:信用,贷款,借贷,抵押贷款,风险,评估,分数,银行,金融。

当你搜索一篇论文/文章/博客文章时,将这些关键词与“深度学习”、“机器学习”或“神经网络”结合起来,以获得所需的结果。

在网上寻找资源

寻找合适的资源可能需要 1 小时到 1-2 天的时间。这真的取决于你有多大决心找到“完美”的试卷。然而,人们应该避免在研究上花费不必要的时间,只要他/她找到 3-4 篇论文,实际的阅读就可以开始了。下面列出了几种查找资源的有效方法。

  • 标准谷歌搜索

有目共睹的是,谷歌搜索上述关键词是第一步。不幸的是,我没有发现这种方法如此有效,因为结果通常不包括实际的解决方案,而是主题的概述,适合任何读者。

然而,如果你搜索谷歌学术,找到你需要的东西的可能性要高得多。

  • 探索顶级机器学习会议

第二步是浏览过去几年会议的所有标题,并提取听起来有趣的内容。例如,让我们看看 NIPS 会议并尝试找到提交的论文列表。

  • 首先,转到https://nips.cc/,将年份从 2019 年改为 2018 年、2017 年等。

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

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

  • 最后,浏览各章节,挑选与你的主题相关的论文。

其他会议的网站上也有“研讨会手册”,您可以通过类似的方式获得。

  • 搜索最流行的在线研究论文库

这类网站包括arxiv.org语义学者科学导报等。在每个平台上使用您预定义的关键字和“高级搜索”选项来查找感兴趣的资料。

注意:有些文件可能是私有的,需要购买。请记住,如果你是学生(来自任何大学),你可以免费获得这些论文。您也许可以使用您的学生凭据登录并获取 pdf。否则,请向您的学校寻求进一步的指导。

深入研究一篇论文

找到一套与你的主题完全匹配的论文的过程可能是乏味且耗时的。你很可能会找到相关的论文(在相同或相邻的领域),但不完全是你需要的。

不要忘记,研究人员是基于以前的发现来完成他们的工作的,每篇论文都包括大量的参考文献。

下面是我如何利用上面的陈述找到我想要的东西:

  1. 在看了 NIPS 2018 研讨会的书籍后,我发现了一个很棒的研讨会,名为*“人工智能在金融服务中的挑战和机遇:公平性、可解释性、准确性和隐私的影响”。*
  2. 大多数论文并不完全是关于评估信用价值,而是关于让金融领域使用的深度学习模型更具解释力的新方法。
  3. 我认为,为了让作者讨论模型的可解释性,他们必须查看(并引用)实际的算法。令人惊讶的是,我发现最初的 3-4 个参考正是我所需要的。

这种方法帮助我扩展了资源列表,找到了真正有用的材料。

过滤噪音

在这最后一节,我想回顾一下我在选择特定论文时所关注的几件事。这有助于我过滤大部分噪音,让我专注于更少但质量更高的来源。

  • 作者 —论文可以由不同领域的不同研究人员发表。我通常会在 LinkedIn 或 Twitter 上查找作者的姓名和机构。例如,一篇由大型银行/金融机构的研究人员撰写的关于深度学习的信用风险评估的论文是一个优质材料。此外,好学校(斯坦福、麻省理工、蒙特利尔大学)和公司(脸书、谷歌、百度)通常拥有最强的研究人员。
  • 发表日期 —深度学习领域正在快速发展,因此 5 年前的一篇论文在今天可能无关紧要。我倾向于寻找更近期的材料,但从不忽视很久以前的好论文,尤其是如果它介绍了一种突破性的技术。
  • 被引用次数 —如果一篇论文没有被引用,通常这并不自动意味着它不是一篇高质量的材料。我经常看被引用的次数,只是为了了解论文的受欢迎程度,但这从来不是决定性因素。

这就是我有效搜索研究论文和文章的方法。如果你有任何意见或建议,请在评论区分享。

谢谢你的阅读。希望你喜欢这篇文章🤩我祝你今天过得愉快!

有效挖掘专利数据的真正价值

原文:https://towardsdatascience.com/effectively-exploiting-the-real-value-of-patent-data-990fbb3d0a43?source=collection_archive---------15-----------------------

B ig 数据制造和运营的所有领域越来越可用,这为实现有竞争力的数据驱动型经济提供了价值。随着数据可用性的增加,支持工业 4.0 的数据可用性增加,这为更好的决策和战略制定带来了巨大的机遇,从而推出了下一代创新和颠覆性技术

O 在过去的二十年里,专利分析和知识产权分析领域有了长足的发展( Trippe,2003Aristodemou 等人,2018 。随着专利数据的数字化(1984 年的 BACON 项目)以及过去几十年来数据质量和分析技术的不断改进,世界上最大的技术信息库已经变得越来越容易获取,成本也在迅速降低。

在最近的一项研究中,我们使用了技术路线图方法来探索专利分析的未来,我们确定了 11 项优先技术,如人工智能和人工神经网络,行业专家认为这些技术在专利分析领域中以更高的比率被采用是非常重要的。

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

Fig. 1 Future of Patent Analytics Technology Roadmap Enablers (Source: Aristodemou and Tietze, 2017)

我们确定了采用这些计算机科学技术的需求,以补充决策流程并提供决策支持( Aristodemou 和 Tietze,2017 )。此外,我们确定了 4 个使能支柱,它们可以促进上述目标的实现;即技术开发周期和方法、立法、持续发展和合作(图 1)。

在全球创新经济中,知识产权的重要性正在迅速增加,并且变得更加复杂。人工智能(AI)、大数据分析和区块链等新技术可用于应对知识产权领域面临的日益严峻的挑战。我们将知识产权分析(IPA)** 定义为:**

分析大量知识产权信息的数据科学,以发现关系、趋势和模式,从而做出决策。

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

Fig. 2 Artificial Intelligence Methods used with Intellectual Property Data (Source: Aristodemou et al., 2018)

具体来说,在最近发表在《世界专利信息》特刊上的一篇论文中,我们回顾了 57 篇最近发表的文章,该论文题为【TechMining 的知识产权信息高级分析。在元数据分析之后,我们将它们分为 4 大类:、知识管理、技术管理、经济价值以及信息的提取和有效管理**,然后确定其中使用的具体方法和算法。图 2 显示了文献中使用的知识产权分析方法的拓扑结构,如 Aristodemou 等人在 2018 年中所讨论的。很明显,研究中存在所有三种学习模型类型:监督、半监督和非监督模型;大多数文章都集中在人工神经网络的使用上。此外,还值得注意的是,所使用的大多数方法都是在数据预处理阶段,即在运行任何算法之前准备专利数据。这显示了这些技术在以这样一种方式构建专利数据中的重要性,使得模型是可感知的和可理解的。用计算机科学的语言来说,这表明了**“垃圾输入垃圾输出”(GIGO)** ,或者换句话说**“合理输入合理输出”(SIRO)** 对于任何模型的重要性。**

C 因此,公司需要密切注意保护和利用这些隐藏在数据本身中的有价值的信息。过去,知识产权安全的重点是保留员工掌握的知识,而现在,重点正转向利用、连接、分析和保护数据。凭借强大的算法和计算机速度,我们现在能够根据个人和组织的需求提取和分析大量数据。

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

Fig. 3 Data Analysis mini-Technology Roadmap Summary (Source: Aristodemou and Tietze, 2017)

这可以通过图 3 中的微型技术路线图部分实现。在短期内,重要的是稳定和建设一个有效的、以目标为导向的基础设施。随着对现有分析技术的进一步理解,这将在如何使用分析工具来避免黑盒方面建立透明度。随后可以开发定制的方法,使用人工智能方法对中期专利数据进行有效的数据分析,从长期来看则是一个完全适应的系统。使用开源社区和开放数据的其他举措可以促进这些过程。重要性在于从专利中获得的技术价值和专利的经济价值之间的联系,即市场愿意为一项这样的发明及其利益支付多少钱。

参考资料:

  • **Aristodemou,l .,& Tietze,F. (2018 年)。知识产权分析(IPA)的最新发展:一篇关于人工智能、机器学习和深度学习方法的文献综述,用于分析知识产权(IP)数据。世界专利信息,55 37–51。【https://doi.org/10.1016/j.wpi.2018.07.002 **
  • Aristodemou,l .和 Tietze,f .,2017 年。探索专利分析的未来。英国剑桥大学制造研究所技术管理中心(CTM)洞察报告,ISBN:978–1–902546–84–1。请访问:https://www . IFM . eng . cam . AC . uk/insights/innovation-and-IP-management/exploring-the-future-of-patent-analytics/
  • Trippe,a . j .(2003)“Patinformatics:任务到工具”,世界专利信息,25(3),第 211–221 页。doi:10.1016/s 0172–2190(03)00079–6

关于作者:

Leonidas Aristodemou 是人工智能、技术和创新管理领域的博士研究员。他是剑桥大学制造研究所(IfM)技术管理中心(CTM)创新和知识产权管理(IIPM)小组的成员。他目前是伦敦艾伦图灵研究所的访问学者。他目前的研究围绕着大数据的使用、应用机器学习和知识产权分析;更具体地说,他分析知识产权数据的大数据集,并使用深度学习模型预测技术价值/影响。预计这将改善创新管理模式中的技术战略决策过程。

轮廓

领英:https://www.linkedin.com/in/leonidasaristodemou/

**剑桥:【http://www.eng.cam.ac.uk/profiles/la324 **

图灵:https://www . Turing . AC . uk/people/博士生/leonidas-aristodemou

有效地预处理文本数据第一部分:文本清洗

原文:https://towardsdatascience.com/effectively-pre-processing-the-text-data-part-1-text-cleaning-9ecae119cb3e?source=collection_archive---------3-----------------------

本文的内容直接来源于 Francois Chollet 的《使用 Python 进行深度学习》和 Manning、Raghavan 和 Schütze 的《信息检索导论》。本文中使用的一些信息图表也取自上述书籍。

文本是一种数据形式,在人类历史中已经存在了几千年。所有影响所有宗教的神圣文本,所有诗人和作家的作品,他们那个时代最聪明的头脑做出的所有科学解释,所有定义我们的历史和未来的政治文件,以及各种明确的人类交流,这些“所有”都定义了以我们所谓的文本形式存在的数据的重要性。

在我之前的文章 有效的数据预处理和特征工程, 中,我已经用三个主要步骤解释了预处理的一些一般过程,这三个步骤是“转换成向量、归一化和处理缺失值”。本文将介绍将文本数据转换成某种形式的向量的前传步骤,更多的是关于数据清理。

文本只是一个单词序列,或者更准确地说,是一个字符序列。但是,当我们通常处理语言建模或自然语言处理时,我们更关心作为一个整体的单词,而不仅仅是担心我们的文本数据的字符级深度。这背后的一个原因是,在语言模型中,单个字符没有很多“上下文”。像’ d ‘,’ r ‘,’ a ‘,’ e '这样的字符不单独包含任何上下文,但当以单词的形式重新排列时,它们可能会生成单词“read”,这可能解释了你可能正在做的一些活动。

矢量化只是一种将单词转换成长串数字的方法,这些数字可能具有某种复杂的结构,只有使用某种机器学习或数据挖掘算法的计算机才能理解。但即使在此之前,我们也需要对文本执行一系列操作,以便我们的文本可以被“清洗”掉。数据“清理”的过程可能因数据来源的不同而不同。文本数据清理的主要步骤如下所示,并附有解释:

删除不需要的字符

这是文本清理过程中的主要步骤。如果我们从 HTML/XML 源中删除一些文本,我们需要去掉所有的标签、HTML 实体、标点符号、非字母和任何其他可能不属于该语言的字符。这种清理的一般方法包括正则表达式,可以用来过滤掉大部分不需要的文本。

有些系统保留了重要的英文字符,如句号、问号、感叹号等。考虑一个例子,你想对人类生成的推文进行一些情感分析,你想把推文分类为非常生气、愤怒、中性、高兴和非常高兴。简单的情绪分析可能会发现很难区分快乐的情绪和非常快乐的情绪,因为有些时候只有语言无法解释。

考虑语义相同的两个句子:

“这菜不错。”,还有“这个。食物。是。很好!!!!!!!!"。

明白我想说什么了吗?同样的词,但完全不同的情感,唯一能帮助我们看出不同的信息是过度使用的标点符号,这显示了某种“额外”的感觉。

由非字母组成的表情符号也在情感分析中发挥作用。“😃,😦,-_-,😄,xD”,所有这些,当被正确处理时,可以帮助进行更好的情感分析。即使你想开发一个系统来分类某个短语是不是讽刺,这样的小细节也是有帮助的。

撇号是一种重要的标点符号,需要小心处理,因为许多文本都可以基于撇号。像“不是,不应该,没有,本来会,可能不会,你们都已经”这样的术语就像一种疾病一样渗透到在线文档中,幸运的是,我们也有治愈这种疾病的方法。这里的是一个很好的词典,收录了所有这些单词的缩写,你可以用它来将包含撇号的单词转换成正式的英语术语,用空格隔开。

以正确的格式编码

有多种数据编码可供选择,如 UTF-8 编码、拉丁编码、ISO/IEC 编码等。UTF-8 是大多数电脑最常用的编码之一,因此将文本转换为 UTF-8 编码总是一个好主意。但是,根据应用程序和您的编程环境,您也可以用其他格式编码。

标记化和资本化/去资本化

标记化就是把一个句子拆分成单词的过程。

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

Tokenization of a sentence

您可能已经意识到,上面的例子不仅标记了句子,还确保了所有的单词都是小写的。这个例子不仅划分了个体实体,而且摆脱了所涉及的资本主义(没有双关的意思)。资本化和去资本化同样取决于应用程序的用途。如果我们只关心术语,而不是它们的“存在强度”,那么所有小写的术语都应该没问题,但是如果我们想区分任何情感,那么大写的东西可能意味着不同于小写的东西。请参见下面的示例:

“我们去高地吧!”

“我们去高地吧!”

同样,后者比第一句表现出更多的热情。

移除/保留停用字词

这个清理步骤还取决于预处理后您最终将对数据做什么。停用词是使用非常频繁的词,它们太频繁了,以至于有点失去了它们的语义。像“of,are,the,it,is”这样的词是停用词的一些例子。在文档搜索引擎和文档分类等应用中,关键字比一般术语更重要,删除停用词可能是一个好主意,但如果有一些应用,例如歌曲歌词搜索或搜索特定引用,停用词可能很重要。考虑一些例子,比如“生存还是毁灭”,“看看你让我做了什么”等等。这些短语中的停用词实际上起着重要的作用,因此不应该被删除。

有两种常见的删除停用词的方法,这两种方法都相当简单。一种方法是对所有出现的单词进行计数,并提供计数的阈值,并去除出现次数超过指定阈值的所有术语/单词。另一种方法是有一个预定的停用词列表,它可以从标记/标记化句子列表中删除。

当在基于语义/情感分析的系统上工作时,一些人类表达,如“哈哈哈,lol,lmfao,brb,wtf”也可以是有价值的信息,但是对于需要更正式类型的应用程序的系统,这些表达也可能被删除。

打破附字

文本数据可以包含连接在一起的单词,单词之间没有空格。社交媒体上的大多数标签都是像“# AwesomeDay、#DataScientist、#BloggingIsPassion”等。天啊。这样的术语也需要注意,一个简单的方法是根据大写字母拆分这些术语,如果我们保留大写字母,这是可能的。如果我们不想保留大写,那么这个步骤应该在标记化步骤中执行,就在所有内容都变成小写之前。

词汇化/词干化

词干化和词元化的目标都是将一个单词的屈折形式,有时是衍生相关形式减少到一个共同的基本形式。“也就是说,词干化/词汇化有助于我们将全部术语的数量减少到某些“根”术语。

组织者,组织者,组织者,有组织的所有这些都可以归结为一个词根,也许是“organiz”。

词干提取是一种简单的方法,通过定义在单词末尾去掉一些字符的规则来减少单词的词根,希望在大多数情况下能得到好的结果。

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

Examples of stemming

词汇化相对来说是一种更系统的方法,做词干化做的同样的事情,但是涉及一些词汇和词法分析。

同样,词干化和词汇化过程应该只在需要的时候执行,因为单词的词缀包含可以利用的附加信息。比如“更快”和“最快”的词根相同,但语义却互不相同。因此,如果您的应用程序只与术语相关,正如大多数搜索引擎和文档聚类系统所做的那样,那么词干化/词条化可能是一个选项,但对于需要考虑一些语义分析的应用程序,词干化和词条化可能会被放弃。

拼写和语法纠正

这些技术是在处理文本数据时获得更好结果的好方法。在一个场景中,你需要为一些正式的用例训练一个聊天机器人,并且你有很多可用的人类对话文本数据,那么你可能要执行拼写和语法纠正,因为如果你的聊天机器人在垃圾上得到训练,它也可能会犯很多错误。此外,由于计算机不擅长区分“awesome”和“awesum ”,同一单词的这两个变体最终将具有不同的特征向量,并将被不同地处理。我们不希望发生这种情况,因为这两个术语都是相同的,只是有一个拼写错误。人为错误不应该对计算机的学习方式产生影响,这一点很重要。如果计算机开始犯和人类一样的错误,那么它们将和那些经常犯错的人一样没用。

总结这篇文章,数据清理就是去除数据中的“噪音”。但是您的应用程序决定数据中哪些内容是噪声,哪些不是噪声。一旦你弄清楚你需要从数据中保留什么,丢弃什么,那么你肯定会有一个按你计划的方式工作的应用程序。

如果你已经执行了上面提到的步骤,或者甚至是其中的一些步骤,那么现在你应该有一个由多个列表组成的矩阵 X ,其中每个列表都包含一个句子中经过清理和标记的单词。现在,下一步是使用一种技术,将所有的标记化列表转换成向量 v 。这个问题将在接下来的文章中讨论,标题为“有效地预处理文本数据第二部分:实现”。

对于任何疑问/评论/批评,我都愿意进行建设性的沟通。

数据科学快乐!

运行全卷积网络的有效方法

原文:https://towardsdatascience.com/efficient-method-for-running-fully-convolutional-networks-fcns-3174dc6a692b?source=collection_archive---------14-----------------------

全卷积(深度神经)网络(fcn)通常用于计算机视觉任务,如语义分割、超分辨率等。它们最好的特性之一是它们适用于任何大小的输入,例如不同大小的图像。然而,在大规模输入(如高分辨率图像或视频)上运行这些网络可能会消耗大量 GPU 内存。在这篇文章中,我将介绍一个简单的方法来缓解这个问题。所提出的算法将 GPU 内存使用率降低到只有 3–30%。

什么是全卷积网络?

一个完全卷积的网络(从现在开始:FCN)是一个仅由卷积层组成的网络。如果你对卷积层不熟悉,这里的是初学者指南。为了简单起见,在这篇文章中,我们将关注图像,但这同样适用于视频或其他类型的数据。

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

A fully convolutional network for segmentation. input and output images from Nvidia dev blog

对于图像处理中的许多任务,要求输入和输出图像具有相同的尺寸是很自然的。这可以通过使用具有适当填充的 fcn 来实现(TensorFlow 中的‘相同’)。因为这是一个标准程序,从现在开始我们假设它成立。

在这种架构下,输出图像中的每个像素都是对输入图像中的相应补片进行计算的结果。

这个斑块的大小称为网络的感受野(RF)。

这是一个关键点。我们将很快看到算法如何使用这个属性

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

FCN with one layer: 3x3 convolution. each output pixel corresponds to a 3x3 patch in the input image

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

FCN with 2 layers: each is a 3x3 convolution. each output pixel corresponds to a 5x5 patch in the input image

上面我们可以看到带有一个(顶部)和两个(底部)3×3 conv 层的 fcn 的插图。在一层(顶部)的情况下,右侧的蓝色输出像素是对左侧蓝色输入面片的计算结果。当有两层(底部)时,我们在输入和输出之间有一个特征图。特征图中的每个绿色像素(中间)都是在一个 3×3 绿色输入面片(左侧)上计算的结果,与一个图层的情况相同。类似地,每个蓝色输出像素(右)是对蓝色 3x3 特征图块(中)的计算结果,该特征图块源自 5x5 蓝色输入块(左)。

所以…有什么问题

如前所述,理论上,我们可以将网络应用于任何输入大小。然而,实际上,计算通过网络的正向传递需要在内存中保存巨大的特征图,这会耗尽 GPU 资源。我在研究视频和 3d 图像时遇到了这个限制。网络根本无法在我们花哨的 NVIDIA v100 GPUs 上运行,这促使我开发了这个解决方案。

通过 FCN 传递大量输入的有效方式

传统 CNN 以完全连接的层结束。因此,每个输出像素都是整个输入的计算结果。在 fcn 中情况并非如此。正如我们所见,只有来自输入的感受野大小的小块影响单个输出像素。因此,要计算单个输出像素,不需要将整个特征图保存在内存中!

换句话说:

我们可以一次计算一小部分输出值,同时只传递输入中必要的像素。这大大减少了 GPU 的内存使用!

让我们来看看下面的例子:
我们的输入是一个 28x28 的图像,如下图所示。由于内存限制,我们可以通过最大 12x12 的网络补丁。最简单的方法是从原始输入(下图中的轮廓)输入 12×12 的面片,并使用 12×12 的输出面片来构建 28×28 的输出图像。

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

Each output pixel is the result of a different patch passing through the network. For example, orange pixels are the result of passing the orange 12x12 patch.

不幸的是,这种方法不会产生与一起传递整个 28x28 输入相同的结果。原因是边界效应。

解决边界效应

为了理解这个问题,让我们看看下图中标记的红色像素。周围的红色方块代表感受野,在本例中大小为 5x5,跨越蓝色和橙色区域。为了正确计算红色输出像素,我们需要同时计算蓝色和橙色像素。因此,如果我们像在天真的方法中那样分别运行蓝色和橙色的补丁,我们将没有必要的像素来精确地计算它的值。显然,我们需要另一种方法。

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

Red — a boundary pixel and the receptive field around it

那么我们如何才能让它变得正确呢?我们可以使用重叠的补丁,这样每个 5×5 补丁将包含在通过网络的 12×12 补丁之一中。重叠量应该比感受野(RF -1)少 1 个像素。在我们的例子中,感受野 RF=5,所以我们需要 4 个像素的重叠。下面的动画演示了不同的图像补丁如何在给定的限制下通过网络传递。它显示了每个 12×12 输入面片(轮廓)在输出(填充)中贡献了更少量的像素。例如,蓝色方形轮廓比蓝色像素填充的区域大。

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

Overlapping patches. For example, orange pixels are the result of passing the orange 12x12 patch.

回到我们标记的红色像素。现在,如下图所示,由于重叠,它可以正确计算。它的 5x5 周围补丁完全包含在橙色 12x12 补丁中(轮廓)

实际上,每个像素都有一个 12×12 的小块包含其感受野大小的周边 这样我们可以确保同时运行整个 28x28 图像的效果。

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

red — a boundary pixel and the receptive field around it

结果

下表给出了一些关于 GPU 内存使用和运行时间的实验结果。正如所承诺的,内存消耗是显着减少!

注意:尽管每个图像的运行时间较慢,但是使用这种方法我们可以并行传递多个图像,因此节省了时间。例如,在第 3 行中,使用该算法我们可以同时运行 13 个图像,这将花费与使用直接方法仅运行 6 个图像一样多的时间。

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

with patch by patch algorithm GPU memory usage is reduced by 67%-97% compared to standard method

实验在 NVIDIA Tesla K80 GPU 上运行。

感谢本·范斯坦、因娜·格里涅维奇、阿维夫·内塔尼亚胡和阿耶莱特·萨皮尔斯坦

EfficientDet:可扩展和高效的对象检测综述

原文:https://towardsdatascience.com/efficientdet-scalable-and-efficient-object-detection-review-4472ffc34fd9?source=collection_archive---------10-----------------------

谷歌大脑团队最近发表了另一篇基于他们预览工作的对象检测论文,EfficientNet。该论文的作者提出了一种可扩展的检测架构,同时在广泛的资源限制范围内实现更高的准确性和效率。与其他检测网络相比,EfficientDet 网络系列可实现类似的性能,同时减少参数和触发器的数量。

效率净值汇总

在深入研究 EfficientDet 纸之前,我们首先需要了解 EfficientNet 纸。与 EfficientDet 不同,该网络旨在提升 ImageNet 域中的网络性能。EfficientNet 论文中的核心概念是网络在多个维度(输入分辨率、深度、宽度)上的复合扩展。EfficientNet 不是只扩展网络的一个或两个维度,而是扩展网络的所有维度。

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

如上图所示,传统方法只增加了网络的一个维度(宽度、深度或分辨率)。这可以通过手动调整缩放系数来提高模型的性能,但是找到正确值的过程是一个冗长的过程,并且经常导致次优的精度和效率。

当在 EfficientNet 中执行复合缩放时,使用固定的缩放系数统一执行每个维度中的调整。例如,当给定 2^N 计算资源时,我们可以通过α^N 增加网络深度,通过β^N 增加宽度,通过γ^N 增加图像大小,其中α、β和γ是通过在原始小模型上的小网格搜索确定的常系数。使用多目标神经架构搜索来执行找到基础效率 Net-B0 的过程。然后,从找到的基线网络开始,应用复合缩放方法来放大网络的维度。

要了解更多关于 EfficientNet 论文的信息,我建议在这里阅读论文

效率检测

在 EfficientDet 论文中,做出了两个主要贡献:(a) BiFPN 允许双向快速多尺度特征融合。(b)一种新的复合缩放方法联合放大主干、特征网络、盒/类网络和分辨率。使用 BiFPN 和新的复合缩放,形成了一系列高效的 Det 网络,在准确性和效率方面优于以前的对象检测器。

BiFPN

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

BiFPN 的目标是以自上而下的方式有效地聚合多尺度特征。上图显示了基于 FPN 的不同汇总方法的比较。从(a)开始,典型的 FPN 网络融合了从 3 级到 7 级的多尺度特征。PANet 架构(b)在 FPN 之上增加了一个额外的自底向上的路径,以有效地利用较低层次的特性。节点之间的连接也可以通过使用神经结构搜索来找到。如©所示,这些连接不同于人类构建的连接。

通过比较这三种架构,作者观察到 PANet 比 FPN 和 NAS-FPN 实现了更好的准确性,但代价是更多的参数和计算。从 PANet 架构开始,为了提高模型效率,EfficientDet 的作者首先删除只有一个输入边的节点,并创建 PANet 架构的简化版本,如(e)所示。直觉是,如果一个节点只有一条输入边而没有特征融合,那么它对旨在融合不同特征的特征网络的贡献将会更小。然后,如果节点处于同一级别,作者会从原始输入向输出节点添加一条额外的边。这样做是为了在不增加太多成本的情况下融合更多功能。最后,与只有一个自上而下和一个自下而上路径的 PANet 不同,双向(自上而下和自下而上)路径被视为一个要素网络图层,并多次重复同一图层以实现更高级别的要素融合。最终提出的 BiFPN 架构如(f)所示。

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

当特征被融合在一起时,利用加权特征融合。由于不同分辨率下的不同输入特征对输出特征的贡献不相等,因此在进行特征融合时,每个输入的额外权重充当比例因子。具体而言,使用上式所示的快速归一化融合。通过在每个ω后应用 relu 来确保每个ω的正定性,并添加ϵ以避免数值不稳定。

复合缩放

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

网络复合扩展的目的是扩大基线模型(EfficientDet D0)的规模,以涵盖广泛的资源限制。一个简单的复合系数φ联合放大了主干网络(BiFPN)、类/箱网络和分辨率的所有维度。在 EfficientNet 论文中使用了网格搜索,但使用了基于启发式的缩放方法,因为对象检测器比图像分类模型具有更多的缩放维度。

**(a)主干网络:**使用与 B6 efficient net-B0 相同的宽度/深度比例系数来恢复 ImageNet-pretrained 检查点。

**(b) BiFPN 网络:**使用等式(1),BiFPN 网络的宽度以指数方式增长,深度以线性方式增加,以将深度值舍入为小整数。

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

**©盒/类预测网络:**预测网络的宽度固定为总是与 BiFPN 相同,但是预测网络的深度使用等式(2)线性增加。

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

**(d)输入图像分辨率:**由于在 BiFPN 中使用特征级别 3–7,输入分辨率必须能被 2⁷ = 128 整除,因此使用等式(3)图像的分辨率线性增加。

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

结果

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

使用复合比例方法,可生成一系列 EfficientDet 网络(efficient det D0–07)。上表显示了 COCO 数据集上模型的单尺度性能。与以前的检测机相比,EfficientNet 型号在各种精度或资源限制下实现了更高的精度和效率。请注意,EfficientDet-D0 模型实现了与 YOLOv3 相似的精度,但触发器数量减少了 28 倍。此外,与 RetinaNet 和 Mask-RCNN 相比,EfficientDet-D1 实现了相似的精度,但参数减少了 8 倍,触发器减少了 25 倍。

对于那些想了解 EfficientDet 更多信息的人,我建议阅读整篇文章。下面提供了链接。

参考

[## EfficientNet:重新思考卷积神经网络的模型缩放

卷积神经网络(ConvNets)通常是在固定的资源预算下开发的,然后按比例放大用于…

arxiv.org](https://arxiv.org/abs/1905.11946) [## EfficientDet:可扩展且高效的对象检测

模型效率在计算机视觉中变得越来越重要。在本文中,我们系统地研究了各种模型

arxiv.org](https://arxiv.org/abs/1911.09070)

高效地寻找昂贵函数的根

原文:https://towardsdatascience.com/efficiently-finding-a-root-of-an-expensive-function-80431c035bb?source=collection_archive---------34-----------------------

解释了二次插值,用 Python 编写了示例代码

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

Photo by Josh Riemer on Unsplash

有时候在科学编程中,你需要使用一个平滑的实值函数 f ( t )来计算开销。具体来说,你可能需要找到函数值变为零的地方。我最近在我的开源天文图书馆工作时遇到了这个问题。我想知道月出月落的时间。这包括计算地球的自转和月球绕地球的轨道,以确定在特定地理位置的观察者所看到的月球何时穿过地平线。

在我的例子中, f ( t )是观察者在时间 t 看到的月亮在地平线以上或以下的视在角高度。找到月出或月落时间意味着找到 t 的值,使得 f ( t )=0。用数学术语来说,我想找到函数 f

评估 f ( t )包括计算月球位置,这需要上千次浮点运算。我想尽量减少我不得不评估 f ( t )的次数,因为我找到了一个足够好的值 t 。我寻找精确到几秒钟以内的时间。

解决这类问题的一个相当好的方法是在开根之前找到时间 t ₀,在开根之后找到另一个时间 t ₁。假设你知道时间间隔足够小,在它里面不会有一个以上的根。(在我的例子中,我知道一个小时内不可能有一次以上的月出。)

假设你确定 f ( t ₀) < 0,f( t ₁) > 0。情况看起来是这样的:

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

There must be at least one root in the interval indicated by the arrow.

鉴于 f 是一个连续函数,在 t ₀和 t ₁之间至少有一个 t 的值,使得 f ( t )=0。连续函数不可能不经过零就从负值变成正值。

为了取得进展,我们在区间中间的时间 t ₂评估函数:

假设你发现 f ( t ₂) < 0。现在你已经了解了一些新的信息。你已经发现根一定在更窄的区间内的某个地方t₂<ttt<tt₁:

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

The uncertainty of the root’s location has been cut in half.

或者,如果您发现 f ( t ₂) > 0,您可以将您的搜索限制在左边的半区间,t₀<t<t₂.

无论哪种方式,您都可以将音程切成两半,并选择哪一半必须包含根。重复这样做被称为二分搜索法。您可以不断迭代,直到时间间隔变得相当小。

如我所说,二分搜索法是一种相当快速的方法。但是在某些条件下,使用二次插值比二分搜索法求函数的根要快得多。以下是条件:

  • 该功能为平滑连续
  • 该函数在很小的区间内很好地近似为抛物线t₀<t<tt₁.非正式地说,在给定的区间上,函数有少量的曲率。
  • 在函数值过零的 t ₀和 t ₁之间,必须有恰好一个 t值。换句话说,函数在给定的时间间隔内必须有唯一的根。

设置类似于上面的二分搜索法,在三个等间距的参数值 t 处评估函数。不同的是,你求的是经过三点的唯一二次函数。二次函数在小间隔上逼近昂贵函数 f 的值。二次函数看起来像这里的红色曲线:

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

Finding an approximate root using a quadratic curve.

一旦有了通过三点的抛物线的公式,就可以使用二次公式来求解抛物线与 t 轴相交的 t 的值。

那么你如何找到抛物线呢?让我们一步一步来。首先,我们将把在范围t₀≤tt₁内变化的时间变量 t 替换为一个抽象参数 x ,它具有更方便的范围 1≤ x ≤+1。这将使数学更简单。

花点时间来验证一下

  • 如果 t = t ₀,那么x= 1;
  • 如果 t = t ₂,那么x= 0;
  • 而如果 t = t ₁,那么 x =+1。

第三种情况为真,因为₂位于₀和₁的中间,因此分子和分母相等。

第二步是写一个通用的抛物线函数 p ( x ):

总是恰好有一条抛物线通过这三个点。我们的下一个目标是找到导致抛物线 p ( x )通过我们为昂贵函数 f 评估的三个点的 QRS 的值。我们写出反映这一要求的三个线性方程:

根据已知值 f ( t ₀)、 f ( t ₂)和 f ( t ₁)解这个三线性方程组,我们发现:

在继续之前,你的算法必须检查特殊情况。**如果 Q =0,表示直线,而不是抛物线,通过所有三点。**换句话说,p(x)=Rx+S。求根求x=S/R。当 Q=0 时,还需要检查 R =0,以避免被零除。这种情况下,线是水平的,因此没有零交叉。否则,如果 Q 不为零,则继续执行以下步骤来寻找 0、1 或 2 个实根。

为了找到当 Q ≠0 时二次曲线 p ( x )的根,我们使用熟悉的二次公式:

下一个特例是平方根R4QS是否为负。如果R4QS<0,则 p ( x )没有实根。当 p ( x )对于 x 的所有值总是为正或总是为负时,就会发生这种情况。因为抛物线从不穿过零点,所以您的求解器必须报告失败。

您必须在自己的应用中决定如何处理R4QS= 0 的情况。当平方根为零时,表示 p ( x )有一个切根,表示抛物线的顶点刚好接触横轴,但不穿过横轴,如下:

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

在我的天文学代码中,把这算作月出或月落是没有意义的。所以我选择将R—4QS≤0 视为失败。这种行为反映在下面的示例 Python 代码中。

如果你已经排除了上面提到的特例,现在你有两个候选值 x ,这要感谢二次公式中的运算符。您的代码应该检查这两个值,看看它们中的哪一个(如果有的话)在 1≤ x ≤+1 的范围内。超出此范围的任何值 x 都应该被丢弃,因为它超出了您指定的搜索间隔。即使您想使用这些异常值中的一个,抛物线也不能被认为是原始函数 f 在搜索区间之外很远的一个很好的近似。

在我的天文学用例中,我知道先验地我的搜索区间必须包含至多一个有效根。因此,如果 x 的两个值满足搜索间隔,我也会报告失败。

假设您最终得到了唯一的有效值 x ,最后一步是将 x 转换回您的独立变量 t :

现在你知道了。通过仅评估一个昂贵的函数三次,并且假设该函数在封闭区间内是充分抛物线的,我们现在有了一个很好的近似 t ,使得 f ( t )=0。

但是 t 有多准呢?这个问题没有简单的答案。您将不得不试验您自己的函数和区间大小来找出答案。

您可能会发现混合方法很有帮助:首先使用二分搜索法缩小足够小的区间(基于实验测试),然后使用二次插值完成这项工作。我自己的算法(参见天文引擎的 Python 版本中的函数Search)使用了一种更复杂的混合算法,试图猜测二次插值的非常小的区间,这种算法在大多数时候都有效。当猜测不正确时,它退回到二分搜索法。在我的性能测试中,这与“纯”二分搜索法一样准确,但是计算时间只有 1/6。

Python 示例代码

以下是示例 Python 代码,演示了如何使用二次插值来寻找近似根。您可以随意使用函数QuadraticInterpolate作为自己应用程序的起点。

用于假新闻检测的自组织网络分析

原文:https://towardsdatascience.com/ego-network-analysis-for-the-detection-of-fake-news-da6b2dfc7c7e?source=collection_archive---------9-----------------------

结合网络分析和自然语言处理来确定推特上“假新闻”的来源

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

Twitter network of verified users with over 1 million followers. Circles (nodes) represent users and the lines connecting the circles represent one user “following” another. Colors represent classes determined through modularity clustering.

虽然“假新闻”在互联网时代之前就已经存在很久 了,但今天似乎比以往任何时候都更难确定新闻来源的可靠性。在对这个话题做了一些研究后,我发现有人正在用图论做一些的工作,看看我们是否可以使用机器学习来帮助检测假新闻的来源。我对网络的力量和我们可以从中获得的信息非常感兴趣,所以我决定看看是否可以建立一个分类模型,在自我网络中找到模式,以检测假新闻。

什么是自我网络?

自我网络(在人类社会网络分析中也称为个人网络)由称为自我的焦点节点和与自我直接连接的称为 Alters 的节点组成,边显示自我与祭坛之间或祭坛之间的链接。自我网络中的每一个改变者都有自己的自我网络,所有的自我网络结合起来形成社会网络。在这样的网络中,自我可以是人,也可以是商业环境中的产品或服务。在下图中,我看到了所有 Twitter 认证用户的自我网络,这些用户拥有超过 100 万的追随者。每个圆圈代表一个经过验证的 twitter 用户节点(圆圈的大小与总粉丝数有关),连接它们的线或边代表彼此“追随”的节点(感谢为我提供 Twitter 边列表的 Luca Hammer )。请务必查看他的媒体中关于探索和可视化网络数据的精彩帖子。这个图形可视化,以及您将在本文中看到的所有其他图形可视化,都是使用 Gephi 创建的。

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

出于这个项目的目的,我决定分析严格验证的 Twitter 网络,因为我觉得用户有一种自然的趋势,即更信任 Twitter 官方验证的来源。

训练数据问题:我如何决定哪些节点代表假新闻源?

在这个项目开始时,我面临的最大问题可能是如何确定哪些 Twitter 帐户被归类为我的训练数据的假新闻来源。没有一个普遍认可的方法来确定新闻是否是假新闻,如果有,它首先就不是一个问题。但是我必须从某个地方开始。幸运的是,我能够在 ICWSM 2015 年论文“cred bank:一个带有相关可信度注释的大规模社交媒体语料库”附带的 CREDBANK 数据中找到一个奇妙的数据集。如果你有时间,我强烈建议看看报纸,但这里有 TLDR:

总的来说,CREDBANK 由 6000 多万条推文组成,分为 1049 个现实世界的事件,每个事件都由 30 名亚马逊机械土耳其的工作人员进行注释以提高可信度(以及他们选择注释的理由)。CREDBANK 的主要贡献是编制了一个独特的数据集,以系统和全面的方式将社交媒体事件流与人类可信度判断联系起来

通过将这个数据集与 Twitter 网络数据相结合,我能够创建自己的数据集来训练分类模型。该数据包括 69,025 个经过验证的用户,以及他们之间的所有连接。在这些用户中,66,621 个被确定为真实新闻的来源,2,404 个被确定为虚假新闻的来源。我认为是假的消息来源是那些超过 5%的推文被亚马逊土耳其人可信度评级机构评为部分准确以下的人。

网络 EDA

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

This is the network graph of all sources in my dataset. Blue dots and lines represent NOT fake sources and red dots and lines represent fake sources.

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

Same graph as above, but with fake sources only

在收集和组织数据之后(我使用图形数据库 Neo4j 来存储网络数据),第一步是对网络数据进行初步的探索性分析。在我最初的分析中,我使用了两种网络算法,特征向量中心性和 PageRank。特征向量中心性算法仅在数据样本上运行,因为在大型网络上计算中心性度量需要相当长的时间。

特征向量中心性是网络中节点影响力的度量。基于到高得分节点的连接比到低得分节点的同等连接对所讨论节点的得分贡献更大的概念,相对得分被分配给网络中的所有节点。高特征向量分数意味着一个节点连接到许多本身具有高分数的节点。

PageRank 被广泛认为是一种检测图中有影响力的节点的方法。它不同于其他中心性算法,因为一个节点的影响取决于其邻居的影响。

来源-https://github . com/neo4j-graph-analytics/graph-algorithms-notebooks

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

我使用 Python 库 NetworkX 的实现这些算法来确定上面显示的统计数据。

如您所见,尽管真实源的特征向量中心性度量的分布要大得多,但总体而言,虚假源和真实源的数字非常相似。我将不得不寻找一些其他的方法来区分这两种类型的节点。

通过鲁汶社区检测进行聚类

社区检测的 Louvain 方法是一种用于检测网络中的社区的算法。它最大化每个社区的模块性得分,其中模块性通过评估社区内的节点与它们在随机网络中的连接程度相比有多密集来量化节点到社区的分配的质量。

我决定在网络数据上运行这个算法,看看是否有假的来源被放在类似的类中。在下面的第一幅图中,我用每个节点被分配到的类的颜色来可视化网络图。第二张图片只包含假消息来源。

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

看起来绝大多数的假新闻来源被放在了紫绿类,很明显所有的假新闻来源主要位于网络图的一个区域。这确实很好地消除了 25838 个真实来源(通过这种聚类方法将 25838 个节点放在没有任何虚假来源的类中),但仍然不足以完全隔离虚假新闻来源。为此,我不得不求助于 node2vec。

Node2Vec

根据斯坦福网络分析项目,node2vec 的创建者:

node2vec 框架通过优化邻域保持目标来学习图中节点的低维表示。目标是灵活的,并且该算法通过模拟有偏的随机行走来适应网络邻域的各种定义。具体来说,它提供了一种平衡探索-开发权衡的方法,这种权衡反过来又导致表示服从从同质到结构等价的等价谱。

基本上,node2vec 算法将使我能够在不止一个维度(具体来说,对于这个项目,是 128 个维度)上嵌入所有节点,作为为图上的节点位置设计新功能的一种方式。对于我的模型,我使用了算法的这个实现。

以下是我选择的参数:

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

不幸的是,即使为每个节点设计了这 128 个新特性,我最初建立分类模型的尝试也没有成功。由于大的类别不平衡(不到 4%的节点是假源),我的算法总是预测所有的源是真实的。我需要一些其他的区别特征来帮助这些分类算法。

单词嵌入

node2vec 的想法实际上来自单词嵌入,这是一种矢量化策略,通过训练神经网络从文本语料库中计算单词向量,从而产生高维嵌入空间,其中语料库中的每个单词都是该空间中的唯一向量。在这个嵌入空间中,向量相对于其他向量的位置捕获语义。

我决定在递归神经网络中使用每个 Twitter 用户的档案描述进行分类。网络内部的嵌入层计算单词嵌入向量。这个神经网络的输出将是 Twitter 账户描述来自真实或虚假账户的概率。然后,我将结合 node2vec 的特征使用这些概率来构建最终的集成分类模型。以下是递归神经网络的细节:

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

Model Summary

最终分类模型

我使用 node2vec 的特征和神经网络的概率对支持向量机和 XGBoost 模型进行了网格搜索。由于高类别不平衡(预测所有“真实”将导致大约 96.5%的准确率),我决定将我的搜索集中在具有高召回率和高准确率的模型上。

XGBoost 和 SVM 网格搜索结果

下图显示了我的 XGBoost 和 SVM 分类器的最佳参数,以及最终模型的混淆矩阵:

XGBoost

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

SVM

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

正如你在上面看到的,XGBoost 模型在精确度上表现稍好,而 SVM 模型在召回率上表现稍好。

结论

这些分类模型表现得相当好,尤其是考虑到大的类别不平衡。很明显,单词嵌入功能在模型检测真阳性的能力方面有很大的不同。虽然我想严格根据网络特征对节点进行分类,但可能不足以区分那些被分类为假的节点。然而,我确实认为网络分析在检测假新闻方面有很大的潜力。我遇到的一些问题只是与网络的巨大规模有关(正如我之前提到的,由于其规模,我无法计算整个网络的中心性度量),并且在数据中肯定会发现更多的模式。

如果你想查看我的项目回购和我的全部分析,你可以在这里找到:https://github.com/briansrebrenik/Final_Project

使用的工具:

数据来源:

特征向量和特征值——你需要知道的一切

原文:https://towardsdatascience.com/eigenvectors-and-eigenvalues-all-you-need-to-know-df92780c591f?source=collection_archive---------1-----------------------

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

Image by joiom - https://pixabay.com/illustrations/seamless-pattern-background-seamless-1822616/

“Eigen”——词的起源

" Eigen "是一个德语单词,意思是“自己的”、“合适的”或“有特点的”。

什么是特征向量和特征值?

让我们看看维基百科对特征向量和特征值有什么说法:

如果 T 是从向量空间 V 经过 F 到自身的线性变换并且 vV 中不是零向量的向量,那么 vT特征向量如果T(这个条件可以写成如下等式

T ( v ) = λ v

其中 λF 域中的标量,称为特征值特征值,或者与特征向量 v 相关联的特征根

看起来很困惑,对吧?我们先分解一下,了解什么是线性变换。

线性变换

假设 A 是一个 m×n 大小的矩阵。给定一个向量

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

那么 t 是从 R^n 到 R^m 的线性变换

这是怎么用的?假设您想要沿 x 轴将 2d 向量缩放 2 倍,沿 y 轴缩放 3 倍。假设向量 v 是[1,4],那么在缩放之后它应该是[2,12]。这可以通过以下方式完成:

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

对于一个向量来说,这可能看起来微不足道。但是假设您有 n 个想要缩放的 2d 向量,您可以通过一次矩阵乘法操作一次转换所有这些向量。线性变换广泛应用于计算机图形学、游戏引擎、统计学等领域。

这种操作不仅仅限于缩放,我们还可以将线性变换矩阵用于翻转矢量、旋转矢量、剪切矢量等。如果你对这个话题感到不舒服,我推荐你看一下 3Blue1Brown 关于线性变换的教程。

回到特征向量和特征值

假设我们在 2d 空间中有一个正方形,正方形上的每个点都是一个向量,我将只使用 3 个向量,如下所示。

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

假设我们沿着 y 轴将正方形缩放 2 倍,如下所示

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

Scaling by a factor of 2 along y-axis

如果你注意到红色 矢量在线性变换后具有相同的比例和方向。绿色矢量的比例发生变化,但方向仍然相同。而黄色向量既没有相同的比例,也增加了与 x 轴的角度,因此其方向也改变了。如果我们仔细观察,除了红色矢量和绿色矢量之外,其他所有矢量的方向都改变了。因此我们可以说红色和绿色向量是特殊的,它们是这个线性变换的特征 。这些向量被称为该线性变换的特征向量**。并且它们由于变换而在尺度上的变化被称为它们的特征值。其中对于红色矢量的特征值是 1,因为它的比例在变换前后是恒定的,而对于绿色矢量,它的特征值是 2,因为它放大了 2 倍。****

让我们看看另一个线性变换,我们沿着 x 轴剪切正方形。

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

Shear along x-axis

如果你猜红色向量是本征向量,你猜对了,它的本征值是 1。

如果我们顺时针旋转这个正方形 90 度。

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

Rotate by 90 degrees clockwise

这里没有特征向量(学术人士会认为这种情况下有复杂的特征向量,但这已经超出了本文的范围,所以为了简单起见,我们还是坚持没有特征向量的情况)。如果我们把正方形旋转 180 度,而不是 90 度。

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

Rotate by 180 degrees clockwise

这里所有的向量和三个彩色向量都是特征值为-1 的特征向量。

让我们来看一个特例,我们沿着 x 轴和 y 轴相等地缩放正方形。

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

Scaling equally along x and y axis

这里所有的向量都是特征向量,它们的特征值就是比例因子。

现在让我们回到维基百科对特征向量和特征值的定义:

如果 T 是从向量空间 V 经过F 到自身的线性变换,并且 vV 中不是零向量的向量,那么 vT特征向量如果 T 这个条件可以写成如下等式

T ( v ) = λ v

其中 λ 是域 F 中的标量,称为与特征向量 v 相关联的特征值特征值特征根

让我们看看这个等式是如何工作的,在第一种情况下,我们沿着 y 轴将一个正方形缩放了 2 倍,其中红色向量绿色向量是特征向量。

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

Scaling by a factor of 2 along y axis

线性变换前:

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

线性变换后:

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

我们可以使用下面的等式显示线性变换后的结果:

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

让我们把这个问题扩大到三维。假设我们沿着 z 轴旋转一个立方体,那么沿着 z 轴的向量就是特征值为 1 的特征向量。

如果我们超过 3 维,就很难想象和计算出特征向量。即使在 2d 或 3d 中的某些情况下,也不是那么容易。那么我们如何计算特征向量呢?

我们知道对于任何特征向量 v,

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

假设变换矩阵是 a。因此,

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

从以上两个等式我们可以推断出,

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

将这些术语放在一起,

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

现在λ只是一个标量。因为 A 是一个矩阵,如果我们能把它转换成一个矩阵,我们就可以把 v 作为一个公式化。为此,我们可以将λ乘以单位矩阵 I。因此,

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

现在,对于右侧的 0,要么(A-λI)应该是 0,要么/和 v 应该是 0。但是如果你还记得特征向量的定义,它是非零向量。所以(A-λI)应该总是 0,v 才是特征向量。我们可以通过计算矩阵的行列式来计算矩阵运算是否为 0。

因此,

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

让我们用同样的例子来看看这是否可行,即沿着 y 轴将一个正方形缩放 2 倍。

这里,变换矩阵 A 可以表示为:

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

现在我们知道了,

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

输入 A 的值并进一步求解:

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

我们知道,

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

求解λ = 1,我们得到:

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

这意味着对于 v2=0 任何向量,该向量是特征值为 1 的特征向量。对于任何垂直矢量都是如此,在我们的例子中是红色矢量。

求解λ = 2,我们得到:

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

这意味着对于 v1=0 任何向量,该向量是特征值为 2 的特征向量。对于任何垂直矢量都是如此,在我们的例子中就是绿色矢量。

特征向量的重要性

特征值在数学中如此重要的原因太多了。以下是我现在想到的一些应用:

  • 主成分分析在降维和目标/图像识别中的应用。(参见 PCA
  • 通过计算图像的特征向量进行人脸识别(见特征脸)。
  • 物理学——稳定性分析,旋转体的物理学(见稳定性理论)。
  • 谷歌用它来为你的搜索结果排名页面(见 PageRank )。

实际的失误

华盛顿州的塔科马海峡大桥在建造了 4 个月后于 1940 年倒塌。这被拍成电影,后来被戏称为“盖尔平”。

它的崩溃可以用特征值来解释。在许多大学物理教科书中,该事件被描述为基本强迫共振的例子,风提供了与自然结构频率相匹配的外部周期频率,即使桥梁故障的真正原因是气动弹性颤振,而不是共振。不要进入辩论,坚持这个博客的目的是解释特征向量和特征值,这个自然频率可以用最小幅度的特征值来表征。

我希望你现在理解了特征向量和特征值背后的理论。如果你想获得更多关于特征向量的直觉,我推荐这个视频教程

图像的弹性变形

原文:https://towardsdatascience.com/elastic-deformation-on-images-b00c21327372?source=collection_archive---------16-----------------------

当前技术发展如此之快,我们的处理能力比以往任何时候都强。我们现在能够保存大量的数据,并对它们进行处理以获得相关信息。然而,即使我们有强大的硬件基础设施,如果我们没有足够的数据来训练我们的算法,我们也无法取得令人满意的结果。数据是 ML 和 DL 问题中最重要的部分。如果我们没有庞大的数据集,这些领域的所有快速发展都是不可能的。

大多数情况下,我们无法找到大量不同的数据类型,我们需要从现有的数据集创建新的数据集。为此,我们可以应用几种技术和算法。今天,我将主要关注图像数据集。图像用于物体检测、图像分类等几个问题。我们需要训练我们的模型同一对象类型的许多不同版本,以便为将来的目的快速确定它。然而,我们可能没有足够的数据集,这是大多数问题的瓶颈。

为了解决这个问题,我发现了一个非常棒的 Python 库。它被称为“增强器”。它有许多不同的技术来从数据集生成新的图像。Augmentor 真的很快,它每秒可以创建大约 100 张图像。它能自动增强图像。我用 Augmentor 用几种技术来创建手绘的条形图。首先,您可以通过以下方式快速安装 Augmentor

pip install Augmentor

之后,您需要将它添加到您的项目中,并创建一个管道。流水线只是图像操作的一系列操作。

import Augmentor
p = Augmentor.Pipeline('./pathToImages')

一旦实例化了管道对象,就可以向其中添加操作。你可以在这里找到增强器文档。操作示例有:

p.rotate(probability=0.7, max_left_rotation=10, max_right_rotation=10) 
p.zoom(probability=0.5, min_factor=1.1, max_factor=1.5)

每个操作都有一个概率值,用于指定一旦图像通过管道,应用该操作的可能性有多大。

如果您想随机应用类似鱼眼的操作,并且不想旋转或缩放以保留一些图像特征,我会推荐这样的管道:

p.random_distortion(probability=1, grid_width=3, grid_height=3, magnitude=5)
p.gaussian_distortion(probability=1, grid_width=3, grid_height=3, magnitude=5, corner='bell', method='in')

我将把这条管道应用到我的数据集中。下面是我的数据集中的一个例子:

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

它创建了惊人的图像数据集。当我将示例结果应用于反色 Python 绘图时,我会分享它们。

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

管道准备就绪后,您可以通过以下方式调用来创建数据集:

p.sample(10000)

简单地说,它使用您的数据集创建随机增强的 10.000 图像样本,并扩展您的限制。默认情况下,它们存储在目录的输出文件夹中,但是您可以在实例化管道对象时更改它。如果您只想处理一次图像以对数据集应用操作,则可以调用:

p.process()

你可以用它来裁剪或调整你的图像,为此你还需要给你的操作赋予概率 1。

Augmentor 还提供了许多不同的其他操作。您可以对图像应用几何和透视变换。但是,这些转换可能会导致图像上的信息丢失,如下图所示。

p.shear(0.5, 10, 10)  #Size Preserving Shearing
p.skew_tilt(0.5, magnitude=0.2) #Perspective Transforms

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

在这些例子中,我也使用随机删除角,因为大多数时候人们不会在绘图中画出完美的形状,而边缘在真实的绘图中也不会出现。为了实现这个想法,您可以使用一个简单的函数,如;

def remove_corners(image):
    img=cv2.imread(image,0)
    corners = cv2.goodFeaturesToTrack(img, 100, 0.01, 10)
    corners = np.int0(corners)

    for corner in corners:
        n = random.randint(1,4)
        if(n != 3):
            x,y = corner.ravel()
            cv2.circle(img,(x,y),3,255,-1)
    return img

我将此功能应用于文件夹中的图片。顶部的图像是源数据集,下面是应用了“移除角点”功能的图像。

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

OpenCV 很容易做到这一点。它读取图像,找到图像内部的角点,并对它们进行着色,以消除它们。我添加了简单的概率方法来从均匀分布中确定 75%的角点,并移除它们以向我们的数据集添加一些随机方法。

Elasticsearch 遇见 BERT:用 Elasticsearch 和 BERT 构建搜索引擎

原文:https://towardsdatascience.com/elasticsearch-meets-bert-building-search-engine-with-elasticsearch-and-bert-9e74bf5b4cf2?source=collection_archive---------7-----------------------

在这篇文章中,我们使用一个预先训练好的 BERT 模型和 Elasticsearch 来构建一个搜索引擎。Elasticsearch 最近发布了带矢量场的文本相似度搜索。另一方面,您可以使用 BERT 将文本转换成固定长度的向量。所以一旦我们用 BERT 把文档转换成向量,存入 Elasticsearch,就可以用 Elasticsearch 和 BERT 搜索相似的文档。

本文通过以下架构实现了一个包含 Elasticsearch 和 BERT 的搜索引擎。这里我们用 Docker 把整个系统分为三个部分:应用、BERT、Elasticsearch。目的是使每项服务更容易扩展。

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

System Architecture

我在这篇文章中只展示了重要的部分,但是整个系统都是在下面的 GitHub 库中用docker-compose.yaml编写的。请查看存储库:

这个职位的计划是:

  1. 下载预先训练好的 BERT 模型
  2. 设置环境变量
  3. 下水码头集装箱
  4. 创建弹性搜索索引
  5. 创建文档
  6. 索引文件

1.下载预先训练好的 BERT 模型

首先,下载一个预先训练好的 BERT 模型。以下命令是下载英语模型的示例:

$ wget [https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip](https://storage.googleapis.com/bert_models/2018_10_18/cased_L-12_H-768_A-12.zip)
$ unzip cased_L-12_H-768_A-12.zip

2.设置环境变量

你需要设置一个预先训练好的 BERT 模型和 Elasticsearch 的索引名作为环境变量。这些变量在 Docker 容器中使用。下面是一个将 jobsearch 指定为索引名和的示例。/cased_L-12_H-768_A-12 作为模型的路径:

$ export PATH_MODEL=./cased_L-12_H-768_A-12
$ export INDEX_NAME=jobsearch

3.启动码头集装箱

现在,让我们使用 Docker compose 启动 Docker 容器。这里要启动三个容器:应用程序容器、BERT 容器和 Elasticsearch 容器。查看 docker-compose.yaml 了解更多详情。

$ docker-compose up

注意,我建议你应该给 Docker 分配更多的内存(8GB 以上)。因为 BERT 容器需要大内存。

4.创建弹性搜索索引

您可以使用 create index API 向 Elasticsearch 集群添加新的索引。创建索引时,可以指定以下内容:

  • 索引的设置
  • 索引中字段的映射
  • 索引别名

例如,如果您想要创建带有titletexttext_vector字段的jobsearch索引,您可以通过以下命令创建该索引:

$ python example/create_index.py --index_file=example/index.json --index_name=jobsearch
# index.json
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
  },
  "mappings": {
    "dynamic": "true",
    "_source": {
      "enabled": "true"
    },
    "properties": {
      "title": {
        "type": "text"
      },
      "text": {
        "type": "text"
      },
      "text_vector": {
        "type": "dense_vector",
        "dims": 768
      }
    }
  }
}

注意:text_vectordims值必须与预训练的 BERT 模型的 dims 相匹配。

5.创建文档

一旦创建了索引,就可以为一些文档编制索引了。这里的要点是使用 BERT 将文档转换成矢量。产生的矢量存储在text_vector字段中。让我们将您的数据转换成一个 JSON 文档:

$ python example/create_documents.py --data=example/example.csv --index_name=jobsearch
# example/example.csv
"Title","Description"
"Saleswoman","lorem ipsum"
"Software Developer","lorem ipsum"
"Chief Financial Officer","lorem ipsum"
"General Manager","lorem ipsum"
"Network Administrator","lorem ipsum"

完成脚本后,您可以获得如下所示的 JSON 文档:

# documents.jsonl
{"_op_type": "index", "_index": "jobsearch", "text": "lorem ipsum", "title": "Saleswoman", "text_vector": [...]}
{"_op_type": "index", "_index": "jobsearch", "text": "lorem ipsum", "title": "Software Developer", "text_vector": [...]}
{"_op_type": "index", "_index": "jobsearch", "text": "lorem ipsum", "title": "Chief Financial Officer", "text_vector": [...]}
...

6.索引文档

将数据转换成 JSON 后,可以将 JSON 文档添加到指定的索引中,并使其可搜索。

$ python example/index_documents.py

7.打开浏览器

http://127.0.0.1:5000 。下面是一个求职的例子。你可以看到“我在找律师”查询返回类似“法律助理”和“律师”的工作。

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

结论

在这篇文章中,我们用 Elasticsearch 和 BERT 实现了搜索引擎。虽然 BERT 的执行速度有问题,但是像这种架构一样把 BERT 当成一个独立的容器,很容易伸缩,所以我认为问题是可以解决的。希望这篇文章对你有用。

对一些可疑统计数据的天真解释;大选数据探索。(第一部分)

原文:https://towardsdatascience.com/election-data-exploration-israel-2019-general-election-cd3c2b0f2f05?source=collection_archive---------26-----------------------

放眼 2019 年以色列大选。当然,有些结果看起来很奇怪,但是有证据证明确实存在渎职行为,或者有更简单的解释吗?

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

我最喜欢的统计学类比(Cassie Kozyrkov 所做的)是对英美法律体系的类比。
【无效假设】被推定无罪(导致无罪释放),而对其的拒绝只能是因为提出了“排除合理怀疑”的有罪证据“我们选择的 P 值是超出合理怀疑的水平。(视所涉问题而有所不同)

你的故事始于社交媒体上的一个帖子。在一个特定的投票站,下面的“异常”正在流传。
所有政党都得到了“非常整数”的选票

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

这些看起来确实很可疑。好了,我们开始吧。

**TL;博士和免责声明

在这个多部分系列中,在某些情况下,我将能够对 表面上可疑的结果 给出简单、无辜的数学解释。在其他情况下我不会。注意,投票箱有一万多个,所以 即使是罕见的数值异常,预计 也会出现几次。

入门指南

我开始寻找其他异常。也许整数太明显了,但是一个政党获得三分之一选票的几率有多大呢?一半?

直方图时间

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

True Data: Here is a histogram of the vote fraction of a specific party in all polling stations; Note the most common values are reduced small rationals: 1/2, 1/3, 3/7, 1/4, 2/5, 1/5, 4/9. weird, right?

谋杀吗?!?我们“抓到他们”了吗?

在我回答之前,你能不能想出一个解释来解释为什么恰好 1/2 这么受欢迎?[花一分钟时间]

[节拍]

好吧,小有理分式有更多的优势。300 个中有 100 个,303 个中有 101 个,这样就可以得到正好是的 1/3。但是要得到 200/601,你必须有一个非常具体的选票统计,和一个非常具体的政党的选票统计。所以这些价值观并不常见。这足以解释这件怪事吗?下面是一个简单模型的结果(我们随机选择投票站的总票数,以及特定政党的总票数,给定该政党的全国总票数)

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

The small rationals making an appearance again, even in a random model. (described in appendix B)

无损直方图

那么,现在我们对数据中的这些有理数有了一个简单的解释,那么看待我们的数据有什么好的方法呢?如果我们让直方图从一开始就做它想做的事情,即绑定数据,会怎么样?如果我们取 100 个箱,我们可以看到箱 50 是否比箱 51 或 49 更有可能,从而做出判断。

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

Binning makes the rational anomalies disappear.

看起来我们没有足够的证据定罪。在零假设为真(没有捏造)的世界里,提出的证据实际上相当合理,一点也不令人惊讶。这并不是说没有一个计票结果被捏造并被设定为某个特定政党的 1/2 选票的情况,这只是而不是看起来的阴谋(几十个投票站同意相同的比例。)

接下来

这篇文章将是系列文章的第一篇。在接下来的几周里,我将探索其他异常现象。
我将重温引发这一切的异常现象,并探索政党之间一些怪异的理性关系。(即一方获得另一方的 1/2 或两倍)

如果你注意到其他一些奇怪的线,你想让我看看,评论,我会看看。

准备好

激起你对这一排选票的兴趣(来自一个投票站)。
注意重复出现的理性关系。例如25–25–75–15027–135它还有数字 21,23,24,25,25,26,27 。可疑,当然。有罪?

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

Is that weird enough to be suspect or just a coincidence? find out next week.

附录 A —加载数据的代码。

每个投票站的计票结果都在这里https://media21.bechirot.gov.il/files/expb.csv

这里有一些样本 python,用于加载该文件(11K 行),并将列重命名为 English,这样您可以自己查看,并发现一些更可疑的结果。
还包括生成上述直方图的代码。

* [## 谷歌联合实验室

编辑描述

colab.research.google.com](https://colab.research.google.com/gist/avishalom/e89aca0c1a852cc548db0d35a5c9ea8e/load-election-data.ipynb)

附录 B 简化模型

拟合每个投票站的有效投票数的正态分布(以 400 为中心,sigma=100,忽略 800 处的峰值)

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

以及给定国家党分数的每个党的票数的泊松分布,从与该党每次投票的国家投票分数相匹配的分布中选取λ。

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

我知道这有点过于简单,例如,PCA 解释不同城市不同政党的投票趋势会更好。但是现在这已经足够好了,它为所有那些小的有理数提供了一个可行的理由。*

用 Python 实现选举投票模拟、误差幅度和中心极限定理

原文:https://towardsdatascience.com/election-poll-simulation-margin-of-error-and-central-limit-theorem-with-python-43f96909a4c6?source=collection_archive---------10-----------------------

在学习中心极限定理(CLT)时,我错过了一些更基本的东西,比如一些显示样本大小如何影响该定理所告诉的结果的图表,它与选举投票等概念的关系以及一些相关代码。有很多很好的文章解释了什么是 CLT,为什么它很重要,以及它背后的数学原理,下面是我找到的一些很好的链接:

在本文中,我更侧重于模拟选举投票,使用可变大小的样本,并将其作为中心极限定理的材料。在这篇文章的最后,你应该了解一些:

  • 如何使用 Python 生成随机样本和简单图形;
  • 什么是中心极限定理;
  • 选举投票的人数如何影响其结果和对结果的信心;
  • 如何选择样本的大小,以使您的投票或测试具有预期的误差幅度和置信度。

为了更好地使用本文,您还应该熟悉正态分布和 Z 检验,因为我们将使用它来分析我们的选举投票结果,并支持中心极限定理。

这里是 Kaggle 上这篇文章所用代码的链接。

模拟选举投票

注意:这段代码更侧重于演示而不是性能,有其他更快的方法来模拟这一点。

假设我们将在两个候选人 Alice 和 Bob 之间进行总统选举,并且我们想要尝试预测谁将是获胜者。假设有一个方法,如果一个人对 Alice 投票,则返回 1,否则返回 0。注意,我使用了二项式分布生成器来创建伯努利随机变量:

This function should return 0 or 1 according to a Bernoulli Distribution with Mean = 0.53. It is like a biased coin simulation.

如果我们能问世界上所有的人他们会投票给谁,我们就能发现获胜者和全体人口投票背后的分布。然而,这通常是不可能的,所以我们做选举民意调查,询问一小群人的意见,试图估计真实的人口结果。比方说,对于每一个不同的日子,我们能够从 n 个人那里获得投票选项:

This method could have an output with a list like this one: [1, 0, 0, 0, 0, 1, 1, 0, 1, 0]

然后假设,在 5 天的时间间隔内,我们每天采访 100 个人,询问他们的候选人是谁。这样,我们将有 5 个相同分布的不同样本,每个样本的大小为 100。由于读取一组 500 个元素并不简单,我将显示每天的平均值:

In my case I got this output [0.51, 0.48, 0.45, 0.51, 0.54], could we say that Alice would win with only those samples?

现在想象一下,我们有无限的金钱和时间,所以我们可以在 5 天、50 天、500 天、1000 天、10000 天和 100000 天做同样的事情。让我们看看使用直方图来总结结果会发生什么:

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

Result of the previous embedded code section

对于仅仅 5 天,直方图没有太大帮助,但是随着我们增加天数(样本),我们可以开始看到一个钟形分布。

随着天数的增加,直方图应该开始变得越来越呈钟形,均值越来越接近人群的真实均值,这是一种直觉,因为大多数日子的样本均值应该与其原始分布相似。然而,正如您所看到的,我们不需要无限长的时间来猜测谁会在这种情况下获胜。

我之前提到的“直觉”可以用中心极限定理(CLT)来解释。据维基百科:

中心极限定理(CLT)证明,在某些情况下,当添加独立的随机变量时,即使原始变量本身不是正态分布的,它们的正态和也趋向于正态分布(非正式的“钟形曲线”)。该定理是概率论中的一个关键概念,因为它意味着适用于正态分布的概率和统计方法可以适用于许多涉及其他类型分布的问题。

有很多文章解释了这个定理的数学背景及其结果,但是现在我想把重点放在这个定理在我们的选举投票例子中的实际应用上。

对我们来说,这个定理的重要结论是如果你从任何概率分布中得到多个样本,这些样本的均值集合趋向于正态分布。这样,我们就有了一个数学背景来假设任何采样结果都遵循正态分布。

现在你应该问“然后呢?”。对于任何给定的正态分布,如果我们知道它的均值和方差,我们可以找到一个大小为 2*Y 的值的区间,随机变量可能以 C%的概率假设该区间。例如,回到我们的选举投票,我们可以发现 Alice 会有 X%的选票,误差为 Y%,对我们的结果有 C%的信心。因此,如果我执行选举投票 100 次,C%*100 次,Alice 将以 X%的选票加上 Y%的误差幅度获胜。

让我们用一个有趣的公式来应用这些概念,这个公式是从中心极限定理推导出来的,用来求这些值。它让我们使用样本的平均值(s 条)和样本的大小(n)来估计真实总体平均值的标准差(σ):

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

当与真实总体平均值比较时,估计的标准偏差σ与我们估计的误差成比例。这样,理想的情况是σ为零。实现这一点的一个方法是增加样本量。在下面的直方图中,我将模拟多次投票,保持样本数量不变(100),但增加样本大小 n,这与我在之前的直方图中所做的不同:

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

Result of the previous embedded code section

请注意,随着样本量的增加,x 轴间隔变得越来越小,条形越来越接近平均值,这表明我们获得了更精确的结果。在现实生活中,我们无法获得这样大小的样本,但是,由于中心定理的限制,我们可以计算任何大小为 n 的样本的误差幅度,检查其显著性,如果幅度对我们来说不够大,就增加 n 值。

为此,我们需要像处理正态分布一样处理数据。我们使用估计的标准偏差来应用 z 检验,找到满足我们期望的误差范围和期望的置信度的值的区间。回到第一天,从我的 100 人样本中,我可以说 Alice 将赢得 95%信心的误差幅度是多少?

得到这些值后,我们可以查阅标准的正态表,看看有多少标准差满足期望的置信度。基于这个规则,我们知道两个标准差的间隔应该覆盖 95%的情况。

基于 z 测试的误差范围测试步骤:

  • 获取样本;
  • 计算样本均值和样本标准差;
  • 利用中心极限定理求其与总体真实均值的估计标准差;
  • 使用一个标准的正态表或者这个规则来知道我们的区间应该包含多少标准差来满足我们期望的置信度;
  • 因为我们想要 95%的置信度,我们需要 2 个标准差。

下面是对我们的选举投票方法执行 z 测试的方法:

Method to get the mean with some margin of error from our election poll simulation. For example, I got this output when I executed it in my machine: {‘error’: 0.09981983770774223, ‘mean’: 0.53}

如果当 n =100 时,您从最后一次代码执行中获得错误值,您会注意到它相当大(几乎 10%),所以这对我们没有太大帮助,因为我们将有一个介于 43%和 63%之间的区间。

如果你还记得估算总体真实均值的标准差的公式,你会注意到,当我们增加 n 时,我们减少了标准差。所以,这解释了为什么越来越多的人参与投票会给我们带来更精确的结果。让我们分析一下在选举投票场景中增加样本量的影响:

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

Result of the previous embedded code section

在样本量为 10 的情况下,我们有几乎 30%的误差( ergh !),然后有 100 个人时,我们有 10%,我们开始从只有 1000 个人时得到好的值(3%)。当样本量大于或等于 1000 时,样本均值也稳定在 0.53 左右。

这是一个很好的结果,因为我们也可以使用一些预先计算的表格,如这个来发现我们应该使用哪个样本大小来获得所需的误差幅度,请注意,这些值几乎与我们在之前的图表中获得的值相同。

最后,我们可以说,如果我们以 95%的置信度对 10000 人进行民意调查,Alice 将以 53%的选票获胜,误差幅度为±1%。让我们用我们的方法来检查这个结果:

This method call returned: {‘error’: 0.009978328316907597, ‘mean’: 0.5329} which is what I said on the previous paragraph, yay!

CLT 之后呢?

现在,您已经了解了如何衡量您的投票、控制样本大小以及讨论其结果。这一知识的一个有趣的应用是进行零假设检验(你可以在许多学术研究和 cia 中找到的那个著名的 p 值的来源)。

查看汗学院的视频,了解如何对一个问题进行零假设检验,以检查一种新药是否真的有效。

也请让我知道你对这个故事的想法,如果文本有错误,请发评论,或者如果你喜欢阅读,请点击鼓掌按钮。再见!

Python 中函数式编程的要素

原文:https://towardsdatascience.com/elements-of-functional-programming-in-python-1b295ea5bbe0?source=collection_archive---------0-----------------------

了解如何使用 Python 中的 lambda、map、filter 和 reduce 函数来转换数据结构。

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

Photo by Markus Spiske on Unsplash

“面向对象编程通过封装活动部分使代码可以理解。函数式编程通过最大限度地减少活动部分,让代码变得可以理解。”:迈克尔·费哲

世界上有多种编程语言,它们可以被分类的类别也是如此。一个编程范例就是这样一种方式,它试图根据编程语言的特性或编码风格对它们进行分类。编程范式本质上是一种编程风格或方式。

大多数时候,我们将 Python 理解为一种面向对象的语言,其中我们以类、对象和方法的形式对数据建模。然而,面向对象编程也有几种替代方案,函数式编程就是其中之一。

以下是业界流行的一些传统编程范例:

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

Conventional programming paradigms: Content Source Wikipedia

函数式编程

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

The Functional Programming Paradigm

根据维基百科, 函数式编程 是一种编程范式,一种构建计算机程序的结构和元素的风格,它将计算视为数学 函数避免 改变 状态 可变

上述定义起初听起来可能令人困惑,但它本质上试图提出以下几个方面:

  • FP 依赖于函数,一切都是用函数来完成的。此外,FP 关注于定义做什么,而不是执行一些动作。该范例的功能被视为一级功能。这意味着函数被像其他对象一样对待,我们可以将它们赋给变量或者传递给其他函数。
  • 函数式编程中使用的数据必须是不可变的,即永远不应该改变。这意味着如果我们需要修改列表中的数据,我们需要用更新的值创建一个新的列表,而不是操作现有的列表。
  • 用 FP 写的程序应该是无状态**。无状态函数不知道它的过去。功能程序应该像第一次执行任务一样执行每一项任务。简单地说,函数只依赖于作为参数传递给它们的数据,而不依赖于外部数据。**
  • 懒惰是 FP 的另一个特性,我们不会计算我们不需要的东西。工作只在需要时做。

如果这有意义的话,这里有一个 OOP 和 FP 之间的比较图表,它会让事情变得更加明显。

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

Original Image: www.educba.com**

Python 提供了 lambda、filter、map 和 reduce 等特性,可以很容易地演示函数式编程的概念。本文中使用的所有代码都可以从相关的 Github 库中获得,或者可以通过点击下图在 my_binder 上查看。

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

λ表达式

Lambda 表达式——也称为“匿名函数”——允许我们在一行中创建和使用一个函数。当我们需要一个只使用一次的短函数时,它们很有用。它们通常与 map、filter 和 sort 方法结合使用,我们将在本文后面看到这些方法。

让我们用 Python 写一个函数,计算5x + 2的值。标准方法是定义一个函数。

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

现在让我们使用 Lambda 函数来计算相同的表达式。为了创建一个 lambda 表达式,我们键入关键字 lambda,后面跟着输入。接下来,我们输入一个冒号,后跟将作为返回值的表达式。

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

这个 lambda 函数将接受输入 x 并返回5x + 2,就像前面的函数f一样。然而,有一个问题。Lambda 不是函数的名称。这是一个 Python 关键字,说明后面是一个匿名函数。那么我们如何使用它呢?一种方法是给它一个名字。

让我们称这个λ表达式为g。现在,我们可以像使用其他函数一样使用它。

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

具有多个输入的 Lambda 表达式。

下面的例子展示了 lambda 函数如何在有或没有输入值的情况下使用。

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

没有输入的 Lambda 表达式。

现在,让我们看看 Lambda 函数的一个常见用法,我们没有给它命名。假设我们有一个美国前七任总统的列表,我们希望按照他们的姓氏对这个列表进行排序。我们将创建一个 Lambda 函数来提取姓氏,并将其用作排序值。

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

map、filter 和 reduce 函数简化了使用列表的工作。当与 lambda 表达式一起使用时,它们通过在一行代码中完成大量工作,使我们的生活变得更加轻松。

地图功能

map 函数将函数应用于 iterable 的每一项,产生结果。当与列表一起使用时,Map通过将函数应用于 input_list 中的所有项目,将给定的列表转换成新的列表。

句法

**map(function_to_apply, iterables)**

使用

假设我们有一个计算立方体体积的函数,给定其边(a)的值。

**def volume(a):
    """volumne of a cube with edge 'a'"""
    return a**3**

如果我们需要计算许多不同边长的立方体的体积,该怎么办?

**# Edge length in cm
edges = [1,2,3,4,5]**

有两种方法可以做到这一点——一种是使用直接方法,另一种是使用映射函数。

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

现在让我们看看如何使用一行带有 map 函数的代码来完成这项任务。

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

map 函数接受两个参数。第一个是函数,第二个是我们的列表、元组或任何其他可迭代的对象。这里,map 函数将音量函数应用于列表中的每个元素。

这里需要注意的一点是,map 函数的输出不是一个列表,而是一个 map 对象,它是结果的迭代器。但是,我们可以通过将映射传递给 list 构造函数,将它转换成一个列表。

例子

现在让我们来看一个例子,它演示了如何使用lambda函数和map函数。我们有一个包含五个人的姓名和身高的元组列表。每个高度都是厘米,我们需要把它转换成英尺。

我们将首先使用 lambda 表达式编写一个转换器函数,它将接受一个元组作为输入,也将返回一个元组。

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

过滤功能

filter’ 函数从那些 iterable 的元素中构造一个迭代器,对于这些元素函数返回 true。这意味着 filter 函数用于从列表、元组或其他数据集合中选择某些数据,因此得名。

句法

**filter(function, iterable)**

使用

让我们看一个例子,我们想从一个给定的输入列表中获得所有大于 5 的数字的列表。

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

我们首先创建一个 lambda 函数来测试输入,看它是否大于 5。接下来,我们传入数据列表。filter 函数将只返回函数为真的数据。同样,返回值不是一个列表,而是一个过滤器对象。这个对象必须被传递给一个列表构造函数来获得输出。

例子

当数据包含缺失值时,会出现一个有趣的“filter”函数用例。这是一个包含一些亚洲国家的列表。请注意,许多字符串是空的。我们将使用过滤函数来删除这些丢失的值。我们将传递 none 作为第一个参数,第二个参数是之前的数据列表。

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

这将过滤掉在布尔设置中被视为 false 的所有值。

Reduce 函数

’ r educe 函数有点不寻常,从 Python 3 开始,它不再是一个内置函数。相反,它被移到了functools 模块。“reduce”函数通过从左到右对序列的项目累积应用一个函数,将给定列表转换为单个值,

句法

**reduce(func, seq)**

其中 reduce 不断地将函数func()应用于序列 seq 并返回一个值。

使用

让我们借助一个简单的例子来说明reduce函数的工作原理,这个例子计算一组整数的乘积。

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

下图显示了计算的中间步骤:

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

Source: Working of ‘Reduce’ function in Python

然而,Python 的创始人吉多·范·罗苏姆不得不这样评价“reduce”函数:

如果真的需要就用 functools.reduce 然而,在 99%的情况下,显式 for 循环更具可读性。

上述程序也可以用显式 for 循环来编写:

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

例子

“reduce”函数可以在一行代码中确定包含整数的列表的最大值。Python 中确实有一个名为max()的内置函数,它通常被用作max(list_name)

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

列表理解:映射、过滤和归约的替代

列表理解是一种在 Python 中定义和创建列表的方法。在大多数情况下,列表理解让我们在一行代码中创建列表,而不用担心初始化列表或设置循环。

它也是 lambda 函数以及 map()、filter()和 reduce()函数的替代品。有些人认为这是编写函数的一种更为复杂的方式,也更容易理解。

句法

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

使用

让我们试着用list comprehensions.复制上面章节中使用的例子

  • 列表理解与地图功能

我们将 map 函数与 lambda 函数结合使用,将高度列表从厘米转换为英尺。让我们用列表理解来达到同样的结果。

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

  • 列表理解与过滤功能

我们使用了 filter 函数来删除亚洲国家列表中缺少的值。让我们用列表理解来得到同样的结果。

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

  • 列表综合与归约功能

同样,我们可以用列表理解快速确定包含整数的列表的最大值,而不是使用 lambda 和 reduce。

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

我们在上面使用了一个生成器表达式,它类似于列表理解,但是用圆括号代替了方括号。

列表理解是一个多样化的主题,需要一篇自己的文章。记住这一点,这里有一篇我写的文章,它不仅涵盖了 python 中的列表理解,甚至还涵盖了字典、集合和生成器理解。

** [## 理解 Python 中的“理解”

理解和实现 python 中的列表、字典、集合和生成器。

towardsdatascience.com](/comprehending-the-concept-of-comprehensions-in-python-c9dafce5111)**

结论

map、filter 和 reduce 函数极大地简化了使用列表和其他可迭代数据集合的过程。有些人对使用它们有所保留,特别是因为列表理解似乎更友好,然而它们的有用性不能被忽视。

参考

强化学习中的资格痕迹

原文:https://towardsdatascience.com/eligibility-traces-in-reinforcement-learning-a6b458c019d6?source=collection_archive---------5-----------------------

有时候向后看并没有那么糟糕

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

Photo by Didier Provost on Unsplash

更新:学习和练习强化学习的最好方式是去 http://rl-lab.com

什么是资格痕迹?

简而言之,合格轨迹是一种数学技巧,可以提高强化学习中时间差方法的性能。

资格跟踪的好处如下:

  • 提供一种以在线方式(不要等待剧集结束)和在没有剧集的问题上实现蒙特卡罗的方法。
  • 提供一种使用短期记忆向量的算法机制。
  • 通过存储单个向量 存储器而不是特征向量列表来提高计算效率。
  • 学习是不断进行的,而不是在一集结束时等待结果。

前瞻性的观点

请记住,在中,时间差蒙特卡罗方法基于未来奖励更新状态。这可以通过直接向前看一步或者等待一集结束来实现。

这种方法被称为前瞻。

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

In Forward View we look ahead n steps for future rewards

在 TD(0)中,我们向前看一步,而在蒙特卡洛中,我们向前看,直到这一集结束,我们收集贴现结果。然而,有一个中间地带,我们向前看 n 步。

n 步前瞻视图

正如上一节所解释的,展望未来可能会有所不同,从向前一步到一集结束,就像蒙特卡洛的情况一样。因此,n 步是某种中间地带。
请记住,在蒙特卡洛中,我们执行剧集,获取它们的回报 G i 并对这些回报进行平均,以计算状态值。
请注意,每集的长度(步数)可能会因集而异。它不是常数!

类似地,我们将对 n 步前瞻进行同样的操作。就像在蒙特卡洛一样,每集的步数不一定相同。
NB。在本节中,我们不再将一个情节称为必须通过达到终止状态而终止的多个步骤,而是简单地称为多个步骤(终止状态不再是一个要求)。

因此,让我们定义所有这些迭代的平均回报,如下所示:

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

其中 G( 𝛌,t)是所有收益 G(t,t+n)的加权平均值,g(t,t+n)是单个剧集的收益,其中每集从 t 开始,到 t+n 结束,n 从 1 到无穷大。𝛌是一个值在[0,1]之间的权重。
在所有加权平均中,权重之和必须为 1,这是因为

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

重要备注:很容易注意到,对于 n 较大的剧集,𝛌对 n 次方的贡献变小,G(t+n)的贡献也会很小。
但是嘿!我们已经知道,通过使用收益定义中的贴现因子γ(ɣ):

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

但是请记住,这是一个不同的问题,例如在蒙特卡洛,V(s)是从已经播放的剧集中计算出的所有回报 Gi 的平均值。所有的地理标志对 V(s)的贡献是相等的,即使奖励会根据它们与州 s 的距离而打折扣。

在这里,问题是不同的,所有 Gi 对 V(s)的贡献并不相同,但是它们是加权的,并且每个权重随着每集内的步数而变小。

下图显示了每集如何根据长度进行加权。

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

这张照片显示了重量如何随着时间(或 n 步)的增加而变小。

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

简而言之,如果一个情节在 3 步之后终止,与其回报相关联的权重远远大于在 T 步处终止的情节(其中 T 远大于 3)。
同样重要的是注意到重量呈指数下降。

让我们重写当剧集在时间 T 终止时的返回。
注意,时间步长 T 之后的返回总是 Gt(这是时间步长 T 时的返回),这仅仅是因为不再有状态,并且最后看到的返回是在 T。

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

当𝛌为 0 时,Gt 的表达式显示的是 TD(0)的公式(注意这个上下文中的 0 到幂零按照惯例是 1,更多信息见这个维基百科文章),当𝛌为 1 时,Gt 就变成了蒙特卡洛的公式。

问题还没有解决!

所有这些细节,但我们仍然没有解决问题…

因为每个状态的更新依赖于当前不可用的后来的事件或奖励,所以前瞻视图实现起来有些复杂。

但到目前为止,我们一直在这么做!
我们正在向前看 n 步…
然而,这将通过采用一种新的方法来改变:向后看。

后视 TD( 𝛌)

假设一个代理人在一个环境中随机行走,发现了一个宝藏。然后他停下来向后看,试图知道是什么让他找到了这个宝藏?自然,靠近宝藏的台阶比远离宝藏的台阶更有价值。因此,较近的位置比较远的位置更有价值,因此它们被赋予更大的价值

这是如何实现的,是通过一个叫做合格痕迹的向量***【E】***。
具体地,合格痕迹是状态 E(s) 或状态动作 E(s,a) 的函数,并保存 V(s)的衰减值。

那么,我们如何从向前看过渡到向后看,资格跟踪在其中的作用是什么?

还记得我们说过的前视,每个情节对当前状态的贡献随着情节中的步数(n)呈指数衰减(𝛌的 n 次方)。
使用相同的逻辑,当我们处于状态 s 时,我们不是向前看,看到一集的衰减回报(Gt)向我们走来,而是简单地使用我们拥有的值,并使用相同的衰减机制将其向后抛出。

例如,在 TD(0)中,我们将 TD 误差定义为:

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

该误差将向后传播,但是以衰减的方式。
类似于随着距离渐行渐远的声音。
我们实现这一点的方法是将𝜹乘以每个州的资格跟踪。

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

其中 Et 更新如下:

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

Backward View propagates the error δ to previous states

符号 1(St = s)意味着,当我们处于状态 s 时,我们分配完整的值,当它向后传播时,它以指数形式衰减。

对于所有状态,合格的跟踪更新从 E(s) = 0 开始,然后当我们经过每个状态(由于执行动作)时,我们递增 E(s)以增加状态的值,然后对于所有的,我们通过ɣ𝛌 (E(s) = ɣ𝛌 E(s)衰减 E(s)

与 n 步前向视图相比,合格轨迹的主要优点是只需要一个轨迹向量,而不是存储最后 n 个特征向量。

使用资格跟踪的算法

以下是几个使用资格跟踪的算法。

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

结论

资格跟踪是一种在时间差“目标”和蒙特卡罗“回报”之间进行加权的方式。这意味着我们不使用一步 TD 目标,而是使用 TD(λ)目标。
换句话说,它微调目标以获得更好的学习性能。

资源

《强化学习:导论》,萨顿&巴尔托著

伊丽莎白·沃伦在 2020 年总统竞选中领先:Python 中的一项分析

原文:https://towardsdatascience.com/elizabeth-warren-is-leading-the-2020-presidential-race-an-analysis-in-python-967e272d15da?source=collection_archive---------27-----------------------

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

Photo by Element5 Digital on Pexels

在这篇文章中,我们将使用 python Google trends API py trends 来分析哪些领先的民主党候选人被搜索得最多。

要安装 pytrends,请打开命令行并键入:

pip install pytrends

接下来打开一个 IDE(我使用 Spyder)并导入 pytrends:

from pyrtends.request import TrendReq

接下来,我们指定主机语言、时区和有效负载。我们将主机语言指定为英语(“en-US”),时区为中部标准时区,即“360”,我们可以将 google 属性过滤器(gprop)保留为空字符串。我们还设置了 category = 0,对应与该关键字相关的所有类别。

让我们来看看乔·拜登从 2019 年 1 月到 2019 年 10 月在纽约的数据:

pytrends = TrendReq(hl='en-US', tz=360)
pytrends.build_payload(['Biden'], cat=0, timeframe='2019-01-01 2019-10-31',  gprop='', geo='US-NY')

然后,我们将 dataframe 定义为结果 pytrends 对象,并打印前五行:

pytrends = TrendReq(hl='en-US', tz=360)
print(df.head())

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

我们还可以使用 seaborn 和 matplotlib 来绘制“Biden”搜索的时间序列:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pdsns.set()
df['timestamp'] = pd.to_datetime(df.index)
sns.lineplot(df['timestamp'], df['Biden'])plt.title("Normalized Searches for Biden in NY")
plt.ylabel("Number of Searches")
plt.xlabel("Date")

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

让我们为怀俄明州的拜登做同样的事情:

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

我们也可以看看纽约的桑德斯:

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

为了进行比较,我们可以覆盖拜登,桑德斯和沃伦在纽约的搜索:

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

Biden(blue), Sanders(orange), Warren(green)

根据谷歌趋势数据,伊丽莎白·沃伦似乎比拜登和桑德斯更受欢迎。我们也可以看看怀俄明州的同样情况,那里有 68%的共和党人:

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

Biden(blue), Sanders(orange), Warren(green)

沃伦在怀俄明州也一直领先。看看几个摇摆州会很有意思。让我们来看看密歇根州:

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

Biden(blue), Sanders(orange), Warren(green)

沃伦在密歇根州遥遥领先,尽管该州被认为是战场州。

爱荷华州有:

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

Biden(blue), Sanders(orange), Warren(green)

最后让我们看看佛罗里达州:

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

Biden(blue), Sanders(orange), Warren(green)

值得注意的是,在撰写本文时,《纽约时报》报道称,根据民调显示,拜登领先(26%),沃伦紧随其后(21%)。有趣的是,尽管拜登领先,但在民主党、共和党和摇摆州,越来越多的人在寻找沃伦。

在美国各州进行这种分析,看看沃伦是否一直处于领先地位,这将是一件有趣的事情。

最后,为了使这些代码易于重用,我们可以将它们封装在一个函数中:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd 
from pytrends.request import TrendReqdef get_searchs(candidate, state):
    pytrends = TrendReq(hl='en-US', tz=360)
    pytrends.build_payload([candidate], cat=0, timeframe='2019-01-01 2019-10-31',  gprop='',geo='US-{}'.format(state))    
    df = pytrends.interest_over_time()

    print(df.head())

    sns.set()
    df['timestamp'] = pd.to_datetime(df.index)
    sns.lineplot(df['timestamp'], df[candidate])

    plt.title("Normalized Searches for Biden, Warren and Sanders in {}".format(state))
    plt.ylabel("Number of Searches")
    plt.xlabel("Date")

例如,我们可以调用函数在马萨诸塞州进行搜索,如下所示:

get_searches('Biden', 'MA')
get_searches('Sanders', 'MA')
get_searches('Warren', 'MA')

我们得到了下面的图:

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

Biden(blue), Sanders(orange), Warren(green)

感谢您的阅读。这篇文章的代码可以在 GitHub 上找到。

【A股温度计】www.agwdj.com 镜像版程序V1.0说明 •通过数据可视化技术,将复杂的A股市场数据转化为直观的图形界面,帮助投资者快速把握市场脉搏。 【核心功能】 •全景视角:突破信息碎片化局限,快速定位涨跌分布,一眼锁定今日热点板块 •板块排序:基于申万行业分类标准,对31个一级行业和131个二级行业实时动态排序 •硬件适配:智能适配不同分辨率屏幕,4K以上屏幕显示信息更多(视觉更佳) •智能缩放:A股全图让大A市场5000+个股同屏显示(支持鼠标滚轮及触摸设备5级缩放) 【三秒原则】 •三秒看懂:通过精心设计的视觉图形,让用户在三秒内看清市场整体状况 •三秒定位:智能算法让大成交额个股和热点板块自动靠前,快速定位机会 •三秒操作:极简的界面,让用户减少操作 【使用场景】 •盘前准备:快速了解隔夜市场变化,制定当日策略 •盘中监控:实时跟踪市场动向,及时把握当日机会 •盘后复盘:全面分析当日市场表现,总结经验教训 【适合人群】 •个人用户:快速了解市场整体趋势变化,辅助决策 •专业人员:获取每天市场的数据云图支持研究工作 •金融机构:作为投研系统的可视化补充组件 •财经媒体:制作专业市场分析图表和报道 【市场切换】 •默认加载"A股全图",可切换单独显示的类型如下: •上证A股/深证A股/北证A股/创业板/科创板/ST板块/可转债/ETF 【程序优势】 •运行环境:纯PHP运行(无需安装任何数据库) •数据更新:实时同步→A股温度计→www.agwdj.com •显示优化:自动适配8K/4K/2K/1080P等不同分辨率的屏幕 •设备兼容:对市面上主流的设备及浏览器做了适配(检测到手机/平板/电视等默认Chrome/Firefox/Edge内核过低的情况会自动提示) 【其他说明】 •A股温度计程序演示网址:https://www.agwdj.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值