一、关联规则挖掘

1、 Apriori算法

(1)Apriori算法原理
Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然后利用L1找频繁2项集的集合L2,L2找L3,如此下去,直到不能再找到任何频繁k项集。最后再在所有的频繁集中找出强规则,即产生用户感兴趣的关联规则。

(2)Apriori算法过程

Apriori算法具有这样一条性质:任一频繁项集的所有非空子集也必须是频繁的。因为假如P(I)< 最小支持度阈值,当有元素A添加到I中时,结果项集(A∩I)不可能比I出现次数更多。因此A∩I也不是频繁的。
1) 连接步
为找出Lk(所有的频繁k项集的集合),通过将Lk-1(所有的频繁k-1项集的集合)与自身连接产生候选k项集的集合。候选集合记作Ck。设l1和l2是Lk-1中的成员。记li[j]表示li中的第j项。假设Apriori算法对事务或项集中的项按字典次序排序,即对于(k-1)项集li,li[1]<li[2]<……….<li[k-1]。将Lk-1与自身连接,如果(l1[1]=l2[1])&&( l1[2]=l2[2])&&……..&& (l1[k-2]=l2[k-2])&&(l1[k-1]<l2[k-1]),那认为l1和l2是可连接。连接l1和l2 产生的结果是{l1[1],l1[2],……,l1[k-1],l2[k-1]}。
2) 剪枝步
CK是LK的超集,也就是说,CK的成员可能是也可能不是频繁的。通过扫描所有的事务(交易),确定CK中每个候选的计数,判断是否小于最小支持度计数,如果不是,则认为该候选是频繁的。为了压缩Ck,可以利用Apriori性质:任一频繁项集的所有非空子集也必须是频繁的,反之,如果某个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK中删除。

3)由频繁项集产生关联规则
Confidence(A->B)=P(B|A)=support_count(AB)/support_count(A)
关联规则产生步骤如下:
1) 对于每个频繁项集l,产生其所有非空真子集;
2) 对于每个非空真子集s,如果support_count(l)/support_count(s)>=min_conf,则输出 s->(l-s),其中,min_conf是最小置信度阈值。(Tip:为什么要压缩CK呢?因为实际情况下事务记录往往是保存在外存储上,比如数据库或者其他格式的文件上,在每次计算候选计数时都需要将候选与所有事务进行比对,众所周知,访问外存的效率往往都比较低,因此Apriori加入了所谓的剪枝步,事先对候选集进行过滤,以减少访问外存的次数。)

(3)Apriori算法例子:

T100

I1,I2,I5

T200

I2,I4

T300

I2,I3

T400

I1,I2,I4

T500

I1,I3

T600

I2,I3

T700

I1,I3

T800

I1,I2,I3,I5

T900

I1,I2,I3




例如,在上述例子中,针对频繁集{I1,I2,I5}。可以产生哪些关联规则?该频繁集的非空真子集有{I1,I2},{I1,I5},{I2,I5},{I1 },{I2}和{I5},对应置信度如下:
I1&&I2->I5 confidence=2/4=50%
I1&&I5->I2 confidence=2/2=100%
I2&&I5->I1 confidence=2/2=100%
I1 ->I2&&I5 confidence=2/6=33%
I2 ->I1&&I5 confidence=2/7=29%
I5 ->I1&&I2 confidence=2/2=100%
如果min_conf=70%,则强规则有I1&&I5->I2,I2&&I5->I1,I5 ->I1&&I2。

2、Fp-tree算法

(1)Fp-tree算法步骤

a、建立 FP-tree树

扫描数据库一次,找出频繁1-项集,按递减顺序排序。再一次扫描数据库,建立FP-tree;

b、 利用FP-tree挖掘频繁集

对于每一个项,先构造条件模式基,然后构造条件FP-树。 在每一个新创建的条件FP-树上重复此过程。 直到结果FP-树为空,或只包含一条路径 。

 

(2)Fp-tree算法流程

Step 1:遍历一次数据库,导出频繁项(1项集)的集合和支持度计数(频率),并且以降序排序。

Step 2:构造FP-tree

Step 3:根据第二步得到的FP-Tree, 为1项频繁项集中的每一项构造条件FP-Tree.

Step 4:得到频繁模式(频繁项集)

(3)Fp-tree的优缺点

优点:整个过程只需要遍历两次事务数据库,并且把大量的数据压缩存储在树中,在时间与空间的开销都优于Apriori算法。

缺点:是需要使用条件模式基递归地构造FP-Tree不仅占用大量的内存空间,而且一次迭代过程结束后,通常只能得到几个频繁模式,因此算法的效率有待进一步提高。


二、分类(有监督学习)

1、KNN

(1)算法思路:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法不仅可以用于分类,还可以用于回归

例如:

 

当K=3,取离绿圆最近的3个邻居,

数据挖掘中的算法knn 数据挖掘算法总结_关联规则

显然多数类是红色三角,故为红色三角;

当K=5,取离绿圆最近的5个邻居,显然多数类是蓝色方形,故为蓝色方形

(2)KNN算法不足:

(a)当样本不平衡时,易误分。当一个类的样本容量很大,而其他类样本容量很小时,在输入一个新样本时,该样本的K个邻居中大容量类的样本占多数;

(b)计算量大。为了得出每一个待分类的文本都要计算出它到全体已知样本的距离,才能求得它的K个最近邻点。

 

2、朴素贝叶斯

多项式模型

(1)   贝叶斯公式

数据挖掘中的算法knn 数据挖掘算法总结_数据挖掘_02

表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:

数据挖掘中的算法knn 数据挖掘算法总结_数据挖掘中的算法knn_03


      贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。

      下面不加证明地直接给出贝叶斯定理:

     

数据挖掘中的算法knn 数据挖掘算法总结_数据挖掘中的算法knn_04

(2)   朴素贝叶斯分类原理

朴素贝叶斯分类的正式定义如下:

      1、设

数据挖掘中的算法knn 数据挖掘算法总结_数据挖掘_05

为一个待分类项,而每个a为x的一个特征属性。      2、有类别集合

数据挖掘中的算法knn 数据挖掘算法总结_数据挖掘_06

。      3、计算

数据挖掘中的算法knn 数据挖掘算法总结_聚类_07

。      4、如果

数据挖掘中的算法knn 数据挖掘算法总结_聚类_08


      那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:

      1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

      2、统计得到在各类别下各个特征属性的条件概率估计。即

          

数据挖掘中的算法knn 数据挖掘算法总结_数据挖掘中的算法knn_09

   。

      3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

数据挖掘中的算法knn 数据挖掘算法总结_分类_10

     

      因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

     

数据挖掘中的算法knn 数据挖掘算法总结_数据挖掘中的算法knn_11


(3)贝叶斯分类应用举例

在多项式模型中,设某文档d=(t1,t2,…,tk),tk是该文档中出现过的单词,允许重复,则

先验概率P(c)= 类c下单词总数/整个训练样本的单词总数

类条件概率P(tk|c)=(类c下单词tk在各个文档中出现过的次数之和+1)/(类c下单词总数+|V|)

V是训练样本的单词表(即抽取单词,单词出现多次,只算一个),|V|则表示训练样本包含多少种单词。在这里,m=|V|, p=1/|V|。

P(tk|c)可以看作是单词tk在证明d属于类c上提供了多大的证据,而P(c)则可以认为是类别c在整体上占多大比例(有多大可能性)。

贝叶斯算法应用举例

给定一组分类好了的文本训练数据,如下:

docId

doc

类别

In c=China?

1

Chinese Beijing Chinese

yes

2

Chinese Chinese Shanghai

yes

3

Chinese Macao

yes

4

Tokyo Japan Chinese

no

给定一个新样本Chinese Chinese Chinese Tokyo Japan,对其进行分类。

该文本用属性向量表示为d=(Chinese, Chinese, Chinese, Tokyo, Japan),类别集合为Y={yes, no}。

类yes下总共有8个单词,类no下总共有3个单词,训练样本单词总数为11,因此P(yes)=8/11, P(no)=3/11。类条件概率计算如下:

P(Chinese | yes)=(5+1)/(8+6)=6/14=3/7

P(Japan | yes)=P(Tokyo | yes)= (0+1)/(8+6)=1/14

P(Chinese|no)=(1+1)/(3+6)=2/9

P(Japan|no)=P(Tokyo| no) =(1+1)/(3+6)=2/9

分母中的8,是指yes类别下textc的长度,也即训练样本的单词总数,6是指训练样本有Chinese,Beijing,Shanghai, Macao, Tokyo, Japan 共6个单词,3是指no类下共有3个单词。

有了以上类条件概率,开始计算后验概率,

P(yes | d)=(3/7)3×1/14×1/14×8/11=108/184877≈0.00058417

P(no | d)= (2/9)3×2/9×2/9×3/11=32/216513≈0.00014780

参考:


三、聚类(无监督学习)

1、K-means

思路:首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。


Kmeans算法的优点是简洁和快速,缺点是关键在于初始点的选取和跟离公式对最终的聚类效果影响明显。

2、层次聚类


数据挖掘中的算法knn 数据挖掘算法总结_数据挖掘中的算法knn_12

缺点:一个样本点一旦划分给某个簇,在后继迭代的过程将永远属于这个类簇,不再具有分配能力。

 

3、基于密度聚类DBSCSN

算法目标:DBSCAN目标是为了找密度相连对象的最大集合。

算法描述:

标记所有对象为unvisited

Do

     随机选择一个unvisited对象P

     标记P为visited

     If P的e邻域至少有minPts个对象

             创建一个新簇C,并把P添加到C

             令N为P的e邻域中的对象集合

                For  N中每个点P

                     If P是unvisited

                           标记P为visited

                          If P为核心对象  将P邻域中所有对象放入N中

                          If  P还不是任何簇的成员,把P添加到C

               End For

               输出C

  ELSE 标记P为噪声点

Until 没有标记为unvisited的对象

算法优点:(1)  可以发现任意形状的聚类簇;

                  (2) 与K-MEANS比较起来,不需要输入要划分的聚类个数;

(3)聚类簇的形状没有偏倚;

(4)可以在需要时输入过滤噪声的参数;

 

算法缺点:(1)当数据量增大时,要求较大的内存支持I/O消耗也很大;

        (2)高维度问题,密度定义麻烦;

(3)当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差。