前言

本篇博客出于学习交流目的,主要是用来记录自己学习后的理解,过程中遇到的问题和心路历程,方便之后回顾。过程中可能引用其他大牛的博客,文末会给出相应链接,侵删!

REMARK:本人菜鸟一枚,如有理解错误还望大家能够指出,相互交流。也是第一次以博客的形式记录,文笔烂到自己都看不下去,哈哈哈


这篇学习笔记关于一种高效Top-k的频繁效用项集挖掘算法。
参考文献:Efficient Algorithms for Mining Top-K High Utility Itemsets

本篇博客介绍论文中的第二种 one-phase算法TKO,一些必要的基础概念和定义在Top-k高效用项集挖掘学习笔记(一) 基础概念中给出,另一种 two-phase 算法在 Top-k高效用项集挖掘学习笔记(二) TKU 中详细记录,请手动跳转。

正文

TKO算法是这篇文章提出的第二种算法,他只需要一个过程就可以得到结果。这个算法基于HUI-Miner算法以及它的utility-list 结构,TKO的项集从这个utility-list中生成而不扫描原始数据库。本篇结构还是先说基础算法 TKOBase T K O B a s e TKO_{Base},然后再说最终版本,即在基础算法上加优化策略。(算法中包括 RUC、RUZ、EPB R U C 、 R U Z 、 E P B RUC、RUZ、EPB优化策略)

utility-list 结构

开始算法前,先简单了解一下utility-list 结构。

项的utility-list 被称作 initial utility-lists,可以通过扫描两次数据库得到。第一次遍历时计算项的TWU值和效用值;第二次扫描数据库时每个交易记录中的项按TWU值大小排序,并且每个项的 utility-list 被创建。

如表7所示,即交易记录中item按TWU值从小到大排序后的结果。

Fig.4展示了各项的utility-lists。每个item都由一个或多个元组组成,即有哪些交易记录包含这些项;元组由三部分组成(Tid,内部效用值iutil,剩余效用值rutil);剩余效用值就是这个item后面的效用值之和,具体看下面的定义。

Definition 17. 前驱和后继(Precede and succeed):
按照TWU值从小到大排列项, Ii≺Ij I i ≺ I j I_{i}\prec I_{j}表示 Ii I i I_{i}在 Ij I j I_{j}之前,即前驱,当且仅当 TWU(Ii) T W U ( I i ) TWU\left ( I_{i}\right )大于或等于 TWU(Ij) T W U ( I j ) TWU\left ( I_{j}\right ),并且 Ii I i I_{i}按字典序比 Ij I j I_{j}小;否则称为后继,记作 Ii≻Ij I i ≻ I j I_{i} \succ I_{j} (原文符号标记好像有误)。

Definition 18. 项集的级联(Concatenation of an itemset):
有两个项集 X={x1,x2,⋯,xu}(xi∈I∗,1≤i≤u) X = { x 1 , x 2 , ⋯ , x u } ( x i ∈ I ∗ , 1 ≤ i ≤ u ) X=\left \{ x_{1},x_{2}, \cdots ,x_{u}\right \}\left ( x_{i}\in I^{*},1\leq i\leq u \right ) 和 Y={y1,y2,⋯,yv}(yj∈I∗,1≤j≤v) Y = { y 1 , y 2 , ⋯ , y v } ( y j ∈ I ∗ , 1 ≤ j ≤ v ) Y=\left \{ y_{1},y_{2}, \cdots ,y_{v}\right \}\left ( y_{j}\in I^{*},1\leq j\leq v \right ),当且仅当 X⊂Y X ⊂ Y X\subset Y并且 Y Y Y的每个 item yi∉X" role="presentation" style="position: relative;">yi∉Xyi∉Xy_{i}\notin X都是X所有 item 的后继, Y Y Y称为X" role="presentation" style="position: relative;">XXX的级联。

Definition 19. (Appear after):
给定优先集合 I∗={I1,I2,⋯,Im} I ∗ = { I 1 , I 2 , ⋯ , I m } I^{*}=\left \{ I_{1}, I_{2},\cdots ,I_{m}\right \},和顺序 I1≺I2≺⋯≺Im I 1 ≺ I 2 ≺ ⋯ ≺ I m I_{1}\prec I_{2} \prec\cdots \prec I_{m} ;假设项集和交易记录中的项都按这个顺序排序好了,在一个交易记录 Tr T r T_{r}中,一个项 Ij∈I∗ I j ∈ I ∗ I_{j}\in I^{*}在项集 X={x1,x2,⋯,xL} X = { x 1 , x 2 , ⋯ , x L } X=\left \{ x_{1},x_{2}, \cdots ,x_{L}\right \}之后发生,当且仅当 Ij∈Tr I j ∈ T r I_{j}\in T_{r}并且 x1≺x2≺⋯≺xL≺Ij x 1 ≺ x 2 ≺ ⋯ ≺ x L ≺ I j x_{1}\prec x_{2} \prec\cdots \prec x_{L} \prec I_{j} ; Tr T r T_{r}中所有出现在 X X X之后的项集记作Tr/X" role="presentation" style="position: relative;">Tr/XTr/XT_{r}/X。

Definition 20. 交易记录剩余效用值(Remaining utility of an itemset in a transaction): RU(X,Tr) R U ( X , T r ) RU\left ( X,T_{r} \right )

RU(X,Tr)=∑Ii∈Tr/XEU(Ii,Tr) R U ( X , T r ) = ∑ I i ∈ T r / X E U ( I i , T r )

RU\left ( X,T_{r} \right )=\sum _{I_{i}\in T_{r}/X}EU\left ( I_{i}, T_{r} \right )
Definition 21. 数据库中的剩余效用值(Remaining utility of an itemset in a database): RU(X) R U ( X ) RU\left ( X \right )

RU(X)=∑Tr∈DRU(X,Tr) R U ( X ) = ∑ T r ∈ D R U ( X , T r )

RU\left ( X \right )=\sum _{T_{r}\in D}RU\left ( X,T_{r} \right )
Definition 22. 效用列表结构(Utility-list structure): ul(X) u l ( X ) ul\left ( X \right )
项集X的Utility-list记作 ul(X) u l ( X ) ul\left ( X \right ),里头存着若干三元组,有几个交易记录包含该项集就有几个元组,每个元组 ⟨r,EU(X,Tr),RU(X,Tr)⟩ ⟨ r , E U ( X , T r ) , R U ( X , T r ) ⟩ \left \langle r,EU\left ( X,T_{r} \right ),RU\left ( X,T_{r} \right ) \right \rangle,即交易记录的序号,X在交易记录上的效用值,X在交易记录上的剩余效用值。

以表7的数据集为例, {D} { D } \left \{ D \right \}在 T1 T 1 T_{1}上的剩余效用值 RU({D},T1)=EU({A},T1)+EU({C},T1) R U ( { D } , T 1 ) = E U ( { A } , T 1 ) + E U ( { C } , T 1 ) RU\left ( \left \{ D \right \},T_{1} \right )=EU\left ( \left \{ A \right \}, T_{1} \right )+EU\left ( \left \{ C \right \}, T_{1} \right ); {D} { D } \left \{ D \right \}在整个数据集上的剩余效用值 RU({D})=RU({D},T1)+RU({D},T3)+RU({D},T4)=(6+13+14)=33 R U ( { D } ) = R U ( { D } , T 1 ) + R U ( { D } , T 3 ) + R U ( { D } , T 4 ) = ( 6 + 13 + 14 ) = 33 RU\left ( \left \{ D \right \}\right )=RU\left ( \left \{ D \right \},T_{1} \right )+RU\left ( \left \{ D \right \},T_{3} \right )+RU\left ( \left \{ D \right \},T_{4} \right )=(6+13+14)=33; {DE} { D E } \left \{ DE \right \}在整个数据集上的剩余效用值 RU({DE})=RU({DE},T3)+RU({DE},T4)=(1+3)=4 R U ( { D E } ) = R U ( { D E } , T 3 ) + R U ( { D E } , T 4 ) = ( 1 + 3 ) = 4 RU\left ( \left \{ DE \right \}\right )=RU\left ( \left \{ DE \right \},T_{3} \right )+RU\left ( \left \{ DE \right \},T_{4} \right )=(1+3)=4。

Property 4.在项集X的Utility-list中,所有元组第二列( iutil i u t i l iutil)的结果相加即X的效用值。

Property 5.有项集 X X X和级联项集Y⊃X" role="presentation" style="position: relative;">Y⊃XY⊃XY\supset X,如果把元组第二列( iutil i u t i l iutil)和第三列( rutil r u t i l rutil)全部求和的效用值小于阈值 δ δ \delta ,那么 Y Y Y的效用值也小于δ" role="presentation" style="position: relative;">δδ\delta 。

Y Y Y是X" role="presentation" style="position: relative;">XXX级联,根据定义18, Y Y Y中多的项一定排在X" role="presentation" style="position: relative;">XXX之后,而 X X X的iutil" role="presentation" style="position: relative;">iutiliutiliutil和 rutil r u t i l rutil的累加和一定大于等于 Y Y Y的iutil" role="presentation" style="position: relative;">iutiliutiliutil和 rutil r u t i l rutil的累加和,根据 Property 4 P r o p e r t y 4 Property \ 4所以一定大于Y的效用值。

TKOBase T K O B a s e TKO_{Base}算法——基础算法

TKOBase T K O B a s e TKO_{Base}输入参数k和一个数据集 D D \mathcal{D}; TKOBase T K O B a s e TKO_{Base}开始时设置 min_utilBorder=0 m i n _ u t i l B o r d e r = 0 min\_util_{Border}=0,并且创建一个小堆结构 TopK−CI−List T o p K − C I − L i s t TopK-CI-List来存储过程中的top-k HUIs H U I s HUIs;算法扫描两边数据库创建initial utility-lists ϕ−ULs ϕ − U L s \phi -ULs;然后用Topk-HUI-Search 算法(基于结合RUC:Raising threshold byUtility of Candidates和HUI-Miner算法,出自参考论文14)去挖掘搜索空间中的top-k HUI;算法不断更新 TopK−CI−List T o p K − C I − L i s t TopK-CI-List中的top-k HUIs H U I s HUIs,并利用列表中的信息更新 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border};算法结束时, TopK−CI−List T o p K − C I − L i s t TopK-CI-List中保存的即为top-k HUIs H U I s HUIs完整解集。

对于每个搜索过程产生的L-项集 X={x1,x2,⋯,xL} X = { x 1 , x 2 , ⋯ , x L } X=\left \{ x_{1},x_{2},\cdots ,x_{L} \right \},如果都不小于 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border},那么利用RUC策略来更新 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border}的值。RUC就是把X加入 TopK−CI−List T o p K − C I − L i s t TopK-CI-List中,然后 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border}更新为第k大EU值项集的阈值,把低于 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border}的项集从 TopK−CI−List T o p K − C I − L i s t TopK-CI-List中删去,保证 TopK−CI−List T o p K − C I − L i s t TopK-CI-List中只有top-k个。

算法伪代码如下图所示:

比较项集 X X X的iutil" role="presentation" style="position: relative;">iutiliutiliutil和 rutil r u t i l rutil的累加和与 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border}大小,利用Property 5剪枝(第六行); Class[X] C l a s s [ X ] Class\left [ X \right ]和 ULS[X] U L S [ X ] ULS\left [ X \right ]分别储存项集级联以及他们的 utility-lists(第七行);候选项集 Z=X∪Y Z = X ∪ Y Z=X\cup Y,并创建Z的utility-lists ul(Z) u l ( Z ) ul\left ( Z \right ),之后就是不断迭代的过程,直到没有候选项集生成时停止。

策略6:RUC(Raising the threshold by the Utilities of Can-didates)
这个策略可以用于任何one-phace依赖效用值建立的算法。该策略用 TopK−CI−List T o p K − C I − L i s t TopK-CI-List结构保存top-k HUIs H U I s HUIs,并把项集按降序排列。最初 TopK−CI−List T o p K − C I − L i s t TopK-CI-List为空,把新项集X加入 TopK−CI−List T o p K − C I − L i s t TopK-CI-List中,然后 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border}更新为第k大EU值项集的阈值,把低于 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border}的项集从 TopK−CI−List T o p K − C I − L i s t TopK-CI-List中删去,保证 TopK−CI−List T o p K − C I − L i s t TopK-CI-List中只有top-k个。

当给定两个项集 X X X和Y" role="presentation" style="position: relative;">YYY以及他们的前缀 P P P,在Topk-HUI-Search 算法过程中,项集Z=X∪Y" role="presentation" style="position: relative;">Z=X∪YZ=X∪YZ=X\cup Y的utility-lists ul(Z) u l ( Z ) ul\left ( Z \right )由下结构过程生成,其中包括两种情况:

CAES1:假设有一项集 X={x1} X = { x 1 } X=\left \{ x_{1} \right \}和 Y={y1} Y = { y 1 } Y=\left \{ y_{1} \right \},并且 x1≺y1 x 1 ≺ y 1 x_{1}\prec y_{1}。让 Z=X∪Y={x1,y1} Z = X ∪ Y = { x 1 , y 1 } Z=X\cup Y=\left \{ x_{1} ,y_{1} \right \}是由X级联 y1 y 1 y_{1} 生成的二项集。utility-lists ul(X) u l ( X ) ul\left ( X \right )和utility-lists ul(Y) u l ( Y ) ul\left ( Y \right )初始化的时候就被创建了,而utility-lists ul(Z) u l ( Z ) ul\left ( Z \right )是通过下面的方法得到。包含项集Z的交易记录记为 Tr T r T_{r},在utility-lists ul(Z) u l ( Z ) ul\left ( Z \right )中创建元组 ⟨Tr,EU(Z,Tr),RU(Z,Tr)⟩ ⟨ T r , E U ( Z , T r ) , R U ( Z , T r ) ⟩ \left \langle T_{r},EU\left ( Z,T_{r} \right ),RU\left ( Z,T_{r} \right ) \right \rangle,其中 EU(Z,Tr)=EU(x1,Tr)+EU(y1,Tr) E U ( Z , T r ) = E U ( x 1 , T r ) + E U ( y 1 , T r ) EU\left ( Z,T_{r} \right )=EU\left ( x_{1} ,T_{r} \right )+EU\left ( y_{1},T_{r} \right ), RU(Z,Tr)=EU(y1,Tr) R U ( Z , T r ) = E U ( y 1 , T r ) RU\left ( Z,T_{r} \right )=EU\left ( y_{1},T_{r} \right )

CAES2:假设有L-1项集 X={x1,x2,⋯,xL−1} X = { x 1 , x 2 , ⋯ , x L − 1 } X=\left \{ x_{1},x_{2},\cdots ,x_{L-1} \right \}和 Y={y1,y2,⋯,yL−1} Y = { y 1 , y 2 , ⋯ , y L − 1 } Y=\left \{ y_{1},y_{2},\cdots ,y_{L-1} \right \}( L≥2 L ≥ 2 L\geq 2),有 xi=yi(1≤i≤L−1) x i = y i ( 1 ≤ i ≤ L − 1 ) x_{i}=y_{i} \left ( 1\leq i\leq L-1 \right )以及 xL−1≺yL−1 x L − 1 ≺ y L − 1 x_{L-1}\prec y_{L-1}。让 Z=X∪Y={x1,x2,⋯,xL−1,yL−1} Z = X ∪ Y = { x 1 , x 2 , ⋯ , x L − 1 , y L − 1 } Z=X\cup Y=\left \{ x_{1},x_{2},\cdots ,x_{L-1} ,y_{L-1} \right \}是由X级联 yL−1 y L − 1 y_{L-1} 生成的L项集;让 P=X∩Y={x1,x2,⋯,xL−2} P = X ∩ Y = { x 1 , x 2 , ⋯ , x L − 2 } P=X\cap Y=\left \{ x_{1},x_{2},\cdots ,x_{L-2} \right \}是 X X X和Y" role="presentation" style="position: relative;">YYY的共同前缀,给出utility-lists ul(X) u l ( X ) ul\left ( X \right ), ul(Y) u l ( Y ) ul\left ( Y \right )和 ul(P) u l ( P ) ul\left (P \right ),而utility-lists ul(Z) u l ( Z ) ul\left ( Z \right )是通过下面的方法得到。
包含项集Z的交易记录记为 Tr T r T_{r},在utility-lists ul(Z) u l ( Z ) ul\left ( Z \right )中创建元组 ⟨Tr,EU(Z,Tr),RU(Z,Tr)⟩ ⟨ T r , E U ( Z , T r ) , R U ( Z , T r ) ⟩ \left \langle T_{r},EU\left ( Z,T_{r} \right ),RU\left ( Z,T_{r} \right ) \right \rangle,其中 EU(Z,Tr)=[EU(X,Tr)+EU(Y,Tr)]−EU(P,Tr) E U ( Z , T r ) = [ E U ( X , T r ) + E U ( Y , T r ) ] − E U ( P , T r ) EU\left ( Z,T_{r} \right )=\left [ EU \left ( X,T_{r} \right ) +EU\left ( Y,T_{r} \right ) \right ]-EU\left ( P,T_{r} \right ), RU(Z,Tr)=EU(Y,Tr) R U ( Z , T r ) = E U ( Y , T r ) RU\left ( Z,T_{r} \right )=EU\left ( Y,T_{r} \right )。

TKO T K O TKO算法——最终算法

将给出四种改进策略用于 TKOBase T K O B a s e TKO_{Base}算法就是 TKO T K O TKO算法,前两种是PE和DGU,这两个在前一个算法里以及说明了。下面说另外两种改进策略。

Definition 23. (Z-element):当一个元素的剩余效用值是0的时候被称为Z-element,否则被称为NZ-element。在X的效用列表中的所有Z-element集合记作 ZE(X) Z E ( X ) ZE\left ( X \right )。

例如, {DBC} { D B C } \left \{ DBC \right \}有两个Z-element, ZE({DBC})={⟨T3,17,0⟩,⟨T4,17,0⟩} Z E ( { D B C } ) = { ⟨ T 3 , 17 , 0 ⟩ , ⟨ T 4 , 17 , 0 ⟩ } ZE\left ( \left \{ DBC \right \} \right )=\left \{ \left \langle T_{3},17,0 \right \rangle ,\left \langle T_{4},17,0 \right \rangle\right \}。

Property 6. NZEU(X) N Z E U ( X ) NZEU\left ( X \right )是项集 X X X的所有NZ-element的第二列(iutil)的和,如果[NZEU(X)+RU(X)]&lt;min_utilBorder" role="presentation" style="position: relative;">[NZEU(X)+RU(X)]<min_utilBorder[NZEU(X)+RU(X)]<min_utilBorder\left [ NZEU\left ( X \right )+RU\left ( X \right ) \right ],那么所有项集 X X X的级联都不是top-k HUIs。

策略7:RUZ(Reducing estimated utility values by using Z-elements)
该策略用在用于Topk-HUI-Search 算法生成候选项集过程中,根据Property 6,我们没必要生成[NZEU(X)+RU(X)]" role="presentation" style="position: relative;">[NZEU(X)+RU(X)][NZEU(X)+RU(X)]\left [ NZEU\left ( X \right )+RU\left ( X \right ) \right ] 小于 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border}的项。

策略8:EPB(Exploring the most Promising Branches first)
该策略的目标是优先生成那些高效用值的候选项集,利用思想总是先扩展拥有最高预计效用值的项,这样更可能得到高效用值,因为这样可以更早的提早 min_utilBorder m i n _ u t i l B o r d e r min\_util_{Border},就可以剪枝更多的搜索空间。

总结

作者在多个不同稀疏程度的数据集上作了对比,对比 TKO T K O TKO和 TKU T K U TKU算法,总体上TKO} TKO} TKO}效果要好,包括内存消耗和速度上,因为 TKO T K O TKO是one-phace算法,具体详细对比可以看原文。

这篇文章看起来内容很多,但是如果把定义都理解清楚还是容易看懂的,最后几乎快变成翻译这篇论文了,不过我已经尽量简化一些复杂的定义和理解了。作为一个记录吧,希望以后自己再看起来方便回顾。

Top-k高效用项集挖掘_学习笔记(三) TKO相关推荐

  1. db4o_8.0对象数据库官方文档翻译_学习笔记三

    紧接上篇:db4o_8.0对象数据库官方文档翻译_学习笔记二 3. Object Manager Enterprise Overview(OME视图)即OME插件的使用 If you did not  ...

  2. K8S 学习笔记三 核心技术 Helm nfs prometheus grafana 高可用集群部署 容器部署流程

    K8S 学习笔记三 核心技术 2.13 Helm 2.13.1 Helm 引入 2.13.2 使用 Helm 可以解决哪些问题 2.13.3 Helm 概述 2.13.4 Helm 的 3 个重要概念 ...

  3. 韩顺平php可爱屋源码_韩顺平_php从入门到精通_视频教程_第20讲_仿sohu主页面布局_可爱屋首页面_学习笔记_源代码图解_PPT文档整理...

    韩顺平_php从入门到精通_视频教程_第20讲_仿sohu首页面布局_可爱屋首页面_学习笔记_源代码图解_PPT文档整理 对sohu页面的分析 注释很重要 经验:写一点,测试一点,这是一个很好的方法. ...

  4. 图论01.最短路专题_学习笔记+模板

    图论01.最短路专题_学习笔记+模板 一.定义与性质 ● 需要的前导知识点 路径 最短路 有向图中的最短路.无向图中的最短路 单源最短路.每对结点之间的最短路 ● 最短路的性质 对于边权为正的图,任意 ...

  5. DHCP服务_学习笔记

    DHCP服务_学习笔记 DHCP(Dynamic Host Configuration Protocol):动态主机配置协议 Lease:租约    续租时间需要是租期时间的一半 UDP协议: Ser ...

  6. 友盟统计+渠道包_学习笔记

    友盟统计+渠道包_学习笔记 资料: 官网:https://developer.umeng.com/docs/66632/detail/66889#h3-u5E38u89C1u95EEu9898 视频资 ...

  7. Dr_can Kalman Filter学习笔记(三)

    Dr_can Kalman Filter学习笔记(三) 本文学习自Dr_can卡尔曼滤波关于Kalman Gain的推导 本文对卡尔曼增益进行一个详细的推导. 一.问题引入 在笔记二中我们得到了状态空 ...

  8. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  9. Mr.J-- jQuery学习笔记(三十二)--jQuery属性操作源码封装

    扫码看专栏 jQuery的优点 jquery是JavaScript库,能够极大地简化JavaScript编程,能够更方便的处理DOM操作和进行Ajax交互 1.轻量级 JQuery非常轻巧 2.强大的 ...

最新文章

  1. 函数调用栈 剖析+图解
  2. boost::allocator_construct的实例
  3. 神舟六号的投入产出比:1比12
  4. 查看python版本和安装路径
  5. SAP UI5 jQuery.sap.includeStyleSheet
  6. copy-maven-plugin - where is it configured - Maven原理探究
  7. java ranger rest_kafka ranger integration issuse
  8. MyBatis第3天
  9. 前景检测算法(四)--GMM
  10. html自动留言,html 留言板
  11. QTP教程入门到高级(转)
  12. 第二次作业(个人作业):软件案例分析
  13. 光伏行业MES管理系统解决方案
  14. 多功能科学计算机.,科学计算器多功能版
  15. OSChina 周一乱弹 —— 年迈渔夫遭黑帮袭抢
  16. 跨考计算机日程记录01
  17. FlyThings OS:基于Linux实现现代化人机交互体验的新嵌入式操作系统
  18. 某程序员发现 CSDN官方“漏洞”,立省¥10000+,抓紧薅吧
  19. 实习第一天——网宿报到日
  20. 信息系统项目管理师 第三章-项目立项管理

热门文章

  1. 教你设置晨曦记账本登录加载本月账目,及时间显示模式
  2. 英属哥伦比亚大学计算机科学,英属哥伦比亚大学_University of British Columbia_学校介绍_专业设置...
  3. c 语言中双向链表逆转编程题,C/C++ 双链表之逆序的实例详解
  4. 2013 AMC8中文
  5. 开始菜单下运行框命令大全
  6. 跑跑卡丁车卡密自动充值工具
  7. 6-1 安全产品防火墙(完)
  8. Shader 轮廓线(描边)总结
  9. U盘误格式化后恢复操作
  10. 机器学习——朴素贝叶斯算法