精华内容
下载资源
问答
  • 多维表达式 (MDX) 是用于在 MicrosoftAnalysis Services 中处理和检索多维数据的查询语言。MDX 基于 XML for Analysis (XMLA) 规范,并带有特定于 SQL ServerAnalysis Services 的扩展。MDX 使用由标识符、值、语句...

    福哥答案2021-01-12:

    这个面试题很偏,连题意都不知道。

    多维表达式 (MDX) 是用于在 MicrosoftAnalysis Services 中处理和检索多维数据的查询语言。MDX 基于 XML for Analysis (XMLA) 规范,并带有特定于 SQL ServerAnalysis Services 的扩展。MDX 使用由标识符、值、语句、函数和运算符组成的表达式,Analysis Services 可以通过计算表达式来检索某个对象(如集或成员)或标量值(如字符串或数字)。
    SQL ServerAnalysis Services 中的 MDX 查询和表达式可用于执行以下操作:
    1.从 SQL ServerAnalysis Services 多维数据集向客户端应用程序返回数据。
    2.设置查询结果的格式。
    3.执行多维数据集设计任务,包括定义计算成员、命名集、范围分配和关键绩效指标 (KPI)。
    4.执行管理任务,包括维度和单元安全性。
    MDX 在很多方面与关系数据库常用的 SQL 语法看起来很相似。但是,MDX 并非 SQL 语言的扩展,在许多方面都有别于 SQL。为了创建用于设计或保护多维数据集的 MDX 表达式,或创建 MDX 查询以返回多维数据并设置其格式,您需要了解有关 MDX 和维度建模的基本概念、MDX 语法元素、MDX 运算符、MDX 语句以及 MDX 函数。

    摘要:网络应用中内容主导的系统需要管理海量的多维数据,比如新闻网页中的标题、图片、作者、时间等多维信息;拼接成网页地址的多个字符串片段;视频分发系统中描述一个片段的多个特征等。大规模多维数据通常是以集合的形式保存在互联网系统中的。因此,需要一种表示多维集合元素的数据结构以及判断元素是否属于某个集合的算法,也就是多维集合的元素表示与存在性查询算法。类似的解决方案除了有低时间和空间复杂度的要求,而且还要能够支持灵活的查找方式,并有效处理高相关查询。  本文的研究工作采用了一种概率型数据结构来表示多维集合的元素,这种刻画能够有效地节省空间,并保存同一个元素不同属性之间的关联信息,从而实现快速准确的查询。在此基础上,提出了一种能够快速准确地支持多维集合中的元素表示与存在性查询的数据结构和相关算法。  我们提出的大规模多维数据查询算法(乘积型布鲁姆过滤器Cartesian-join ofBloom Filters,简称CBF)不仅能够较好的处理完整查询、不完整查询和相关查询,而且还能够有较低的时间复杂度和空间复杂度。相比传统的基于表的解决方案,CBF能够明显节省存储空间;与标准布鲁姆过滤器比较,CBF能够使用同样的空间支持多维元素的完整查询,同时还能额外支持提供不完整信息的元素存在性查询。  论文从理论上推导出了CBF的虚警率的解析表达式和最优哈希函数个数与元素个数及存储空间的关系,证实了CBF的虚警率具有与SBF基本相同的形式。从理论上分析了算法的时间复杂度和空间复杂度,CBF的时间复杂度与维数成正比,与集合元素个数无关。在占用空间不低于其下限的情况下,CBF空间复杂度与标准的布鲁姆过滤器相同。  我们使用公共数据集与合成数据集来检验我们的理论推导的正确性。公共数据集由56663条二维数据构成,用于验证CBF虚警率和最优哈希函数个数解析表达式。合成数据集用来验证时间复杂度、空间复杂度、算法可用性等内容。我们选取了虚警率与最优哈希函数实验、维度扩展性实验、完整查询实验、不完整查询实验、空间复杂度实验和时间复杂度实验。并将实验结果与理论推导进行比较。实验证明了我们的理论推导的准确性。在实验中,我们使用大约10个比特来保存一个元素,虚警率约为1%。  为了使用多线程技术来加速集合表示和存在性查询过程,我们迸一步提出了基于CBF的改进算法——并行化乘积型布鲁姆过滤器Parallel Cartesian-join ofBloom Filters,简称PCBF。该算法在继承CBF的优势的同时,避免了对同一个元素进行哈希时不同哈希数据点出现冲突的问题,能够较好地支持多线程加速,可以较快地完成集合元素表示。我们通过理论分析和实验验证了PCBF的算法特性。理论分析和实验证明,PCBF的性能和CBF基本一致,同时可以在使用多线程加速技术后有较好的性能。  最后,本文展示了CBF和PCBF算法的应用场景和未来的研究方向。


    2021-01-12:多维快查多维查询系统,你了解的解决方案都有哪些?
    查询多维数据(Analysis Services - 多维数据)
    多维数据查询效率分析(1)
    评论

    展开全文
  • 呵呵,业务需要按多维数组中某个元素进行排序,在PHP中也是非常... ‘news’=>array( ‘name’=>’新闻动态’,’order’=>1 ),  ‘product’=>array( ‘name’=>’产品中心’,’order’=>4 ),  ‘message’=>arra
  • 1、引言 2、流时间序列中基于预测的异常检测 3、异常形状的时间序列 4、多维流的异常检测

    1、引言

    1.1 基本介绍

    时间和流数据的异常检测场景出现在许多应用中,如传感器数据、机械故障诊断、医疗数据、网络入侵数据、新闻文本帖子和财务帖子等。在这些问题中,时间连续性假设在识别异常值方面起着至关重要的作用。

    时间连续性是指数据中的模式不会突然改变,除非有异常的过程在工作。

    在时间序列数据中,时间连续性是即时的,预计将非常强。

    在具有时间成分的多维数据(如文本流)中,时间连续性要弱得多,而且只从总体趋势的角度来看。

    以下是两种时间连续性改变的情况:

    时间序列中的突然改变的检测:

    这些对应于底层数据流趋势的突然变化。在这种情况下,时间连续性是重要的,异常值被定义为不寻常的,因为它于近期或长期历史缺乏连续性。例如,时间序列值的突然变化短期历史)或时间序列子序列的独特形状长期历史)被识别为异常值。

    在整个时间序列离线可用的情况下,可以利用事后的优势来识别异常的时间序列值或形状。 在时序分析中,垂直分析更重要,当每个单独的序列(或维度)被视为一个单元时,分析主要是在这个单元上进行的。如果有多个系列可用,则可以利用交叉关系,尽管它们通常在每个系列的分析中起次要作用。 这是因为时间序列数据是上下文的,它对序列值施加了很强的时间局部性。

    多维数据中的新颖性和变化的检测:

    在这种情况下,数据包含相互独立的单个多维点,与时间序列数据相比,时间连续性问题要弱得多。 例如,在从传感器数据导出的时间序列中,两个连续的数据值通常几乎相同。 另一方面,一个单独的文本文档(多维数据点)在一系列新闻文章中通常可能与它的前一篇文章有很大的不同。 为了构建一个鲁棒的离群模型,需要将数据点与文档的更大历史进行比较。

    多维流数据中的异常可以对应于总趋势发生变化的时间实例或单个数据点的新情况。

    1.2 时间序列中的异常值种类

    时间序列中有两类异常值:上下文异常值集体异常

    当特定时间戳的值突然相对于其时间上的相邻值发生变化时,异常值时上下文异常。

    当整个时间序列或事件序列中的大子序列具有不寻常的形状时,异常值时集体异常。

    对于如何定义异常值,需要对所研究的问题有深入的研究。

    例如,在传感器数据的情况下,有时使用偏差检测方法进行噪声异常值过滤可能是有帮助的,而在其他情况下,医疗流中的异常形状可以诊断心脏状况,如心律失常。

    1.3 离线和在线之间的微妙差异

    离线和在线(流)之间也有一些微妙的差异。

    在离线情况下,流的整个历史可以用于分析,而在在线情况下,只有到当前时间的流是可用的。

    1.4 标签的使用

    标签可用于监督时间序列或多维异常值检测中的异常检测过程。

    在时间序列中,标签可以与时间实例、时间间隔相关联,也可以与整个序列相关联。

    在多维数据中,标签与单个数据点相关联。在这种情况下,问题减少到罕见类检测的特殊情况。

    因为监督方法总比无监督方法好,所以尽可能地使用监督方法。

    1.5 时间序列的连续数据和离散数据

    尽管时间数据可以包括连续数据或离散序列,但本章将重点放在连续数据上,以保持表示的同质性。 这是因为时间连续性的概念在离散数据中的定义不同于在连续数据中的定义。 在离散数据的情况下数据值的缺乏排序显著影响了用于异常分析的方法的性质。 应该注意的是,连续序列总是可以离散为符号数据,尽管丢失了一些信息。离散数据的异常检测将在下章介绍。

     

    接下来的三节中,将介绍三个部分:

    基于对时间瞬间预测值的偏差检测(上下文异常);

    时间序列数据中子序列的异常形状的检测(集体异常);

    多维流数据中异常检测的方法。

     

    2、流时间序列中基于预测的异常检测(基于对时间瞬间预测值的偏差检测:上下文异常)

    时间异常检测的最常见应用是利用基于回归的预测模型检测待定时间实例的基于偏差的异常值。

    这些异常是上下文异常,因为它们根据相邻时刻数据值之间的关系,在数据的特定时刻定义异常。

    这种方法可以检测底层过程中的突然变化,也可以过滤底层流中的噪声

    基于偏差的时间序列异常值时间序列预测问题密切相关,因为异常值是根据偏离预期值(或预测值)来定义的。

    在这些方法中,时间连续性起着重要的作用,因为假设时间序列数据值与连续时刻高度相关,时间趋势不会突然变化。 基于偏差的异常值通过各种回归模型在下一个时间戳使用预测值。 单个时间序列中的相关性,或跨多个序列中的相关性,可用于执行预测。 因此,使用了两种类型的相关性:

    跨时间的相关性:

    这是与时间连续性相同的原则,通常使用自回归建模和预测来实现。与预期预测(即预测值)的重大偏差被定义为异常值。因此,这种重大偏差的定义是违反时间连续性。

    跨序列的相关性:

    许多传感器应用导致的时间序列往往是密切相关的。例如,一个传感器的鸟鸣通常也会被附近的传感器记录下来。在这种情况下,可以经常使用一个序列来预测另一个序列偏离这种预期的预测可以作为异常值。

    2.1 自回归模型Autoregressive Models

    自回归模型(AR)在单变量时间序列中特别有用。 设X1...Xt为单变量时间序列中的值。

    在自回归模型中,Xt的值是根据长度p的前一个窗口中的值定义的。使用长度p的前一个窗口的模型称为AR(P)模型。 

    Xt的定义如有所示:

    回归系数a1...ap,c的值需要从训练数据中学习,这是以前的时间序列历史。被定义为误差,表示预测值与真实值(期望值)的偏差,它对应于每个时间戳的异常值分数。这些误差需要通过线性回归建模来最小化。

    将自回归模型与移动平均模型(MA模型)相结合,可以使自回归模型具有更强的鲁棒性)。 该模型预测时间序列中的后续值作为过去偏差历史的函数。 移动平均模型定义:

    换句话说,利用时间序列中过去的冲击历史来预测一个值。 上述模型也称为MA(Q)。 μ的值是时间序列的平均值。 b1.bt的值是系数,需要从数据中学习。 移动平均模型与自回归模型有很大的不同,因为它将当前值与序列的平均值和以前的偏差历史联系起来,而不是以前的值历史。

    在实践中,以前的偏差历史和值对于计算期望值可能都很重要。然后,这两个模型可以与p自回归项和q移动平均项相结合,建立以下自回归移动平均(ARMA)模型:

     

    时间序列的非平稳性:在某些情况下,时间序列可能有一些持续的趋势,因此它可能偏离平均值。

    从预测的角度来看,非平稳性是一个问题,因为随着时间的推移,旧的数据变得陈旧,并且它可能不再与基于回归的建模相关。 例如,人们不能指望用基于窗口的回归模型,根据一百年前的价格来预测今天的价格。这是因为价格呈现出明显的趋势,今天基于价格的时间序列的统计可能与一百年前的情况有很大的不同。 在这种情况下,该系列可以通过在ARMA建模之前先对时间序列进行差分去趋势。 这种建模方法被称为自回归综合移动平均模型(ARIMA)

    2.2 多时间序列回归模型

    在许多应用中,可以使用多个时间序列来以更健壮的方式执行时间序列值的预测。

    其思想是,不同时刻的时间序列往往包含相同的信息,有时可能包含滞后相关性。

    例如,一个传感器的鸟鸣也会在附近的传感器上听到,尽管滞后很小。这种滞后相关性可以用来做出更稳健的预测。

    下面是一些具体的方法。

    2.2.1 自回归模型的直接推广

    多元自回归模型的基本思想是,利用过去长度p窗口预测每个时间戳处的值。与单变量回归模型的主要区别是,每个时间戳处的值(对于任何特定序列)被预测为前一个长度p窗口中所有流中d*p值的线性函数。因此,通过将窗口滑动到序列上,可以生成一个具有d·p系数的线性方程组

    2.2.2 时间序列选择方法

    Muscles Selective Muscles技术可以通过使用递归和基于选择的技巧来加速回归。
     

    Muscles 方法是一个相对简单的应用最小二乘模型的多元回归。

    2.2.3 PCA和隐变量模型

    2.3 无监督异常值检测与预测的关系

    可以使用监督预测和预测方法进行无监督异常值检测。

    异常值违反了数据依赖项的正常模型。因此,预测模型有助于建模这些依赖关系,因为它们适用于特定的数据点。违反这些依赖关系表示违反正常数据模型,因此对应于异常值。

    2.4 时间序列中的监督点异常检测

    上述方法确定了与期望值的显著偏差,并将其报告为异常值。 在许多情况下,这种偏离可能有许多原因,但不一定表明有兴趣的事件。 例如,在环境监测应用中,许多偏差可能是传感器设备故障或导致传感器值偏差的另一个虚假事件造成的。 这可能不一定反映出利益异常。 虽然异常事件往往对应于传感器流值的极端偏差,但不同类型偏差的精确因果关系可能有很大的不同。

    那么如何区分噪声和真正异常值呢?可以从以往的例子中使用监督方法。

    在多元场景中,真正的异常事件只能从不同时间序列流的偏差的差异行为中检测到。在这种情况下,监督可以非常有助于区分时间序列流中的真实异常和虚假异常。

     

    3、异常形状的时间序列(时间序列数据中子序列的异常形状的检测:集体异常)

    关于时间序列异常检测的大部分工作是确定不寻常的变化与底层序列非常大的偏差。然而,某些类型的偏差不仅基于数据点的单个偏差,而且还基于时间序列中相对于其他提取部分的特定部分的形状

    显然,确定与以前时间戳的大偏差不能区分地发现这种异常,因为整个序列(或子序列)需要从数据库中其他正常序列的角度来看待。换言之,必须集体看待这套时间戳,以了解它们是否应被视为异常值。

    这些方法的目的是确定数据(或子序列)的窗口,其中给定的序列与多个序列的数据库的行为不同。前面讨论的异常值是由单个位置定义的,这种异常值对应于多个连续的时间戳;在这些时间戳中特定模式的异常值一起出现,代表异常值。因此,前面的情况对应于上下文异常,而这节说的是集体异常。

    集体异常可能存在两种可能性:

    1、整个序列异常:

    在这种情况下,整个序列的形状被视为异常值。

    2、子序列异常:

    如果时间序列是在长时间内收集的,那么我们可能有一个单一的时间序列,它显示了较短时间内的典型趋势。因此,偏离这些典型趋势时,在时间序列的小窗口上检测到异常形状

    这两种类型的问题之间的区别在一定程度上是人为的,因为子序列异常检测的大多数方法也可以用于全序列异常检测。 这是因为子序列异常检测的第一步是从时间序列中提取窗口,然后将提取的子序列作为整个序列处理,以进行异常检测。 随后,各种基于距离、概率或线性的方法可以应用于提取的窗口。

    子序列异常和全序列异常之间存在细微的差异。在处理子序列异常时,必须始终考虑相邻窗口之间的重叠。对于全序列异常,较长的序列长度是一个问题。

    在所有情况下,假设该序列已归一化为零均值和单位标准差,因为比较不同均值和振幅的序列是没有意义的。

    3.1 转换为其他表示形式

    有两种类型的转换用于比较时间序列的各个段:

    1、数值多维转换:

    数值多维转换,即将序列(或序列的每个子序列)转换为多维向量。每个维度的表示对应于标准向量空间中的数值系数。

    近似可以用欧式距离在这种表示上进行计算。

    2、离散序列转换:

    使用离散化方法将序列转换为符号表示。离散数据的异常检测将在第十章介绍。

    3.1.1 数值多维转换

    最简单的可能变换时将时间序列中长度为n的每个窗口视为长度n的多维向量。

    3.1.2 离散序列转换

    这种转换通常是在数据的窗口上执行的,它导致底层时间序列的压缩和近似表示。 这种方法既可用于离散序列的独立异常检测,也可用于通过快速近似表示和剪枝来提高上述最近邻检测器的效率。

    需要注意的是,符号离散化确实丢失了一些关于底层时间序列的信息。

    3.1.3 利用时间序列的轨迹表示

    从多元序列中寻找不寻常形状的情况要具有挑战性得多。 在这里,不同的行为属性,如温度、压力或相同的行为属性,如温度,可以在同一时刻由不同的传感器测量。 因此,在这种情况下,寻找不寻常形状的问题需要非常仔细地定义。 从随后的讨论中可以明显看出,这个问题直接映射到轨迹离群点检测。

    在多元时间数据中,不同的行为属性通常是同时使用多个传感器来测量的。在这种情况下,可以利用现有的轨迹离群点检测工作来检测离群点形状。 

    上图表示多变量时间序列可以映射到轨迹数据。

     

    3.2 基于距离的方法

    书上提到了一个Hotsax方法,其使用欧氏距离来定义基于距离的异常值。此外,其还使用离散近似来执行剪枝。利用欧式k最近邻来确定每个子序列的异常值分数。且为了便于剪枝,假设只报告top-r异常值的分数。

    在长度为p的窗口上进行异常分析,从时间序列中提取这些子序列,并确定最近的欧氏距离。

    书上还讨论了在欧氏距离函数上下文中使用的剪枝方法。

    书上还说明了SAX表示(SAX Representation),其是为了为异常值提供一个良好的候选排序,以及迭代计算候选最近邻距离的排序。对候选点的良好排序确保了早期发现强异常值。

    书上还提到了单个长的序列和多个短序列的问题,在比较的时候,需要依据具体情况选择一个长序列还是多个短序列进行比较。

    3.3 概率模型

    概率模型使用生成过程模型来模拟一组时间序列的生成。例如,可以从给定的时间序列中提取一组子序列,然后对从该混合组件的一个组件中生成的这些时间序列进行建模。聚类时间序列最常见的生成模型是隐马尔可夫模型HMM

    3.4 线性模型

    可以使用第三章中的线性模型来发现底层时间序列中的不寻常的形状。也分为单变量和多变量情况。

    3.4.1 单变量序列

    可以从长度n的时间序列中反复提取长度p的重叠窗口来创建(n-p+1)个对象。每个长度为p的窗口可以被视为一个p维数据点。

    3.4.2 多变量序列

    该方法也可应用于多元时间序列。 主要的区别在于特征工程;换句话说,多维表示是不同的。 而不是从一个单变量时间序列中提取p维点,我们现在从d个不同时间序列的集合中提取p·d维点。 对于d不同的时间序列,在最近的长度p窗口中有d·p不同的值。人们可以将这些值看作一个单一的(d·p)维数据点,并在数据流上滑动一个窗口来生成(n−p+1)这样的点。

    3.4.3 组成任意相似函数

    3.4.4 使用线性模型的核方法

    还可以应用一类支持向量机等方法,只要可以定义适当的核函数来度量对象之间的相似性。

    核方法通常与线性模型相结合,因为变换空间中的线性模型对应于原始空间中的复杂边界。如一类支持向量机和核PCA方法。

    3.5 寻找异常时间序列形状的监督方法

    在许多医学应用中,特征病理特性可能被潜在时间序列的不寻常形状所捕获。 在这种情况下,训练数据往往是关于正常或病理行为,或两者兼而有之。 因此,这种方法需要以监督的方式检测时间序列中不寻常的形状。 标签可以与整个时间序列、时间序列的部分(子序列)相关联。 在这种情况下最简单的方法是为正常类和异常类开发子序列配置文件。 对于给定的测试子序列,可以使用k近邻方法进行分类。

    特征提取和转换形式是所有监督方法的核心,用于时间序列分类。

    如果时间序列以判别特征(discriminative features的形式表示,则对其进行分类就变得容易得多。 一种可能是将序列转换为离散表示,然后使用第10章的隐马尔可夫模型(HMM)进行分类。 由于在离散数据的背景下开发基于模式的分类模型自然容易,因此有更多的模型可用于序列分类。 第二种可能性是从数据中挖掘形状,这些数据是用于分类目的的高度鉴别特征。

    4、多维流的异常检测(多维流数据中异常检测的方法)

    前面两节讨论的情况是从时间序列中根据偏离期望值不寻常形状确定异常值。即使有多个相关的时间序列,每个时间序列也被处理为一个分析单元。在传统的时间序列分析中,由于时间连续性的强假设,自相关autocorrelation(autocorrelation)在预测和异常值计算过程中非常重要。

    在多维数据的情况下,每个记录都包含d维,它们构成一个不可分割的单元。此外,在时间序列的情况下,在单个序列中观察到非常高的时间连续性。多维数据流的情况不一定如此,在这些数据流中,时间连续性要弱得多。

    例如,在多维文本记录流中,无法从其紧接的记录中可靠地预测文本记录中一个属性的单个的频率。另一方面,文档中存在的单词可以在聚合级别上与记录流的历史进行比较,以预测异常值。

    多维流场景更接近传统的多维异常分析方法。唯一的区别是在分析中添加了一个时间分量,尽管这个时间分量比时间序列数据要弱得多。在多维数据流中,需要快速发现异常值,因此效率很重要。

    多维数据流中可能出现两种类型的异常值:

    1、第一种是基于异常检测的个别记录。这种异常值也称为新奇点,因为他代表了一个以前从没有看到的点。

    2、第二种是基于多维数据的总趋势的变化。这本质上代表了基于特定时间窗口的更高级别和聚集的异常值。第二类变化点几乎总是第一种的个别异常值开始。但第一种类型的个别异常值可能并不总是发展成一个聚集变化点。

     

    4.1 个别数据点作为异常值

    将单个数据点检测为离群点的问题与无监督的新颖性检测问题密切相关,特别是当使用数据流的整个历史时。

    4.1.1 基于邻近的算法

    一种基于距离的异常值检测方法。

    原基于距离的离群点定义修改如下:

    一个数据点的异常值分数是根据其在长度为W的时间窗口中与该数据点的k近邻距离来定义的。

    【LOF算法也扩展到增量场景。 此外,该方法还可以处理数据点的插入和删除。 】

    由于基于距离的方法众所周知在计算上是昂贵的,所以在数据流的上下文中,上述许多方法仍然相当昂贵。 因此,采用基于聚类的方法可以大大提高孤立点检测过程的复杂性。

    当大量数据点可用时,基于聚类的方法特别有效。 在数据流的上下文中,通常有足够数量的数据点可用,以便将集群保持在非常高的粒度级别。

    4.1.2 基于概率的算法

    在数据量大的情况下,概率算法工作比较有效。

    有一种方法:从混合属性数据集创建混合模型。 其思想是在将数据点添加到模型之前和之后计算传入数据点与模型的拟合。 这是通过使用期望最大化算法来实现的。 期望最大化算法自然适合于流的情况,因为它们对优化过程的迭代方法。 随着新的数据点的到来,使用这些点调整参数相对容易。

    4.1.3 高维场景

    流场景和高维数据的结合特别具有挑战性,因为高维投影聚类算法的复杂性。 显然,计算效率是高维算法背景下的主要关注点。

    许多高维投影流聚类算法也可以用来确定数据流中的异常。

    有一种方法叫做SPOT,用于检测高维数据流中的异常值。与聚类方法不同,该方法旨在直接查找数据的稀疏子空间。

    集成方法在高维数据中也比较有用。例如,可变子采样方法和旋转袋方法分别针对大数据集中和高维数据集中的效率而设计。对于流数据,可以创建多个可变大小的子样本,并于旋转袋相结合,实时提供数据点的异常值分数。

    4.2 聚集变化点作为异常值

    4.2.1 速度密度估计方法

    速度密度估计的思想是构造一个基于密度的速度剖面数据。这类似于静态数据集中的核密度估计的概念。

    4.2.2 总体分布中统计显著变化

    描述多维数据流中聚合变化的另一种方法是估计这些时间窗口中的总体分布。 这些时间窗口的重大变化可以报告为数据流的异常变化。

    4.3 多维流数据种的稀有和新奇类的检测

    监督场景在时间领域中是一个非常丰富的场景,因为类的不同类型的时间和基于频率的方面可以对应于异常值。 这些可能对应于新的类异常值稀有类异常值不经常重复出现的类异常值

    因此,可能需要使用概念漂移分析concept drift analysis异常检测outlier detection稀有类检测rare-class detection的方法组合来确定流场景中有趣的异常值。这种情况经常出现在入侵检测等应用中,其中一些已知的入侵可能被标记,但新的入侵也可能随着时间的推移而出现。因此,异常检测算法使用监督和非监督方法的组合来检测异常值是至关重要的。

    多维数据流场景中不同类型的异常值:

    1、稀有类异常值rare-class outliers:这种异常值的识别类似于静态监督场景中的异常值。在这种情况下,一小部分记录可能属于一个稀有的类,但从时间角度来看,它们不一定以非同质的方式分布。虽然一些概念漂移可能也需要考虑,但可以使用罕见的流分类算法变化。

    2、新颖类异常值novel-class outliers:这些类在数据流中没有遇到。因为,它们可能根本不反映在训练模式中。最终,随着时间的推移,这些类可能成为数据的正常部分。

    3、不频繁出现的类的异常值infrequently recuring class outliers:这些类在一段短时间内没有遇到,但可能会在流中重新出现。这样的类不同于第一类,因为这种类是在时间上罕见的突发中出现的。

    4.3.1 检测稀有类

    许多分类器可以用于流场景中。为了检测稀有(或者叫做罕见)类,对这些分类器的唯一更改是添加旨在处理类不平衡的方法。这种变化与在静态上下文中处理类不平衡的变换没有很大不同。

    4.3.2 检测新颖类

    检测新颖类也是半监督的一种形式,因为其他许多类都有模型,但检测到的类没有。

    传统的新颖类检测工作大多只集中在寻找与当前模型不同的新类。 然而,这种方法并不区分随着时间的推移可能遇到的不同的新类。 理解新颖类检测问题的一个更一般的方法是将其视为监督(分类)和非监督(聚类)模型的组合。 

    当接收到新的测试实例时,首先将分类模型应用于它,以测试它是否属于当前存在的(标记)类。 如果情况并非如此,则测试它是否自然属于新颖类之一。 测试实例与表示新类的集群的统计边界的关系用于此目的。 如果这两个条件都不成立,则假定新的数据点应该在自己的新类中。 因此,这种方法结合了监督和无监督的方法,以灵活的方式进行新颖类检测。

    4.3.2 检测不频繁出现的类

    在实际应用中,许多异常值通常以不频繁的时间突发出现。许多分类器无法区分新颖类和稀有类,特别是当旧模型在数据流中老化时。因此,一个解决方案是简单地将重复出现的异常值报告为新的异常值。

    然而,这不是一个非常理想的解决方案,因为新类检测是一个半监督问题,而重复类的检测是一个完全监督的问题。 因此,通过记住循环类随时间的分布,可以提高分类精度。

     

    5. 总结

    本章研究了时间序列数据和多维数据流中的异常检测问题。在这两种情况下,异常值的性质是不同的。时间序列数据许哟啊以每个序列为单位进行分析,而多维数据则需要以每个多维数据点为单位进行分析。不同类型的异常值也可以在时间序列数据中定义,这取决于是否需要识别序列中的偏离点,或者是否需要识别不寻常的形状子序列。

    对于多维数据,单个数据点可以被归类为新奇点,或者数据中的聚合变化点可以被定义为异常值。

    在一些标签可用的情况下,监督和无监督方法可以结合起来进行有效地对新颖类和稀有类检测。

     

    展开全文
  • 图解c/c++多级指针与“多维”数组  声明:本文为原创博文,如有转载,请注明出处。若本文有编辑错误、概念错误或者逻辑错误,请予以指正,谢谢。  指针与数组是C/C++编程中非常重要的元素,同时也是较...

    图解c/c++多级指针与“多维”数组

         声明:本文为原创博文,如有转载,请注明出处。若本文有编辑错误、概念错误或者逻辑错误,请予以指正,谢谢。

         指针与数组是C/C++编程中非常重要的元素,同时也是较难以理解的。其中,多级指针与“多维”数组更是让很多人云里雾里,其实,只要掌握一定的方法,理解多级指针和“多维”数组完全可以像理解一级指针和一维数组那样简单。

         首先,先声明一些常识,如果你对这些常识还不理解,请先去弥补一下基础知识:

    复制代码
    1、实际上并不存在多维数组,所谓的多维数组本质上是用一维数组模拟的。
    
    2、数组名是一个常量(意味着不允许对其进行赋值操作),其代表数组首元素的首地址。
    
    3、数组与指针的关系是因为数组下标操作符[],比如,int a[3][2]相当于*(*(a+3)+2) 。
    
    4、指针是一种变量,也具有类型,其占用内存空间大小和系统有关,一般32位系统下,sizeof(指针变量)=45、指针可以进行加减算术运算,加减的基本单位是sizeof(指针所指向的数据类型)。
    
    6、对数组的数组名进行取地址(&)操作,其类型为整个数组类型。
    
    7、对数组的数组名进行sizeof运算符操作,其值为整个数组的大小(以字节为单位)。
    
    8、数组作为函数形参时会退化为指针。
    复制代码

     一、一维数组与数组指针

          假如有一维数组如下:

      char a[3];

          该数组一共有3个元素,元素的类型为char,如果想定义一个指针指向该数组,也就是如果想把数组名a赋值给一个指针变量,那么该指针变量的类型应该是什么呢?前文说过,一个数组的数组名代表其首元素的首地址,也就是相当于&a[0],而a[0]的类型为char,因此&a[0]类型为char *,因此,可以定义如下的指针变量:  

      char * p = a;//相当于char * p = &a[0]

          以上文字可用如下内存模型图表示。

          大家都应该知道,a和&a[0]代表的都是数组首元素的首地址,而如果你将&a的值打印出来,会发现该值也等于数组首元素的首地址。请注意我这里的措辞,也就是说,&a虽然在数值上也等于数组首元素首地址的值,但是其类型并不是数组首元素首地址类型,也就是char *p = &a是错误的。

          前文第6条常识已经说过,对数组名进行取地址操作,其类型为整个数组,因此,&a的类型是char (*)[3],所以正确的赋值方式如下: 

      char (*p)[3] = &a;

          注:很多人对类似于a+1,&a+1,&a[0]+1,sizeof(a),sizeof(&a)等感到迷惑,其实只要搞清楚指针的类型就可以迎刃而解。比如在面对a+1和&a+1的区别时,由于a表示数组首元素首地址,其类型为char *,因此a+1相当于数组首地址值+sizeof(char);而&a的类型为char (*)[3],代表整个数组,因此&a+1相当于数组首地址值+sizeof(a)。(sizeof(a)代表整个数组大小,前文第7条说明,但是无论数组大小如何,sizeof(&a)永远等于一个指针变量占用空间的大小,具体与系统平台有关

    二、二维数组与数组指针

          假如有如下二维数组:

      char a[3][2];

          由于实际上并不存在多维数组,因此,可以将a[3][2]看成是一个具有3个元素的一维数组,只是这三个元素分别又是一个一维数组。实际上,在内存中,该数组的确是按照一维数组的形式存储的,存储顺序为(低地址在前):a[0][0]、a[0][1]、a[1][0]、a[1][1]、a[2][0]、a[2][1]。(此种方式也不是绝对,也有按列优先存储的模式)

          为了方便理解,我画了一张逻辑上的内存图,之所以说是逻辑上的,是因为该图只是便于理解,并不是数组在内存中实际的存储模型(实际模型为前文所述)。

         

          如上图所示,我们可以将数组分成两个维度来看,首先是第一维,将a[3][2]看成一个具有三个元素的一维数组,元素分别为:a[0]、a[1]、a[2],其中,a[0]、a[1]、a[2]又分别是一个具有两个元素的一维数组(元素类型为char)。从第二个维度看,此处可以将a[0]、a[1]、a[2]看成自己代表”第二维”数组的数组名,以a[0]为例,a[0](数组名)代表的一维数组是一个具有两个char类型元素的数组,而a[0]是这个数组的数组名(代表数组首元素首地址),因此a[0]类型为char *,同理a[1]和a[2]类型都是char *。而a是第一维数组的数组名,代表首元素首地址,而首元素是一个具有两个char类型元素的一维数组,因此a就是一个指向具有两个char类型元素数组的数组指针,也就是char(*)[2]。

         也就是说,如下的赋值是正确的:

      char (*p)[2]  = a;//a为第一维数组的数组名,类型为char (*)[2]
    
      char * p = a[0];//a[0]维第二维数组的数组名,类型为char *

          同样,对a取地址操作代表整个数组的首地址,类型为数组类型(请允许我暂且这么称呼),也就是char (*)[3][2],所以如下赋值是正确的:  

      char (*p)[3][2] = &a;

    三、三维数组与数组指针

         假设有三维数组:

     char a[3][2][2];

         同样,为了便于理解,特意画了如下的逻辑内存图。分析方法和二维数组类似,首先,从第一维角度看过去,a[3][2][2]是一个具有三个元素a[0]、a[1]、a[2]的一维数组,只是这三个元素分别又是一个"二维"数组,a作为第一维数组的数组名,代表数组首元素的首地址,也就是一个指向一个二维数组的数组指针,其类型为char (*)[2][2]。从第二维角度看过去,a[0]、a[1]、a[2]分别是第二维数组的数组名,代表第二维数组的首元素的首地址,也就是一个指向一维数组的数组指针,类型为char(*)[2];同理,从第三维角度看过去,a[0][0]、a[0][1]、a[1][0]、a[1][1]、a[2][0]、a[2][1]又分别是第三维数组的数组名,代表第三维数组的首元素的首地址,也就是一个指向char类型的指针,类型为char *。

       

     

                由上可知,以下的赋值是正确的:

          char (*p)[3][2][2] = &a;//对数组名取地址类型为整个数组
          char (*p)[2][2]  = a;
          char (*p) [2]  = a[0];//或者a[1]、a[2]
          char *p = a[0][0];//或者a[0][1]、a[1][0]...

    四:多级指针

          所谓的多级指针,就是一个指向指针的指针,比如:

          char *p = "my name is chenyang.";
    
          char **pp = &p;//二级指针
    
          char ***ppp = &pp;//三级指针

          假设以上语句都位于函数体内,则可以使用下面的简化图来表达多级指针之间的指向关系。

          

             多级指针通常用来作为函数的形参,比如常见的main函数声明如下:

        int main(int argc,char ** argv)

             因为当数组用作函数的形参的时候,会退化为指针来处理,所以上面的形式和下面是一样的。

        int mian(int argc,char* argv[]) 

             argv用于接收用户输入的命令参数,这些参数会以字符串数组的形式传入,类似于:

        char * parm[] = {"parm1","parm2","parm3","parm4"};//模拟用户传入的参数
    
        main(sizeof(parm)/sizeof(char *),parm);//模拟调用main函数,实际中main函数是由入口函数调用的(glibc中的入口函数默认为_start)

             多级指针的另一种常见用法是,假设用户想调用一个函数分配一段内存,那么分配的内存地址可以有两种方式拿到:第一种是通过函数的返回值,该种方式的函数声明如下:

        void * get_memery(int size)
        {
           void *p = malloc(size);
           return p;
         }

            第二种获取地址的方法是使用二级指针,代码如下:

    复制代码
        int get_memery(int** buf,int size)
        { 
          *buf = (int *)malloc(size);
          if(*buf == NULL)
              return -1;
          else
              return 0;
        }
         int *p = NULL;
         get_memery(&p,10);
    复制代码

            关于多级指针的用法很多,尤其以二级指针应用最为广泛,后续的有时间再进行补充。

               

       

             

     

    分类: C,C++
    5
    0
    « 上一篇:python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
    » 下一篇:图解JVM的Class文件格式(详细版)
    posted @ 2016-02-27 12:29 陈洋Cy 阅读(3362) 评论(1) 编辑 收藏

      
    #1楼33705142016/3/2 19:35:06 2016-03-02 19:35 山中水寒  
    很不错,C语言最大的成功就是它的指针!!
    http://pic.cnblogs.com/face/685406/20150814204337.png
    展开全文
  • 本文实例讲述了php中count获取多维数组长度的实现方法。分享给大家供大家参考。具体分析如下: 先来看看下面程序运行结果: $numb=array( array(10,15,30),array(10,15,30),array(10,15,30) ); echo count($...

    本文实例讲述了php中count获取多维数组长度的实现方法。分享给大家供大家参考。具体分析如下:

    先来看看下面程序运行结果:

     

     

    $numb=array(
                array(10,15,30),array(10,15,30),array(10,15,30)
    );
     

    echo count($numb,1);

    A.3
    B.12
    C.6
    D.9
    答案是B
    count函数中如果mode被设置为 COUNT_RECURSIVE(或 1),则会递归底计算多维数组中的数组的元素个数(也就是你结果的12)。如果不设置mode默认为0 。不检测多维数组(数组中的数组)(结果3)。

    首先遍历的是外面的数组array得出有两个元素("color1″,"color2″,"color3″) 为3
    再遍历("color1″,"color2″,"color3″)数组得出的是9个元素 为9
    结果就是3+9=12

    参考示例:

    代码如下:
    <?php
    $fruits = array (
        array (1, 2,null,null, 5, 6),
        array (1, 2,null,null, 5, 6),
    );
    echo(count($fruits[0]));
    ?>
    如果用其他方式定义的数组,比如:
    复制代码 代码如下:
    <?php
    $fruits[0][0]=1;
    $fruits[0][3]=1;
    $fruits[0][4]=1;
    echo(count($fruits[0]));
    ?>

    这样那就输出3,因为php中的数组不要求索引必须连续,参考手册上有如下一段:
    数组:

    PHP 中的数组实际上是一个有序图。图是一种把 values 映射到 keys 的类型。此类型在很多方面做了优化,因此你可以把它当成真正的数组来使用,或列表(矢量),散列表(是图的一种实现),字典,集合,栈,队列以及更多可能 性。因为可以用另一个 PHP 数组作为值,也可以很容易地模拟树。
    实例:
    获得二维或多维数组的第一维的长度,这是个常用的程序判断,比如你读取的数组是一个二维数组:

    <?php
    $arr=array(
     0=>array('title' => '新闻1', 'viewnum' => 123, 'content' => 'ZAQXSWedcrfv'),
     1=>array('title' => '新闻2', 'viewnum' => 99, 'content' => 'QWERTYUIOPZXCVBNM')
    );
    ?>

    如果你想统计数组$arr的长度,也就是说该二维数组只有两条新闻,你想要的数字也是2,但是如果使用count($arr)不同版本的php,统计的结果是不一样的;
    后来在php手册中发现,count函数还有第二个参数,解释如下:
    count函数有两个参数:
    0(或COUNT_NORMAL)为默认,不检测多维数组(数组中的数组);
    1(或COUNT_RECURSIVE)为检测多维数组,
    所以如果要判断读取的数组$arr是不是有新闻信息,就要这样写了:

    <?php
    if(is_array($arr) && count($arr,COUNT_NORMAL)>0 )
    {
      .....
    } else {
      .....
    }
    ?>

    你可以使用这样的代码来测试该函数:

    <?php
    $arr=array(
     0=>array('title' => '新闻1', 'viewnum' => 123, 'content' => 'ZAQXSWedcrfv'),
     1=>array('title' => '新闻2', 'viewnum' => 99, 'content' => 'QWERTYUIOPZXCVBNM')
    );
    echo '不统计多维数组:'.count($arr,0);//count($arr,COUNT_NORMAL)
    echo "<br/>";
    echo '统计多维数组:'.count($arr,1);//count($arr,COUNT_RECURSIVE)
    ?>

    好了,到此位置,已经解决php中获取二维或多维数组的第一维长度的问题

    转载于:https://www.cnblogs.com/pingliangren/p/5586874.html

    展开全文
  • 你可以使用这样的代码来测试该函数: $arr=array( 0=>array('title' => '新闻1', 'viewnum' => 123, 'content' => 'ZAQXSWedcrfv'), 1=>array('title' => '新闻2', 'viewnum' => 99, 'content' =
  • 表cms_top:  id name ... 1 国际新闻  2 国内新闻 表cms_category:  id name tid(连接上级)  1 国际娱乐新闻 1  2 国际体育新闻 1  3 国际时政新闻 1  4 国内娱乐新闻 2 ...
  • "新闻管理", "url" =>"/#1", "submenus"=>array( "category"=>array( "id"=>"1", "name"=>"新闻类别", "url" =>"/#1", ), "add"=>array( "id"=>"2", "name"=>"新闻...
  • 在php中,获得二维或多维数组的第一维的长度,这是个常用的程序判断,比如你读取的数组是一个二维数组:$arr=array( 0=>array(title => 新闻1, viewnum => 123, content => ZAQXSWedcrfv), 1=>array(title => 新闻...
  • array_multisort — 对多个数组或多维数组进行排序   排序顺序标志: SORT_ASC - 按照上升顺序排序 SORT_DESC - 按照下降顺序排序   排序类型标志: SORT_REGULAR - 将项目按照通常方法比较...
  • 我把数据表分类,生成了多维数组进行保存 function getkind($id) { if(file_exists($_G['cache'].'kindcache.txt')) //分类缓存是否存在 $str = unserialize(file_get_contents($_G['cache'].'kindcache.txt'));...
  • 今天遇到一个问题,是这样的——给你源数据,排序好后... 60179=fido=FidoNet 电子邮件和新闻网络 10082=amandaidx=Amanda 备份服务 10083=amidxtape=Amanda 备份服务 1178=skkserv=简单假名到汉字(SKK)日文...
  • 大江网/大江新闻客户端讯 近日,由北京巨龟科技有限责任公司联合飞天诚信科技股份有限公司打造的聚归客商家端及硬件设备同步上线了。该平台能帮助餐饮商户连接外卖平台,聚合经营数据,智能操作外卖订单,提高商户...
  • 新闻快讯,来源区视网分享《对话链圈》栏目 视频链接分享:http://www.51bitbee.com/course/1848.html 本期嘉宾是尚币的创始人兼CEO周渊凯。 主持人嘉欣:之前一直在创业,有创业过智慧停车平台叫朋泊,在创业之后...
  • 一种基于R-Tree的改进多维索引摘要:为了适应空间多维索引技术在视频数据库中的应用关键词:R-Tree 视频数据库 多维索引 数据空间分割1 引言 信息的膨胀导致了现代多媒体数据库检索需要面对的问题越来越多。...
  • string(12) "新闻资讯" ["url"] => string(30) "localhost/main/index.php/news/" ["second"] => array(0) { } } [3] => array(6) { ["id"] => string(1) "5" ["level"] => string(1)...
  • 新闻

    2021-02-22 04:33:08
    国家重大科研仪器设备研制专项“多维多尺度高分辨率计算摄像仪器”通过验收;创鑫激光科创板上市申请获受理;杰普特科创板上市申请已获受理;帝尔激光在深交所敲钟上市,开盘涨停;量子通信第一股——科大国盾科创板申请...
  • 'name' => '国际新闻', ), array( 'id' => 5, 'pid' => 0, 'name' => '图片分类', ), array( 'id' => 6, 'pid' => 5, 'name' => '新闻图片', ), array( 'id' => 7, 'pid' => 5, 'name' =>...
  • 选题目的 网络舆情浪潮对事件发展、政府公信力、社会舆论安全以及国家安全造成了巨大的压力。因此,对网络新闻进行深入分析,揭示信息传播的原动力和...网络舆情具有衍生性、动态性和多维性,这使得舆情的演化分...
  • 哈德兰进行了一系列的检测,在199 1年8月18日一个简短的新闻透露会上,哈兰德指出:“查过保存在航海记录中的指纹,已确认了史密斯船长的身分,所受磨难的程度和时间正如所料。”另一位幸存者温妮。考特29岁于1990年9...
  • 来源 | CB Insights 编译 | Rik 、张震 2017 年 7 月,设备制造商 Jawbone 成为了创业史上最引人注目的失败案例之一。 ...该公司的资产出售宣言姗姗来迟:尽管 10 年间总共攫取了 9.3 亿美元融资,Jawbone 却...
  • } 6、定义一个二维数组 打印里面的内容 List list = [ { "cate":'国内', "news":[ {"title":"国内新闻1"}, {"title":"国内新闻2"}, {"title":"国内新闻3"} ] }, { "cate":'国际', "news":[ {"title":"国际新闻1"}, ...
  • 对于一个多维数组(以二维数组为例),经常需要获取到其中的一列,比如有几条用户数据,是一个二维数组,现在需要获取到这几个用户的名字,可以有多种方法实现: $arr = array( array( 'id'=>'101', 'name'=>...
  • "国内新闻3" } ] } , { "cate" : '国际' , "news" : [ { "title" : "国际新闻1" } , { "title" : "国际新闻2" } , { "title" : "国际新闻3" } ] } ] ; /* 国内 国内新闻1 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,518
精华内容 1,807
关键字:

多维新闻