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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用双耳和双声道音频训练的音乐源分离 CNN 的感知评估

原文:https://towardsdatascience.com/perceptual-evaluation-of-a-music-source-separation-cnn-trained-with-binaural-and-ambisonic-audio-275f147ba555?source=collection_archive---------18-----------------------

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

研究概述

本研究探索了使用不同空间音频格式来训练音乐源分离神经网络的想法。DeepConvSep 是由 Marius Miron、Pritish Chandna、Gerard Erruz 和 Hector Martel 设计的库,用作测试不同卷积神经网络进行源分离的框架。然后详细说明听力测试,并分析测试结果,以便对模型进行感知评估。得出关于使用空间音频格式来训练源分离神经网络的有效性的结论。

介绍

音频神经网络寻求使人工智能能够像人类一样说话和听觉。在该领域的发展中存在许多障碍,因为音频包含大量的信息,从数万个不同的频率和相位分量,以及外部的、不需要的噪声和多种来源的可能性。为了解决这个问题,目前存在几种方法来将音频压缩和重新格式化成与神经网络的输入更兼容的数据向量。

空间音频格式(如双耳和双声道音频)的出现为比立体声更“自然”的音频创造了潜力。然而,对于这些更“自然声音”的音频格式是否有利于神经网络学习和理解声音的尝试,之前几乎没有研究。这项研究试图通过训练和感知评估用不同音频格式训练的几个源分离神经网络模型来试验这一想法。

源分离

概念基础

源分离是旨在将音频混合分离成它们各自的源元素的过程,无论它是音乐还是语音等。自动语音识别(ASR)、音乐后期制作和音乐信息检索(MIR)等领域都受益于源分离技术的改进研究[1]。源分离可以进一步细分为两个不同的类别。面向音频质量(AQO)的源分离寻求从混合中分离源信号,同时最好地保持它们的感知音频保真度。相反,面向重要性(SO)的方法从分离的源信号中提取高级语义信息[1]。这项研究的重点是 AQO 方法在评估源分离的有效性。

研究灵感

源分离是神经网络的理想任务,因为它本质上是一个分类任务。DeepConvSep 由 Marius Miron、Pritish Chandna、Gerard Erruz 和 Hector Martel 设计,是一个卷积神经网络(CNN)库,专为信号分离评估活动(SiSEC)而构建[2,3]。为了分离当代/流行音乐,用 Demixing Secrets DSD100 数据库训练原始神经网络模型。DSD100 由一组 100 首歌曲组成,每首歌曲都有相应的混音和词干,分为四个类别(人声、贝斯、鼓和其他),最初是为 SiSEC 2017 开发的。

虽然 DSD100 模型最初是使用单声道音频输入训练的,但研究人员 Gerard Erruz 探索了使用多声道甚至空间音频输入训练模型的想法[1]。Erruz 最初假设双耳频谱线索,如双耳电平和时间差(ILD 和 ITD)可以对帮助 CNN 更准确地执行源分离产生积极影响。为了测试这一点,DSD100 以几种配置(“cross”、“xeix”和“random”)进行双耳处理,以输入 CNN。

为了对这些空间训练的源分离神经网络进行感知评估,进行了听音测试。

为了量化这种性能改善,使用了五种客观测量方法:源失真比(SDR)、源干扰比(SIR)、源噪声比(SNR)、源伪像比(SAR),以及图像与空间失真比(ISR)的合并,以说明立体声输出中的空间失真[1]。Erruz 的结论是,某些指标(SDR,SIR)表明,用双耳音频输入训练的模型(除了将所有训练信号放置在随机位置的配置)优于用立体声或单耳输入训练的模型[1]。

虽然这些客观测量看起来是展示模型性能差异的合理方式,但是这种源分离任务仍然必须诉诸 AQO 方法,并且呈现感知上高保真的音频输出。为了感知地评估这些空间训练的源分离神经网络,进行了听音测试。此外,使用相同 CNN 架构的模型通过双声道编码的 DSD100 进行训练,以探索使用空间处理音频的替代形式来进一步提高源分离性能的可能性。

测试方法

刺激物的选择

必须训练几个 CNN 模型来代表不同的方法。原始的 DeepConvSep 架构被保留下来,因此数据库输入的差异将成为主要变量。一个模型使用标准 DSD100 作为立体声训练模型进行训练。双耳和双声道训练模型都以“交叉”形式配置,因为已经注意到特定通道中的信号优势提高了分离性能[1]。图 1 展示了数据集的空间定位。

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

图一。双耳解码的“交叉”布局。“D”、“V”、“B”和“O”分别对应于鼓、人声、低音和其他。[1]

DSD100 使用两个!Ears 的双耳场景模拟器和 SADIE 头部相关传递函数(HRTF)数据库,以创建 BDSD100(双耳 DSD100) [4]。ADSD100 (ambisonic DSD100)是通过使用 SN3D 归一化球面谐波对数据库进行 ambisonic 编码而创建的。该实验使用一阶环绕声,产生一个双耳解码的 4 声道信号。双耳解码是通过将使用谷歌的共振音频工具包进行双声道编码的双声道音频与赛迪 that 的双声道音频进行卷积,并将结果信号求和为左右声道[5]。

使用 DSD100 的各种版本训练模型,然后使用每个模型分离数据库的 50 首测试歌曲。测试刺激是从这 50 首歌曲中选择的,所有这些歌曲都不是原始模型训练的一部分。使用单个均方误差训练阶段和表 1 所示的 DeepConvSep CNN 的默认参数来训练所有模型。

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

表 1。CNN 训练参数[1]。

一台配备特斯拉 K80 显卡和英特尔至强 E5–2690 V3 CPU 的微软 Azure 云计算机用于模型训练。

测试配置

对总共 14 名参与者进行了听力测试,他们都自认为听力正常。大多数参与者都是经验丰富的音频工程师,尽管小组中的音频经验水平各不相同。测试在德比大学的半电波暗室中进行,参与者使用一对 Beyerdynamic DT770 PRO (80 欧姆)闭背耳机进行测试。采取这些措施是为了减少未经声学处理的空间中任何房间反射的影响,这种影响会扭曲定位线索。然而,考虑其他类型的耳机可能是有意义的。例如,已经注意到自由空气等效耦合(FEC)耳机具有更准确的双耳刺激再现,因为它们在覆盖耳朵时不会改变耳道的声阻抗[6]。

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

图二。德比大学半消声室中的听力测试装置。

使用 DragonFly Red DAC 在计算机上进行测试。使用网络音频评估工具[7]设计了隐藏参考和锚的多重刺激(MUSHRA)测试。网络音频评估工具被设置为将测试信号校准到-23 LUFS,参与者不能改变信号电平。选择 MUSHRA 测试格式是为了符合 ITU 的编码系统中间质量水平主观评估方法(ITU-R bs . 1534–1)[8]。MUSHRA 格式在几个源分离听音测试中一直是一个主要范例,并以其评估测试信号与已知参考信号相比的退化的能力而闻名[9]。

该测试总共包括 8 首歌曲,参与者被要求评价所选元素的分离程度(如贝斯、鼓等)。)或不同音频样本的“稳定性”如何。参与者被告知,如果没有不切实际的振幅和声相调制,音频就更稳定,如果相反,音频就不稳定。评级是在 0 到 100 的范围内进行的。通过从 DSD100 数据库中提取测试歌曲各自的词干,创建了一个隐藏引用。通过对 3.5 kHz 的隐藏参考应用低通滤波器来创建低范围隐藏锚点。剩下的选项包括由双声道、双耳和立体声训练模型执行的分离。实验的零假设是双声道和双耳训练的模型在感知上与原始立体声训练的模型没有区别。测试的样本页面如图 3 所示。

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

图 3。MUSHRA 听力测试的样本页面。

结果分析

在 MATLAB 中对分离和稳定性响应数据进行单向方差分析(ANOVA)测试,以捕捉总体趋势并确认统计显著性。分离和稳定性反应的 p 值分别为 0.3863 和 0.001。这表明,由于 p 值高于证明显著性的 0.05 (5%)阈值,分离均值未被证明具有统计学显著性差异。就分离质量而言,不同的格式可能太难区分,并且它们中没有一个可能完成了预期的任务。可能还很难确定分离质量对参与者意味着什么,这可能是相关听力考试中未来改进的领域。然而,稳定性评级低于 p 分数阈值,因此拒绝了零假设。因此,当使用双耳和双声道音频来训练立体声分离模型时,观察到的稳定性损失得到了证实,这表明当训练源分离模型时,这可能不是使用的理想方法,因为稳定性可能对感知评估有很大影响。这种分析还产生了缺口盒图(见图 4 和图 5)。

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

图 4。比较不同训练的 CNN 模型之间的分离等级的凹口盒图。“Ambi”、“anch”、“bina”、“ref”和“ster”指的是 ambisonic、anchor、双耳、参考和立体声。

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

图五。缺口盒图比较不同训练 CNN 模型之间的稳定性评级。

所有源分离模型的总体得分都很低,立体声模型的中值稍高,意见方差较低。然而,由于模型箱线图的所有凹口几乎对齐,这一观察结果落在置信区间之外,表明没有强有力的证据表明中位数实际上是不同的。双声道和双耳模型都有更大的方差和更多的异常值,这可能意味着这些格式产生了感知混乱的结果,产生了各种各样的意见。参考中有许多异常值,这些异常值很可能代表对听力任务不完全清楚的参与者;这些异常值也可能始终一致。

稳定性得分有较大的方差,但也再次得出了更明确的结论。立体声模型自信地胜过双耳和双声道模型,因为它的中值得分更高,并且在其他模型的置信区间之外。奇怪的是,立体声模型的评分差异很大。识别音频稳定性可能太不明确,并且可能在将来使用一些改进作为目标度量。在很大程度上,当分离立体声音乐时,用双声道和双耳音频训练的模型表现出较低的稳定性;这可能归因于这些格式之间的空间定位技术的差异。

由于模型对各种类型的音乐和乐器的反应非常不同,所以从测试选择的任何特定流派或乐器中没有得出重要的结论。然而,据观察,立体声模型在人声分离方面的得分始终比其他两个模型好。也许与其他工具相比,声音分离更容易区分,因此参与者能够做出更果断的选择。

结论

用双声道和双耳音频训练的模型并没有胜过立体声训练的模型。使用立体声素材训练的模型可能在分离立体声音频时表现最佳。感兴趣的是进一步研究由它们各自训练的模型分离的各种不同的音频格式,以观察当将模型训练与预期的目标素材配对时的任何性能改进。当使用更高分辨率的环绕立体声输入时,为了观察任何差异,也可以使用更高阶的环绕立体声。

这个实验也对最初研究中使用的客观测量方法投下了怀疑的阴影[1]。当量化源分离系统性能时,可能必须有更好的测量方法,以确保不同源分离模型的质量能够被准确和彻底地理解。

总的来说,很明显这种源分离算法在感知上是无效的。虽然模型和输入材料的特定组合产生了极好的分离结果,但是性能是不一致的,并且必须采取进一步的措施来改进源分离神经网络结构。这项研究的结果表明,在这一点上,改变音频训练材料的空间格式可能不是源分离的进步之路。

参考

[1] G. Erruz,“卷积神经网络的双耳源分离”,2017。硕士论文。庞贝法布拉大学。https://zenodo.org/record/1095835#.XNLm2-hKiUk(访问日期:2019 年 3 月 28 日)

[2] P. Chandna,M. Miron,J. Janer,E. Gomez,“使用深度卷积神经网络的单声道音频源分离”,2017 年潜变量分析和信号分离国际会议。

[3] A. Liutkus,F. R. Stö ter,Z. Rafii,D. Kitamura,B. Rivet 等人,“2016 年信号分离评估活动”,第 13 届潜变量分析和信号分离国际会议(LVA/ICA 2017),法国格勒诺布尔,2017 年,第 323–332 页,10.1007/978–3–319–53547–0 _ 31 页。hal-01472932

[4]“二!耳朵”,【http://twoears.eu/ (访问时间:2019 年 4 月 8 日)。

[5]谷歌,“共鸣音频”,https://resonance-audio.github.io/resonance-audio/(访问时间:2019 年 4 月 8 日)。

[6] T. McKenzie,D. Murphy 和 G. Kearney,“一阶环绕声的扩散场均衡”,第 20 届国际数字音频效果会议(DAFx-17),英国爱丁堡,2017 年 9 月 5 日至 9 日,第 8 页。

[7] N. Jillings、D. Moffat、B. De Man 和 J. D. Reiss,“网络音频评估工具:基于浏览器的听力测试环境”,2015 年第 12 届声音和音乐计算大会。

[8] E. Cano,D. FitzGerald,K. Brandenburg,“声源分离算法质量评估:人类感知 vs 量化度量”,2016 年第 24 届欧洲信号处理会议(EUSIPCO),2016 年,第 1758–1762 页。

[9] H. Wierstorf,D. Ward,R. Mason,E. M. Grais,C. Hummersone,M. D. Plumbley,“混音音乐的源分离感知评估”,音频工程学会大会 143,2017。

原载于 2019 年 5 月 9 日https://danrothdatascience . github . io

表演草坪设备

原文:https://towardsdatascience.com/performance-lawn-equipment-an-exercise-in-addressing-business-effeciency-1bc330a269ae?source=collection_archive---------7-----------------------

解决业务效率问题的练习

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

Photo by Helloquence on Unsplash

以下迷你项目试图回答虚构性能草坪设备委员会提出的几个问题,这是一家专门从事拖拉机和割草机生产的公司。相关数据包括客户满意度、市场销售报告、生产效率和成本效益分析。这些练习的目的是探索用 Excel 报告基本统计数据的各种方法。下面展示的所有作品和图片都是用 Excel 创建的。

经销商和最终用户满意度

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

Figure 1: Average Dealer Satisfaction with PLE by Region

图 1(上图)显示了 PLE 运营的每个地区 5 年间的平均经销商满意度。这些评级是通过一项调查收集的,该调查允许受访者对他们对 PLE 的满意度进行 1-5 级评分,其中 5 级为最高满意度。对收集的数据进行加权平均,得出上图。我们可以看到,南美经销商对 PLE 的评价一直是最高的,而中国经销商的评价往往是最低的。南美和欧洲市场对该公司的历史评级约为 3.75-4.00,变化不大。环太平洋地区在过去 5 年中取得了最大的进步,平均评分从 2010 年的不到 3.25 上升到 2013 年的超过 4.00。虽然 2014 年的平均评级略有下降,但所有其他市场的评级都保持或高于 2013 年。

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

Table 1: Average Satisfaction from Dealers by Region and Year

表 1 显示了从经销商处收集的满意度评分的平均值和标准偏差,评分等级为 1-5。我们可以看到,除了欧洲,所有地区的收视率每年都有所提高。例如,北美在 2010 年的平均评分为 3.78,到 2014 年增加到 4.11。尽管中国最初的平均评级较低,但评级仍从 2012 年的 3.00 提高到 2014 年的 3.69。欧洲将其平均评级从 3.93 提高到 4.12,但随后在 2013 年略微下降到 4.07。大多数区域的标准偏差也逐年增加,表明对调查的回应值范围更广。这表明回答中有更多的可变性,但平均值的增加表明数值趋向于更高的等级。

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

Figure 2: Average End-User Satisfaction with PLE by Region

图 2(上图)显示了从发送给 PLE 产品最终用户的类似调查中收集的数据。本次调查的数据也被收集和加权,以创建按年份和地区的平均值,其中 5 被认为是最高满意度。总体而言,最终用户的满意度比经销商调查显示的要高。在这个数据集中,北美市场的排名几乎每年都在上升。南美通常在最终用户满意度方面排名第三或第四,2014 年,它在所有市场中排名最低,平均得分为 4.11。与平均经销商满意度相似,中国终端用户市场的满意度往往最低。南美和环太平洋地区每年的趋势都很接近,从 2011 年到 2013 年,差异不到 0.05。欧洲的变化可能是多年来最大的,从 2012 年的低点 3.90 增加到 2013 年的高点 4.07。

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

Table 2: Average Satisfaction from End-users by Region and Year

表 2 提供了类似的信息,尽管是从最终用户调查中收集的。尽管南美市场在 2010 年至 2011 年期间略有下降,但每个地区在 5 年期间的总体增长都有所增加。从 4.0 的平均评分开始,南美的评分在 2011 年下降到 3.95,然后在 2012 年回升到 3.99,随后几年稳步上升。2010 年后,北美地区在 PLE 服务区域中得分最高,2014 年的平均得分为 4.22。

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

Figure 3: Total Complaints Filed Quarterly by Region

上图 3 详细显示了每个地区每个季度受理的投诉数量。北美市场始终占向 PLE 提交的所有投诉的至少 50%,有时占 60%。北美市场也是最大的市场,这可能解释了为什么来自该市场的投诉量最大。从 2011 年开始,来自南美市场的投诉比例逐渐增加,而来自欧洲市场的投诉量相对稳定。我们还可以确定中国在 2012 年进入该市场的时间,因为在第一季度,新市场开始出现投诉。

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

Figure 4: Customer Service Call Response Times by Quarter

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

Table 3: Response Times to Customer Service Calls by Quarter

最后,图 4 和表 3 强调了客户服务部门的平均呼叫响应时间。此指标有 2 年的数据,按季度细分。乍一看,我们可以看到,从 2013 年 Q1 奥运会(3.829)到 2014 年第四季度(2.477),平均响应时间有所缩短。两年来,四分位距也有所改善;2013 年,75%的响应时间在 2.988 到 5.042 之间。到 2014 年第 4 季度,75%的响应时间在 1.62 到 3.476 之间。2014 年第四季度记录的最长时间为 4.872,而 2013 年 Q1 的最长时间几乎是 8.019 的两倍。虽然时间全面下降,但 2014 年第三季度有一个异常值为 7.419,远远超出第三个四分位数范围 4.075。

市场表现

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

Figure 5: Total PLE Mower Sales each Quarter by Region

图 5 和图 6 分别显示了各地区割草机的季度销售情况。图 5 显示大多数 PLE 割草机在北美市场销售。通常,在任何给定的季度中,超过 80%的割草机销量来自北美市场。欧洲是第二大消费市场,平均每个季度约占 10-15%。南美占比不到 5%,环太平洋地区和中国占比更低。我们还可以看到每年北美和欧洲市场之间的购买模式。北美市场的销售额在第一和第二季度有所增长,而欧洲市场在第三和第四季度有所增长。

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

Figure 6: Monthly Mower Sales by PLE and Industry

图 6 显示了 PLE 和整个行业割草机销量的比较。割草机的销售几年来一直很稳定,没有太大变化。然而,每年的这个时候都会有一个明显的周期:销售额通常会在夏季达到最高,然后随着时间的推移而下降。PLE 和整个行业的销售都受到这一趋势的影响,如下图所示。通过分析 5 年间的销售数据,我们可以计算出 PLE 和行业割草机销售之间的相关性约为 0.9904。这表明在每次销售上升和下降之间有很强的关系。

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

Figure 7: Total PLE Tractor Sales each Quarter by Region

图 7 显示了类似的拖拉机销售数据,尽管结果大相径庭。北美市场通常只占 PLE 拖拉机销售的 30-40 %,而不是像割草机销售那样主导市场。欧洲在这些销售中占有较大份额,每个季度占 30-35%。南美和太平洋地区平均各占季度销售额的 10-15%。在过去几年中,欧洲的拖拉机销量下降,而北美的销量上升。南美市场的销量也有所增加,在 PLE 拖拉机销量中占据了更大的份额。

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

Figure 8: Monthly Mower Sales by PLE and Industry

同样,我们可以观察 PLE 和拖拉机销售行业之间的关系。图 8 追踪了拖拉机在同一 5 年间的销售情况。像割草机一样,拖拉机的销售往往会随着每年月份的变化而起伏。然而,与割草机的趋势不同,拖拉机的销量每年都在稳步增长。2010 年 7 月,行业销量达到 15,905 辆,2011 年 4 月增加到近 19,000 辆,最终在 2014 年 6 月达到 27,374 辆的峰值。尽管 PLE 的销售数据只是一小部分,但它们从 2011 年开始就遵循了大致相同的趋势。销量从 4 月份的 2340 辆逐步增长到 2014 年 6 月创纪录的 4476 辆。PLE 和行业拖拉机销售之间的相关性略低于割草机销售,为 0.9603,但它仍然表明两者之间的密切关系。

扩张成本

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

Table 4: Fixed Costs of Capacity Increase versus New Facility Construction

上表探究了在堪萨斯城和圣地亚哥新建工厂和扩建现有工厂的成本。通过将总施工成本分解为施工后的新单位成本,我们可以更容易地比较每个方案的价值。这考虑了每项提案需要收回多少成本。考虑到每个地点的新成本和平均运输成本,我们可以看到割草机的单位成本从 39.85 美元到 77.57 美元不等,拖拉机的单位成本从 40.30 美元到 78.01 美元不等。第一个四分位数分别为 54.95 美元和 55.40 美元,第三个四分位数分别为 62.49 美元和 62.95 美元。

根据第一张表中的数据,最有价值的项目(或新项目单位成本最低的项目)最有可能是孟买和新加坡的新工厂。孟买的两项提议都属于第一个四分位数,这意味着它们属于 25%最便宜的提议。将堪萨斯城的容量扩大到 20,000 也属于第一个四分位数,使其成为最便宜的升级选项。圣地亚哥的其余升级选项超过了第三个四分位数,成为成本最高的 75%的项目之一。第四个四分位数,也称为第 100 个百分位数,等于数据集中的最大值。在这种情况下,将 Santiago 的容量升级到 5,000 将导致最高的单位成本以收回成本。

业务运营效率

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

Figure 9: Ratio of Deliveries Made On Time by Month

我们可以在图 9(上图)中看到 4 年间的准时交付率。2010 年 3 月达到最低点,1 116 次交付中有 27 次没有按时交付,导致从 98.1%降至 97.6%。2010 年 9 月是一个明显的高峰,当时 1223 次交付中只有 13 次延误。该月 98.9%的交付是准时的,这将保持到 2012 年 7 月的最高点。上面的红色虚线描绘了成功交付率每月逐渐增加的趋势线。虽然有一些明显的高点和低点,但大多数交付率遵循稳定的模式。

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

Figure 10: Average Defects from Suppliers Each Quarter (per million items received)

上图显示了每个季度从供应商处收到的缺陷数据。这些数字表明从供应商处收到的每百万件产品中平均有多少件是次品。最高时,PLE 平均每百万接收 848.33 个缺陷产品。从 2010 年 Q1 奥运会到 2012 年第三季度,缺陷产品的数量开始减少,类似的比率一直保持不变。到 2012 年第四季度,平均值为 701.33。2013 年略有下降,全年平均为 669 件。从 2013 年第四季度开始,次品率开始快速下降。2014 年每个季度平均下降 40–80 个,2014 年第四季度的平均缺陷率为 439.67 个。

割草机刀片生产

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

Table 5: Detailed statistics from mower blade tests

上表描述了收集的割草机刀片重量数据集。测试的 350 个叶片的平均重量约为 4.99,标准偏差为 0.1093。叶片重量几乎没有变化。50%的观察值落在 4.92-5.06 之间,范围只有 0.14;95%的观察值落在 4.77 到 5.21 之间。假设数据是正常的,有 2.78%的概率测得的体重超过 5.2。类似地,4.04%的测量值预计低于 4.8。在收集的数据集中,2%的权重在 5.2 以上,2.29%的权重在 4.8 以下,分别相差 0.78%和 1.76%。

查看下图,我们可以进一步确认重量通常在严格的规格范围内。几乎所有的测量值都在 4.7 和 5.3 之间,有两处异常。画一条平均体重线,我们得到的斜率为-7e-5,以-0.00007 的微小速度下降。虽然有一个负斜率,但它小到可以忽略不计。我们可以有把握地假设刀片将继续以 5.00 的稳定平均重量生产。

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

Figure 11: Mower blade weights over time

总的来说,我们可以假设刀片制造过程是稳定和可预测的。然而,数据集中有两个异常值。发现 37 号叶片为 4.63,略高于平均值的 3 个标准偏差。样品 171 被记录为 5.87,这大大超出了任何值的预期范围。这可能是由许多问题造成的,如个别缺陷、材料问题或测量或记录值的错误。因为平均值、中值和众数都是相似的值,并且这些值均匀地分布在平均值的两侧,所以正态分布是该数据的最佳拟合模型,如下直方图所示。

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

Figure 12: Histogram of blade weights over time

在最后一个实验中,下图 13 中的指数分布显示了割草机测试的结果。这种方法最好地显示了 30 次测试中每一次有多少次失败的频率,每一次测试随机抽样 100 台割草机。总的来说,被观察的 3000 台割草机中有 54 台没有通过测试,约占 0.18%。我们可以看到不到 15%的测试报告没有失败,而大多数测试报告了一两次失败。大约 35%的样本报告 1 次故障,大约 38%的样本报告每 100 台割草机 2 次故障。2 次之后,这一比例急剧下降,只有 15%的测试报告 3 次失败。100 个割草机样本中,没有一个测试报告超过 5 次故障。根据收集的数据,我们可以估计接下来测试的 100 台割草机中大约有 2.07 台会出现故障。

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

Figure 13: Failures in mower blade tests

在 TensorFlow 中执行分类

原文:https://towardsdatascience.com/performing-classification-in-tensorflow-95368fde289c?source=collection_archive---------6-----------------------

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

在本文中,我将解释如何使用 Python 中的 TensorFlow 库执行分类。我们将使用加州人口普查数据,并尝试使用个人的各种特征来预测他们属于哪个收入阶层(> 50k 或<=50k). The data can be accessed at my GitHub profile in the TensorFlow repository. Here is the 链接来访问数据。我的代码和 Jupyter 笔记本可以在下面访问:

[## HarshSingh16/Tensorflow

我目前正在做的 Tensorflow 项目。通过创建帐户,为 harshsing 16/tensor flow 的发展做出贡献…

github.com](https://github.com/HarshSingh16/Tensorflow/blob/master/Classification_Tensorflow.ipynb)

导入库和数据集

让我们从导入必要的库和数据集到我们的 Jupyter 笔记本开始。

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

让我们看看我们的数据集。所以,有 15 列。在这 15 列中,有 6 列是数值型的,其余 9 列是分类型的。下图提供了有关列类型和相应描述的信息。请注意,在这个例子中,我们不会使用变量“fnlwgt”。

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

查看我们的目标列:

我们现在来看看我们的目标栏*“收入”*。如前所述,我们正试图对个人的收入等级进行分类。所以,基本上有两类——“≤50K”和“> 50K”。

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

然而,我们不能让我们的目标标签保持当前的字符串格式。这是因为 TensorFlow 不把字符串理解为标签。我们必须将这些字符串转换成 0 和 1。如果收入等级大于 50K,则为“1 ”,如果收入等级小于或等于 50K,则为“0”。我们可以通过创建一个 for 循环,然后将标签附加到一个列表中来实现。我还用我们刚刚创建的新列表直接更新了现有的*“收入”*列。下面是执行转换的代码:

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

标准化我们的数字特征:

我们现在想要规范化我们的数字特征。归一化是将数值
特征可采用的实际值范围转换为标准值范围的过程,通常在区间[1,1]或[0,1]内。规范化数据并不是一个严格的要求。然而,在实践中,它可以提高学习速度。此外,确保我们的输入大致在同一个相对较小的
范围内是有用的,这样可以避免计算机在处理非常小或非常大的数字时出现的问题(称为数字溢出)。我们将使用 lambda 函数来做到这一点。代码如下:

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

创建连续和分类特征:

下一步是为数值和分类数据创建特征列。将特性列视为原始数据和估计值之间的中介。特性列非常丰富,使您能够将各种各样的原始数据转换成评估人员可以使用的格式,从而允许进行简单的实验。这里有一个来自 TensorFlow 网站的例子,说明了功能栏是如何工作的。这里讨论的数据是著名的 Iris 数据集。如下图所示,通过估计器的feature_columns参数(Iris 的DNNClassifier)指定模型的输入。特征列将输入数据(由input_fn返回)与模型连接起来。

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

为了创建特性列,我们必须从[tf.feature_column](https://www.tensorflow.org/api_docs/python/tf/feature_column)模块调用函数。这张来自 TensorFlow 网站的图片解释了该模块中的九个功能。如下图所示,所有九个函数都返回分类列或密集列对象,除了bucketized_column,它从这两个类继承:

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

现在是时候为数据集创建要素列了。我们将首先处理数字列,并通过使用[tf.feature_column.numeric_column](https://www.tensorflow.org/api_docs/python/tf/feature_column/numeric_column)将它们转换成特性

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

接下来,我们将处理分类特征。这里我们有两个选择-

  1. [tf.feature_column.categorical_column_with_hash_bucket](https://www.tensorflow.org/api_docs/python/tf/feature_column/categorical_column_with_hash_bucket) :如果您事先不知道分类列的一组可能值,并且有太多可能值,请使用此选项
  2. [tf.feature_column.categorical_column_with_vocabulary_list](https://www.tensorflow.org/api_docs/python/tf/feature_column/categorical_column_with_vocabulary_list) : 如果您知道一列的所有可能的特征值的集合,并且只有少数几个,则使用此选项

因为在我们的例子中,每个分类列中有太多的特征值,所以我们将使用散列函数。请确保指定的哈希值大于列的类别总数,以避免将两个不同的类别分配给同一个哈希值。

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

接下来,我们希望将所有这些变量放入一个名为 feat_columns 的列表中。

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

执行培训和测试分割

我们将使用sklearn库来执行我们的训练测试分割。因此,我们必须将我们的标签与特征分开。这是因为来自sklearn 的模块 train_test_split 模块要求您显式指定特性及其目标列。

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

我们现在将导入我们的 train_test_split 模块。我们将在测试集中保留 33%的数据。这将为我们提供足够数量的观察结果,以准确评估我们模型的性能。

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

定义输入函数和线性分类器:

我们现在创建一个输入函数,将熊猫数据帧输入到我们的分类器模型中。模块 tf.estimator.inputs 提供了一种非常简单的方法。它要求您指定功能、标签和批量大小。它还有一个名为**shuffle,**的特殊参数,允许模型以随机顺序读取记录,从而提高模型性能。

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

接下来,我们将定义我们的线性分类器。我们的线性分类器将训练一个线性模型来将实例分类为两个可能的类别之一——即 0 代表收入小于或等于 50K,1 代表收入大于 50K。同样,TF . estimator . linear classifier允许我们只用一行代码就能做到这一点。作为参数的一部分,我们必须指定我们的特性列和类的数量。

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

训练模型:

最后,激动人心的部分!让我们开始训练我们的模型。显而易见,我们必须指定输入函数。**steps** 参数指定训练模型的步数。

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

预测

现在是时候进行预测了。首先,我们需要重新定义我们的输入函数。虽然定型模型需要您指定目标标注和要素,但在生成预测时,您不需要指定目标标注。预测结果将在稍后与测试数据上的实际标签进行比较,以评估模型。所以让我们开始吧!

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

现在让我们将输入函数输入到 model.predict 中。请注意,我已经在 model.predict 函数周围调用了 list 对象,这样我就可以在下一步轻松访问预测的类。

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

万岁!我们现在有了我们的预测。让我们看看对测试数据中第一个观察值的预测。在下图中,我们可以看到我们的模型预测它属于 0 类(参考 class_ids )。我们还有一堆其他的预测,比如类的概率,逻辑等等。然而,为了进行我们的模型评估,我们只需要class _ id。下一步,我们将尝试创建一个我们的class _ id的列表。

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

如上所述,我们现在将从字典的预测列表中创建一个仅包含class _ id键值的列表,这些预测将用于与真实的 y_test 值进行比较。

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

查看前 10 个预测的类别。

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

车型评价

我们现在已经到了项目的最后阶段。我们现在将尝试评估我们模型的预测,并通过使用 sklearn 库将它们与实际标签进行比较。

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

这是我们的分类报告:

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

我还打印了一些其他评估指标,这些指标将让我们非常清楚地了解我们模型的性能。我们的模型具有 82.5%的总体准确性和 86.5%的 AUC。好的分类器在曲线下有更大的面积。显然,我们的模型已经取得了一些非常好的结果。

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

最后备注:

我希望这篇文章能让您很好地理解在 TensorFlow 中执行分类任务。期待听到大家的想法和评论。请随时通过 LinkedIn 联系我。

表演探索,罗宾汉风格

原文:https://towardsdatascience.com/performing-exploration-robin-hood-style-da1369114300?source=collection_archive---------35-----------------------

如何对全新的产品进行有价值的探索,只需要简单的嵌入技巧

本帖原载于 Taboola 的工程博客

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

我们在 Taboola 的核心业务是为网上冲浪者提供个性化的内容推荐,无论他们可能在哪里冲浪。我们使用最先进的深度学习方法来做到这一点,从我们不断增长的文章和广告池中学习向每个用户显示什么。但是,当我们挑战自己展现更好的模型和更好的预测时,我们也发现自己经常面临另一个问题——我们如何不听从我们的模型。或者换句话说:我们如何更好地探索?

正如我刚才提到的,我们的文章池正在增长,这意味着每分钟都会添加越来越多的项目——从人工智能的角度来看,这是我们必须解决的一个主要问题,因为当我们完成新模型的训练并将其推向生产时,它已经必须处理其训练数据中从未存在的项目。在之前的一篇文章中,我已经讨论过我们如何使用加权抽样来允许对低点击率(点击率)的项目进行更多的探索,同时尽量不损害高点击率项目的流量。在这篇文章中,我将进一步扩展这个困境,并讨论我们如何允许对我们的模型从未见过的项目进行有意义的探索。

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

理解嵌入和 OOV

理解嵌入的使用——以及它们代表什么——是理解所讨论的探索方法的关键,所以让我们简单回顾一下它们是如何工作的。嵌入是模型学习的一组权重(或更简单地说,一个向量)来表示输入要素的特征。假设我们有两个项目,其中项目 A 在生活在美国和加拿大的 20 到 30 岁的游戏玩家中非常成功,项目 B 在生活在欧洲德语国家的 30 到 40 岁的烹饪爱好者中非常受欢迎。模型应该在哪里存储这些学习到的信息?当然是在每件物品的嵌入物中!因此,嵌入是模型已经学习的特定于值的向量,它允许模型区分彼此,并更准确地估计它们的性能。对于我们的每个项目,模型学习一个新的向量。如果我们的模型训练正确,另一个项目是成功的项目 A 的人群将有一个嵌入向量,这将是接近他在我们的向量空间。

但是,假设我们的训练数据有另一个项目,项目 C,这是如此之新,它只出现在训练数据一次。这种单一的外观是否足以让模特了解这件物品的任何信息?当然不是。所以为它创建嵌入是没有意义的——因为它显然只是噪声。然而,我们仍然需要一个嵌入,所以我们应该怎么做呢?

每当我们构建一个特性的嵌入时,我们决定每个值必须具有的最小外观的阈值,以便有它自己的嵌入。出现次数少于所需阈值的所有值随后被聚集,并用于构建将用于所有这些值的单个嵌入。这种嵌入被称为词汇外嵌入(OOV),因为它用于所有没有进入具有自己嵌入的值列表(或词汇)的值。此外,OOV 嵌入还用于所有全新的项目,这些项目是该模型从未见过的。

很容易理解为什么 OOV 嵌入对任何值都是有害的。它是由许多许多完全不同的价值观构成的,这些价值观很少相互关联。这意味着 oov 通常是嘈杂的,并且具有非常低的 CTR 估计值——即使这些项目没有任何问题,但它们只是在模型训练时显示得不够。

但这里有一个恶性循环——如果一个新项目由于缺乏外观而接受了 OOV 嵌入,它将得到模型非常低的 CTR 估计——这又不会允许它接受许多外观。这可能会使模型坚持它总是显示的相同项目,这对我们不好。所以… 我们该去舍伍德森林了!

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

罗宾汉探险

我们在 Taboola 最重要的目标之一是预测用户是否会点击我们展示给他们的项目。因此,我们的训练数据由我们展示的所有项目(也称为印象)和用户的反应(点击与否)构成。由于我们展示某个项目的次数与其收到的点击次数之间存在明显的正相关关系,因此很容易看出我们最畅销的项目也是在我们的训练数据中出现次数最多的项目。这意味着这些也是具有最强大和训练有素的嵌入的项目。

因此,我们在这里做的技巧非常简单——就像嵌入有一个最小的外观阈值,低于它的值会变成 OOV,我们给外观添加了一个最大阈值,高于它的值也会变成 OOV。我们对其进行了调整,因此只有最顶端的项目会超出此阈值,并将被添加到 OOV 存储桶中。这为我们提供了一个由我们拥有的最赚钱的项目组合而成的 OOV——所以现在所有的新项目都接受了一个超级强大的嵌入,这使得该模型给它们更高的 CTR 估计值。我们将这种方法命名为罗宾汉探索*,因为我们从我们最好的项目中“窃取”数据,并将其移动到我们的 oov 中。*

是的,它确实有效:

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

与我们的默认模型相比,罗宾汉方法的不同嵌入组的印象(黄色)和收入(绿色)。

罗宾汉方法的表现符合预期——我们的 oov 和弱势嵌入群体获得了更多的流量,也产生了更多的收入,但这是以牺牲我们的畅销书为代价的。中等强度的嵌入几乎没有变化。减少畅销书的流量是我们在影响有限流量时可以处理的事情——我们在这里的目的是进行探索,也就是给新品增加流量,没有必要对我们的畅销书进行探索——我们已经知道它们是我们的畅销书。还有更好的消息:当谈到我们的总收入时,这种方法绝对没有显示出任何负面影响。

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

总之,我们的 Robin-Hood 方法(将数据从顶层项目转移到 oov)已被证明是以最少的技术努力进行有意义的探索的一种有价值的方法。我们希望它也能证明它对我们的读者是有价值的。一路平安!

使用 Numpy 广播执行多维矩阵运算

原文:https://towardsdatascience.com/performing-multidimensional-matrix-operations-using-numpys-broadcasting-cf33e3029170?source=collection_archive---------13-----------------------

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

Tensor manipulation…

Numpy 的 broadcasting 特性可能会让这个库的新用户有些困惑,但它允许非常干净、优雅和有趣的编码。绝对值得努力去习惯。在这篇短文中,我想展示一个很好的广播实现来节省一些循环甚至计算时间。

先说一个简单的案例。

基本概念是,当两个大小为 (m,1)(1,m) 的向量相加或相乘时,numpy 会广播(复制向量)以便允许计算。例如,将一个向量*【1,2,3,4,…10】*乘以其自身的转置版本,将得到乘法表。例如:

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

Broadcasting a vector into a matrix. A miniature multiplication table.

在这个例子中,我们将一个大小为 (3,1) 的一维向量(V)与其大小为 (1,3) 的转置版本相乘,得到一个 (3,3) 矩阵,它是V外积

如果您仍然感到困惑,下图将该过程分为两个步骤,使其更加清晰:

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

Broadcasting in slow motion.

你可以把广播想象成简单地把我们的两个向量复制成一个 (3,3) 矩阵,然后执行元素式乘法。

我们刚刚将一个一维数组广播到一个二维矩阵中,然而,我们可以用它将一个二维数组(或矩阵)广播到一个三维数组(张量)中。想象一下,您需要对相同长度的多个向量执行V*V.T。你可以简单地把它们堆在一起,然后一次性得到所有的结果。

个案研究

在这种情况下,我希望为虹膜数据集生成一个欧几里德距离矩阵。欧几里得方程是:

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

显然,可以使用两个嵌套的 for 循环来获取表:

然而,它也可以使用矩阵运算来执行(这两种运算都要快 100 倍,而且要酷得多)。

我们取数据集(图中表示为'A'),

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

A rectangle representing the iris data set, in which case m=150 and n=4.

创建它的 3D 副本,并将其旋转到图中所示的方向'B'

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

We can use numpy’s rot90 function to rotate a matrix. See code below.

然后我们创建另一个副本并旋转它,如'C'所示。

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

Copy and rotate again.

B-C将生成(通过广播!)一个 3D 立方体('D'),大小为 (m,m,n) ,代表计算

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

对于原始数据集向量( n =4)的每个实例( m )和特征( n )。

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

Notice that we are summing up the features for all instances at once!

然后,我们简单地将整个立方体提升到 2 的幂,将代表特征的轴上的结果相加(见上图),然后平方。

结果就是距离矩阵('E')!

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

This is the Euclidean distance matrix. It might seems like it only contains the letter ‘E’, but in fact it holds the distance between all instance pairs. Twice. The diagonal is the distance between every instance with itself, and if it’s not equal to zero, then you should double check your code…

如果你在所有这些矩阵的翻腾中迷失了,回头看看计算欧几里得矩阵的方程。我们所做的就是同时求解几个向量的方程。

代码:

摘要

每当在几个实例上执行相同的计算时,广播是一种非常干净有效的方法。作为一个练习,我鼓励你尝试在 2 个 3D 阵列上使用广播(假设你有 n 个向量,属于 k 个类)。这意味着你将需要广播到第四维度。当然不可能想象,但是实现它遵循同样的逻辑。

使用自然语言处理的香水推荐

原文:https://towardsdatascience.com/perfume-recommendations-using-natural-language-processing-ad3e6736074c?source=collection_archive---------13-----------------------

Doc2Vec、潜在语义分析和情感分析一起在聊天机器人界面中提出相关建议。

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

Photo by Jessica Weiller on Unsplash

介绍

(如果你想尝试这种模式,你可以通过发短信“嗨”到(424)343–3755 来开始。你自己的个人 AI 聊天机器人会回复,会帮你发现个性化的香水推荐。)

自然语言处理在推荐系统和信息检索中有许多有趣的应用。作为一名香水爱好者和数据科学家,小众香水社区中使用的不寻常且高度描述性的语言启发我使用 NLP 来创建一个模型,以帮助我发现我可能想要购买的香水。“小众”香水是由小型精品香水公司制造的稀有香水。类似于葡萄酒,有一个围绕着小众香水的整个亚文化,它有自己的诗歌词汇,非常适合 NLP!

我希望这个模型做两件事:

  1. 我希望能够描述一款香水,并根据我的描述获得相关推荐。由于所使用的建模方法,也由于香水的语言如此丰富,该模型可以推荐与情绪、感觉、个性或度假等事件的描述相匹配的香水
  2. 把情绪考虑进去。我希望能够描述我不喜欢的东西以及我喜欢的东西,并且仍然能够收到相关的推荐。

数据

我写了一个 python 脚本,从一个流行的小众香水网站上收集数据。他们似乎并不介意。;-)

我收集了三个文本数据源,并把它们连接到每种香水的一个文档中:

  • 描述
  • 复习
  • 香水中的香调列表

下面是我个人最喜欢的香水 Delma 的三个文本数据源的例子。

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

一些有趣的结果!

我用一个集成了 Doc2Vec 和潜在语义分析(LSA)的模型在 python 笔记本中创建了一个聊天机器人界面。Doc2Vec 和 LSA 表示潜在空间中的香水和文本查询,然后使用余弦相似度来匹配香水和文本查询。最相关的前五种香水作为推荐返回。

这是一个与聊天机器人互动的例子。对圣诞节香水的简单查询会返回五种适合季节的香水。这一请求的第一款香水有非常切题的没药味!

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

Christmas perfume recommendations

这里有几个更有趣的例子:

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

The query “Looking for my signature beach scent. I plan to wear it to the beach or pool” returns perfumes with notes of seasalt, coconut, and seaweed. My own beach scent, Eau de Soleil Blanc by Tom Ford, appears second on the list! I can attest that this perfume does smell like a day at the beach on a tropical vacation!

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

The query “I’m looking for a perfume for a vacation in Italy to a small Italian island.” returns perfumes with Sicilian orange and lemon, and a perfume from a perfume house Carthusia called capri.

为什么感情如此重要?

考虑这条聊天机器人消息。“我喜欢桃子和梨。酒鬼香草甜味美食家。”

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

注意第四种推荐的香水有椰子和烟草的味道。如果我讨厌那些笔记怎么办?我更新了我的查询以包含这个信息,并得到了一个更新的推荐列表。“我喜欢桃子和梨。醉人的香草甜味美食家。我不喜欢烟草,或者椰子。”

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

第四款香水从推荐中消失!

模型

该模型的第一步是从聊天机器人消息中识别每个句子的情感。我用 VADER 来做这件事。(超级好用,给了我很大的效果。如果你有一个想使用情感分析的项目,我强烈推荐你尝试一下。)我把所有正面和中性的句子串联成一串,所有负面情绪的句子串联成另一串。我现在有两个文件可以用来寻找类似的香水。

这些香水有文字描述、评论和注释列表。该模型由两个文档嵌入组成,一个来自 LSA,另一个来自 Doc2Vev。为了训练 LSA 和 Doc2Vec 模型,我将每种香水的香水描述、评论和注释连接到一个文档中。然后,我使用余弦相似度来查找与聊天机器人消息查询中的肯定句和中性句相似的香水。我删除了与否定句相似的香水推荐。

为了计算聊天机器人消息和香水文档之间的余弦相似性,我分别从 LSA 嵌入和 Doc2Vec 嵌入中计算余弦相似性,然后对这两个分数进行平均以得出最终分数。

LSA 简单地用 TF-IDF 对文档中的单词进行了符号化,然后用 SVD 将这些特征压缩成嵌入内容。LSA 是一种单词袋(BoW)方法,意思是不考虑所用单词的顺序(上下文)。这就是弓形方法的缺点。然而,我已经看到许多 BoW 方法在实践中优于更复杂的深度学习方法,因此 LSA 仍然应该被测试并被认为是一种可行的方法。

Doc2Vec 是一种从文本文档中学习嵌入的神经网络方法。由于其体系结构,该模型考虑了文档中的上下文和语义。文档的上下文和单词之间的关系被保存在所学习的嵌入中。

通过将 Doc2Vec 与 LSA 捆绑在一起,我能够获得很好的一对一匹配,例如当我请求时返回玫瑰香水,我还能够利用语言的复杂性,并在我描述更抽象的东西(例如情绪或事件)时返回相关结果。

结论

如果你想尝试这种模式,并获得一些个性化的建议,你可以发短信给直播机器人(424)343-3755。聊天机器人是使用 Flask、Twilio 可编程 SMS、Airtable 和 AWS EC2 实例部署的。我的公共 github repo 上也有代码。

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

Using Twilio, I deployed this model as a chatbot sms service.

使用 Python 促进能源和经济发展

原文:https://towardsdatascience.com/perkiertech1-2bf7f8d50e43?source=collection_archive---------11-----------------------

可再生能源在增强人民权能方面可以发挥关键作用。

我开发了一个工具来模拟 20 年的太阳能,并在我的城市波尔图用几个月平均电费进行了测试。目标是针对每个月的平均账单,给出最佳的太阳能解决方案(哪个和多少太阳能电池板,如果是电池,哪个电池是个好主意),以最大化投资回报。这份报告对消费者或公司都很有用。

代码中最重要的部分可以在 Github 查看。
查看下面这个项目的报告!

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

ELECTRIC AESTHETIC by Tesla

项目的相关性

这个项目的想法是在我试图思考如果我经营一家可再生能源公司我会做什么的时候产生的。当然,也有其他软件可以计算可再生能源的潜力,但都不是免费的、准确的,也不可能同时比较多个太阳能电池板。由于对可再生能源充满热情,我认为这将是 python 数据科学库的第一个完美项目。

工具

Python、Numpy、Pandas 和 scikit-学习

说到科学计算和数据科学,两个关键的 python 库是 NumPy 和 pandas。

Numpy 在使用上有令人难以置信的优势:NumPy 是用 Python 和 C 编写的,因此 NumPy 数组比 Python 列表更快。然而,与 Python 列表不同,NumPy 数组不灵活,所有元素都应该是同一类型。

当谈到用 Python 分析数据时,Pandas 是一个相当大的游戏改变者。Pandas 接收数据(CSV 文件、SQL 数据库等。)并创建一个具有行和列的 Python 对象,称为数据框,它看起来非常类似于统计软件中的表(允许对数据结构进行数学运算,忽略数据结构的元数据,使用关系运算,并且很容易处理丢失的数据)。这通过提供数字表格和时间序列数据结构,实现了简单快速的数据分析和操作工具。

Scikit-learn 是一个强大而高效的数据挖掘和数据分析工具。该库专注于建模数据,是进行机器学习项目时使用的主要库之一。

PVlib 和 Sandia 模块

PVlib python 是一个社区支持的工具,它提供了一组用于模拟光伏能源系统性能的函数和类。PVlib 是由桑迪亚国家实验室开发的,它实现了实验室开发的许多模型和方法。

桑迪亚国家实验室正在推动一个光伏(PV)专业人员协作小组(PV 性能建模协作或 PVPMC)。该小组对提高光伏性能模型和分析的准确性和技术严谨性感兴趣。此类模型用于评估当前绩效(绩效指数)并确定光伏发电项目的未来价值(以预测的发电量表示),进而影响金融界如何看待光伏项目和技术的投资风险。

PVlib python 的源代码托管在 GitHub 上。

创建太阳能电池板价格数据库

本节用到的重要代码可以在 Github 上查看: Function_Find_PanelsFind_Panels_DBPrices_aux

由于缺乏关于桑迪亚数据库中太阳能电池板价格的信息,人们找到了新的方法来了解这些公司如何评估他们的产品。基于废弃的两个不同的太阳能电池板价格信息网站,创建了两个数据库。这两个网站有不同的相关信息:

DB1:品牌;太阳能电池板模型;最大功率;日常用电;效率;最小功率;每个面板的成本;生产国;保修;

DB2:品牌;太阳能电池板模型;权力;每个面板的成本;尺寸;重量;生产国

因为没有关于要测试的太阳能组件价格的明确或可用的数据。我必须创建一个插值方法,根据可供购买的电池板的价格、功率和年份来预测每个太阳能公司收取的每瓦特价格。

创建了一个新的数据库,将太阳能电池板品牌与其预测价格与 scikit-learn 库中的两种方法相关联:(1)线性回归方法——使用单个自变量来预测因变量的值;(2) Ransac 方法——一种迭代算法,用于从完整数据集的内联子集中稳健估计参数。

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

Example of Two Different Solar Panels Price Interpolation

从上面的图中可以看出,对于太阳能价格,两种回归方法并无不同。另一方面,LG 展示了一个非常有趣的案例,说明为什么应该选择 RANSAC 回归器来插值模块的价格。如果选择线性回归,则假设 LG 面板的价格随着功率的增加而下降,这没有多大意义。出于这个原因,RANSAC 回归器被选为插入太阳能组件价格。

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

根据我所能收集到的关于太阳能电池组件价格的最多信息,对两个数据库进行了比较(Sandia 模块和太阳能电池板价格),并根据比较结果对 35 块电池板进行了测试(见左侧表格)。
面板名称和 Sandia_Name 在左侧图像中带有“(…)”,以避免创建过大的表格。

能耗

本节用到的重要代码可以在 Github : 消费 _FUNC萨区 _ 消费AC _ 助手上查看

消耗函数改编自加州每小时电力负荷曲线。据推测,同样的曲线模式也适用于葡萄牙。来自图像的曲线通过绘图数字化仪包扫描,该数字化仪包将曲线转换成 x,y 坐标文本文件。

使用 numpy,我创建了一个函数来拟合我之前在 plot digitizer package 上标记的点。运行了几个具有不同回归度的 polifit 函数,发现误差较小的回归度为 n=15(见下图)

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

Duck Curve Polygonal Regressions

了解季节性消费模式也很重要。为此,葡萄牙能源月刊采用了同样的程序。

现在到了棘手的部分:
每天的变化必须符合每年的能源消耗变化。换句话说,每个月内的每日能量消耗必须与一年内每个月的变化进行核对。为此,我将每个值除以所有瓦特值的总和。这样,所有值的和就是一。

电力消耗的年度变化是不同的。与消费群中总和等于 1 不同,每 12 个值除以平均值是有意义的。这样就很容易将这些值乘以每月的平均账单。

通过 numpy 功能,创建了一个 24x12 的矩阵。在矩阵中,有每个月每个小时消耗的电力值(假设从同一个月开始的几天内没有消耗变化)。

最后,使用 pandas 库的日期范围(与 PVlib 中使用的相同),为每小时的计算分配一个特定的电力消耗。

创建电池数据库

电池数据库是由三个提供电池信息和价格的网站组成的。

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

创建了一个包含 22 种电池型号的数据库。这些模型来自 AXITEC Energy、LG、SolaX Power、BYD、Tesla、PYLONTECH、VARTA 和 Enphase,存储在一个 csv 文件中,包含左侧示例中的信息。

能源和节能计算

本节用到的重要代码可以在 Github 查看:太阳能模块电池解释器电池脚本

为了确保尽可能准确的结果,计算是按小时进行的。太阳能电池板的能量是用一年中和几年内每小时的辐照度变化来计算的。以 20 年为时间线,单个面板的每一轮计算加上消费数据大约需要 40 秒。为所有电费计算所有电池板的产量将花费大量的时间。为了解决这个问题,我想用三个步骤来找到每月电费的最佳解决方案:

第一步——每块太阳能电池板都要进行测试,以对潜在的节约进行分类。计算出的节约量是第 2 步中计算出的实际节约量的近似值。
第 2 步——每个月平均账单的五个最佳潜在节约将成为第 2 步计算。在此阶段,将模拟精确节约。
步骤 3——对于每个月平均账单,将使用电池数据库中的每个电池测试步骤 2 中的两个最佳案例。

第 1 步—快速节约的结果

涉及太阳能电池板性能的第一次计算是使用 PVlib 库进行的。对于每个月的平均账单,计算需要多少太阳能电池板,以确保每个电池板装置的年产量至少足够接近年消耗量。

为每个太阳能组件安装创建了三个模型,以给消费者更多的选择并提高透明度。第一种,使用最接近的整数,即一个面板的年消耗量除以年能量所得的值(n=0)。第二种情况比第一种情况多一个面板(n=1),第三种情况比第一种情况少一个面板(n=-1)。

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

每块太阳能板的节能量计算方法是,20 年内生产的能源乘以葡萄牙每千瓦时能源的价格,再减去太阳能板的价格。建议的太阳能电池板数量的总节约量,节约量乘以建议的太阳能电池板数量。对于每次安装,都会创建一个新的数据库。上表代表了月平均账单为 50€且 n=0 时的最佳情况。

步骤 2 —精确节约结果

第 1 步的结果是此阶段的基础。现在只计算前一阶段的五个最佳结果。

介绍了一种计算总节约量的新方法。在此阶段,为了提高精确度,每小时都会计算一次节省量。上面计算的消费函数参与其中。该方法包括计算节约额,即 20 年时间内不安装该装置所花费的资金、初始投资、仍需向电网购买的资金(主要是夜间)以及向电网出售电力所获得的资金之间的平衡(尽管在葡萄牙,该值仍比向电网购买电能低 4 倍)。

为了每小时计算太阳能电池板是否会产生满足消费者需求的能量,完全不产生或者甚至产生超过需求的能量,使用具有 175×316 个元素的 AC _ df(20 年中的小时数)的以下 for 循环:

for k in range(len(ac_df)):

    Grid_Power[k] = consumo[k] - ac_df.iloc[k].loc['Watt-hour']if Grid_Power[k] < 0:
        Grid_Buying_Power[k] = 0
        Grid_Selling_Power[k] = Grid_Power[k]if Grid_Power[k] > 0:
        Grid_Buying_Power[k] = Grid_Power[k]
        Grid_Selling_Power[k] = 0

同样,对于每个月的平均账单,计算了三种解决方案。

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

此步骤的最终结果显示了五个面板,并根据新的节约计算对它们进行了重新排序。在左图中,有月平均 75€(当 n=0 时)的最佳面板的最终信息。看完这些结果后,一个细心的人会说,这个面板上显示的结果根本不可能。不幸的是,在 20 年内购买 1129.6€的电力是不可能的。在葡萄牙,夏令时约为 40%。因此,如果没有电池,从电网购买的总电量将只有没有太阳能电池板时的一半。在其他几个面板上也发现了这一错误,这些面板已从计算中删除。

第 3 步—电池的节能效果

第 3 步计算考虑电池存储。节能计算与第 2 步类似,但这一次使用电池储存能量,以供夜间使用。预计在所有情况下,向电网购买的剩余电量将接近于零。

在这些计算中,使用了每个月平均账单的 2 个最佳面板(步骤 2)。

为了每小时计算能量产生和电池存储的平衡,使用以下 for 循环:

for k in range(len(ac_df)):if k == 0:
        batt_stock[k] = batt_aux + ac_df.iloc[k].loc['Watt-hour']
        -consumo[k]else:
        batt_stock[k] = batt_stock[k - 1] + 
        ac_df.iloc[k].loc['Watt-hour'] - consumo[k]
        Grid_Selling_Power[k],Grid_Selling_Power[k] = 0, 0if batt_stock[k] < 0:
            Grid_Buying_Power[k] = - copy.deepcopy(batt_stock[k])
            batt_stock[k] = 0if batt_stock[k] > Battery_Capacity_Wh[num]:
            Grid_Selling_Power[k] = batt_stock[k] -     
            battery_Capacity_Wh[num]
            batt_stock[k] = copy.deepcopy(Battery_Capacity_Wh[num])
            Grid_Buying_Power[k] = 0

最佳解决方案是根据最高的节约价值选择的。

结果

每个月平均电费的最终结果如下:

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

关于结果的注释

虽然结果非常精确,但还是做了一些近似:(1)每个太阳能电池板都被认为在 20 年的时间里有相同的 15%的效率损失(见这里的计算);(2)计算中只使用了一个反演器。这可能会导致不同的结果,因为逆变器可以在特定类型的太阳能电池板上更好地工作;(3)没有考虑太阳能模块之间的能量损失。

最后的想法和结论

虽然一些从电网购买的太阳能电池板的价值出现了小的倒退,从计算中排除了一些太阳能电池板,减少了研究中太阳能电池板和品牌的数量,但这个项目的目标还是达到了。事实证明,太阳能电池板可以是一项伟大的长期投资,电池可以使这项投资更加有利可图。
我们可以在一段时间内消耗的瓦特小时数和你的房子需要的太阳能电池板数量之间画一条线。安装的电池板数量应该能够在同一时间段产生该功率。这样,太阳能装置将产生 200%的情感利润和 400%的真实的金钱利润。

可再生能源是赋予新一代人权力的一个很好的方式。平均每年节省 620€可以是人们生活中的一大飞跃,通过明智的投资,节省下来的电费可以成为企业家和公司的游戏规则改变者。

后续步骤

这篇文章标志着第一个 perkier.tech 项目。
perkier.tech 创建创新的工程项目,旨在帮助世界变得更美好,同时让我研究和学习新的东西。

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

perkier.tech logo

该能源项目的下一步将是利用微电网和区块链技术创建一个独立于电网的小型社区,同时实施新的发电方式(即小型风力涡轮机)。

在接下来的几个月里,我将学习更多关于智能电网和区块链电码的知识。

欢迎反馈和建议!我很想听听你关于如何实施创新工程的新想法。

你可以在 diogoncsa@gmail.com 找到我或者在 LinkedIn 找到我

持续同源:一个带有例子的非数学介绍

原文:https://towardsdatascience.com/persistent-homology-with-examples-1974d4b9c3d0?source=collection_archive---------1-----------------------

在数据科学中使用拓扑数据分析(TDA)工具

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

Growing disks around points to calculate 0d persistent homology, discussed in detail below.

在一家全是拓扑学家的公司工作,我经常需要编写和解释拓扑数据分析工具(TDA)。TDA 生活在代数拓扑的世界里,它融合了数学中抽象的代数和拓扑概念。抽象代数从来不是我的强项,我也没有上过正式的拓扑课,所以我为我经常使用的工具之一创建了以下非数学的解释和例子,持久同调

概括地说,持续同源性的焦点是:

当一个人增加一个阈值时,我们在多大尺度上观察到数据的某些表示的变化?

联系这里描述的持久同源性的许多用途的数学是深刻的,并且不在这篇文章中涉及。这里需要注意的是,我们在这里描述的不同用法有着截然不同的直观含义。我们将了解以下方面的不同含义/用途:

  • 持续同源的维度(如 0d 持续同源、1d 持续同源、 n -d 持续同源)
  • 数据类型(例如信号与离散欧几里得点)
  • 两点“接近”意味着什么(例如高度过滤)

这绝不是下面将要讨论的内容的全面总结。这些区别将通过例子和如何使用/解释结果的详细描述变得清楚。

欧几里得数据

本节着眼于与欧几里得数据(例如, n 维分离点的集合)持续同源的几个维度。注意,整个讨论和其中的计算也适用于其他度量空间中的点集(例如,曼哈顿距离)。

0d 持续同源性

欧几里得空间中的持久同调可以最好地解释为在每个点周围同时生长球。这里 0d 持续同源的关键焦点是连接组件 —随着点周围的球扩展,0d 持续同源在球接触时记录。

让我们把这个概念形象化。这里,我们使用两个噪声集群的示例,并随着我们增加每个点周围的球的半径来评估连通性:

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

Two noisy clusters of data (left), and the corresponding 0d persistence diagram (right).

让我们来看看,当我们把阈值从负无穷大扫到无穷大时,会发生什么。

负阈值不会发生任何事情(没有半径为负的球)。

第一个有趣的阈值是 0。值为 0 时,每个点的连通分量为born——每个点都由一个球表示,且没有球相交。

0d 持续同源是这些球相交时的追踪。更具体地说,它记录一个连接组件中的球何时第一次与一个不同的连接组件的球相交。当我们的第一组两个球接触时,我们称之为球 A 和球 B ,它们将成为同一个连接组件的一部分。因此,我们将有我们的第一个连接组件的死亡,以及我们在持久性图上的第一个点。持续同源的正常先例是当两个球接触时,先出生的球存活;然而,这里所有的点都是 0,我们将简单地通过索引值选择哪个点死亡。所以我们说球 A “死亡”并且它的(出生,死亡)对被添加到持久性图中。随着这两个球的半径继续增加,并且对应于 AB 的球中的任何一个击中点 C 的球,则 AB 连接的组件将与 C 连接的组件合并,导致其中一个组件死亡,并在持久性图上增加第二个点。

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

Connectivity of two noisy clusters, as measured by 0d persistent homology. Disk colors at any given time represent each unique connected component.

(下面的讨论将利用上面 gif 中的暂停来解释发生了什么,但作为参考,您也可以在这里交互式地完成这个示例。)

该图更清楚地显示了当单个连通分量中的任意点的球撞击来自另一个连通分量的另一个点的球时,分量合并,一种颜色持续,另一种颜色消失。每一种颜色的消失都对应着一个死亡,因此在持久性图上又增加了一个点。

我们来关注一下这个例子的一个具体方面。对眼睛来说,应该很清楚这些数据有两个嘈杂的集群的一些外观。这将对持久性图产生可预测的影响。随着磁盘从 0 增长到 0.66,我们看到多个(出生、死亡)对迅速出现在右侧的持久性图上。这并不奇怪,当每个圆盘的半径增加时,彼此靠近的点会快速接触。

然而,一旦我们达到 0.66,我们在左边看到每个集群中的磁盘被连接成两个不相交的集群(浅蓝色和橙色)。因此,这些组件有增长的空间,而不会触及不相交的组件,导致暂时没有额外的死亡,从而在持久性图上出现新的点时暂停。

然而,最终,当我们增加阈值使得这两个集群在半径 3.49 处接触时,其中一个集群死亡(在本例中,浅橙色),这在持久性图上创建了最后的*(出生,死亡)对。

当阈值超过 3.49 时,所有的球已经接触。因此,这些球将永远不会击中任何其他尚未与其自身相连的球,这意味着不会有任何额外的死亡(例如,持久性图上不再有点)。

(有的选择有一个死亡值无穷大的额外(出生,死亡)对,但这是一个更主观的决定。)

如上所述,聚类的噪声导致持续图上的值更接近 0,并且两个聚类的分离导致 3.49 处的单独的、更高的持续值。因此,在持久性图上,更接近于 0 的(出生、死亡)对和上述任何点之间的间隙具有特殊的意义。特别是,这个间隙表示数据相对于其噪声的聚集程度。对于上面的图片,如果我们进一步分离这两个有噪声的集群,那么最高持久性值和较低持久性值之间的差距会更大。同样地,如果我们把嘈杂的星团推得更近,这个差距就会缩小。

持久性值的这种差距可能增加的另一种方式是如果每个聚类的噪声减少。为了强调这一点,下面是一个随机数据集中到两个集群的例子。更准确地说,在左边我们看到了一个时间序列的点云,我们从随机数据开始,然后我们向前移动到时间上,直到点云由两个点组成。右侧显示了相应的 0d 持久性图:*

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

Collapsing data to 2 sinks, and the corresponding persistence diagram as we collapse the data.

*当我们有随机数据时,在持久性图中,没有远离 0 附近的噪声值的高持久性值。

然而,随着数据开始分离,我们看到一个越来越持久的点从对应于噪声的持久性值中分离出来。

还要注意,当数据收敛到两个点时,噪声的持续值向 0 移动。当数据收敛到两个点时,聚类不仅变得更加明显,如持续图上最持续的点和其余点之间的间隙增加所表示的,而且当给定聚类内的点之间的距离收敛到 0 时,噪声本身变得不那么嘈杂。一旦数据汇聚到这两个点,所有的点都是 0,但是在每个集群内的*,这些点会立即合并,因为磁盘增长了很小的量。**

为什么在 K-means 上使用 0d 持久同源性

K-means 聚类算法特别受欢迎,因此值得花点时间来强调由 0d 持续同源性收集的额外信息,这些信息在使用 K-means 时会丢失。
特别是,运行 K-means for k =2 不会告诉您任何关于 2 个集群相对于任何其他数量的集群的稳定性的信息,而 0d 持续同源性提供了在持续图上分离值时集群稳健性的度量。

K-means 确实对此提供了一些解决方案,例如通过搜索拐点,它探索了减少误差和聚类数量之间的权衡。当然,这涉及 K-means 的多次运行,并且为了探索通过 0d 持续同源性可以探索的尽可能多的选项,人们将不得不针对 k =1 到K*=数据点的数量运行它。

此外,回想一下 K-means 的结果不一定是稳定的,或者换句话说,用相同的参数运行 K-means 两次并不能保证得到相同的答案,这对于无监督的机器学习来说是一个潜在的问题。另一方面,持久的同源性是一个稳定的结果。此外,0d 持久同调带来了对噪声鲁棒性的一些很好的
数学证明。*

1d 持续同源

对于 1d 持续同源,我们仍然在点周围炸球,就像我们对 0d 持续同源所做的一样。然而,在这里,我们跟踪点之间连通性的更微妙的概念。现在,我们不再仅仅跟踪连接的组件,而是在循环形成和消失的时候进行跟踪。说实话,一个循环*的严格定义需要更多的数学知识,这对于本文来说是不合适的(参见芒克雷斯的代数拓扑书籍了解更多),但是直观的含义将有望从这个例子中变得清晰。

考虑下图中一圈嘈杂的数据:*

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

A noisy circle of data (left), and the corresponding 1d persistent homology calculation (right).

(下面的讨论将利用上面 gif 中的暂停来解释发生了什么,但作为参考,您也可以在这里交互式地完成此示例。)

在这个持久性图上有一点特别重要。注意左边在 0.25 左右形成一个环(gif 中间的停顿)。此时,数学形式使我们能够说,一个单一的环已经形成,其中包括环内的白色空间。随着阈值的增加,环会变厚,从而缩小白色空间,直到最后不断增长的圆盘最终填充环的内部,大约为 0.6。因此,循环在 0.25 处出生*,在 0.6 处死亡,给我们右侧的高异常值 1d 持续值。
这些环的半径很小,因此很快被膨胀的圆盘填满,导致死亡值接近它们的出生值,因此在持久性图上靠近对角线的地方产生点。

另一种看待 1d 持久同源性的方式是让数据“更具循环性”下面我们用一个网格点,把它分成三个循环:*

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

Observing 1d persistent homology as we force a grid of data into 3 loops.

*首先,我们最终有三个高度持久的点对应于三个循环,这并不奇怪。一个重要的限定词来自于此。让我们把注意力集中在右上方最小的圆上。在暂留图上,其对应的 1d 暂留值大约为(0.3,0.9)。注意,随着圆圈内部变空,持久性图上的值从对角线向上移动。然后,即使圆外仍有点收敛到循环,它也会稳定下来。我们正在了解循环内部的行为/鲁棒性,但是 1d 持续同源不能保证数据是一个圆

我们可以用一个静态的例子进一步强调这一点。下面使用的两个数据集由跨越一个圆的一组点组成,第二组点使用相同的圆数据,在圆外有一个额外的点网格。比较从下面两个数据集得到的两个持久性图:*

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

Perfect circle of data, and its corresponding single 1d persistence value.

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

The same perfect circle of data, with a grid of points outside it. This gives us the same 1d persistence value, plus some noisy 1d persistence values resulting from loops quickly forming and closing among the grid points.

对于具有外部网格的圆,我们得到一些快速出生和死亡的循环,如沿着对角线的点所示,但是主循环对于两组点具有相同的持久性值。

n-次元持久同调

值得注意的是,这种方法可以推广到 n 维欧几里德数据(随着维度的增加,我们吹大的球只是变成了球体/超球体,我们寻找这些球包围的多维空洞,而不是包含在循环中的圆)。然而,我们不会在这里进一步探讨。

使用欧几里德数据的持续同调测量的示例

*机器学习的一个重要方面是特征提取。如果不使用代表他们试图预测的特征,最强大的模型也不能预测任何事情。这就提出了一个问题,我们如何为几何复杂的物体生成特征?如上所述,持续同源提供了一个解决方案。

举个例子,我们将使用这篇应用统计学年报论文中的数据来检验大脑中的动脉与年龄之间的关系。首先,让我们先看看我们是否能从视觉上区分年轻的大脑和年老的大脑:*

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

2 brain artery trees. On the left, a 20-year old. On the right, a 72-year old.

这两种脑动脉树之间似乎没有任何显著的差异。接下来让我们尝试使用 1d 持续同源性来量化这些差异:

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

1d persistence diagrams for the 20-year old (left) and 72-year old (right).

同样,在这些图中可能有些小的不同,但是总体上,它们看起来有些相似。让我们寻找群体差异,区分 50 岁以下和 50 岁以上的年轻人和老年人的大脑。我们的示例数据集共有 98 个案例,分为年轻组中的 58 个案例和年长组中的 40 个案例。以下是按组汇总的所有 1d 持久性图:

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

1d persistence diagrams for all 98 brain artery examples, separated into brains from individuals over age 50 (left) and brains from individuals below age 50 (right).

这些数字似乎有细微的差异,但这里的特征仍然不是很清楚。关于这些图表的更细致的特征,参见应用统计学年报论文,其中它们持久的基于同源性的特征被证明在检测脑动脉树的年龄差异中是有用的。不过,为了简化起见,让我们只考虑 1d 持久性值的数量:

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

The relationship between the number of 1d persistence values in a brain artery tree and age in our dataset. On the left, we include the full figure. On the right, we consider the same relationship, but excluding the few outliers to better show the subtle, linear relationship.

正如这些图表所示,年龄和 1d 持久性值的数量之间存在微妙但具有统计意义的(p-值< 0.0005)关系。平均而言,在我们的数据集中,年轻人的脑动脉树中比老年人有更多的环路。虽然我们没有发现数量上的强关系,正如像增强这样的技术所证明的那样,一组微妙的关系可以在机器学习中一起工作,导致令人印象深刻的分类。

信号

对于信号,我们关心的是我们认为连续的东西的离散近似。因此,与前面讨论的与欧几里得数据的持续同源性不同,我们在这里对点之间的“x”距离如何分布不感兴趣。相反,我们只关心基于每个点的值的点之间的连通性(例如“y”距离)。

像前面的 0d 持续同源讨论一样,当我们增加一个阈值时,我们仍然在跟踪连通分量;然而,炸球不再是我们正在做的事情的类比,因为我们不关心点之间的水平分布。相反,我们可以认为这是在信号上扫一条线,如下图所示:

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

A toy example of a signal (left), and the corresponding signal persistence diagram (right).

在这种情况下,我们可以用各自的颜色来表示信号的连通分量。因此,持久性图上的点将对应于颜色的消失,所以让我们用下图来讨论颜色和持久性图之间的联系:

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

The same toy example signal as above, but coloring the connected components with unique colors as we sweep up the threshold.

*当我们向上扫描阈值时,我们看到我们短暂地拥有多达三个独立的组件(绿色、橙色和粉色)。当这些组件中的两个在阈值 4.5(gif 中间的停顿)相遇时,我们看到橙色组件“死亡”,在持久性图上为它出现一个点。信号持续同源性遵循通常的先例;较新的连接组件死亡并合并到较旧的组件中。因此,橙色成分变成绿色,因为它现在是绿色成分的一部分。当我们继续向上扫描时,我们看到没有出生或合并发生,直到我们到达信号的全局最大值。按照通常的持久性同源约定,我们将较年轻的组分合并到较老的组分中,并在持久性图上标记一个点,粉红色胜过绿色。然而,与欧几里德 0d 持久同源性不同,我们在持久图上为最后存活的组分创建了一个额外的点。回想与欧几里德 0d 的持久同调,当最后两个集群相遇时,我们在持久图上只放一个附加点。欧几里德 0d 持续同源的想法是,当我们继续增加每个点周围的球的大小时,不会再发生合并,因此集体集群永远不会死亡。这里,我们采取的立场是,一旦阈值超过信号的全局最大值,一切都死了。

我们为什么选择这种不同的做法来发出信号呢?答案与最后一个持久性值中包含的信息有关。信号的最后一个持久性值包含了信号的边界——它的出生值是信号的全局最小值,它的死亡值是信号的全局最大值。然而,用欧几里得 0d 持久同源性,我们在记录最后一点时没有获得额外的信息。该点总是在 0 处出现,或者在无穷远处消失,这不会显示任何信息(对于所有数据集都是如此),或者我们选择在它与最后一个聚类合并时消失,也不会显示任何信息,因为这将使最后一个持久化点成为倒数第二个持久化点的重复。*

信号持续同源性使用的例子

信号持续同源性可以帮助我们的一个例子是
压缩。作为一个具体的例子,我们将使用 1000 个时间点的随机行走的一些玩具数据:

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

A random walk signal to compress.

开始时,我们当然储存 1000 点。然而,使用信号持续同源性,我们可以存储更少的点,同时仍然相当精确地重构信号:

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

A reconstruction of the signal, using only the persistence values. Note we’ve already achieved nearly 75% compression.

我们已经实现了近 75%的压缩,显然,我们的压缩信号“保持”了原始信号的形状,我们可以通过将两个信号叠加来强调这一点:

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

An overlay of the original signal (blue) with the reconstructed signal (orange). Note they appear nearly identical.

然而,这个过程并不完美。我们丢失了一些信息;我们只是无法在信号的最大范围内看到它。让我们放大信号的一部分:

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

An subset of the overlay of the original signal (blue) with the reconstructed signal (orange). Note we have lost the non-critical points on the reconstructed signal.

这里需要注意的重要一点是,持续同源性只保留了斜率从正变为负的临界点*。斜率在不同正值之间或不同负值之间变化的点没有被保留。这是有意义的,因为没有(出生,死亡)对记录这些值。此外,如果点之间的插值,甚至是两个临界点之间的插值,是非线性的,那么该曲率将会由于这种压缩技术而丢失(尽管可以存储额外的曲率信息用于更精确但不太紧凑的压缩)。

现在让我们考虑一下,如果 75%的压缩率对我们来说不够好,我们会怎么做。也许我们只能传输少量的数据,或者也许我们有更大数量级的信号。我们可以通过选择保留哪些持久性值来再次利用持久性同源性,即保留最高的持久性值,并因此优先考虑信号中最重要的结构。下面是一个演示,展示了当我们保留更少的持久性值时,我们返回的信号的简化:*

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

A reconstruction of the signal (left) as we remove progressively more signal persistence values (right). Note the size of the resulting reconstruction in the title of the figure on the left, and recall the original size of the signal was 1000 values.

对于上面压缩的交互式可视化,请参见这里的了解更多。

当我们移除更高的持续值时,我们对信号的最终重构进行越来越剧烈的改变,但是即使当我们存储少至大约 50 个点(95%的压缩)时,我们也保持了信号的体面骨架。

如果您想在自己的例子中尝试这种压缩技术,我已经将这一概念转化为一个名为topological-signal-compression的独立 Python 包。代码可以通过 PyPI (例如pip install)安装。其他代码示例(包括真实信号数据和一个音乐示例)可在文档中找到。

在我的 arXiv 论文中可以找到关于涵盖理论、用例以及机器学习实验的技术的更详细的讨论:用于推断和近似重建的信号的拓扑简化

图像的高度过滤

*与图像的持续同源与信号的持续同源有很多相似之处。像信号持续同源一样,我们关心的是我们愿意认为是连续的东西的离散近似。此外,点与点之间的连接是基于每个点处的值,而不是点与点之间的欧氏距离。最后,就像信号持续同源一样,我们将能够根据图像中像素的“高度”(例如颜色)来跟踪连接组件的出生和死亡。

我们将看看下面的场景:*

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

An toy example of an image with one dimension of color, which we will think of as height.

或者,从视觉上强调高度和颜色之间的三维关系:

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

A 3d representation of the above image.

我们像这样扫起一个门槛:

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

Sweeping up a threshold along the image from low to high height.

或者如在三维空间中看到的:

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

A 3d representation of sweeping up a threshold along the image.

使用高度过滤,当我们向上扫描阈值时,我们跟踪连接的成分,就像我们在信号持续同源性中所做的那样。因此,我们得到以下高度过滤图:

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

Visualizing connected components as unique colors as we sweep up the threshold on the toy example image.

高度过滤的使用示例

高度过滤的一个可能用途是图像分割。我们将展示一个木质细胞的例子:

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

An actual image of wood cells.

运行高度过滤最简单的方法是对单一高度进行过滤,因此我们将从将图像从三个颜色通道(RGB)转换为一个颜色通道开始。我们还将对图像进行模糊处理,以促使该分割管道聚焦于更强健的特征(例如,最大限度地减少对细胞壁中某些点的亮度斑点的聚焦):

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

Taking the image of wood cells, putting in grayscale, and blurring.

在我们将高度过滤运行到用户指定的水平后,我们就能初步感受到我们可以如何区分不同的细胞:

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

Visualizing the connected components generated from the blurred, grayscale image.

看起来很有希望!作为一项完整性检查,让我们看看原始图像上每个连接组件的中心:

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

The wood cells figure, with a point at the center pixel of each connected component.

我们的表现很出色,但并不完美。有一些假阳性,可能有一两个特别窄的遗漏细胞。

至于我们分割图像的效果如何,下面是原始的木材细胞图像,识别的像素由顶部的连接部分着色:

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

The original wood cells image overlayed with our connected components as calculated using the height filtration.

我们在一些更窄形状的细胞的细胞壁内捕捉像素并不出色。不过,总的来说,我们捕获了每个单元格内的大部分像素。值得强调的是,要运行这个算法,我们只需要手动调整两个参数,模糊参数和高度阈值。此外,该算法运行迅速,不需要任何标记数据或训练程序来实现这些强有力的结果。

如果你对沿着不同的阈值跑步时的高度过滤感到好奇,请参见这里的获得一个交互式小工具。

结论

我希望我已经激起了你对持久同源的兴趣,并扩展了你对 TDA 如何扩充数据科学家工具箱的好奇心。

为了响应一些对用于生成本文中图形的代码的请求,我发布了一个包含我的 Python 代码的。但是,请注意,我不会支持这个回购,所以我不保证这些脚本目前是有效的。对于所有持续的同源性计算,我使用了一个名为gda-public的开源 TDA 包,可以在 PyPIGitHub 上获得。信号压缩功能得到支持(和维护!)在一个叫做topological-signal-compression的包里,这个包在 PyPI 上有。我所有的可视化都是在matplotlibholoviews完成的。要在一个地方访问我在本文中链接的所有小部件,请参见这里的了解更多信息。感谢阅读!

人员重新识别

原文:https://towardsdatascience.com/person-re-identification-21625969f780?source=collection_archive---------15-----------------------

什么是人员重新识别

在计算机视觉中,在其他时间或地点识别感兴趣的人是一项具有挑战性的任务。它的应用范围很广,从通过相机跟踪人们到在大型画廊中搜索他们,从将相册中的照片分组到零售店的访客分析。像许多视觉识别问题一样,姿势、视点、光照和遮挡的变化使得这个问题变得不重要。

论文评论

AlignedReID: Surpassing Human-Level Performance in Person Re-Identification(arXiv 2017)

论文/ 代码 1 / 代码 2 / 语义学者

  • AlignedReID 提取与局部特征联合学习的全局特征
  • 局部特征学习通过计算两组局部特征之间的最短路径来执行对齐/匹配
  • 全局特征学习极大地受益于局部特征
  • 联合学习后,只需要全局特征来计算图像间的相似度。

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

aligned Reid 的框架(张璇等,2017)

全局分支和局部分支共享相同的卷积网络来提取特征图。通过直接在特征图上应用全局池来提取全局特征。对于局部分支,在水平汇集之后应用一个 1 × 1 卷积层,这是具有水平方向的全局汇集。应用三元组硬丢失,根据全局距离通过硬样本挖掘选择三元组样本。

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

通过寻找最短路径计算的 AlignedReID 局部距离的例子(张璇等人,2017)

黑色箭头显示右侧相应距离矩阵中的最短路径。黑线显示了左边两个图像之间的对应对齐。

Beyond Part Models: Person Retrieval with Refined Part Pooling and A Strong Convolutional Baseline (ECCV 2018)

论文/ 代码 1 / 代码 2 / 语义学者

学习用于个人检索的有区别的部分通知特征有两个贡献:

  • 一种称为基于部分的卷积基线(PCB)的网络。给定一个图像输入,它输出一个由几个部分级特征组成的卷积描述符。通过统一的分区策略,PCB 实现了与最先进方法相媲美的结果。
  • 一种改进的零件共享(RPP)方法。均匀划分不可避免地会在每个部分中引入异常值,这些异常值实际上与其他部分更相似。RPP 将这些异常值重新分配给它们最接近的零件,从而得到零件内部一致性增强的精细零件。

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

PCB 的结构(孙一凡等人,2018)

输入图像从主干网络向前通过堆叠的卷积层,以形成 3D 张量 T。PCB 用传统的池层代替原始的全局池层,以在空间上将 T 下采样成 p 个列向量 g。随后的 1× 1 核大小的卷积层降低 g 的维度。最后,将每个降维的列向量 h 分别输入到分类器中。每个分类器都由一个全连接(FC)层和一个连续的 Softmax 层实现。p 个 g 或 h 片段被连接以形成输入图像的最终描述符。

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

多氯联苯结合精炼零件池(孙一凡等人,2018 年)

当我们关注空间划分时,3D 张量 T 被简单地表示为矩形而不是立方体。T 之前的层被省略,因为它们与之前的图相比保持不变。部分分类器预测每个列向量属于 p 个部分的概率。然后从所有列向量中以相应的概率作为采样权重对每个部分进行采样。差距表示全球平均池。

Camera Style Adaptation for Person Re-identification (CVPR 2018)

论文/ 代码 1 / 代码 2 / 语义学者

提出了一种用于深层人物再识别的摄像机风格自适应方法。

  • 使用 CycleGAN 为每对摄像机学习摄像机感知风格转移模型,用于从原始图像生成新的训练图像。真实图像和风格转换后的图像形成新的训练集。
  • 为了减轻由 CycleGAN 引起的增加的噪声水平,对生成的样本应用标签平滑正则化(LSR)。

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

管道的方法(图来自论文)

摄像机感知风格转移模型是从不同摄像机之间的真实训练数据中学习的。对于每个真实图像,利用训练的传递模型来生成符合目标相机风格的图像。随后,真实图像(绿框)和风格转移图像(蓝框)被组合以训练重新识别的 CNN。交叉熵损失和标签平滑正则化(LSR)损失分别应用于真实图像和风格转移图像。

Generalizing A Person Retrieval Model Hetero- and Homogeneously (ECCV 2018)

论文/ 代码/ 语义学者

给定一个有标记的源训练集和一个无标记的目标训练集,本文旨在提高 re-ID 模型在目标测试集上的泛化能力。异质同质学习(HHL)方法被用于同时加强两个属性:

  • 相机不变性,通过由未标记的目标图像和它们的相机风格传递的对应物形成的正对来学习
  • 域连通性,通过将源/目标图像视为目标/源图像的负匹配对。

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

管道的方法(图来自论文)

它由两个损失函数组成:1)用于分类的交叉熵损失,通过标记源样本学习;2)用于相似性学习的三元组损失,其对模型施加相机不变性和域连通性,并且通过标记的源样本、未标记的目标样本和相机风格转移的样本来学习。

原载于amberer . git lab . io

人员搜索

原文:https://towardsdatascience.com/person-search-1f207af28bec?source=collection_archive---------17-----------------------

什么是人肉搜索

人物搜索是一项任务,其目的是在没有边界框注释的情况下在图库的图像中搜索相应的实例。相关联的数据类似于个人重新识别中的数据。关键的区别在于边界框在此任务中不可用。实际上,可以将行人检测和人员识别结合起来视为一项任务。

论文评论

Joint Detection and Identification Feature Learning for Person Search(CVPR 2017)

论文/ 代码/ 语义书生

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

图取自论文

人员搜索问题设置更接近真实世界的应用,并且比人员重新识别更具挑战性,因为检测行人将不可避免地产生错误警报、错误检测和错位。本文没有将人员搜索问题分解为两个独立的任务——行人检测和人员重新识别,而是在单个卷积神经网络中联合处理这两个方面。提出了一种在线实例匹配(OIM)损失函数来有效地训练网络,该函数可扩展到具有大量身份的数据集。

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

提议的框架(图取自论文)

行人提议网络生成候选人的包围盒,将其送入识别网络进行特征提取。该特征被投影到 L2 归一化的 256 维子空间,并且用提议的在线实例匹配损失来训练。行人建议网和识别网共享基础卷积特征图。

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

在线实例匹配(图取自论文)

左边部分显示了图像中已标记(蓝色)和未标记(橙色)的身份建议。我们维护一个查找表(LUT)和一个循环队列(CQ)来存储特性。转发时,每个标记的身份与所有存储的特征相匹配。向后时,我们根据 id 更新 LUT,将新功能推送到 CQ,并弹出过时的功能。注意,这两种数据结构都是外部存储器,而不是 CNN 的参数。

Person Search in Videos with One Portrait Through Visual and Temporal Links(ECCV 2018)

论文/ 项目/ 代号/ 语义书生

在一些现实世界的应用中,人们需要从长视频中通过少量的肖像来搜索特定的人。与人的重新识别相比,这是一个非常困难的问题,因为环境可能非常多。为了解决这一挑战性问题,作者提出了一种通过视觉和时间链接的标签传播策略,其中视觉链接由视觉外观特征之间的相似性定义,而时间链接由轨迹生成。使用经由竞争共识技术的渐进传播来提高传播过程的可靠性。

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

图形中的视觉链接和时间链接(黄庆秋等,2018)

在图中执行身份传播,其中节点由检测到的人定义。该图包含两种链接,视觉链接和时间链接(这两种链接都是稀疏的,以提高图的鲁棒性)。

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

竞争性共识与线性扩散的比较(黄庆秋等,2018)

以防止在标签传播期间身份信息被噪声链路污染。使用竞争一致性模型,目标节点的邻居在传播期间相互竞争,并且仅保留最大的同一性元素。

最初发布于amberer . git lab . io

个性化的、生成性的叙述

原文:https://towardsdatascience.com/personalized-generative-narratives-591d80caa8eb?source=collection_archive---------27-----------------------

使用 Tweepy、IBM Watson 和 GPT-2,根据用户的个性档案制作个性化内容

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

Photo by Greg Rakozy on Unsplash

为了我在 Metis 的顶点项目,我决定继续我在自然语言、电影人物塑造和 IBM Watson 个性洞察方面的工作。

我之前的项目中,我已经成功地将单一类型电影角色的五大人格形象化。然而,对于这个项目,我决定将工作向前推进几个步骤。然而,在我开始之前,请允许我介绍一些背景…

愿景

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

Imagery from my immersive experience company

在踏上成为数据科学家的旅程之前,我的工作主要植根于沉浸式体验设计行业。虽然我已经在这个行业工作了近十年,但在 2015 年,我成立了自己的沉浸式体验公司,名为截图制作

在截图中,我们通常一次为一个观众成员制作亲密的沉浸式体验,目标是将个人置于普遍的人类体验中,并挑战他们在更大的整体中考虑他们的位置和责任。我们经常为每个观众定制互动和对话,在某些情况下,我们还会根据观众对展前问卷的回答,创作出完整独特的剧本。

虽然这种形式为巨大的情感冲击提供了渠道,但它根本不可扩展。我们经常发现自己每个演出周末只能容纳 100-150 名观众,并且不得不收取(令人望而却步的)高票价,以达到收支平衡的制作成本。

因此,这个项目的核心问题是:我们能否利用数据科学,特别是生成性深度学习,通过长形式的互动叙事提供类似的有影响力的个性化体验,从而同时影响数十万个人?

另一个人说:

我们是否可以利用从用户的社交媒体档案中获得的个性见解,结合虚构的对话,以可扩展的格式制作强大、互动和完全个性化的叙事?

在变得过于兴奋之前,请允许我说,简短的回答是:目前没有。由于文本生成仍然是一个相对年轻的领域,我在 Metis 的时间也相对较短,所以我没有努力去创作长篇叙事。相反,我利用在 Metis 工作的机会制定了一个简短的目标,作为实现这个更大目标的垫脚石:

成功地创建一个生成模型,将用户的大五人格特征与一个虚构的角色结合起来,并从该角色的角度生成一个短段落或推文。

为此,我确实成功了。

方法、数据和流程

就像我之前的项目一样,我利用的数据来自加州大学圣克鲁斯分校编辑的大量电影文集。该语料库按类型划分,包含 960 个电影剧本,其中电影中的对话已从场景描述中分离出来。

这个过程是对数据进行清理和预处理,这样我得到了一个熊猫数据框架,这个框架按角色进行了分解,所有的对话实例都是行(完整的代码,请查看我的项目报告)。接下来,我过滤了具有 100 行或更多的字符的数据帧,每行至少由 3 个单词组成,这样我就可以返回任何给定电影的主角和主要角色以及实际上对确定他们的个性有一定意义的行。

在这里,我创建了一个关系数据库,其中包含以下嵌套结构的信息:电影类型、电影名称、电影角色,以及所有类型中每个角色的所有对话:

接下来,我创建了一个脚本,通过 IBM Watson Personality Insights 程序运行每个人物的对话,并返回他们详细的五大人格特征。注意,这只是通过 IBM Watson 运行每个字符的函数,但是 Watson 需要单独配置:

此时,我已经有了 3000 多个人物及其相关个性特征的数据库,所以我转到了 Twitter,在那里我使用 Tweepy 从任何给定用户那里提取最近 200 条推文,并编写了一个类似的脚本来通过 IBM 运行他们的个性:

然后将 Twitter 个人资料与关系数据库中的所有人物进行比较,并使用余弦相似度,我打印出了每个流派中与使用此功能的用户最相似的人物:

最后一步,我利用 OpenAI 的 GPT-2 架构为每个角色生成一条简短的 tweet。GPT-2 实例是使用马克斯·伍尔夫创建的 GPT-2 简单 python 库训练的(谢谢马克斯!),对语料库中每个角色的对话进行单独训练,并进行微调,以打印出一条推文长度的原始内容。

结果的预览

所有这些调查的结果令人鼓舞!我用我的团队中的一些人的 Twitter 账号以及一些著名的个人资料进行了测试,如埃隆·马斯克(他与《星际迷航》中的斯波克最相似),我觉得大多数情况下的结果都很有道理。

有了这些,我构建了一些基本的模型,让用户可以像 Flask 应用程序一样与之交互。下图展示了@realDonaldTrump 手柄的真实效果:

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

Home page for the app

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

Results page

在上面,我们看到特朗普与《意大利工作》中的查理·克罗克 99%相似。对这个角色的描述是:“一个伦敦犯罪团伙的头目,从监狱里释放出来,打算在意大利做一件大事,从一辆装甲保安卡车上偷走金条。”

是的……听起来很对我的胃口。

顶部的引用是生成性的、微调的 GPT-2 模型的输出,该模型基于查理·克罗克的全部对话进行训练。

后续步骤

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

Photo by Drew Beamer on Unsplash

虽然我对这个项目的结果非常满意,但这仅仅是个开始。

正如本文开头所提到的,长期目标是实际创建一个动态的、长形式的叙事交付,在几个月的时间内展开,跨许多设备和媒体(文本、视频、AR/VR)交付,并动态响应用户与它的交互方式。这显然是相当雄心勃勃的(在为期 12 周的数据科学课程中肯定不可能实现),但我将在未来一年不懈努力,使之成为现实。

除了仅仅创建一个长篇叙事,我还对使用个性方面向用户开放不同的思维模式非常感兴趣。假设一个用户在他的大五人格档案中对新体验的开放度很低。在故事开始时,他们会从一个有着类似封闭新体验倾向的角色那里获得内容。然而,随着旅程的继续,故事中人物的视角将会变得更加开放,直到旅程结束时,他们处于光谱的另一端。

这里的希望是从本质上充当类似 Youtube 算法的对立面。Youtube 根据你的观看历史引导用户浏览越来越多的“极端”内容。例如,观看可能具有一些右翼倾向(或评论)的视频的用户可能会得到具有稍微更右倾观点的视频,等等。最终的结果是,用户从一个超特定的角度被内容所困扰。

对于这个项目,我想为任何给定的用户建立一个基线人格,将他们与相应的“虚构”角色结合起来,并通过定制的叙事交付让他们接触到不同的思维模式。换句话说,我希望向用户开放以前未探索过的思维模式,拓宽他们的观点,并最终帮助他们打破既定的思维模式,而不是进一步将他们束缚在现有的模式中。

应用+结论

这个项目的应用是令人兴奋和多样的。

我开始将这个项目视为扩展沉浸式体验类型的一种方式,虽然我认为这仍然有效,但我在治疗应用中看到了更多的好处和影响。

有充分的证据表明,我们越是使用某些神经通路,它们就变得越根深蒂固。我喜欢把这些路径想象成雪橇滑下雪山的轨迹。雪橇越往山下走,痕迹就变得越深,直到雪橇很难再走其他路下山。消极的模式,比如增加,可以这样想:除了一次又一次地从事破坏性行为,似乎不可能做任何事情。

然而,我们同样知道,我们的大脑非常灵活,通过神经可塑性,我们实际上可以重新连接我们的大脑回路。我们有无数的方法可以做到这一点:通过注意力、冥想、迷幻药、心理治疗等等。但作为一名体验设计师,我总是被故事的深刻影响所吸引和感动。

我相信,故事是一种独特而强大的方式,可以让我们拥有不同于自己的体验,我希望在这个完成的项目中,我将(随着数据和生成性深度学习的增加)能够有效地挑战个人,找到与他人体验的共鸣和联系,从而改变他们自己的操作模式。

附录

GithubLinkedInPortfolio

人脑仿真和模拟的哲学方面

原文:https://towardsdatascience.com/philosophical-aspects-of-human-brain-emulation-and-simulation-d64047b26640?source=collection_archive---------37-----------------------

科学、技术和哲学必须协同工作

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

科幻小说探索了人工智能、心灵上传和意识转移的许多后果,但倾向于将科学或技术机制归结为一些模糊的解释或完全忽略它。未来主义者和超人类主义者急切地等待这些想法成为科学事实,以便他们可以体验意识或永生的新前景,但他们可能会忽视所需的开创性科学和技术的难度。

我认为,神经假体导致部分和全部替换人脑并最终上传思想是可能的,因为它没有被物理定律明确禁止,因此主要是更先进的科学和技术的问题。

即使这些可能改变人类本质的超人类和未来主义的观点在理论上是可能的,也没有相应的原则说它们是人类可以达到的,也不是在不久的将来,尤其是在我们都死之前。我们不能也不应该只是等待未来,而是必须行动起来创造未来。

“我不想通过我的作品达到不朽;我想通过不死来达到永生。”

—伍迪·艾伦

一个重要的考虑是在通过技术描绘人脑时仿真和模拟之间的相互作用。仿真涉及更多的技术,而模拟涉及更多的科学。

我将探索人脑在头脑上传中的仿真和模拟的差异和效用

仿真和模拟的区别

为了更好地说明人脑仿真和模拟之间的区别,让我们考虑一下鸟类飞行的类比。

鸟类飞行的模拟

作为一个实现飞行的仿真例子,让我们简单地复制一只鸟如何用翅膀飞行。

这将涉及到精确复制鸟类生理学和解剖学的所有方面,我们认为这些方面在没有任何理解的情况下负责飞行。

我们甚至可以进一步复制诸如羽毛的颜色、眼睛的确切大小、内部消化系统的功能和交配模式等特征,但如果我们只关心实现飞行,这将超出范围。

这里的困难是确定鸟的哪些部分有助于它实现飞行,这似乎是直观的,除了翅膀之外的这些其他特征是不相关的。然而,在其他情况下,复制哪些特征可能不一定如此明显。例如,通过简单观察袋鼠如何在澳大利亚炎热的太阳下保持凉爽和不过热就不那么明显了,因为它没有汗腺。(袋鼠的前臂上有一个特殊的血管网络,所以它们舔那些前臂,唾液的蒸发带走热量。)

这种对鸟类飞行的简单模拟可能看起来很原始,但考虑到我们正在复制自然界花了数百万年才进化出来的东西,这是从单细胞生物到鸟类的远祖再到不会飞的鸟类的近亲,最后到达现在的鸟类的进步的顶点。

在不了解其他任何东西的情况下,仅仅通过观察和复制鸟类翅膀的形状就可以取得很大的进步。这种鸟的存在本身就是飞行概念的证明。

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

人脑的模拟

类似于模仿鸟来实现飞行,我们可以模仿人脑来实现意识,而不一定需要确切理解大脑的所有组成部分是如何工作的,或者意识是如何产生的。我们可以在以下水平上观察和复制大脑:

  • 大脑的总体特征
  • 神经网络
  • 单个神经元
  • 轴突和树突
  • 突触
  • 神经递质
  • 单个分子

这里的困难是考虑成功模拟大脑需要什么样的最小抽象层。这可能不一定需要模拟单个分子的运动,但可能需要我们正确复制神经递质及其与突触的相互作用,这本身就可能非常复杂。

此外,我们将需要高度先进的技术工具来成功地探测、复制、复制、实例化,然后运行。

尽管这非常困难,但对于这种仿真过程来说,这更像是一个工程问题,不需要任何更深入的科学原理。

仿真非常有用,因为它不需要理解或发现关于大脑功能和意识的抽象科学概念,它只需要完成,这可以发生在原始人类神经元之外的基底上。

模拟鸟战

现在,假设我们想要“模拟”一只鸟如何飞行。这就需要飞行的原理,这是一种科学的理解。

这需要比简单复制更高层次的抽象。但是一旦我们理解了更高阶的原理,如推力、升力、阻力,以及空气动力学和物理学的原理,我们就可以设计其他的机翼来“模拟”飞行。这种飞行可能是在机翼设计上,不一定看起来像原始鸟类的翅膀形状,而完全忽略了表面的方面,如翅膀的颜色。

此外,因为我们是在抽象的层面上研究飞行原理,所以我们可以将这些原理用于基于这些相同原理的完全不同的工程。例如,我们可以建造一架直升机,其旋翼的功能不同,但基于与鸟类飞行相同的科学原理。

我们甚至可以进一步利用空气动力学和物理学原理来考虑火箭推进,这将允许我们进入一个全新的空间领域。在这里,我们能够超越鸟类在大气中的飞行,进入一个完全不同的领域。

人脑的模拟

同样,如果我们理解大脑解剖学和生理学的更高抽象,我们就不必像在仿真中那样精确地复制有机和天然神经元的工作方式。

这种大脑功能的模拟将更加依赖于科学原理。例如,根据波动力学复制波浪在水上的运动不依赖于特定的水体或者甚至水本身,因为波动力学已经在数学中被抽象掉了。

(题外话:更进一步说,波的概念需要一个概念上的飞跃,因为,例如,当波穿过海洋时,每个单独的水分子并没有被带走,而是波是一种从组成水分子中产生的突发现象。可以这样理解,人类意识是存在于神经元“水分子”基础成分上的“波”,也可能存在于任何其他介质上。)

虽然对大脑原理的理解将允许我们在除了有机神经元之外的其他基底上模拟人类思维,但在可预见的未来,可能很难获得对人类大脑功能的抽象科学理解,因此纯工程模拟方法在近期可能更可行。

就像鸟类的空气动力学原理可以用来建造火箭并到达全新的太空领域一样,也许大脑功能和意识背后的科学原理可以用来建立人工智能,增强我们自己的思维,甚至将它们融合在一起,探索真正新的意识前景,在抽象出鸟类飞行的特定细节之前,我们甚至无法概念化。

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

同时使用仿真和模拟

因此,似乎当试图在另一个可以产生意识的物理系统中复制人脑时,我们可能需要两种方法的结合,一种是针对我们可能不完全理解的大脑组件的工程“仿真”,另一种是针对我们在更抽象的层次上理解的方面的基于科学的“模拟”。

这样,我们就可以利用它们各自的优势,避免它们在我们当前科技进步水平下的局限性。

例如:

  • 如果我们不知道每个神经元的确切内部工作情况,模拟神经元以达到相同的神经放电特征(可能涉及每个神经元内部发生的计算)可能是有用的。
  • 如果我们使用更有效的科学和算法原理来运行我们完全科学理解的大体解剖特征的模拟,而不是直接仿真,则可以节省我们的能量或计算需求。

不管仿真或模拟的具体组合,以及这种组合将随着科学和技术的进步而发展到何种程度,在复制人脑时明确区分它们是有用的。

哲学在科学技术中的效用

认知偏差的存在

科学家和技术人员倾向于对哲学持有从明确和积极的厌恶到冷漠的态度。我确实相信通过对科学和技术的理解而增强的好的哲学是非常有益的,但是很容易做出没有科学和技术基础的坏的哲学。

让我们考虑人类大脑中认知偏差的存在。

  • 认知偏差所涉及的任何神经架构是否也应该在仿真或模拟的人脑中复制?
  • 如果没有这些认知偏差,它“仍然”是人脑吗?如果不是,那么如果我们模仿或模拟一个存在于另一个基底上的复制人脑,它又怎么可能是人类呢?如果是的话,我们可能会盲目地模仿或模拟那些认知偏见,从而盲目地跟随过去几百万年的进化,而那时我们可以更好地设计。

这可能不仅仅是一个哲学练习,因为在仿真或模拟中实现这些认知偏差可能需要对神经元进行更深入的扫描,以获得更精细的细节,更多的数据处理,以及更多的计算或能量。

这是许多例子中的一个,但其他例子可能更抽象,例如:我们应该在多大程度上更倾向于可能需要更多计算来实现相同性能的仿真,而不是可能抽象掉一些不相关部分的模拟。

科学、技术和哲学可以相互借鉴

以前有一个问题,是科学和工程/技术哪个更基础更重要,哪个驱动另一个。但这是一个定义不清的问题。为什么?因为它们存在于一个相互促进的良性循环中:技术可以让更强大的科学得以实现,大型强子对撞机就是一个例子,而大型强子对撞机反过来又可以推动更好的信息技术,这些信息技术可以用来建立更令人印象深刻的技术,这些技术可以用于更好的科学。

同样,哲学有很大的效用,并有希望通过将科学和技术的注意力集中在重要的事情上,或者至少是未来的事情上,以良性循环的方式促进科学和技术的发展。

如上所述的人类大脑中的认知偏差最终会有影响吗?也许吧。也许不是。但考虑这些认知偏差是否是复制人脑所必需的,并真正复制它们是至关重要的。

科学、技术和哲学的进步必须同步进行,这样它们才能相互加强。可以这样理解,哲学可能是最难的,因为问题可能是无限的,甚至是棘手的,所以我们必须满足于足够好。

使用智能手机传感器和机器学习进行身体活动监控

原文:https://towardsdatascience.com/physical-activity-monitoring-using-smartphone-sensors-and-machine-learning-93f51f4e744a?source=collection_archive---------16-----------------------

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

Photo by CoWomen on Unsplash

坐着:最危险的活动之一

久坐行为已经成为世界范围内的一个主要公共健康风险。专家告诉我们,最低量的日常体育活动对于保持健康和降低糖尿病、心脏病和癌症等慢性疾病的风险是必要的。一些研究人员提出,除了不活动的总量之外,长时间坐着本身也可能导致这个问题。2017 年发表的一项研究发现,在控制其他因素后,一次静坐超过 30 分钟会增加死亡风险。久坐的总时间是一个独立的危险因素。同一团队的一项后续研究于 2019 年 1 月发表,发现减少久坐的持续时间没有任何好处,除非这些时间被身体活动(任何强度)取代。2019 年 4 月发表的一项研究发现,从 2007 年到 2016 年,坐着的时间增加了一个小时——成年人超过 6.5 小时,青少年接近 8.5 小时。

每个人口袋里的多传感器

随着用于工作和娱乐的各种尺寸的屏幕的激增,许多人发现自己一天中大部分时间都坐着。然而,同样的设备可以提醒人们保持活跃。智能手机包含许多可用于对运动进行分类的传感器,包括加速度计、陀螺仪、GPS 和磁力计(指南针)。GPS 定位只能在户外使用,但其他的在任何地方都可能有效。持续轮询智能手机传感器会消耗大量电力,并会很快耗尽手机电池。因此,一个有用的算法应该能够基于相对不频繁的传感器轮询来对活动进行分类。一些消息来源表明,智能手机陀螺仪比加速度计消耗的功率大得多,因此只有在绝对有必要解决手头问题的情况下,才应使用它们。

人类活动识别的一个问题

关于使用智能手机和可穿戴设备的传感器来检测和分类不同类型的人类活动,有大量的文献。经常使用的 UCI-HAR(人类活动识别)数据集,发表在 UCI 的机器学习知识库上,有来自 30 个对象的加速度计观察结果,这些对象被标记为行走、上楼、下楼、坐着、站着或躺着(原文如此)。

虽然 UCI 数据集和许多其他数据集要求受试者参与许多不同类型的活动,但对于提议的用例(监测和促进身体活动),区分每种活动类型并不是必要的。我们需要能够区分活动和不活动,并且我们还想知道活动的强度,例如步行与跑步的比较。(虽然一些研究表明,坐着可能比站着更糟糕,但我们只能肯定地说,这种风险在于久坐的行为。)这个项目的目标是利用普通智能手机的传感器数据开发一个模型,可以区分 a)活跃和不活跃状态,b)剧烈和不太剧烈的身体活动。

真实世界的数据集

有许多公开可用的人类活动数据集可用于模型开发和测试。我使用了曼海姆大学数据和网络科学研究小组创建的真实世界数据集。除了 UCI-HAR 数据集中相同的六项活动之外,该数据集还包括两项更活跃的活动(跑步和跳跃)。总共 8 个活动类别是:爬下楼梯、爬上楼梯、跳跃、躺、站、坐、跑/慢跑和步行。研究人员为 15 名受试者配备了 7 种身体姿势的智能手机或智能手表:胸部、前臂、头部、胫骨、大腿、上臂和腰部。我决定只使用“大腿”(口袋)位置的数据,假设这是测试中最常用的位置。该数据集包括来自以下传感器的读数:加速度、GPS、陀螺仪、光、磁场和声级。受试者被要求执行每项活动 10 分钟(跳跃除外)。传感器以 50 赫兹(每秒 50 次观察)记录。我的研究仅限于加速度计和陀螺仪的三轴(x、y 和 z 轴)数据。

探索性数据分析

我为执行 8 项活动中每一项活动的 15 名受试者分别创建了加速度计和陀螺仪数据散点图,x、y 和 z 维度以红色、蓝色和绿色显示。例如,这是一个正在行走的受试者的加速度计数据图:

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

同一个题材的一个情节坐看起来很不一样:

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

从这些图中可以看出,受试者被要求在开始指定的活动之前等待一小段时间。因此,每个活动周期的开始和结束的标签经常是不正确的。此外,通过检查这些图可以清楚地看出,并非所有的受试者都连续进行了指定的活动。例如,受试者 4 在几次跑步之间站立了几个时间段,这可以从下面看出:

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

更正标签

因为受试者并不总是在整个时间段内持续执行指定的活动,所以有必要对数据进行过滤,以去除否则会被错误标记的样本。我将原始数据分成两秒钟的窗口,每个窗口有 100 个观察值(50 赫兹)。我在每个主题/活动的每 100 个连续观察值上标注了一个样本号(去掉任何余数)。然后,我计算了每个样本的传感器数据的标准偏差。然后我画出了标准差。例如,以下是受试者 4 跑步的加速度计数据样本的标准偏差图:

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

可以清楚地看到对象不运行的时间。通过检查所有受试者的该图和类似的图,y 加速度计读数的标准偏差的阈值 5 被选为截止值。y 加速度计的标准偏差小于 5 的所有样本都从数据中删除。同样,为所有其他活动设定了阈值:静止活动(坐、躺)的最大值和运动活动的最小值。没有对站立进行过滤,因为受试者在记录期间没有转换到站立或从站立转换。

从 8 项活动到 3 节课

我最初测试了所有八个活动的模型。尽管机器学习模型可以适用于训练数据,但它们不会以足够的精度对来自未包括在训练集中的对象的数据进行概括。八项活动的最佳分类模型只能对验证数据产生 75%的准确度(当后者完全由新的受试者组成时)。这对于预期的目的来说是不够准确的,因为太多的错误会导致用户不信任、忽略和删除我们潜在的手机应用程序。此外,对于 PA 推广,没有必要知道活动的确切类型。因此,这些活动被分为以下三个 PA 类别:

  • 久坐(站、坐、躺)
  • 轻中度 PA(行走、上楼梯、下楼梯)
  • 精力充沛的 PA(跑、跳)

下面所有的模型结果都是基于将数据分成这三组。

将数据分为定型集、测试集和维持集

来自前 10 名受试者的数据用于开发和训练模型。其余 5 名受试者的数据留待最终测试。训练数据分为训练样本和测试样本。我尝试了两种方法:使用 Keras 中的“验证分割”设置随机选择样本,并手动将样本分为受试者 1 至 7 的训练组和受试者 8 至 10 的测试组。我发现有必要对训练和测试数据进行基于主题的拆分。随机分割意味着在训练数据中存在来自所有 10 个对象的观察结果。虽然最终的测试分数很高,但该模型在来自以前没有见过的受试者的数据上表现不佳,因为受试者之间存在显著差异。因为我们的用例涉及检测来自任何(以前看不见的)用户的 PA 的能力,所以确保该模型可推广到新的主题是至关重要的。“K 倍交叉验证”是训练和测试数据的另一种形式的随机分裂。人类活动识别中创建重叠样本的常见实践通过在训练和测试数据中包括相同的信息而使问题复杂化。HAR 研究中心对这些问题的一项研究发现“k-fold 交叉验证人为地将识别器的性能提高了大约 10%,当使用重叠窗口时甚至提高了 16%。”

使用手工制作功能的模型

我创建了一个汇总数据集,其中受试者进行的活动样本被分组到 100 个观察窗口中(代表 2 秒的测量)。我计算了加速度计和陀螺仪的三轴测量值(x、y 和 z 维度)的平均值、标准偏差和范围。这 18 个(3×3×2)特征被用于各种机器学习模型来预测该类(久坐、轻中度 PA、剧烈 PA)。测试的模型有逻辑回归、KNN、各种决策树,包括 XGBoost、SVM 和朴素贝叶斯。在验证数据上,逻辑回归提供了最高的准确性(0.973)和 F1 得分(0.956),略高于次佳模型。

对维持数据的测试

逻辑回归模型在由其余五名受试者组成的拒绝数据上进行测试。预测的总体准确率为 94%,加权平均 F1 得分为 0.54。这是按类别划分的混淆矩阵图:

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

对相关系数的检查表明,许多陀螺仪特性与加速度计特性高度相关(r > 0.9)。仅包括加速度计特征的逻辑回归模型与包括加速度计和陀螺仪特征的模型具有相同的精度和 F1 分数。在这个模型中使用陀螺仪数据没有好处。这一结果意义重大:仅使用一个传感器和简单的统计特征就可以非常准确地预测身体活动。

虽然这个简单模型的整体准确性非常高,但大约 600 个轻中度 PA 样本(全班的 11%)被错误地归类为“久坐”。更复杂的模型能做得更好吗?

神经网络模型

神经网络模型使用原始传感器数据,而不是使用“手工制作的特征”,在这种情况下,原始传感器数据被格式化为 100 个观察值(2 秒)x 6 个传感器读数的数组。因为数据有时间维度,所以使用递归图层是合适的。我使用门控递归单元(GRU)技术,因为它比 LSTM 具有更少的参数,并且在较小的数据集上可能具有更好的性能。卷积层可以通过帮助模型学习重要特征、防止过度拟合和减少参数数量来改善结果。批次标准化用于进一步减少过度拟合。最终模型包括:

  • 两个卷积层,具有 50 个过滤器、3 个内核和 ReLU 激活,每个卷积层后面都有一个池层和一个批处理规范化层(第一个池大小设置为 4,第二个池大小设置为 2)
  • 两个递归(GRU)层,每个层具有 64 个神经元和 tanh 激活(第二层具有 0.2 的递归下降)
  • 辍学率为 0.1 的辍学层
  • 代表要预测的三个类别的最终密集层。

在这个模型中有超过 55,000 个参数需要训练。虽然这种神经网络比逻辑回归模型的计算强度大得多,但它相对稀疏——一些神经网络有数百万个参数要训练。该模型仅在两个时期内使用 25 个样本的小批量进行训练。计算时间适中。

神经网络模型的性能甚至优于逻辑回归模型,达到 99%的准确性。大约有 100 个实际上是高强度 PA 的样本被错误地归类为轻中度 PA。这是一个非常小的错误率,并且是一个比以前的模型更好的错误类型,因为错误标记涉及身体活动的程度,而不是运动和久坐行为之间的混淆。

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

进一步的改进

这个模型只在 15 名受试者身上测试过。我想结合其他公共数据集来创建一个更强大的模型,包含更多的受试者、不同的硬件、不同的测试情况和不同的环境。此外,我想看看采样速率从 50 Hz 降至 10–25Hz 是否仍能产生稳定的模型,因为较低的采样速率意味着功耗显著降低。

这项研究的 Python 代码可以在我的 Github 页面上找到。

为线性回归选择合适的 MLA

原文:https://towardsdatascience.com/picking-the-proper-mla-for-linear-regression-4221ea5a8f2e?source=collection_archive---------20-----------------------

普通最小二乘法失败的地方,决策树成功了

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

Decision Tree Regression

在我的上一篇文章中,我谈到了选择特定的特征,并在普通的最小二乘公式中使用它们来帮助预测分子相互作用属性的标量耦合常数。我用一个相对较差的预测算法结束了它,并决定这是由于由我所有的 EDA 计算确定的不重要的特征。我将张贴我以前的图片以及只有重要特征的输出视觉效果。

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

你能看出区别吗?他们使用两种不同的功能。第一个包含权重为 150 或以上的所有特性,而第二个包含权重为 1500 或以上的特性。那时我意识到这只是一个糟糕的工作模式。

鉴于我之前的特征重要性是不正确的,我决定研究一个模型,该模型考虑了多个特征,并且通过主成分分析只保留重要的特征。这让我想到了决策树回归算法。现在,当大多数人谈论决策树时,他们指的是分类,但由于我试图寻找一个连续变量,它必须是一个回归。

首先,我加载了使用 pandas 从大规模数据库中创建的子样本 csv。然后,我使用下面的代码检查所有类别并删除它们。请记住,这些类别很少或没有重要性,并进行太多稀疏计数,它是有效的。

df= pd.read_csv('molecule_subsample.csv')for col in df.select_dtypes(include=[object]):
    print(df[col].value_counts(dropna=False), "\n\n")df= df.drop(columns=['molecule_name', 'atom_atom1_structure', 'type', 'type_scc', 'atom'])

现在我有了一个包含我想要的特性的合适的数据框架。我还决定将它保存为 csv 文件,以便将来可以更快地导入它:

df.to_csv('subsample_nocat.csv ',index=False)

然后我创建特征和目标变量,然后进行训练测试分割。我选择了较小的训练规模,因为即使这个子样本也包含了将近 50,000 个数据集。

feature= df.drop(columns=['scalar_coupling_constant'])
target= df[['scalar_coupling_constant']]feature_train, feature_test, target_train, target_test= train_test_split(feature, target, test_size=0.1)total feature training features:  419233
total feature testing features:  46582
total target training features:  419233
total target testing features:  46582

之后,就相对简单了。我加载了决策树回归器,并用我想要的标准填充它。知道我有一个相对较大的数据集,我选择了一个相当大的最大深度

DTR= tree.DecisionTreeRegressor(max_depth=75, min_samples_split=3, min_samples_leaf=5, random_state=1)DR= DTR.fit(feature_train, target_train)DR:
DecisionTreeRegressor(criterion='mse', max_depth=75, max_features=None,
                      max_leaf_nodes=None, min_impurity_decrease=0.0,
                      min_impurity_split=None, min_samples_leaf=5,
                      min_samples_split=3, min_weight_fraction_leaf=0.0,
                      presort=False, random_state=1, splitter='best')

我试图将它可视化,但我的电脑一直在崩溃,所以我决定采用另一种方法,对我的决策树进行交叉验证。我基本上重做了上面的代码,但考虑到了交叉验证:

drcv= DR.fit(feature_train, target_train)drcv_scores =cv(drcv, feature_train, target_train, cv = 10)drcv_scores:
{'fit_time': array([20.96234488, 20.751436  , 20.6993022 , 20.62980795, 20.80624795,
        20.72991371, 20.73874903, 20.65243793, 20.55556297, 20.36065102]),
 'score_time': array([0.03302193, 0.0274229 , 0.02751803, 0.02114892, 0.02561307,
        0.02700615, 0.02410102, 0.02259707, 0.02510405, 0.02420998]),
 'test_score': array([0.99999431, 0.99998765, 0.99999402, 0.99999096, 0.99999444,
        0.99999466, 0.99998819, 0.99999362, 0.99999481, 0.99998841])}print("regression score: {}".format(drcv.score(feature_train, target_train)))regression score: 0.9999964614281138

看看结果。它有 99%的预测是正确的。这只能意味着一件事:数据被过度拟合。不管怎样,我都愿意看透这一切。我知道我可以通过降低我的最大深度来调整这种过度拟合,并在稍后更改我的树最小节点和树叶,以及实现随机森林集合方法。

我再次运行了上面的代码,但是做了一点小小的改动:

cv= cross_validate(DR,feature_train,target_train,n_jobs=-1,return_train_score=True)

我还想查看我的训练成绩状态:

{'fit_time': array([19.88309979, 19.68618298, 19.56496   ]),
 'score_time': array([0.06965423, 0.08991718, 0.07562518]),
 'test_score': array([0.99999126, 0.99998605, 0.99999297]),
 'train_score': array([0.99999497, 0.99999486, 0.99999842])}

这表明我的训练和测试几乎没有任何区别。即使在过度配合的情况下,也不应该发生这种情况。我认为这可能是由于发生了一些代码泄漏,或者我在编写变量时犯了某种形式的错误。所以我决定再看看几个结果:

DTR.score(feature_test, target_test)
0.9999870784300612DTR.score(feature_train,target_train)
0.9999964614281138

这显示了两个不同的数字,虽然非常接近。因此,虽然我在名字上没有犯任何错误,但似乎因为我如何建立我的树,一切都被过度拟合了。然后我决定检查最后两个指标。现在,由于它们是两种不同的数据格式,我必须先将其中一种更改为 numpy 数组,然后绘制:

predict=DTR.predict(feature_test)
type(predict):
numpy.ndarraytt_np= target_test.to_numpy()
type(tt_np):
numpy.ndarrayplt.rcParams["figure.figsize"] = (8, 8)
fig, ax = plt.subplots()
ax.scatter(predict, tt_np)
ax.set(title="Predict vs Actual")
ax.set(xlabel="Actual", ylabel="Predict");

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

Look at how beautiful it is!

哇,我没想到会这样。虽然我的预测错过了一些,但看起来它几乎把所有事情都做对了。这让我得出结论,这个机器学习模型也是不正确的,但我会在尝试随机森林后获得更好的洞察力。

PID 控制器介绍

原文:https://towardsdatascience.com/pid-controller-intro-26fda41aaa59?source=collection_archive---------6-----------------------

控制自动驾驶汽车沿着路径行驶

PID 控制器是一种调节应用程序以平滑地跟随某个值或路径的方法。我在这里第一次学到了这个概念,它介绍了如何驾驶汽车沿着特定的路径行驶。虽然一个完整的应用程序解释可能非常复杂,但它以一种超级优雅和简洁的方式总结了背后的数学,并使这一思想可以很容易地扩展到许多现实生活中的问题。在本帖中,让我们跟随关键结构,探索 PID 控制器如何工作。

在本帖中,我们将遵循以下路径:

  1. P :比例
  2. PD :比例微分
  3. PID :比例-微分-积分

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

基础设置

让我们通过一个问题的实现来学习这个想法。假设我们有一个机器人汽车对象,我们希望汽车能够控制自己沿着一条路径行驶,在这种情况下,这条路径将是一条直线,汽车控制自己的唯一方法是调整它的转向或方向,以便它可以逐渐优雅地接近这条路径,并在到达那里后沿着这条路径行驶。简单地说,问题是:

通过改变方向盘来控制自动驾驶汽车沿着直线行驶

car 对象的完整实现在这里是(整个对象的解释在我们的范围后面)。基本上,机器人对象遵循以下结构:

set功能设置汽车的初始坐标和方向。我们需要知道的是,每次我们都需要给机器人发出steering的指令,这样它就可以调整自己来接近路径。

P

p 代表比例。事情是这样的,我们的机器人坐在坐标为(x, y)的二维世界里。假设目标路径是y = 0,那么当前朝向目标的误差是y — 0 = y,基于该误差,我们应该相应地调整汽车的转向。那么如何调整转向,以便我们可以快速减少误差呢?如果你驾驶的汽车偏离了你的目标路线,你会怎么办?

一个直接的方法是根据误差按比例调整转向,这意味着你离目标越远,你驾驶汽车的角度就越大。考虑到这一点,我们有了第一个解决方案:

我们在n步骤中调整汽车,在每一步中,我们根据误差robot.y成比例地驾驶汽车:

steering = -tau*robot.y

其中tau是我们分配给误差的权重。(注:汽车以speed = 1移动,由于时间戳为 1,所以distance = speed * 1 = speed

让我们画出汽车的轨迹:

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

P Control

我们设定我们的机器人从(0, 1)开始水平前进。轨迹在目标路径外振荡。看起来我们的转向太过激烈,以至于赛车超过了我们的目标,当它试图转向时,又超过了目标。显然坐在这样的车里会很头疼。那么,我们可以在接近目标时减小转向角吗?

帕金森氏症

问题引出 PD 控制,其中 D 代表导数。这个想法是,随着误差的减少,我们的汽车应该反向转向,以避免超调,而不是不断转向,导致振荡。

因此,我们应该在控制过程中添加的新项是δy/δt,其中δt为 1,因此δy = current_y — last_y。实施将是:

这里的导数项是dev = robot.y — prev_ctetau_d是它的权重。结果轨迹如下所示:

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

PD Control

看起来很完美!现在一切看起来都很好,但实际上这个模型并不稳健。我的意思是如果存在固有的系统缺陷怎么办?如果你的车轮在开始时有一点小故障,总是转移到另一个方向,PD 能够克服这一点吗?

答案是否定的。让我们举个例子:

这里我们set_steering_drift给汽车的方向添加了一些噪声,结果变成了:

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

PD Noise

它远离我们的目标路径振荡。原因是,虽然我们的车正在转向目标,但它不能抵消固有的系统偏差。

PID

为了克服这个问题,我们需要第三项 I,它代表积分,它有助于监控误差,如果在一定时间内误差没有减少,汽车应该增加更多的转向。

在我们的例子中,积分实际上是每步误差的总和,实现方式如下:

在每一步,当前误差robot.y被加到sum_cte上,并且tau_i是该项的权重。因此通过增加这一项,汽车避免了在远离目标的某个地方振荡的机会,因为这一项将不断变大,转向角将相应调整。

这给出了校正后的结果:

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

PID Control

在同样的转向噪音下,这一次机器人汽车仍然能够到达目的地。

结论

另一个需要注意的是 P、I 和 d 的权重。这些参数需要仔细调整,不同的权重选择会导致显著不同的性能。您可以通过查看的完整实现来测试和演示它。

总而言之,PID 控制器其实挺有意思的,尤其是被这么直观简单的讲解。你可以把三个组成部分 P、I 和 D 想象成负责一项任务的三个不同方面的三个不同的人:

  • P :将应用推向目标状态的主要力量
  • I :全程监控,遇到困境时帮助跳出困境
  • D :监控 P 并在必要时进行计数器测量

最后,PID 控制器的应用绝对不仅限于这个用例,您可以应用和探索更多的乐趣!

参考:

  1. https://classroom . uda city . com/courses/cs 373/lessons/48743150/concepts/4a5b 7329-1df 6-48d 0-9f5b-146 F9 e 58 ad 22

饼图——来饱餐一顿吧!

原文:https://towardsdatascience.com/pie-charts-come-get-your-fill-ing-bad92645afdb?source=collection_archive---------41-----------------------

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

“Which of these pieces is biggest?” and other problems with pie charts

这是我们的感恩节。我认为这将是一个伟大的时间来谈论,你猜对了,饼状图!我知道,我知道,我怎么敢选择心爱的南瓜饼形象来谈论那些令人厌恶和最讨厌的图表/图形。底线是,尽管几万年来我们人类热爱圆圈,但饼状图与趋势背道而驰,人们完全讨厌它们。这是为什么呢?!我决定看看我们对圆圈的热爱的历史,然后看看饼状图周围的情绪,最后我会给你留下一些使用这个两极分化图的有用指南。

对圈子的热爱永无止境

人们喜欢圈子。这是没有办法的。我们已经这样做了,因为我们有能力把它写下来。有一本巨著概述了人类文化圈的历史(这里见作者关于这本书的媒体博客)。利马提出了三个普遍的理论来解释为什么我们如此热爱圆圈。第一个理论来自进化论,认为圆形和曲线形相比尖锐的边缘让我们放松,尖锐的边缘提醒我们危险,如动物的牙齿(作为参考,我建议看电影《乌鸦》)。

第二个理论是,圈子只是让我们快乐,或者至少我们把圈子等同于积极的情绪。这遵循了第一个基于进化的理论,并走得更远,声称我们认为圆形具有令人愉快的项目,如婴儿的脸。(也许我们现在已经进化到可以用同样的眼光看待南瓜派了。)

利马提出的最后一个理论与我们眼睛的形状有关(眼睛本身是圆的)。因为我们是通过异形镜片来观察世界的,所以与我们眼睛互补的形状比那些边缘粗糙或锯齿状、与我们眼睛不互补的形状更有吸引力。

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

From Manuel Lima’s post regarding his book. Pleases the eye, but then why do we hate pie charts so much?

令人讨厌的饼图——我们在哪里转错了弯?

因此,随着数千年的进化支持我们对圆的热爱,使用形状来传达数据的意义应该是一件显而易见的事情,对吗?显然不是。问问任何一位数据科学家,或者更好的数据科学讲师,他们对饼状图有什么看法。这是我们在数据科学沉浸式课程中学到的首批数据可视化课程之一。“什么时候使用饼图合适?”响亮、响亮的回答没有留下任何解释的余地。“绝不!”

但是,等等…我们喜欢圆圈。它们补充了我们的眼睛(谁不喜欢这方面的好“赞美”呢)。我们哪里出错了?通过一些研究,你可以看到饼状图从一开始就被讨厌,因为它是一种向数据传达意义的低效和混乱的方式。这些论点是有道理的,我们并不擅长辨别每一块的角度,所以我们可能无法掌握一个馅饼“一块”相对于其他馅饼的大小。这违背了饼图的初衷,因为饼图旨在显示图表中类别作为整体一部分的统计比例。

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

Marshall Eriksen gets how to diversify his data visualization game.

这些图表的致命一击出现在 1984 年,当时统计学家 William Cleveland 和 Robert McGill 写了一篇论文,将条形图与饼图进行了比较,结果是所有圆圈爱好者都吃了一个大饼。在其他图表中,条形图更容易解释和显示分类值的差异。添加的类别/变量越多,饼状图的使用就失去了有效性,它只会变得一团糟。甚至不要从甜甜圈图开始,它没有圆形那么进化,但也同样受人喜爱。

恰当使用饼状图

到目前为止,我们已经看到了圆形硬币的两面:人们喜欢圆形,但是饼状图却被普遍厌恶。有折中的办法吗?在这个问题上,有什么办法可以得到一半香肠一半蔬菜?我想是的,答案可能和感恩节吃馅饼一样:饼状图可以在适当的情况下使用,但要适度使用。以下是一些使用饼图的规则,基于数据科学社区的建议:

  1. 饼图只能处理一组数据!南瓜苹果派听起来不错,但是你不能把它们混合在一起并期待好的结果。
  2. 负值或零值=饼图的负面使用。你不能展示一块已经吃过的馅饼。
  3. 最多 7 个类别——在一个饼图上放超过 7 个类别会冲淡意义,让浏览者感到困惑。
  4. 移除图例并使标签易于查看——不要让查看者的眼睛在图例上来回移动,这对于饼图来说效果不好。
  5. 堆叠饼图以比较大小——也就是说,如果您真的想比较它们。
  6. 最重要的是,考虑您想用数据讲述的故事。饼图最能显示类别间的不同比例,总计 100%。例如,如果我想展示这个感恩节我吃了多少,我可以用饼图来展示与火鸡和甜点相比,我吃的边数不成比例。

世界将永远喜欢圆圈,但数据可视化社区将永远讨厌饼图。也就是说,饼图有一些合适的用途。不过,当有疑问时,我的建议是坚持一些不那么两极化的东西,除非你想从精通数据的受众中获得增长。

祝大家感恩节快乐!

什么是 PIMCore:赢得 DXP 挑战赛的 PIM

原文:https://towardsdatascience.com/pimcore-the-pim-that-let-you-win-the-dxp-challange-eb409a91f14e?source=collection_archive---------37-----------------------

发现 PIMCore,它是一款 MDM、PIM 工具,可以满足您的所有需求(或者几乎是承诺)

在我作为开发人员的职业生涯中,我讨厌很多事情,但是在列表的第一位,有读取和保存数据。我发现花时间在 ORM 上映射字段,创建 CRUD 例程,把大脑放在一个小小的业务逻辑层上是如此无聊。我不仅讨厌它,而且觉得它是对时间的极大浪费。这段时间本应该花在我能带来价值的事情上,比如基础设施、性能或提高可用性。

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

Pimcore logo from Pimcore press media kit

可能这就是为什么当我遇到 PIMCore 时,我爱上了它。PIMCore 拥有我见过的最聪明、最实用的数据管理。相信我,我尝试了很多数据管理工具和 RAD 框架。PIMCore 背后的想法很简单:创建一个系统,在这个系统中,你可以描述你的数据必须如何编辑和组成,并且可以很容易地使用这些数据。伟大的结果是数据定义由一个简单的 UI 管理,它甚至允许非程序员描述数据以及必须如何编辑数据。这允许创建一个快速简单的过程,分析师或非技术人员只需看一眼就知道系统在做什么。通过这种方式,所有浪费在重复工作上的开发时间都被去除了,我们可以专注于客户真正的需求。好看吗?我喜欢它。

如果您不相信阅读本文并了解 PIMCore 是一个好机会,那么您必须知道,您放入数据库的每一条记录都可以使用 GraphQL 查询进行搜索。

这一切怎么可能?感谢 PIMcore 用来存储数据的强大方法,它定义了关系、字段类型等等。

太好了!让我们详细看看 PIMCore 是如何工作的。

PIMCore 用人类的话来说是什么

名字本身就解释了 PIMCore 是什么:一个 PIM(产品信息管理)。名字没有说出来的才是最重要的部分。PIMCore 是一把多工具的瑞士刀,帮助我们实现数字化转型。它提供了许多功能,结合在一起,让所有的军队赢得 DXP 挑战。仔细想想,将 DAM、PIM、MDM 和 DataHub 放在一个工具中是一个非常好的结果。

这种配置让您无需编写一行代码就可以管理结构化和非结构化数据。

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

Pimcore in action, image from Pimcore press media kit

Pimcore 如何帮助数字化转型

Pimcore 由几个特性组成,这些特性结合在一起构成了整个 DXP 平台。在第一次安装之后,你给了客户一个强大的生态系统,里面有他需要的一切,甚至更多。根据您的需要,您可以在多种配置中使用它:

  • 个人信息管理
  • 主数据管理(Master Data Management 的缩写)
  • 无头 CMS
  • 电子商务
  • 客户关系管理
  • 羧甲基淀粉钠

这些功能有助于解决 DXP 挑战,推动数字化转型。怎么会?只看下面五点。

数据管理

如今,从技术到制造,数据是每个公司的资产。Pimcore 整合来自多个来源的数据并集中信息。好消息是,所有信息都在一个地方,无需任何额外的努力就可以交付给其他挑战。

数据集成

API 是 2019 年最好的集成,但我们也有遗留系统。Pimcore 通过 CVS export\import 支持遗留系统,可以通过用户界面进行配置,提高了大多数公司的集成度和接受度。对于所有新的东西,API 已经准备好了,开箱即用,没有任何惊喜。

免费开源,社区支持

Pimcore 是开源的,可以免费使用,不需要任何许可费用。这意味着较低的准入门槛和在采用前测试的可能性。社区很大而且很活跃,你也可以要求付费的企业支持。

现成的解决方案

通过安装它,你可以实现门户网站,电子商务没有任何限制。你可以编辑任何内容或任何数据,而无需询问开发者。这有助于专注于内容,而不是被技术问题分散注意力。你可以在不接触内容的情况下改变整个网站的图形,因为 CMS 与内容是分离的。您可以在一个地方编辑所有多语言产品,并在完全遵守公司政策的情况下分发给营销渠道。

上市时间,经济高效

都包括在内了。您可以一次性交付覆盖 DXP 多个地区的解决方案。这降低了集成、维护和开发的成本。省钱本身是好事,但更短的上市时间会带来不同。

利用 Pimcore 打破孤岛

Gartner 和其他大型分析师对孤岛的担忧正在减弱,他们要求我们作为顾问,如果没有任何方法可以让他们一起沟通,就打破孤岛。另一个选择是信任大型供应商,住在一个非常昂贵的大筒仓里。这两种解决方案对每个公司来说都是一个巨大的挑战。大公司有资金实现飞跃,但时间非常有限,小公司总是在寻找经济高效的解决方案。在这种情况下,PIMCore 是上市时间的替代方案,可以帮助您快速实现数字化转型。事实上,该产品是免费的,易于设置,并可以与每一个遗留系统集成,因为它的动态导入\导出系统可以处理 CSV 文件。我们所有的遗留系统的问题,但肯定我们知道,与 CSV 文件的工作是他们可以处理没有任何头痛。对于所有的新系统,都有 API rest 或 graphQL,所以我所期望的是,任何新系统都会乐于与他交互(尊重而不是处理遗留的 CSV 文件😉).在我看来,PIMCore 的方法与大型供应商非常相似。您拥有这个工具,它完成了开箱即用的大部分工作,并为您提供了大多数情况下所需的一切。只有一个能做所有事情的单一工具似乎被供应商锁定了?这就是你每次选择工具的风险。也许有许多工具可以更好地满足单一需求。你可以考虑得到最好的,购买多个垂直解决方案,让大家一起讨论,但我们再次陷入孤岛问题:沟通。所以,问题是没有什么是完美的。对于大多数情况,PIMCore 都很适合,并给出了具体的上市时间解决方案。

带什么回家

PIMCore 是一个非常有趣的帮助管理数据的工具。基本上是因为它的强大,可以用来将最重要的数据带入公司。推出数字化转型的最重要功能,您可以使用它来管理您的网站、门户、PIM、电子商务和 DAM。此外,您可以启用数据中心功能,在整个公司范围内共享黄金记录。

你为什么需要 PIMCore?

  1. 一致且集中的数据
  2. 筒仓破坏
  3. 数字转换加速器
  4. 全渠道推动者
  5. 数据中心

PIMCore 的优势

  • 全在一个产品中。只需安装到公司,一次性解决多个问题
  • 免费和开源。没有饲料,没有限制。由强大的社区支持
  • 附带许多功能,您现在并不需要,但当时机到来时,您将做好准备
  • 经济高效的定制易于实施。

PIMCore 的局限性

  • 基本上是一个单一的应用程序。也可以用在复杂的场景中,但是性能和流程的中断要管理得很好,以避免范围蔓延。

从 Salesforce 到 MySQL 的管道数据,无需外部连接器

原文:https://towardsdatascience.com/piping-data-from-salesforce-to-mysql-without-external-connectors-57a822b1d75b?source=collection_archive---------24-----------------------

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

我希望这篇文章可以拯救那些需要在没有外部连接器的情况下将数据从 salesforce 传输到 MySQL 的人,因为您的上级要求您这样做。我自己在找到一个简单的方法之前遭受了很长时间,所以现在让我们走吧!

你需要什么

  1. Salesforce lightning 帐户(以及一些关于 Salesforce 对象的知识)
  2. MySQL 凭证
  3. 使用 npm 安装的 jsforce(以及 node.js 的一些知识)
  4. 一个好的代码编辑器(:

别担心,我会和你一起检查零件!

1。Salesforce lightning 帐户

因此,如果您还不知道,salesforce 将帐户、案例等项目存储到对象中。对象由字段组成,每个字段都有一个类型。我们今天要做的是将所有账户数据导入 MySQL。

获取您的安全令牌

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

security token from salesforce lightning page

稍后需要安全令牌来使用 node.js 连接到 salesforce

现在这一部分已经完成,让我们转移到 mySQL

2.MySQL 凭证

如果你现在用的是 mySQL,你会知道有用户名和密码以及主机。因此,您将需要这些信息来连接到您的帐户+您想要连接的数据库。

你需要进入 MySQL,点击数据库

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

然后,从下拉列表中,单击“管理连接”

查看您的连接参数。

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

现在,让我们使用“创建数据库 test_db”和随后的“创建表 test_table 值”创建一个新的数据库 test_db (我们将在其中存储 test_table 以加载 salesforce 数据。

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

3.节点 js 脚本

创建一个您选择的目录,并执行 npm init 来获取所有需要设置的文件。如果没有,您需要安装 npm!

现在创建一个 config.js 文件来存放这些凭证。

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

How the config file should look like

这样,我们将使用**‘NPS install jsforce’安装 js force。**

现在让我们对 jsforce 做一个测试连接。

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

基于文档,使用 conn.login,conn.login(用户名、密码+ salesforce 安全令牌)。然后,您应该不会得到任何错误代码(:

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

是时候把所有东西放在一起了。我们的想法是,首先要连接到 mySQL,并确保它是连接的。接下来,我们将连接到 salesforce 并使用 jsforce wrapper 来查询数据,如使用 SQL langauge,然后将其导入 mySQL(:

var jsforce = require('jsforce')var connection = require('./config.js')connection.connect(function (err) {if (err) {return console.error('error:' + err.message);}//console.log('Connected to MySQL');var conn = new jsforce.Connection({});// password + security tokenconn.login('<login email>', '<password + security token>', function (err, userInfo) {if (err) { return console.error(err); }// Now you can get the access token and instance URL information.// Save them to establish connection next time.//console.log(conn.accessToken);//console.log(conn.instanceUrl);// logged in user property//console.log("User ID: " + userInfo.id);//console.log("Org ID: " + userInfo.organizationId);var records = []var query = conn.query("Select Id,Name FROM Account").on("record", function (record) {records.push(record);console.log(record.Id)let sql = 'INSERT INTO test_table VALUES (?,?)';let data = [record.Id, record.Name]connection.query(sql, data, (err, res, fields) => {if (err) {return console.error(err.message);}console.log('Rows affected:', res.affectedRows);})}).on("end", function () {connection.end(function (err) {if (err) {return console.log('error:' + err.message);}console.log('Close the database connection.');});//console.log(records[0].Id);//console.log("total records is :" + query.totalSize);//console.log("total fetched is :" + query.totalFetched);}).on("error", function (err) {console.log(err);}).run({ autoFetch: true, maxFetch: 4000 });});})//let sql = 'INSERT into test_db VALUES (xxx)  '

有了那个,你应该得到这个。

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

这并不难,对吧!

我希望这在某种程度上帮助了你!如果你也有这个问题,请分享给你的朋友!

数据规范化的陷阱

原文:https://towardsdatascience.com/pitfalls-of-data-normalization-bf05d65f1f4c?source=collection_archive---------15-----------------------

生命科学的数理统计和机器学习

标准化如何导致单纯形中的虚假相关

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

Image source

这是专栏第四篇生命科学的数理统计与机器学习T5。在本专栏以及 生命科学的深度学习 中,我一直在反复强调,我们在生命科学中处理的数据是高维度的,这一事实我们并不总是意识到并且适当地考虑到。今天,我们将讨论另一个典型的陷阱,即如何执行数据标准化您可能会在单形空间中结束,在那里欧几里德距离不再有效,经典的频率统计数据失效。

为什么要归一化数据?

数据标准化对于分析【NGS】数据,例如 RNA 测序(RNAseq)宏基因组学 非常重要,以避免由于技术人为因素造成的混淆效应。事实上,有时一个基因在患病个体中的表达似乎比健康个体高,这仅仅是因为由于技术噪音,所有基因的总表达,生物信息学术语中的测序深度文库大小碰巧在患病个体中更高。例如,如果你为我在这一系列文章中一直使用的癌症相关成纤维细胞(CAFs) 数据集绘制所有细胞的库大小,你会发现细胞与细胞之间的巨大差异,这些差异可能具有生物学或**技术(噪声)**性质。

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

Library sizes (total expression of all genes) for Cancer Associated Fibroblasts (CAFs)

为了安全起见,通常假设细胞之间的总基因表达应该没有太大差异,观察到的测序深度的巨大差异是由于技术偏差。因此,通过简单地将每个基因的表达除以所有基因的总基因表达(文库大小)来均衡细胞间的“平均”基因表达是非常诱人的。这种方法在 RNAseq 中被称为文库大小归一化,在宏基因组学社区被称为总和缩放(TSS)

标准化会导致虚假的相关性

在这里,我们将证明如果我们天真地将文库大小标准化应用于 RNAseq 基因表达数据会发生什么。为了简单起见,让我们模拟两个基因的表达。我们独立地从 负二项分布 中得出它们的表达值(计数),因此基因应该不相关,我们可以通过计算 Spearman 相关性容易地确认它:

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

我们可以看到,Spearman 相关性ρ= 0.001,p 值= 0.99,所以根本不显著相关。从基因 1 对基因 2 的图中,我们确认两个基因之间没有可见的相关性。现在让我们应用库大小归一化,这意味着每个计数将除以来自相应样品/柱的计数总和。之后,我们再次计算 Spearman 相关系数,并绘制两个基因的表达图。

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

在这里我们可以看到一些惊人的东西。现在,这些基因似乎完全相关。Spearman 系数ρ=-1,p 值非常显著,该图显示了两个基因之间的完美相关性。

发生了什么事?看起来,通过应用库大小标准化,我们发现了一种新的生物学!

基因在标准化之前是不相关的,但现在它们似乎一起表达(共表达)。等一下!我们知道,我们没有模拟两个基因相关/共表达,我们模拟了数据,所以我们知道真相:基因 不应该相关,而是 它们在文库大小标准化之后。真是自相矛盾!

合成数据和单纯形空间

我们刚刚观察到的效应叫做比率的虚假相关。卡尔·皮尔逊(还记得皮尔逊相关系数吗?)最初是推动库大小规范化的人。然而,在他发现虚假相关性的影响后,他强烈反对通过库大小/总和来进行数据标准化。

库大小标准化的问题是给定样本的跨基因计数总计为 1 ,即它们不再是独立的,而是受限的,因此它们变成 组成的 。通过构建复合数据,您不再处于传统频率统计所基于的欧几里得空间,因为欧几里得空间/距离是高斯分布的结果。事实上,你最终会进入单形空间,在这里传统的统计方法不再适用,因为两点之间的距离不再是欧几里德距离,而是“带约束的欧几里德距离”,即 艾奇逊距离

如果您在单纯形空间中,您不应使用任何传统的统计方法,如线性回归、相关或主成分分析(PCA ),因为它们基于数据点之间的欧几里得距离。而且如果你在做 RNAseq 分析,文库大小归一化可能会彻底毁了 基因网络分析 ,这对基因表达数据的生物学解读非常重要。

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

Library Size Normalization may severely damage the gene network analysis, image source

如果您仍然想对成分数据使用 PCA,您应该执行对数比转换之一,将数据从单纯形转换回欧几里德空间:加法(alr)、中心(clr)或异构(ilr)对数比转换

单纯形空间的效果似乎是 众所周知的 宏基因组学 区域,这里的社区通常使用对数比变换或 累积和缩放(CSS) 而不是总和缩放(TSS)。令人惊讶的是,我从未在 RNAseq 或 scRNAseq 文献中听到任何关于单形空间偏差的提及。对数比变换(alr,clr,ilr)使用对数函数,我假设这就是为什么 RNAseq 人喜欢对数变换他们的数据,而没有意识到这种操作实际上允许他们放弃单纯形空间

为什么要 TPM 正常化?

有趣的是,【TPM】最近成了一种流行的归一化策略。 GTEX ,也许是最大的公共 RNAseq 资源,默认提供基因表达数据作为 TPM 标准化计数。

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

GTEX RNAseq resource provides TPM normalized gene expression by default

根据定义,给定样本的 TPM 计数总计为一百万,这是一个单纯形空间约束。因此 TPM 计数并不比库大小标准化计数更好,因为它们也遭受单形空间偏差,并且不应该天真地对这些计数应用例如 PCA。很多 GTEX 用户似乎并不知道这个陷阱,在 GTEX 门户上没有提到 。因此,我要问所有 GTEX 开发者、用户和 RNAseq 社区的问题是:

你们意识到你们是通过使用 TPM 标准化基因表达计数在单纯形空间中工作的吗?

摘要

在这篇文章中,我们了解到 RNAseq 数据标准化避免技术偏差的重要一步,然而文库大小标准化可能导致基因之间虚假的相关性。这是因为库大小标准化的表达式值不再是欧几里德空间中的而是单纯形空间中的传统的 频数统计中断对数比变换必须被应用以避免错误的结果。

在下面的评论中让我知道生命科学中的哪些分析对你来说是特别神秘的,我会在这个专栏中尽力解答。在媒体关注我,在 Twitter @NikolayOskolkov 关注我,在 Linkedin 关注我。我的下一个帖子将是关于神秘的孟德尔随机化,敬请关注。

使用 Python、SQL 或电子表格透视数据

原文:https://towardsdatascience.com/pivoting-your-data-using-python-sql-or-spreadsheets-62736ba23921?source=collection_archive---------9-----------------------

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

如今,收集数据似乎比以往任何时候都容易,但这并不意味着你总能以一种能提供你所寻找的洞察力的方式来收集数据。有时,您需要以改变数据组织的方式来操作数据,以便可以从一个新的角度来查看数据。透视数据通常是重新组织数据列和行的一种简单方法,可以将它们转换成组、统计数据或摘要。本文将向您展示使用 Google sheets、Microsoft SQL Server Management Studios 和 Pandas Python 库等工具透视数据的三种简单方法。

如果你想跟进,你可以从 kaggle 下载我的期权时间和销售数据:

[## 期权市场交易

下载数千个项目的开放数据集+在一个平台上共享项目。探索热门话题,如政府…

www.kaggle.com](https://www.kaggle.com/bendgame/options-market-trades)

使用熊猫在 Python 中旋转

Pandas 是一个强大而流行的 Python 数据分析库。它允许您创建数据框,以类似于电子表格或数据库表的结构来查看和操作数据。您可以使用熊猫创建数据透视表,只需几行代码!我将向您展示如何透视列或行:

  1. 导入依赖项和数据:
import pandas as pd
import numpy as np#read your csv data to a Data Frame
data = pd.read_csv(r'C:\Users\Admin\Desktop\Edge\optionsTradeData.csv')#check the data
data.head() 

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

2.使用 Pandas.pivot_table 函数创建类似电子表格的数据透视表:

pd.pivot_table(data, index = ['Sector'], values = ['Spent'], aggfunc = np.sum)

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

您可以将扇区设置为列,而不是将其用作索引:

pd.pivot_table(data, columns = ['Sector'], values = ['Spent'], aggfunc = np.sum)

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

透视您的电子表格

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

查看我们的数据,假设我们想要按部门合计支出金额。数据透视表使计算变得简单。Microsoft Excel 和 Google Sheets 具有内置的透视功能,可以轻松转换您的电子表格。要在 google sheets 中创建数据透视表,请遵循以下步骤:

1\. Data > Pivot table.
2\. Set the Data range.
3\. Select an insert option data. I recommend New sheet.
4\. Click Create.

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

您将看到一个空表和透视表编辑器,允许您设置行、列、值和过滤器。如果您对数据透视表完全陌生,Google Sheets 会为您提供建议的数据透视表,让您轻松入门:

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

要获得部门的总支出,我们需要设置我们的行和值:

1\. Click Add Rows.
2\. Select sector.
3\. Click Add Values.
4\. Select Spent.

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

您已成功透视了数据,如下所示:

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

SQL 中的透视

SQL 是一种强大的查询语言,允许你在关系数据库中检索和操作数据。这是一门相当容易学习的语言,如果你不熟悉它,我强烈推荐探索基础。我在工作和家庭中使用微软 SQL Server 和 SQL Server Management Studios ,所以这是我在我的例子中使用的风格,但是有几种不同的数据库/SQL 环境可供您使用:MySQL、PostgreSQL、SQLite 和 Oracle Database,仅举几例。

Microsoft SQL Server 允许您使用 PIVOT 关系运算符来旋转和聚合您的数据,将其转换为数据透视表。这是微软文档中透视语法的一个示例:

SELECT <non-pivoted column>,  
    [first pivoted column] AS <column name>,  
    [second pivoted column] AS <column name>,  
    ...  
    [last pivoted column] AS <column name>  
FROM  
    (<SELECT query that produces the data>)   
    AS <alias for the source query>  
PIVOT  
(  
    <aggregation function>(<column being aggregated>)  
FOR   
[<column that contains the values that will become column headers>]   
    IN ( [first pivoted column], [second pivoted column],  
    ... [last pivoted column])  
) AS <alias for the pivot table>  
<optional ORDER BY clause>;

从输出您想要透视的数据的 SELECT 语句开始:

(select sector, spent
from v_FlowTotal)

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

从该数据中,选择要透视的列。在我们的示例中,我们希望旋转扇区:

select [Non-Cyclical Consumer Goods]
,ETF
,Healthcare
,Utilities
,MISC
,[Cyclical Consumer Goods]
,Telecommunication
,WEED
,Financials
,Energy
,[Basic Materials]
,Industrials
,REIT
,Technology
FROM (
  select sector, spent FROM v_FlowTotal ft
) as SourceTable

然后应用 PIVOT 运算符以及您的聚合函数:

select [Non-Cyclical Consumer Goods]
,ETF
,Healthcare
,Utilities
,MISC
,[Cyclical Consumer Goods]
,Telecommunication
,WEED
,Financials
,Energy
,[Basic Materials]
,Industrials
,REIT
,Technology
FROM (
  select sector, spent FROM v_FlowTotal ft
 ) as SourceTable
PIVOT (
  sum(spent)
  for sector IN (
  [Non-Cyclical Consumer Goods]
  ,ETF
  ,Healthcare
  ,Utilities
  ,MISC
  ,[Cyclical Consumer Goods]
  ,Telecommunication
  ,WEED
  ,Financials
  ,Energy
  ,[Basic Materials]
  ,Industrials
  ,REIT
  ,Technology)
)As PivotTable

输出将如下所示:

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

最后备注:

虽然本文将帮助您开始使用数据透视表,但是了解它们所提供的所有功能的最好方法是通过修补和摆弄这些功能!数据透视表易于创建,并允许您通过更改查看数据的方式来获得对数据的洞察力。

谢谢大家!

—埃里克·克莱本

Pix2Pix

原文:https://towardsdatascience.com/pix2pix-869c17900998?source=collection_archive---------5-----------------------

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

Shocking result of Edges-to-Photo Image-to-Image translation using the Pix2Pix GAN Algorithm

本文将解释一篇关于使用条件 GANs 进行图像到图像翻译的流行论文 Pix2Pix 的基本机制,以下是该论文的链接:

[## 基于条件对抗网络的图像到图像翻译

我们研究条件对抗网络作为图像到图像翻译问题的通用解决方案…

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

文章大纲

一.导言

二。具有对抗性和 L1 损失的对偶目标函数

三。u 网生成器

四。PatchGAN 鉴别器

动词 (verb 的缩写)估价

介绍

图像到图像的翻译是生成对立网络(GANs)非常适合的任务的另一个例子。在这些任务中,几乎不可能对损失函数进行硬编码。大多数关于 GANs 的研究都与新颖的图像合成有关,将随机向量 z 转换成图像。图像到图像转换将一个图像转换为另一个图像,例如将上面的袋子边缘转换为照片图像。另一个有趣的例子如下所示:

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

Interesting idea of translating from satellite imagery into a Google Maps-style street view

图像到图像的转换在诸如彩色化和超分辨率的应用中也是有用的。然而,许多特定于 pix2pix 算法的实现思想也与那些研究新颖图像合成的人相关。

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

上面描述了本文中图像到图像转换架构的非常高级的视图。与许多图像合成模型类似,这使用了条件 GAN 框架。调节图像 x 被用作发生器的输入和鉴别器的输入。

具有对抗性和 L1 损失的对偶目标函数

进行图像到图像翻译的一个天真的方法是完全抛弃对立的框架。源图像将仅通过参数函数传递,并且结果图像和地面实况输出的差异将用于更新网络的权重。然而,用诸如 L1 和 L2 的标准距离度量来设计这个损失函数将不能捕捉这些图像之间的许多重要的区别特征。然而,作者确实发现了 L1 损失函数作为对抗性损失函数的加权助手的一些价值。

条件-对抗损失(生成器对鉴别器)非常普遍地格式化如下:

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

前面提到的 L1 损失函数如下所示:

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

结合这些功能会产生:

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

在实验中,作者报告说他们发现λ参数等于 100 时最成功。

u 网生成器

GAN 发生器中使用的 U-Net 架构是本文中非常有趣的部分。图像合成架构通常采用大小为 100×1 的随机向量,将其投影为具有全连接层的更高维向量,对其进行整形,然后应用一系列去卷积操作,直到实现所需的空间分辨率。相比之下,pix2pix 中的生成器类似于自动编码器。

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

The Skip Connections in the U-Net differentiate it from a standard Encoder-decoder architecture

生成器接收要翻译的图像,并将其压缩成低维的“瓶颈”向量表示。然后,生成器学习如何将其上采样到输出图像中。如上图所示,考虑标准编码器-解码器结构和 U-Net 之间的差异很有意思。U-Net 类似于 ResNets,其方式是将早期层的信息集成到后面的层中。U-Net skip 连接也很有趣,因为它们不需要任何尺寸调整、投影等。因为被连接的层的空间分辨率已经彼此匹配。

PatchGAN 鉴别器

pix2pix 中使用的 PatchGAN 鉴别器是该设计的另一个独特组件。PatchGAN / Markovian 鉴别器的工作原理是将图像中的单个(N×N)片分类为“真实对虚假”,而不是将整个图像分类为“真实对虚假”。作者认为,这加强了更多的约束,鼓励尖锐的高频细节。此外,PatchGAN 的参数更少,运行速度比分类整个图像更快。下图描述了对要分类的 N x N 个面片的大小 N 进行实验的结果:

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

The 70 x 70 Patch is found to produce the best results

估价

评估 GAN 输出很困难,有许多不同的方法。pix2pix 的作者使用两种不同的策略来评估他们的结果。

第一种策略是使用人工评分。真实图像和用 pix2pix 创建的图像随机堆叠在一起,人类评分员在观看 1 秒钟后将每张图像标记为真实或虚假。这是使用亚马逊 Mechanical Turk 平台完成的。

我发现的另一个非常有趣的评估策略是在综合生成的网络上使用语义分割网络。这类似于另一种非常流行的 GAN 输出量化评估指标,称为“初始分数”,其中基于预先训练的初始模型的分类能力来对合成图像的质量进行评级。

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

Far Left: Semantic Segmentation Label, Second: Ground Truth Image, Third: L1 Distance Used, Fourth: cGAN used, Far Right: L1 Distance + cGAN

结论

Pix2Pix 是一种非常有趣的图像到图像转换策略,它结合了 L1 距离和对抗性损失,并在生成器和鉴别器的设计上有所创新。感谢阅读,请查看论文以了解更多实施细节和对实验结果的解释!

TensorFlow 2.0 中的 pix2pix GAN

原文:https://towardsdatascience.com/pix2pix-gan-in-tensorflow-2-0-fe0ab475c713?source=collection_archive---------8-----------------------

(查找代码关注本帖 此处 。)

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

原始代码可以在谷歌联合实验室的这里找到,但我把这当成了一个深入挖掘 TensorFlow 2.0 的好机会,以及快速原型开发的高级 API 的更新范围。

关于新特性的详细讨论,以及如何创建模型模块的子类,请看这里

在这篇文章中,我将假设对用于训练神经网络(NNs)的方法有一个基本的了解,以及生成式对抗网络(GANs)在实践中是如何工作的。要更深入地介绍有条件——GANS 可以看看我以前的文章这里,或者超分辨率 GANS 这里

这里有三个主题需要解决:首先是什么是图像到图像翻译以及 Pix2Pix 如何适应这种情况的概述;损失函数如何定义、优化以及如何反馈到网络架构决策中的数学原理;以及在两个数据集上训练的结果——分段立面数据集和卫星/谷歌地图数据集,我还将简要讨论代码和训练。

我法师处理比较辛苦。这些数据是复杂的,高度结构化的,作为人类,我们直观地知道一幅好的图像看起来像什么,即使我们不能容易地量化这意味着什么。然而与此同时,我们正在不断推进我们可以用机器学习算法自动处理的边界,从创建比清晰度高很多倍的超分辨率图像,到动态图像处理,以获得硬件无法单独完成的手机摄像头的性能。但一般来说,所有这些问题都是单独解决的;它们令人印象深刻,但我们距离使用机器学习的图像处理通用解决方案还有很长的路要走。

通常,图像到图像的翻译对于每种情况都需要特定的算法和结构,尽管事实上所有这些情况基本上都是相同的。它们都涉及获取一个像素数组并更新值以映射到另一个空间。而不是需要手握着通过这一过程,为什么缺乏通用性?

伯克利的团队开始设计图像到图像翻译问题的通用解决方案,其中底层方法可以用于几乎任意数据,以在广泛的图像域中执行通用翻译,而无需改变底层算法。他们在 2018 年发表的论文这里,连同 pix2pix 软件。

但是首先,我们在谈论什么是图像到图像的翻译?图像处理通常是指我们获取一幅图像,进行一些处理,然后输出一幅新图像。说起来很琐碎,但第二个图像是第一个图像更新版本,是普通 GAN 方法的不足,甚至是基本的条件 GANS,其中输入定义为随机噪声向量。

这个想法是通过学习一组图像和另一组图像之间的映射,网络可以将相同的映射应用到新数据上。这更符合风格转换的一般情况。我要做一个相当全面的声明,图像可以大致分为两个部分。首先,是图像的内容。内容是指图像中的内容——图像中所有部分的对象、景观和空间关系。另一部分可以认为是图像的风格。风格包括颜色、阴影和每个物体的表现方式。

我们可以把这比作一张照片和一个艺术家的印象之间的区别,或者甚至是同一场景的两个艺术表现。潜在的信息和内容是一样的,尽管他们的风格可能大不相同。诀窍是找到一种方法从一个翻译到另一个。

暗示就在术语中:与其关注图像,不如想想语言,就像翻译学习英语和法语之间的映射一样。给定一个一种语言的句子,他们可以将其翻译成另一种语言,同时尽可能多地保留原始信息(内容),并且仍然可以找到一种自然的方式来表达每种语言的情感(风格)。这就是用 pix2pix 的目的。

损失函数和网络体系结构的相互作用是微妙的,正如我们将看到的,解决一个问题通常有多种方法,但首先我们需要为生成性敌对网络定义一个条件损失。这里的关键原理与任何 GAN 相同,即两个网络之间的生成性对抗性最小最大博弈,以优化损失函数:

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

其中 G 是发生器,D 是鉴别器,x 是条件输入图像,y 是真实图像,z 是随机噪声向量。

(这里有更详细的讨论,但是基本思想是 G 输出一个图像,使得 D(G)最大化,而 D 被优化以输出真实图像的 1。为什么这个曾经收敛,以及收敛到什么程度,我们是不是找错人了,另一个有趣的讨论是 这里 。)

这与普通的 GAN 案例已经有了一个关键的区别:它是有条件的。这里的“有条件”是指发生器不仅仅接收一个随机噪声向量,还会接收额外的信息。这可能只是 cDCGAN 中的类信息,或者在这种情况下,条件信息是原始图像。凡尼拉 GAN 依赖于 G:z -> y,条件 GAN 则依赖于 G:{x,z} -> y。

有趣的是,这实际上并不是全貌。当网络训练时,它通常学会忽略随机噪声向量,因此为了保持网络的非确定性,使用了丢失来重新引入随机行为。

在许多 GANs 中,基于通过最小化目标和生成图像之间的欧几里德距离(MSE ),生成器将学习图像的结构和颜色,L2 正则化损失被添加到优化中。然而,发现这通常导致模糊的图像,因此为了克服这一点,L1 正则化损失被添加了一些预因子权重,作为替代:

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

这给出了要优化的总损耗函数:

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

下一个关键问题是关于网络的结构。

在此分析中,发生器基于 U-Net 结构,是自动编码器的变体,而鉴别器称为 patch-GAN。

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

Generator Architecture

使用 U-Net 结构的要点是,网络迫使所有信息通过网络中间的一个紧密瓶颈。这迫使找到输入图像的潜在表示,该潜在表示可以被重构为原始图像,其思想是有限量的信息可以通过-网络被迫学习最佳简化映射,而不能简单地记忆训练集。

这有一个明显的局限性;输出和输入图像的很大一部分应该共享相同的描述。图像的内容应该保持不变。U-net 相对于自动编码器的变化是在 U-Net 结构的每个对称层之间增加了一个跳跃连接,如上图所示。这些级联层具有在网络中以适当的规模直接传递更高级信息的效果,并且减少了通过潜在瓶颈层所需的信息量。这里的想法是,传递的信息关注更细微的细节,而不是大规模的结构。

鉴别器更不典型,可能需要更多的上下文。一般来说,L1 和 L2 正则化是对网络的弱约束,不会产生清晰的细节,因为有许多路径可以获得小的 L 值。然而,这并没有取消损失函数的这一部分,因为它鼓励产生高层次的结构,这在鉴别器的选择中被利用。

可以通过多种途径将清晰的细节引入到生成的图像中:

  1. 调整 L1/L2 损耗上的λ预因子的权重——如上所述,这导致相对模糊的图像,通常是正确的,但没有清晰的细节。
  2. 增加了量化输出图像性能的额外损失-已经尝试了许多使用预训练网络来评估输出图像质量的方法。特别是在 SRGAN 的情况下,VGG 网络在目标和输出图像上的潜在空间之间的距离被最小化。
  3. 更新鉴别器以提升清晰的细节——patch-GAN——似乎太明显了,不是吗?

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

Patch-GAN Discriminator [here]

patch GAN 的工作方式是,不是对整个图像进行分类,而是仅对图像的一部分(NxN)进行真假分类。“补丁”扫描图像,对每个图像进行预测,并优化平均值。

这假设图像可以被视为马尔可夫随机场,其中由 N 个或更多像素分隔的像素是独立的。当考虑高层结构时,这对于整个图像来说是不正确的,但是当查看低层细节时,这是一个合理的假设。

这里的优点是用修补 GAN 保留了细节;为了通过鉴别器测试,鼓励现实的低水平细节,并且使用正则化损失来保存总体结构。与整个图像分类器相比,这种修补方法的另一个重要优点是速度快,因为小的 NxN 修补比单个鉴别器评估和训练更快。它还可以有效地缩放到任意大小的图像。

网络的训练有两个技术点。首先,训练不是最小化(1-log D),而是最大化 log(D)。其次,鉴别器目标函数在训练期间减半,以限制鉴别器相对于发生器的训练速率。

最后,我们来看看我复制论文结果的实验结果。如上所述,我复制结果的代码可以在这里找到,使用 tensorflow 2.0 高级 API 编写。使用单个 GPU 计算节点,在 Amazon AWS EC2 单元上训练了 200 个历元来重现立面结果——每个历元花费了大约 4 分钟。在训练过程中,每 10 个时期拍摄快照图像,并全程记录发生器和鉴别器的损耗。

正如你在这些结果中看到的,建筑的结构已经被发现,并且风格从每一个被映射的部分是一致的。

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

一些细节显然在分割中丢失了,特别是在每个特征的正面和精细结构的边缘周围,以及窗户和柱柱顶周围的楣梁,正如预期的那样。

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

很明显,细节没有像论文中描述的那么好。此外,建筑物边缘的模糊性在视觉上不是很吸引人——这是训练 gif 中变化最大的区域,随着时代的增加会稳定下来。

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

随着训练持续时间的延长,我们可能会期待稍好的结果,因为很明显损失函数还没有完全饱和。

地图数据有一个稍微不同的问题。虽然在这些示例中恢复的一般道路布局和要素相当一致,但生成的结果似乎不如立面输出稳定,并且整个图像更经常出现错误。这些图像看起来也相当暗,可能是因为道路与建筑物或草地之间的对比度比立面上的元素之间的对比度低。

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

结论是,虽然 pix2pix 方法显然具有令人印象深刻的发电能力和通用性,但它的训练成本仍然相对较高,至于持续恢复最精细的细节,未来几年还需要做更多的工作。

规划数据科学项目?需要做出的最高决策

原文:https://towardsdatascience.com/planning-a-data-science-project-top-decisions-to-be-made-e131fd324f5b?source=collection_archive---------32-----------------------

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

Source: unsplash — free stock images

6 个问题让你自己不被打败

谁说选择很容易?如果我们能有一个分类模型来告诉我们是否做出了正确的决定,这不是很好吗?可惜,那是不存在的(至少现在是!)在生活的任何方面,从几个选项中选择任何一个,确实是一个挑战。不管我们是在两种不同口味的汽水中做出选择,还是从衣柜里拿出一件 t 恤,去哪里吃晚餐,或者就像在这种情况下,决定在接下来的几周里让自己沉浸在一个数据科学项目中。

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

毫无疑问,这从来都不容易,但有些决定显然比其他的更容易。我们面临的这种情况可能是最重要的因素,但它也关系到我们拥有的选项数量,以及我们最终评估我们是否做出了正确决定时所考虑的因素。但是还有一个额外的关键因素,那就是决策背后的人:我感兴趣的不一定是你感兴趣的。

这就是为什么我想告诉你我问自己的问题,以选择一些想法来面对一个中等长度的数据科学项目。有句名言是这样说的:

“好的决策来自经验,经验来自坏的决策”

虽然不可能知道这句话是谁第一次说的,因为它被网络上许多不同的人引用,但我可以向你保证,我将详细描述的这些问题来自经验…肯定是一些错误的决定。因此,我希望您能提前发现它对您的特定项目非常有用:

  1. **应该是哪个题目?**你将带着它深入黑暗。在接下来的几个月里,一周几天,所以首先试着选择一些你有激情的事情。不要仅仅因为某个主题的公众相关性或其他有偏见的原因而选择它。
  2. 我能面对哪一级别的困难?在网上调查在这个领域或类似项目中工作过的其他人,以确保你能够掌握所有必要的工具。
  3. 哪个应该是我的目标?我将试图发现什么?也许这个话题非常有趣,但是没有真正的意义去研究它。你的目标越具体越好。这将有助于以后评估您的项目结果,不仅使用典型的数据科学指标,而且对照您的目标。
  4. 你的项目会有观众吗?如果答案是肯定的,那么确保你能同时解决自己和他们的兴趣。否则,你可能会以一个除了你之外没人感兴趣或者没人理解的非常酷的项目结束。
  5. 我有足够的时间吗?这似乎是显而易见的,但是当我们面对一个有固定期限的项目时(例如,我们必须提交的学校项目),制定一个时间表是必要的。计划我们要做的每一步,确切地知道我们应该在哪个日期完成项目的每个阶段。否则,我们可能会在最后一周结束,甚至没有完成我们的数据集,因为仍然在做网络抓取。
  6. **有可能获得数据吗?**一个需要尽快得到答案的关键问题。如果你不知道如何获取信息,你就一无所有。此外,就这一点向自己提出以下问题也很重要:
  • 来源:具体从哪里获取数据?
  • 格式:会是哪种格式?你能处理那种格式吗?
  • 采取必要的行动:你会废弃它吗?找人要数据集?

如你所见,归根结底,就是做决定。作为我们心爱的决策树,选择数据科学项目是将我们引向终点的小决策的分支:我们的项目。

如果你来到这里,你想知道更多关于我的项目,我邀请你访问我的 GitHub 个人资料,我已经上传了其中的一些:【https://github.com/gonzaferreiro。此外,不要忘记查看我的上一篇文章,关于我在训练测试分裂中犯的 6 个业余错误,以及我的作者简介中的更多内容。如果你喜欢这篇文章,别忘了关注我,如果你想直接在你的邮箱里收到我的最新文章,就订阅我的时事通讯吧:)

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

感谢阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值