文献翻译2_Temporal Pyramid Pooling Convolutional Neural Network for Cover SongIdentification

原文链接:[PDF] Temporal Pyramid Pooling Convolutional Neural Network for Cover Song Identification | Semantic Scholar

Abstract

    在音乐信息检索领域,识别翻唱歌曲是一个重要的问题。现有的大多数方法依赖于手工设计的特征和序列比对方法,而进一步的突破变得困难。本文使用卷积神经网络( CNNs)进行表示学习,以解决这个任务。我们展示了它们能够自然地适应处理翻唱歌曲中的音调转换。此外,采用了时域金字塔池化方法,在不同尺度上提取信息,并将长度不同的歌曲转换为固定维度的表示。此外,设计了一种训练方案来增强模型的鲁棒性。大量实验证明,结合这些技术,我们的方法对存在于翻唱歌曲中的音乐变化具有鲁棒性,并在几个数据集上的时间复杂度较低的情况下超过了现有方法。

1 Introduction

    (背景)随着互联网上音乐数据的增加,对音乐数据的开发成为研究人员感兴趣的话题。翻唱歌曲识别(CSI)专注于在数据集中检索给定歌曲的翻唱版本,可应用于音乐许可管理、音乐聚类、检索和推荐等领域。由于其潜在的应用价值,它长期以来吸引了许多研究人员的关注。

面对翻唱歌曲中的变化,如音调转换、节奏变化和结构变化,研究人员面临挑战。音调转换是指音乐音符的移动。结构变化的一个例子是在现场表演中,音乐家可能会省略引子或重复副歌。节奏可能会因现场表演中的表现力而改变或波动。结构和节奏的变化往往会导致当我们试图对齐两个翻唱版本时出现差异。尽管人们很容易识别不同版本对应于同一首歌曲的这些变化,但对于机器来说,在出现这些复杂的音乐变化时进行顺序匹配是具有挑战性的。(研究现状)为了解决这个问题,研究人员开发了用于版本识别的对齐算法。例如,提取表示十二个音高类的强度的Chroma被用来描述音乐[Fujishima, 1999]。Needleman-Wunsch-Sellers算法和Dynamic Time Warping等序列对齐算法被用于寻找两个版本之间的最佳对应关系[Bello, 2007; Silva et al., 2018]。这些序列对齐算法本质上是为了衡量时间序列之间的相似性。它们在一定程度上帮助减少了结构和节奏变化的影响,并在应用于小规模数据集(如几百首歌曲)时实现了高精度[Serr`a et al., 2009; Martin et al., 2012; Cheng et al., 2017]。然而,对于较大的数据集来说,使用这些算法变得困难。

为了提高效率,研究人员设计了紧凑的特征或使用机器学习对音乐进行建模,而不是使用对齐算法[Bertin-Mahieux and Ellis, 2012; Khadkevich and Omologo, 2013; Serr`a et al., 2012]。这些方法隐式或显式地从音乐中提取固定维度的特征。然后,使用欧氏距离等度量来衡量给定两首歌曲之间的相似性。这些方法具有线性时间复杂度,因此比序列对齐方法更快。然而,音乐建模失去了很多时间信息,并且与序列对齐方法相比常常导致较差的结果。

此外,上述方法通常依赖于精心设计的对齐算法和手工制作的特征,这需要在音乐理论和信号处理方面进行广泛的人力和专业知识投入。为了克服这些缺点,一些研究人员将深度学习引入到这一领域。例如,Chang等人利用CNN来从相似矩阵中衡量相似度[Chang et al., 2017]。该研究在有限的数据上训练模型,并在自建数据集上报告结果。还尝试使用神经网络进行特征学习,而不是距离度量[Xu et al., 2018]。这些方法取得了有希望的结果,但仍需要进一步改进。距离度量:不需要进行特征学习,直接基于已有的特征向量进行相似度计算。

    (本文方法)本文使用CNN来学习适用于翻唱歌曲识别的不变特征。受计算机视觉中金字塔池化(Pyramid Pooling)的成功应用的启发[He et al., 2015; Wang et al., 2017],我们将这一技术应用于音乐分析,并利用时间金字塔池化(Temporal Pyramid Pooling,TPP)来总结不同尺度的信息,并将音乐转化为固定维度的特征。尽管这些技术在计算机视觉中已经被应用,但很少有研究人员将其用于音乐检索,音乐检索主要关注音频特征工程和对齐算法。

本文的创新和贡献有三个方面。首先,我们展示了CNN可以用于学习音乐的不变表示,类似于其在计算机视觉中提取平移不变特征的应用。其次,我们使用TPP来提取不同尺度上的信息,并将可变长度的序列转化为固定长度的表示。第三,我们开发了多长度训练策略来进行数据增强,并使模型对时长变化具有鲁棒性。通过具体的设计和训练策略,我们的方法在两个公开数据集上优于现有的方法。我们的方法提取出紧凑的表示,并比对齐方法更加有效。

代码、数据和实现的基准模型已经上线[2],鼓励该方法的应用。

2 Related Work

2.1 Audio Feature

   (提取序列特征再衡量相似性和生成固定长度的向量法) 尽管在翻唱版本中,音乐结构和速度可能会发生变化,但是翻唱版本仍然具有相似的旋律结构和和声进行。因此,研究人员设计了音乐描述符来表示旋律信息。一种常见的方法是从音乐中提取序列描述符,然后使用对齐算法来衡量两个给定序列之间的相似性。例如,Tzanetakis等人提出使用音高直方图来表示音调[Tzanetakis et al.,2003]。色度及其变体被广泛应用于这一任务[Ellis and Poliner,2007; Serr`a et al.,2008; Grosche and M¨uller,2012; Silva et al.,2016; Cheng et al.,2017]。

与序列表示不同,其他研究人员尝试生成固定长度的向量来进行翻唱歌曲识别。例如,Khadkevich和Omologo [2013]使用和弦概要来表示音乐。Bertin-Mahieux和Ellis应用二维傅里叶变换和中值滤波器从Beat-chroma中提取全局表示[Bertin-Mahieux and Ellis,2012]。Osmalsky等人结合了持续时间和音色等多个全局特征用于翻唱歌曲识别[Osmalsky et al.,2015]。

2.2 Similarity Measure

    (衡量相似性)对于顺序表示法,动态规划是常用的方法之一,用于衡量顺序描述符之间的相似性。通过搜索两个顺序表示之间的最佳对应关系,这些算法有助于减少局部结构变化的影响,从而实现高精度的匹配[Bello, 2007; Serr`a et al., 2008; Martin et al., 2012; Cheng et al., 2017]。对于其他方法,尽管它们没有明确使用动态规划,但它们计算了序列之间的交叉相似性,并且需要相当的复杂度[Grosche and M¨uller, 2012; Seetharaman and Rafii, 2017]。对于固定维度的特征,研究人员使用简单的度量方式,如欧氏距离和余弦距离,以降低时间复杂度[Bertin-Mahieux and Ellis, 2012; Osmalsky et al., 2015; Xu et al., 2018]。

3 Method

    图1:检索过程概述。Conv:卷积层,Pool:最大池化层,TPP:时域金字塔池化层,FC:全连接层。方块中的数字表示卷积层的大小和通道数,以及全连接层的输入和输出维度。FC1的输出维度为4611,因为训练时使用了一个包含4611首歌曲的数据集。

    (网络设计)我们的网络由卷积层和TPP(Temporal Pyramid Pooling)层组成,用于学习音乐表示,并将输入转化为固定维度的向量。在训练过程中,我们将同一首曲目的不同演奏版本视为同一类别的样本,将不同的歌曲视为不同的类别。通过收集10万条录音,我们通过分类准则对网络进行训练。训练结束后,倒数第二层的输出用来提取音乐表示,如图1所示。在检索过程中,我们通过网络提取查询q的音乐表示,并计算其与数据集中参考音乐表示{r1, r2, ..., rN}之间的距离。参考音乐表示已经预先计算并存储在磁盘中以供检索使用。

3.1 Low-level Representation

    图2:展示了从两个版本的《小星星》中提取的CQTs(Constant-Q Transform)的可视化结果。为了突出显示,对其进行了对数操作。

   (提取CQT特征) CQT(Constant-Q Transform)是一种具有对数频率刻度的转换,反映了西方音乐音阶[布朗,1991]。我们使用Librosa进行提取[McFee等,2015]。音频被重新采样为22050 Hz。在预处理中使用Hann窗口,跳跃大小为512。最后,CQT使用平均因子20进行下采样。图2中展示了两个CQT的示例,其中x轴和y轴分别表示时间和频率维度。图中显示的段落代表音乐中的音符及其谐波系列。与广泛应用于CSI系统的Chroma相比[Ellis和Poliner,2007;Serrà等,2008],CQT是一个低层级的描述符,因为它不将频率分量映射为音高类。它保留了更多信息,并帮助神经网络学习更好的CSI表示。

3.2 Convolutional Neural Network for Key-invariance

    键位变换是指将乐曲转调到不同的键位。图2展示了一个键位变换的例子。我们可以看到,如果将一个图形的音符垂直移动,就可以得到另一个图形。然而,直接匹配这两个图形(不考虑变调)会导致很大的差异。为了处理键位变换,一些研究人员测试了所有或一些潜在的变调[Bello,2007;Serrà等,2009]。其他人则尝试提取对键位变换不变的特征[Bertin-Mahieux和Ellis,2012;Seetharaman和Rafii,2017]。

(CNN学习调不变)然而,这些方法涉及到复杂的手工特征设计。作为替代,我们的方法使用CNN来学习具有键位不变性的表示。将CQT视为图像,我们发现键位不变性表示与图像分类中的平移不变性表示相关。CNN被用来从音乐中提取和捕捉和弦模式或旋律结构,而不是识别图像中的对象。[Xu等,2018]翻译的第二篇文献,也使用CNN来学习键位不变的表示,但他们的解决方案使用了Chroma,并旨在学习一个递归不变的特征。我们的方法简单直接且有效;我们使用CNN学习平移不变性特征,并获得了更高的精度(详见第5.3节)。循环不变特征主要关注歌曲的音乐结构和节奏模式,能够提取到时间序列的长期依赖信息;而平移不变特征则主要关注歌曲的频率和幅度信息,能够提取到固定模式和谐波结构等特征。

(网络结构设计)网络结构如图1所示。我们设计了一个大小为36×40的Conv0。这种设计有两个优点。首先,它的高度是12的倍数。换句话说,它捕捉了四个谐波并跨越了三个八度。其次,为了在较大的上下文中聚合信息,它的宽度设为40,对应于20秒。这种设计与现有的CSI作品[Serrà等,2008;Bertin-Mahieux和Ellis,2012]的思想是一致的;它们通常从较长的范围内提取特征或衡量相似性。

显然,该网络结构与图像分类或图像检索中的结构不同,后者由小的方形滤波器组成[Simonyan和Zisserman,2015;He等,2016]。我们最初按照这种风格构建带有小滤波器的网络,但结果较差。在研究图像和音乐之间的差异时,我们意识到音乐本质上是时间信号;即使图2将CQT显示为图像,x轴和y轴具有不同的含义,分别表示时间和频率域。因此,借用图像分类的网络结构是不合适的。作为替代,我们在初始层使用了大的卷积核,在实验中取得了更好的结果。

3.3 Temporal Pyramid Pooling

    图3:时域金字塔池化层。首先将输入特征图在不同级别上进行划分,然后对每个通道的划分应用最大池化操作。

    (利用TPP解决将音乐信号缩放为固定长度的问题)通过使用多个卷积和池化层,我们在Conv5中获得了一个形状为L×512的特征图(参见图1)。L的大小取决于输入的长度,而不是一个常数;在该层中,我们得到了与输入相关的可变长度激活。可变长度激活函数能够根据输入序列的实际长度来自动调整计算,而不需要对输入进行填充或截断。它可以有效地处理不同长度的序列,并产生相应长度的输出。受计算机视觉中的金字塔池化方法的启发[He等,2015;Wang等,2017],我们使用TPP来学习一个固定维度的特征,并从不同的时间尺度提取信息。在我们的实现中,使用自适应窗口进行池化操作。自适应窗口的使用可以根据输入数据的特性动态地选择不同大小的窗口。对于具有n个区间的金字塔级别,最大池化窗口沿着时间在特征图上移动,其中第i个区间与特征图中的区间相关。如图3所示,我们的方法使用了4个金字塔级别{1, 2, 3, 4}。在此操作之后,我们将来自不同级别的特征图连接起来,得到一个固定维度的向量进行进一步处理。

TPP将可变长度的特征转换为固定长度的输出。没有TPP,神经网络需要固定长度的输入,而音乐不是这种情况。另一种解决可变长度输入困难的方法可能是将音乐信号缩放为固定长度。然而,音频与图像不同,后者可以调整为任意尺寸。虽然研究人员提出了时间拉伸来进行音频缩放,但这些算 ** 对原始信号引入人工效果[Z¨olzer,2011]。我们利用TPP来解决这个冲突,并从具有不同持续时间的歌曲中学习固定维度的表示,而不是修改信号。

采用TPP有助于从不同的时间尺度聚合信息。它捕捉了音乐中不同部分的和弦模式和旋律结构。自适应全局池化是TPP的一个特例,只使用一个金字塔级别。与自适应全局池化相比,多个金字塔池化保留了更多信息,我们发现在实验中多个池化级别有助于提高精度。

3.4 Multi-length Training

    (用多长度训练让网络适应不同的长度并且丰富训练集)TPP被应用于将可变长度的特征转换为固定维度的向量,然后将其输入到两个全连接层中。我们有一个训练集D = {(x1, t1),(x2, t2). . .(xN , tN )},其中xn表示一个音乐版本,tn是one-hot encoding vector,表示xn属于哪首歌曲。每首歌曲都有不同的音乐版本。将这些歌曲视为类别,同一首歌的不同版本被看作来自同一类别的样本。

在训练过程中,我们首先从{x1, x2 . . . xN }提取CQT(Constant-Q Transform),并将它们输入到网络中。使用交叉熵损失来训练网络,以预测标签{t1, t2 . . . tN }。然而,在检索或测试阶段,网络不用于预测输入音频的类别。相反,如图1所示,我们使用倒数第二层的特征图进行检索

不同的歌曲具有不同的持续时间。为了训练一个对持续时间变化具有鲁棒性的模型,我们设计了多长度训练策略。在每个训练步骤中,我们从D中采样一个数据批次B,并提取CQT。对于每个CQT,我们随机裁剪三个长度分别为200、300和400的子序列,分别对应100秒、150秒和200秒。如果原始长度小于200、300或400,我们会在CQT序列末尾填充零元素。因此,我们从B生成三个新的批次B200、B300和B400,并将它们输入到网络中进行训练。这个方案的动机是,如果我们只提供固定长度的输入给网络,网络将对这个特定长度有偏好。在这种情况下,即使TPP可以将可变长度的序列转换为固定维度的特征,TPP在训练过程中也变得无效。此外,多长度训练策略将训练数据量增加了三倍,并且随机裁剪序列还起到了数据增强的作用。该训练策略模拟了删除变化,即音乐家在演奏时跳过音乐短语或音乐段落,从而提高了模型对结构变化的鲁棒性。

3.5 Retrieval

    (对新的翻唱歌曲的检索过程)检索过程如图1所示。给定一个查询q,我们提取CQT描述符Q并将其输入网络中提取音乐表示f(Q),其中f通过网络将CQT映射为音乐表示。对于参考音频{r1, r2 . . . rN },我们提取CQT描述符{R1, R2 . . . RN }并在预处理中计算音乐表示{f(R1), f(R2). . . f(RN )}。查询q和参考音频r之间的距离dq,r(为简洁起见省略下标)定义为它们音乐表示的余弦距离,如下所示:

对于检索,我们在数据集中计算查询和参考音频之间的成对距离,并返回一个排序列表进行评估。值得注意的是,由于现代计算机的计算能力和音乐表示的低维度,我们的方法可以在百万级歌曲数据集上快速运行,无需任何加速。

4 Experimental Settings

4.1 Dataset

    (数据集)由[Xu等人,2018]收集的Second Hand Songs 100K(SHS100K)包括8858首歌曲,总共有108523个录音,其中包含多个版本。我们将其分为三个子集,即SHS100K-TRAIN、SHS100K-VAL和SHS100K-TEST,用于训练、验证和测试,比例分别为8∶1∶1。与[Xu等人,2018]中的划分不同,我们希望收集一个更大的测试集。SHS100K存在严重的不平衡问题;一些歌曲有几十个翻唱版本,而一些只有一两个翻唱版本。为了使训练集更加均衡,只有有超过五个翻唱版本的歌曲用于训练。经过筛选过程,共有4611首歌曲和84340个录音用于训练。对于测试,我们计算了SHS100K-TEST中所有录音之间的相似度,该测试集包含10547个录音,因此为评估计算了一个10547×10546的相似度矩阵。

Youtube数据集由[Silva等人,2016]收集。它包括50首具有不同音乐风格和流派的作品,每首作品有7个版本,总共有350个录音。原始数据集被分为训练集和测试集。为了与文献进行比较,我们使用训练集作为参考音频,使用测试集作为查询音频,按照与[Silva等人,2016]相同的配置进行实验。

Covers80数据集共有80首歌曲,每首歌曲有2个翻唱版本。它被广泛用作文献中的基准数据集。为了与现有方法进行比较,我们计算了所有录音之间的相似度,因此计算了一个160×159的相似度矩阵用于评估。

4.2 Evaluation

    (评估指标)在评估中,我们计算了常见的评估指标:平均精度均值(MAP)、前10项准确率(P@10)以及第一个正确识别的翻唱版本的平均排名(MR1)。MAP是平均精度的均值,P@10是在前10项中成功识别为相同版本的比例的均值。这些指标正是Mirex音频翻唱歌曲识别竞赛使用的指标。我们还记录了查询时间,以进行效率比较。

5 Experimental Results and Analysis

    在接下来的实验中,我们在SHS100K-TRAIN数据集上训练模型,并在SHS100K-VAL上调整参数,以选择最佳模型。然后我们在Youtube、Covers 80和SHS100K-TEST三个数据集上评估性能。所提出的方法被称为CQT-TPPNet。

5.1 Effectiveness of TPP and Multi-length Training

    (设置了有TPP和没有TPP需要固定长度的输入对比实验)为了与我们的模型进行比较,我们构建了几个没有TPP(Temporal Pyramid Pooling)的网络。与CQT-TPPNet不同的是,这些网络中Conv5的输出直接连接到全连接层。这些网络在训练和测试时需要固定长度的输入,而没有TPP的支持。它们被称为CQT-Net(i),其中i表示输入的长度,我们通过{200, 300, 400}来测试i的取值。表1显示出TPP可以提高性能。由于不同的歌曲有不同的时长,固定输入长度会导致信息损失。相反,TPP适应性更强,并且具有更好的性能。此外,我们还探索了需要多少金字塔级别才能达到更好的精度。表1中尝试了几种组合。实验结果表明,使用多个金字塔级别相对于一个级别(或自适应全局池化)始终能够取得更好的性能,因为多个级别可以从不同的尺度上利用更多信息。我们还探索了超过表1中显示的级别,但没有显著的增益。因此,我们在后续实验中使用了具有四个级别{1, 2, 3, 4}的CQT-TPPNet。

(多长度训练产生的效果的实验)我们进行了几个实验来探索多长度训练策略是否有助于提高准确性。与原始设置相比,我们将模型训练固定在输入长度j为{200, 300, 400},分别表示为单长度训练(j)。如表1所示,与单长度训练相比,多长度训练在所有三个数据集上始终取得更好的性能。多长度训练减少了模型对特定输入长度的偏见。即使模型允许测试可变长度的歌曲,如果不使用这种训练策略,性能也会下降。改进的另一个解释是多长度训练为训练提供了更多的数据。值得一提的是,我们的训练集SHS100K-TRAIN平均每首歌曲有大约15个版本。随机裁剪片段并将可变长度序列馈送到网络中作为数据增强的一种方式,极大地提升了性能。

5.2 Robustness against Musical Variations

    (用Librosa做了一些音乐变化,丰富数据集,验证实验稳健性)我们进行了实验来探索我们的方法对音乐变化(如调性转换和节奏变化)的稳健性。考虑到数据集没有提供关于这些变化的任何注释,我们使用Librosa [McFee等,2015]模拟了这些变化,并修改了查询,然后从数据集中检索封面并评估性能。由于在现实生活中,音乐家在演奏作品时不会做出像演奏几个八度高或急剧改变节奏这样显著的变化,因此我们测试了一个八度内(或十二个半音)的转调和几种节奏变化。

表1显示了一些结果,揭示了这些变化对数据集的性能造成了一些损失。我们提出的模型仍然能够处理调性转换和节奏变化。例如,如果将调性在四个半音内转移,或者节奏在[0.9, 1.1]的因子范围内变化,性能下降相对较小。对于调性转换,我们发现将音高升一个八度(+12个半音)比降一个八度(-12个半音)导致的精度较差。将修改后的查询与音高相对上升或下降一个八度进行比较,我们发现通过Librosa上升一个八度会带来更多人造效果,如刺耳的声音,而下降一个八度则没有这种影响。这些影响使得识别封面变得更加困难。

5.3 Comparison

    (和2DFM,In-Net对比)我们仔细重新实现了两种方法2DFM [Bertin-Mahieux and Ellis, 2012]和In-Net [Xu et al., 2018],以进行比较。2DFM是一种手工设计的特征,而In-Net则利用神经网络进行特征学习,与我们的方法类似。这两种方法和我们的方法都在一台装有Intel Xeon E5-2640v3和两个TI-TAN X(Pascal)GPU的Linux服务器上实现。此外,我们还与报告其结果在Covers80或Youtube上的最先进方法进行比较。

    比较结果如表2所示。从精确度和效率的角度来看,我们的方法在Covers80和Youtube上的表现优于这些方法。例如,在Covers80上,它的平均平均准确率为0.744,平均处理时间为0.06毫秒。由于这些结果来自于除了我们实现的方法之外的不同机器和操作系统,查询时间仅作为参考,而不是精确的比较。

然而,除了2DFM、In-Net和CQT-TPPNet之外,其他方法都涉及到序列对齐过程,需要二次时间复杂度,从而比我们的方法运行得更慢。与2DFM和In-Net相比,我们的方法学习到了一个较低维度的表示,并且稍微更快一些。采用线性时间复杂度,我们的方法的平均查询时间与数据集的规模成正比。即使对于包含百万首歌曲的数据集,我们的方法估计在1秒内能够处理一个查询。

对于SHS100K-TEST数据集,与我们实现的方法相比,我们的方法在低时间复杂度下获得了最高的精确度。在不同数据集之间比较性能时,我们发现在较大的数据集上准确度会下降。这是因为较大的数据集更有可能包含具有相似旋律结构、和弦模式和伴奏的歌曲,这使得识别出cover变得更具挑战性。研究人员也发现了类似的结果;例如,[Bertin-Mahieux和Ellis,2012]在包含12960个录音的音乐收藏中获得了0.09475的MAP值。

5.4 Error Analysis

    最后,我们对Covers80上不同类型音乐的性能进行了研究。考虑到Covers80没有关于音乐风格的注释,我们仔细听录音,并对每一首音乐进行标注,判断其是否为摇滚音乐、节奏是否快以及是否有明显的伴奏。

然后我们统计不同类型中的错误情况。表3显示,当查询是摇滚音乐或具有明显的伴奏时,错误率相对较高。相反,如果伴奏较弱且不是摇滚音乐,模型的性能较好,错误率分别降低到0.39和0.27。我们推测摇滚音乐具有更多的鼓点和钹声,而强烈的伴奏包含非和谐的内容,使得识别cover变得困难。如何提取对这些效果具有鲁棒性的表示是我们未来工作的一个重要课题。

此外,我们还听了三个数据集中一些查询的前10个候选结果。我们的模型能够发现包括非歌词版本、仅伴奏版本、在不同乐器上演奏的版本等各种cover版本。另外,我们发现前10个候选结果通常与查询具有相似的旋律结构、和弦模式和流派,尽管其中一些候选结果不是查询的cover。例如,当查询歌曲为摇滚音乐时,模型可能会错误地将几首摇滚歌曲作为前10个候选结果,但它们并不是查询的cover。我们推测通过使用音乐相似性作为训练目标,模型学会了检索具有相似风格的音乐,而不仅仅是音乐cover。在某种意义上,我们的模型可以用于基于内容的音乐推荐。

6 Conclusion

    在这篇论文中,我们提出了一种具有时间金字塔池化的CNN结构,用于cover歌曲识别。它允许可变长度的歌曲作为框架输入,并提取出鲁棒的cover歌曲表示。此外,我们设计了一个网络训练方案来进行网络训练。大量实验证明,我们的方法对于cover歌曲中的音乐变化(如调式变换和节奏变化)具有鲁棒性。它在Youtube和Covers80这两个公共数据集上优于现有方法,并且相对于我们实现的方法在SHS100K-TEST上实现了最高的精确度,同时具有低的时间复杂度。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值