数据挖掘:概念与技术(第三版)之第五章的学习记录

数据立方体

本章主要介绍数据立方体技术
在第四章的时候已经提到过,在数据挖掘中有一种OLAP风格的多维数据挖掘被广泛的使用。因此,为了追求其良好的性能,我们对多维模型需要进行预计算和建立索引。第四章只是简单的说道了完全立方体,冰山立方体等概念。在第五章,我们着重对完全立方体的物化技术和冰山立方体的物化技术进行讲解。

首先大家需要明确一些概念。
详细见书P122,5.1.1节图5.1及其下方的基本单元,聚集单元,祖先,子女,父母。

在有些时候,我们希望预计算完全立方体(注意这里不要理解成了一个立方体的所有单元而是给定数据立方体(数据立方体就是方体的格)的所有方体的所有单元)。但实际上,我们知道计算所有立方体的所有单元的开销是非常大的,但是不是这样我们就不用研究它的计算方法了呢?实际上不是这样的,既然有问题,那必然会有相应的解决办法。比如对于开销来说,我们可以单独用一个辅助存储器来存放它,或者仅把这种算法用在维数比较少的方体上。但其实更重要的是,理解完全立方体的算法有助于我们理解部分立方体的计算方法

一般来说,不管是完全立方体和部分立方体,其计算优化策略一般都是这么几个
1.排序、散列和分组
利用排序、散列和分组操作对共享一组相同维值的元组(就是相同格式的数据)进行聚集,这样有利于计算
2.同时聚集和缓存中间结果
计算时不必要每次都从头算起,利用中间结果进行二次计算会大幅减少开销
3.选择合适的子女方体泛化
4.利用先验剪枝方法有效地计算冰山立方体
这一条策略,可以说是最重要的策略了。我们将在后面细说。关于先验性质的表述如下:如果给定的单元不满足最小支持度,则该单元的后代(即更特殊化的单元)也都不满足最小支持度。

完全立方体的计算方法

多路数组聚集(Multiway)
我们在第四章的时候已经稍微提到过一点,高性能的OLAP操作依赖于多维数据模型及物化和索引技术。其中物化技术分为全部物化和部分物化。这里的多路数据聚集是全部物化的一种算法,而且是一种典型的使用数组直接寻址的MOLAP方法。我们知道全部物化就是把整个数据立方体进行预计算。那么我们在把整体放入内存中进行计算的时候,为了节约资源或者说提高性能。必须要考虑这么两个东西。
(1)尽量减少块反复调入内存的次数。
(2)尽量利用较少的内存空间完成计算。
大家首先要明确的是,块的计算顺序是会影响计算所需内存的大小的。为什么?其实很简单,像数据立方体这种结构加上全部物化这种操作,势必要重复访问某些单元甚至是重复访问全部单元(想想方体的格)。如果我们访问次序不当的话,那么很有可能那些之前被访问过的单元还要被访问多次,这就会造成某些单元一直在频繁的进出内存。所以我们假如把这些会被重复访问的单元一直放在内存中,就可以有效的解决内存的开销问题。
当然,上面只是笼统的说了一下,也不是太准确。主要是提供了一种思路。
所以,正如上文所说。我们现在需要做到就是两个东西
(1)在内存中保持某些单元。
(2)改变访问次序,力求在内存中持有最小数量的单元。
OK,参考书上P127页,图5.3.
一般情况下来说,先从基数小的维开始聚集。在本例中设A=40,B=400,C=4000,则先聚集A,计算2-D面BC;然后聚集B,计算2-D平面AC;聚集C,计算2-D平面AB。其中AB平面最小,AC平面次大,BC平面最大。
因为计算刚开始的四个块1,2,3,4就可以得到BC面的第一块,并且之后每连续的四个块一组得到下一个BC面的块,则在计算BC面时只需要缓冲BC面一个块的大小100*1000就可以,之后计算的16次均重复利用此内存块。
因为只有在调入块13的时候才可以计算得AC面的一块,则前面的12块都应该得到缓存,所以在计算AC面的时候,缓存的结果大小为AC面的一行,即40*1000;  
因为只有调入第49块的时候才可以计算AB面,则前面计算结果均需保存,所需内存应为AB整个平面的面积,即40*400.
所以在此次计算中所需的内存为:40*400(AB整个平面)+40*1000(AC平面的一行)+100*1000(BC平面的一块)。即在内存中常驻AB整个平面,AC平面的一行,BC平面的一块。
而按照书上给出的对比的 次序访问的话,内存开销为是上面的十倍。所以最优次序就是按块次序1~64依次访问。
因此,实际上整体的思路还是很清晰的。所有的目的都是为了在尽量减少开销的基础上加快操作速度 。
同样的,可以推广至0-D和1-D。总的来说,大致思路一致。就是在内存中存放最小的方体的全部块;存放次大的方体的一行块;存放最大的方体的一块块
书上P128页靠下处即129页给出了适用情景等 ,写得很明了。
参考文章:多路数据聚集详解

在实际中,我们可能对方体的许多单元都不感兴趣,并且方体中还有许多单元的数值是稀疏的。因此我们希望在计算方体的时候
只计算满足我们需要的部分方体就好了,这不仅可以减少计算开销还能我们的分析更加聚焦。
因此这种部分物化的立方体被成为冰山立方体,满足需要的最小阀值称为最小支持度阀值。

部分立方体的计算方法

首先要搞清楚的是,什么是先验剪枝?
对于数据立方体来说,先验性质表述如下:如果给定的单元不满足最小支持度,则该单元的后代(即更特殊的单元也都不满足最小支持度)。因此,假如说一个方体单元的计数小于最小支持度阀值,那么我们将其剪枝,因为其后代的任何计数都不可能高于阀值。进行剪枝之后,直接就减少了大量的不符合我们要求的数据,显著的提高了性能。

BUC:从顶点方体向下计算冰山立方体
BUC是一种计算稀疏冰山立方体的算法。关于冰山立方体的前面已经介绍过了,其中最重要的概念就是最小度量值。一旦不满足最小度量值,则根据先验性质(Apriori property),可以对该单元及其后代进行剪枝。因此这种算法实际上不同于上面提到的多路数组聚集算法共享计算,BUC直接减少了计算数量。
那么具体做法其实很简单,用了递归的思想。具体过程写得很清楚。
可以参考下这篇文章BUC

Star-cubing
参考下这篇文章Star-cubing。目前其实我不太理解这个算法的具体流程,而且书上说兼具Multiway和BUC的优点,但是我只看到了剪枝的优势。而且,对于星树的构造实在让人费解。这里暂且放一下

外壳片段方法
前面所说的计算冰山立方体只物化数据立方体的一小部分,但这还不是最终的解。原因是最小阀度值很不好确定,定小了,则开销巨大;定大了则会丢失许多细节。此外,冰山立方体一旦产生增量更新则需要完全从头计算。
因此,一个可能的解是计算一个很薄的立方体外壳。即只预计算涉及少数维(如3~5个维)的方体,但这种方法会带来一些问题,即对OLAP支持相当差。
实际上,尽管数据立方体包含很多维,但我们通常都只在少数的几个维上进行OLAP操作。因此,基于从实际使用的角度出发,我们一般的做法是这样的:
1.首先找到某些感兴趣的方体;
2.在这些方体中,沿一两个维下钻;
3.考察相关维的变化。
所以,实际上,计算完全立方体,冰山立方体或外壳立方体很有可能是多余的。因此,这里引出一种新的计算方法,即外壳片段方法。

这种算法的基本思想如下:给定一个高维数据集,把维划分成互不相交的维片段,把每个片段转化成倒排索引表示,然后构造立方体外壳片段,并保持与立方体单元相关联的倒排索引。
OK,这样的话,我们使用立方体外壳片段(预计算过的),就可以联机地,动态地组装和计算所需要的数据立方体的方体单元(通过倒排索引上的集合交操作完成)
这是个什么概念呢?其实有点模块化的意思。我把它搞成模块化,到时候直接组装就行了。

那么这种算法,会涉及到三个东西。
1.倒排索引
2.构造立方体外壳片段
3.用外壳片段来回答OLAP查询

其中倒排索引比较好理解,资料也比较多,百度一下就OK,这里就不说了。这里重点说说如何构造数据立方体的外壳片段。在书137页最后一段,给出了计算流程图。其中我们要重点关注一句“计算它的完全数据立方体”。OK,到这里我们知道了,在前面,我已经说过,研究完全立方体的算法可以用来指导 我们研究部分立方体的算法。在这里,Frag-shell(外壳片段算法)实际上就借鉴了完全立方体的思想。既然你体量很大,那么我们把你划分成n多个的小东西不就行了嘛!在后面的对比中我们可以看到在面对60维时,采用Frag-shell比直接算,性能高了几百倍=。=

OK,那么构造了外壳片段,我们如何使用他们来回答OLAP的查询呢?
首先我们要弄清楚查询类型,之后在分类型进行响应。具体的书上139-141有详细的介绍。

处理高级查询

上面提到的点查询和子立方体查询是典型的用于商务数据仓库应用的。那种数据立方体相对来说还是简单的多维结构。我们接下来要介绍的是传统数据立方体技术的拓展,使用这种拓展技术可以用来回答在样本数据立方体上的查询,top-k查询。实际上,基本数据立方体已经进一步扩展到各种复杂的数据 和 新的应用。比如空间数据立方体,多媒体立方体等等。在这里,我们只介绍几个简单的扩展。

抽样立方体
样本数据是我们在统计中经常需要用到的。而假如把传统的OLAP工具用于样本数据(即用样本数据来构造传统的数据立方体)则会产生一些问题。为此,我们需要针对样本数据引入一种新的立方体结构。它就是抽样立方体。
抽样立方体是一种存储样本数据和它们多维聚集的数据立方体结构。它支持样本数据上的OLAP操作。此外,它还要计算置信区间。
我们知道,我们进行抽样的目的是希望通过样本来估计总体。为了度量估计结果是否符合总体,我们引入了置信区间这个概念。置信区间能够告诉我们结果的可靠程度。置信区间越小,则这个结果越可靠。
书上P142,5.1给出了置信区间的公式 。观察这个公式我们会发现。影响置信区间大小的主要因素有两个:样本数据的方差和样本大小。
这个很好理解,如果样本数据的方差过大时,说明我们选择的样本数据就不好,没有“代表性”;而样本过小时,会有较小的自由度导致较大的置信区间。
针对方差过大的问题,我们的解决办法是下钻到更细节的单元,即做更细节的查询;针对样本数据过小的问题,我们的解决方法也很简单,那就是取得更多的数据。
但是,我们要明确一点的是。虽然立方体里面有足够多的数据,但是不是随便哪个数据就能作为扩充数据来使用的。我们通常使用“邻近”单元中的数据。
那么如何使用“邻近”单元中的数据呢?我们通常采用两种方法:方体内查询扩展和方体间查询扩展。

方体内查询扩展
我们知道在方体内部有很多维。现在我们面临的问题是抽样数据过小,那么这种方法很简单,就是通过在该方体内部扩展一些维来扩大样本。这个很好理解。那么问题来了,我们到底该扩展哪些维呢??
注意了!!!在这里,我们要遵循一个引入原则,那就是“新样本旨在提高回答的置信度,而不改变查询的语义。”什么意思?说白了就是你扩展的维不能与你待预测的值有很大的关系。
书上举了个例子。在这里例子,我们主观认知,收入与教育水平有关系。此时,样本数据过小了,我们需要进行样本内查询扩展。假如说我们扩展education维的话,这就违反了原则。因为education与income的关系非常密切,我们这样做可能会改变最终的结果,因此,我们扩展birth_month。因为我们通常认为,income与出生年月日没有什么关系。
在上面我们反复提到了关系,那么究竟如何来度量这些关系呢?换句话说,我们怎么知道这个维与待预测的值之间有没有关系?
很简单,其实这就是一个相关性的问题。我们在第二章就提到过计算相关性的问题。其实这里也是一样的。通常的,我们对数值数据使用皮尔逊相关系数来计算相关性,而对标称数据使用卡方检验
OK,到这里,我们已经知道了该拓展那些维了。那么是不是我们就一定要使用拓展维里面的所有数据呢?
答案是否定的,我们应该选择语义类似的值。如何选择语义类似的值?方法有两个:一个是选择接近被例示的查询值的值,一个是使用t-检验。
P143下面有详细解释,P144,例5.14也有详细的例子展示。

方体间查询
理解了方体内查询,方体间查询就很好理解了。具体查看书145页。

排序立方体
同样的,Top-k查询在日常生活中也是比较常见的。而传统的数据立方体不能满足这种要求。因此,我们引入一种新的立方体结构,即排序立方体。排序立方体的核心思想是物化+分区。具体看书145,5.3.2

总结,第五章涉及到很多数据库方面的知识。对这一块不是特别熟悉的,很吃力的同学,可以暂时忽略这一章。等以后在实际工作中有需要了,再去了解。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值