大數據分析與挖掘


第一章 緒論

大數據分析與挖掘簡介

大數據的四個特點(4v):容量(Volume)、多樣性(Variety)、速度(Velocity)和價值

  概念:數據分析是用適當的統計分析方法,對收集來的大量數據進行分析,提取有用信息和形成結論並對數據加以詳細研究和概括總結的過程。數據分析可以分為三個層次,即描述分析、預測分析和規范分析。

  數據挖掘:是指從數據集合中提取人們感興趣的知識,這些知識是隱含的、實現未知的、潛在有用的信息。提取出來的知識一般可表示為概念、規則、規律、模式等形式。

大數據分析與挖掘主要技術

大數據分析與挖掘的過程一般分為如下幾個步驟:

  1. 任務目標的確定
          這一步驟主要是進行應用的需求分析,特別是要明確分析的目標,了 解與應用有關的先驗知識和應用的最終目標。
  2. 目標數據集的提取
          這一步驟是要根據分析和挖掘的目標,從應用相關的所有數據中抽取數據集,並選擇全部數據屬性中與目標最相關的屬性子集。
  3. 數據預處理
          這一步聚用來提高數據挖掘過程中所需數據的質量,同時也能夠提高挖掘的效率。數據預處理過程包括數據清洗、 數據轉換、數據集成、數據約減等操作。
  4. 建立適當的數據分析與挖掘模型
          這一步驟包含了大量的分析與挖掘功能,如統計分析、分類和回歸、聚類分析、關聯規則挖掘、異常檢測等。
  5. 模型的解釋與評估
          這一步驟主要見對挖掘出的模型進行解釋,可以用可視化的方式來展示它們以利於人們的理解。 對模型的評估可以采用自動或半自動方式來進行,目的是找出用戶真正感興趣或有用的模型。
  6. 知識的應用
          將挖掘出的知識以及確立的模型部署在用戶的應用中。但這並不代表數據挖掘過程的結束,還需要一個不斷反饋和迭代的過程,使模型和挖掘出的知識更加完善。

數據挖掘主要包括如下的功能

  1. 對數據的統計分析與特征描述
  2. 關聯規則挖掘和相關性性分析
  3. 分類和回歸
          例如決策樹、貝葉斯分類器、KNN分類器、組合分類算法等,回歸則是對數值型的函數進行建模,常用於數值預測。
  4. 聚類分析
          聚類的主要目標是使聚類內數據的相似性最大,聚類間數據的相似性最小

  5. 異常檢測

第二章 數據特征分析與預處理

數據類型

2.1.1數據集類型

  1. 結構化數據
          即行數據,存儲在數據庫里,可以用二維表結構來邏輯表達實現的數據,所有的數據都具有相同的模式。
  2. 半結構化數據
          半結構化數據也具有一定的結構,但是沒有像關系數據庫中那樣嚴格的模式定義。
          常見的半結構化數據主要有XML文檔和JSON數據
  3. 非結構化數據
          非結構化數據沒有預定義的數據了模型,涵蓋各種文檔、文本、圖片、報表、圖像、音頻、視頻

數據屬性的類型

  1. 標稱屬性
          標稱屬性類似於標簽,其中的數字或字符只是用來對物體進行識別和分類,不具有順序關系,也不存在比較關系。
          對標稱屬性不能做加減乘除運算,可以分析各個屬性值出現的次數
          當標稱屬性類別或狀態數為兩個的時候,稱為二元屬性,也被稱為布爾屬性,如果二元屬性的兩種狀態具有相同的重要程度,則稱為對稱的
  2. 序數屬性
          這種屬性值之間可以有順序關系,例如:學生成績可以分為優秀、良好、中等、及格和不及格;產品質量可以分為優秀、合格和不合格。這樣的屬性稱為序數屬性,在統計學中也稱為定序變量
          標稱、二元和序數屬性的取值都是定性的,它們只描述對象的特征,如高、低等定性信息,並不給出實際的大小。可以用來比較大小,但還不能反應不同等級間的差異程度,不能進行加減乘除等數學運算
  3. 數值屬性
          數值屬性是可以度量的,通常用實數來表示。
          數值屬性可以分為區間標度屬性比率標度屬性
          (1)區間標度屬性不能進行比率運算,例如20℃不能說是10℃的兩倍,類似區間標度屬性的還有日歷日期、華氏溫度、智商、用戶滿意度打分等。這些區間標度屬性共同的特點是:用相等的單位尺度度量,屬性的值有序,可以為正、負或零。相等的數字距離代表所測量相等的數量差值,在統計學上也稱為定距變量
          (2)比率標度屬性由於存在絕對零點,因此可以進行比率的計算,即它可進行加減乘除運算。這一類數值屬性稱為比率標度屬性,在統計學中稱為定比變量,是應用最廣泛的一類數值屬性

屬性類型總結

標稱屬性 序數屬性 區間標度屬性 比率標度屬性
頻數統計
眾數
順序關系
中位數
平均數
量化差異
加減運算
乘除運算
定義"真正零值"

數據的描述性特征

描述數據幾種趨勢的度量

1. 算術平均數 一個包含n個數值型數據的集合,其算術平均數的定義是:

\[\bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_{i} \]

(1)一個集合中的各個數據與算術平均數離差之和等於零,即:\(\sum_{i=1}^{n}(x_{i}-\bar{x})=0\) 這個性質在數據的規范化中會被用到
(2)一個集合中的各個數據與算術平均數的離差平方之和是最小的。

算術平均數的缺點:容易受到集合中極端值或離群點的影響。

  1. 中位數
    中位數是按照一定順序排列后處於中間位置上的數據,中位數比算術平均數對於離群點的敏感度要低。當數據集合的分布呈現偏斜的時候,采用中位數作為集中趨勢的度量更加有效

  2. 眾數 (適合標稱屬性)
    當數據的數量較大並且集中趨勢比較明顯的時候,眾數更適合作為描述數據代表性水平的度量。

  3. k百分位數
    將一組數據從小到大排序,並計算相應的累計百分比,處於k%位置的值稱為第k百分位數,用\({X_{k\% }}\)表示。在一個集合里,有k%的數小於或等於\({X_{k\% }}\),有1-k%的數大於它。
    例:設有一組數據:[-35,10,20,30,40,50,60,100],求它的25百分位數,即\({X_{25\% }}\)
    一般有兩種方法,分別是(n+1) * k%或者1+(n-1) * k%
    \({X_{25\% }}\)所在位置是1+(8-1)* 25%=2.75,處於第二個和第三個數之間,即10與20之間。如果采用線性插值的話\({X_{25\% }}\)=10+(20-10)* 0.75=17.5,中點:(10+20)/ 2=15

  4. 四分位數
    四分位數是一種特殊的百分位數。
    (1)第一四分位數Q1,又稱“較小四分位數”,即25百分位數。
    (2)第二四分位數Q2,就是中位數。
    (3)第三四分位數Q3,又稱“較大四分位數”,即75百分位數。
    四分位數是比較常見的分析數據分布趨勢的度量

描述數據離中趨勢的度量

  1. 極差
    極差是指一組數據中最大值與最小值之差,又稱范圍誤差或全距,用R表示。
  2. 四分位數極差(IQR)
    四分位數極差也稱內距,計算公式IQR=Q3-Q1,即第三四分位數減去第一四分位數的差,反應了數據集合中間50%數據的變動范圍。
    在探索性數據分析中,IQR可用於發現離群點,約翰·圖基給了一個判定方法:超過Q3+1.5 * IQR或者低於Q1-1.5 * IQR的數據可能是離群點。

  1. 平均絕對離差
    計算數據結合中各個數值與平均值的距離綜合,然后取其平均數。

\[MAD=\frac{1}{n}\sum_{i=1}^{n}|x_{i}-\bar{x}| \]

  1. 方差和標准差
    ♦樣本方差的計算公式:
    總體的方差:

\[{\sigma ^2}{\rm{ = }}\frac{{\sum {{{(X - \mu )}^2}} }}{N} \]

            樣本方差:

\[{s^2}{\rm{ = }}\frac{1}{{n - 1}}\sum\limits_{i = 1}^n {{{({x_i} - \overline x )}^2}} \]

            ♦標准差
            標准差=方差的算數平方根
5. 離散系數
離散系數又稱變異系數,樣本變異系數是樣本標准差與樣本平均數之比:

\[{{\rm{C}}_{\rm{v}}} = \frac{s}{{\mathop x\limits^ - }} \]

數據分布形態的度量

皮爾遜偏態系數
\(s{k_1} = \frac{{\mathop x\limits^ - - {M_0}}}{s}\) 或者 \(s{k_2} = \frac{{3(\mathop x\limits^ - - {M_d})}}{s}\)
其中,\(\mathop x\limits^ - \\\) 是平均數,\(\\{M_0}\\\)是重數,\(\\{M_d}\\\)是中位數,s是樣本標准差

數據的峰度及度量
峰度用於衡量數據分布的平坦度,它以標准正態分布作為比較的基准。峰度的度量使用峰度系數:

\[k = \frac{\frac{1}{n}\sum_{i=1}^{n}(x_{i}-\bar{x})^{4}}{(\frac{1}{n}\sum_{i=1}^{n}(x_{i}-\bar{x}))^{2}}-3 \]

k≈0,稱為常峰態,接近於正態分布。
k<0,稱為低峰態。
k>0,稱為尖峰態。

數據偏度和峰度的作用
       給定一個數據集合,通過計算它的偏度和峰度,可以符集數據分布與正態分布的差異,結合前面介紹的數據集中和離中趨勢度量,就能夠大致判斷數據分布的形狀等概要性信息,增加對數據的理解程度。

箱型圖

數據的相關分析

相關分析

  1. 散點圖
           判斷兩個屬性之間是否有相關性,可以首先通過散點圖進行直觀判斷。
           散點圖是將兩個屬性的成對數據,繪制在直角坐標系中得到的一系列點,可以直觀地描述屬性間是否相關、相關的表現形式以及相關的密切程度。

  2. 相關系數
    數據的各個屬性之間關系密切程度的度量,主要是通過相關系數的計算與檢驗來完成的。
    屬性X和Y之間的樣本協方差的計算公式:

\[{\mathop{\rm cov}} (X,Y) = \frac{{\sum\limits_{i = 1}^n {({X_i} - \mathop X\limits^ - )({Y_i} - \mathop Y\limits^ - )} }}{{n - 1}} \]

            協方差的正負代表兩個屬性相關性的方向,而協方差的絕對值代表它們之間關系的強弱。

  1. 樣本相關系數,協方差的大小與屬性的取值范圍、量綱都有關系,構成不同的屬性對之間的協方差難以進行橫向比較。為了解決這個問題,把協方差歸一化,就得到樣本相關系數的計算公式:

    \[\\r(X,Y) = \frac{{{\mathop{\rm cov}} (X,Y)}}{{{s_X}{s_Y}}}\\ \]

            \(\\{s_X}{s_Y}\\\)標准差
相關系數消除了兩個屬性量綱的影響,它是無量綱的。相關系數的取值范圍:-1<=r<=1;若0<r<=1,表示X和Y之間存在正線性相關關系;若-1<=r<0,表明X和Y之間存在負線性相關關系。若r=0,說明兩者之間不存在線性相關關系,但並不排除兩者之間存在非線性關系。

卡方檢驗
可以用相關系數來分析兩個數值型屬性之間的相關性。對於兩個標稱屬性(分類屬性),他們之間的獨立性檢驗可以使用卡方檢驗來推斷。

\[{\chi ^2} = \sum {\frac{{{{(Observed - Expected)}^2}}}{{Expected}}} \]

合計
小說 250(90) 200(360) 450
非小說 50(210) 1000(840) 1050
合計 300 1200 1500

\({\chi ^2}\)=507.93
自由度 dof=(r-1)(c-1) r和c分別是兩個屬性各個分類值的個數
自由度=(2-1)(2-1)
\({\chi ^2}\)就是統計樣本的實際觀測值與理論推算值之間的偏離程度。Observed(觀測),Expected(理論)

數據預處理

定義:對原始數據進行必要的清洗、集成、轉換和歸約等一系列處理,使數據達到進行只是獲取所要求的規范和標准

零均值化
將每一個屬性的數據都減去這個屬性的均值后,形成一個新數據集合,變換后各屬性的數據之和與均值都為零。各屬性的方差不發生變化,各屬性間的協方差也不發生變化。

z分數變換
標准分數也叫z分數,用公式表示為:

\[z = \frac{{x - \mathop x\limits^ - }}{s} \]

其中x為原始數據, \(\mathop x\limits^ - \\\)為樣本均值,s為樣本標准差。變換后數據的均值為0,方差為1。無量綱,數據盡量滿足高斯分布。
z值表示袁術數據和樣本均值之間的距離,是以標准差為單位計算的。原始數據低於標准值時,z為負數,反之為正數。
缺點:假如原始數據並沒有呈高斯分布,標准化的數據分布效果不好

最小-最大規范化
最小-最大規范化又稱離差標准化,是對原始數據的線性轉換,將數據按照比例縮放至一個特定區間。假設原來數據分布在區間[min,max],要變換到區間[min',max'],公式如下:

\[v^{'}=min^{'}+\frac{v-min}{max-min}(max^{'}-min^{'}) \]

獨熱編碼
獨熱編碼又稱一位有效編碼,用來對標稱屬性(分類屬性)進行編碼。

例,產品的顏色有{黑、白、藍、黃}四種取值,分別用1、2、3、4來編碼,假設有5個產品如下所示:

ID 顏色
1 1
2 2
3 3
4 4
5 5

問題:各個不同顏色值之間沒有順序關系,但從上述編碼來看,顏色黑和黃之間的差異為3,而藍和黃差異為1,似乎黃色和藍色更相似一些。因此,按照這種簡單的編碼方式計算對象之間的差異時,就會得到錯誤的結果。
在上面的例子中,可以將一個顏色標稱屬性擴充為4個二元屬性,分別對應黑、白、藍、黃四種取值。對於每一個產品,它在這四個屬性上只能有一個取1,其余三個都為0,所以稱為獨熱編碼

ID 黑色 白色 藍色 黃色
1 1 0 0 0
2 0 0 1 0
3 0 1 0 0
5 1 0 0 0
5 0 0 0 1

任意兩個不同顏色的產品之間的歐氏距離都是:
\(\sqrt{(1-0)^{2}+(0-1)^{2}+(0-0)^{2}+(0-0)^{2}}=\sqrt{2}\)
可以看出,每一個標稱屬性擴充為獨熱編碼后,在每一組新屬性中,只有一個為1,其余同組的擴充屬性值都為0,這就造成獨熱編碼構成的向量較稀疏。
      獨熱編碼能夠處理非連續性數值屬性,並在一定程度上擴充了數值的特征(屬性)。如在上例中顏色本身只是一個特征,經過獨熱編碼以后,擴充成了四個特征。
      使用獨熱編碼,將離散屬性的取值擴展到歐氏空間,回歸、分類、聚類等很多數據挖掘算法對距離或相似度的計算是非常普遍的,而獨熱編碼會讓距離的計算更加合理。
      在實際應用獨熱編碼時,要注意它的引入有時會帶來數據屬性(維數)極大擴張的負面影響。

數據抽樣技術

不放回簡單隨機抽樣

例:設有一組數據: [11,13,16, 19,27, 36,43, 54, 62, 75], 現在想要從中不放回隨機抽樣5個數據,每個數據被抽中的概率分別為[0.1, 0.05, 0.05, 0.05, 0.05, 0.1, 0.1,0.1,0.1, 0.3]。
抽樣過程如下。
(1 )根據待抽樣數據的概率,計算以數組形式表示的累計分布概率edf,並規范化。
計算: cdf=[0.1,0.15,0.2,0.25,0.3, 0.4, 0.5, 0.6,0.7, 1]
規范化: cdf/=cdf[-1], 得到:[0.1,0.15,0.2,0.25, 0.3, 0.4, 0.5,0.6,0.7,1]
(2)根據還需抽樣的個數,生成[0,1]的隨機數數組x。
[0.04504848, 0.5299489, 0.0734825, 0.52341745, 0.17316974]
(3)將x中的隨機數按照cdf值升序找到插入位置,形成索弓數組new。
[0,7,0,7,2]
(4)找出數組new中不重復的索引位置,作為本次抽樣的位置索引。
[0 7 2]
(5)在概率數組p中,將已經抽樣的索引位置置0。
P=[0, 0.05, 0., 0.05, 0.05, 0.1, 0.1, 0., 0.1, 0.3]
(6)重復上述步驟,直到輸出指定數目的樣本

水庫抽樣
輸入:一組數據,其大小未知
輸出:這組數據的K個均勻抽樣

要求:

  1. 僅掃描數據一次
  2. 空間復雜性為O(K)【和抽樣大小有關,和整個數據量無關,不可把所有數據都放在內存里進行抽樣】
  3. 掃描到數據的前n個數字時(n>K),保存當前已掃描數據的K個均勻抽樣

針對此種需求,水庫抽樣法應運而生

算法步驟:

  1. 申請一個長度為K的數組A保存抽樣
  2. 保存首先接收到的K個元素
  3. 當接收到第 i 個新元素 t 時,以 K / i 的概率隨機替換A中的元素(即生成 [ 1, i ]間隨機數j,若 j ≤ K,則以 t 替換 A[ j ])

算法性質:

  1. 該采樣是均勻的。
    即在任何時候,接收到的大於K的n個數據,選出來的數都保證是均勻采樣。

證明:

  1. 假設(n-1)次采樣后, 緩沖區中k個樣本的采樣概率為𝑘/(𝑛−1);
  2. 在第n次采樣中,緩沖區的樣本被替換的概率為:𝑘/𝑛×1/𝑘=1/𝑛;
  3. 則第n次采樣中,緩沖區的樣本不會被替換的概率為: 1−1/𝑛=(𝑛−1)/𝑛
  4. 經過n次采樣后,數據留在緩沖區的概率是下面兩個概率乘積:
    1.前(n-1)輪以后,數據在緩沖區中;
    2.第n輪,沒有被替換出去;
  5. 概率是:𝑘/(𝑛−1)×(𝑛−1)/𝑛=𝑘/𝑛
  6. 歸納完畢
  • 空間復雜性為O(K)
    在整個的算法處理當中,我們只需要一個長度為K的數組保存抽樣,剩下的計算概率的啥的空間都是常數的,因此空間復雜度為O(K)

主成分分析

  1. 主成分分析的目的和思想
    主成分分析方法就是用較少數量的、彼此不相關的維度代替原來的維度,並能夠解釋數據所包含的大部分信息,這些不相關的新維度稱為主成分。主成分實際上是一種降維方法,是將p維特征映射到m維上。
    主成分分析的主要思想是將原來數量較多的具有一定相關性的維度,重新組合為一組數量較少的、相互不相關的綜合維度(主成分)來替代原來的維度。

缺失值填充

將數據集中不含缺失值的變量(屬性)稱為完全變量,而將數據集中含有缺失值的變量(屬性)稱為不完全變量。

通常將數據缺失機制分為以下三種。
(1)完全隨機缺失(Missins Compltely at Random,MCAR), 數據的缺失與不完全變量以及完全變量都是無關的。在這種情況下,某些數據的缺失與數據集合中其他數據的取值或者缺失沒有關系,缺失數據僅是整個數據集合的一個隨機子集合。 (例:硬件采集數據丟失)
(2)隨機缺失( Missing at Random, MAR )。數據的缺天僅僅依賴於完全變量。隨機缺失意味着數據缺失與缺失的數據值無關,但與數據在某些屬性上的取值有關。例如,在分析客戶購物行為的調查中,客戶年齡這個屬性的缺失值可能與本身的數值無關,但可能與客戶的性別屬性有關。客戶收入屬性上的缺失值,可能與他的職業屬性有關,但與自身收入多少無關。
(3)非隨機缺失( Not Missing at Random, NMAR)。 在不完全變量中數據的缺失依賴於不完全變量本身,這種缺失是不可忽略的。例如,在客戶購物行為的調查中,一些高收入人群往往不填寫收入值,這種缺失值與自身屬性取值有關。

缺失值填充方法

  1. 均值填充法
    將屬性分為數值型和非數值利分別進行處理。如果缺失值是數值型,就用該屬性在其他所有對象的取值的平均值來填充該缺失的變量值:如果缺失值是非數值型,則使用眾數補齊該缺失的變量值。這種方法是建立在完全隨機缺失的假設之上,而且會造成變量的方差和標准差變小。
    這種方法的一個改進是“局部均值填充”,即使用有缺失值元組的“類別”的所有元組的平均值作為填充值。例如,某個職員工資額的缺失值,可以根據該員工的職稱,求出具有同一職稱的所有職工的平均工資值替換缺失值,以更加接近真實值。
  2. 回歸填充法
    回歸填充法是把缺失屬性作為因變量, 其他相關屬性作為自變量,利用它們之間的關系建立回歸模型來預測缺失值,並完成缺失值插補的方法。
    回歸填充的基本思想是利用輔助變量Xk與目標變量z的線性關系建立回歸模型,從而利用已知的輔助變量的信息,對目標變量的缺失值進行估計。第i個缺失值的估計值可以表示為:

\[Z_{i}=\beta _{0}+\sum_{k=1}^{n}\beta _{k}X_{ki}+\varepsilon \]

其中,\(\beta _{0}\)\(\beta _{k}\)為參數、\(\varepsilon\)為殘差,服從零均值正態分布。
問題是應該被估算的數據沒有包含估計中的誤差項,導致因變量與自變量之間的關系被過分識別。回歸模型預測缺失數據最可能的值,但並不提供該預測值不確定性方面的信息。
3. 熱卡填充法(相似度: 歐式距離)
對於一個包含空值的對象,熱卡填充法就是在完整數據中找到一個與它最相似的對象,用這個相似對象的值來填充。
特點:不同的問題可能會選用不同的標准對相似性進行判定。該方法的概念很簡單,是利用數據間的關系來進行空值估計。這種方法的難點在於“距離” 或者“相似性”的定義。

平滑噪聲

噪聲數據:是指數據中存在着錯誤或異常(偏離異常值)的數據,這些數據對數據分析造成了干擾。即無意義數據,現階段的意義已經擴展到包含所有難以被機器正確理解和翻譯的數據,如非結構化文本。任何不可被源程序讀取和運用的數據,不管是已經接受、存貯的還是改變的,都成為噪聲。 噪聲產生的原因有:數據收集工具的問題、數據輸入錯誤、數據傳輸錯誤、技術限制、命名規則的不一致

因為噪聲對數據分析造成了干擾,所以我們需要去掉噪聲或者平滑數據。現在介紹一種初級的方法:分箱
“分箱”是將屬性的值域划分成若干連續子區間。如果一個屬性值在某個子區間范圍內,就把該值放進這個子區間所代表的“箱子”內。把所有待處理的數據(某列屬性值)都放進箱子內,分別考察每一個箱子中的數據,采用某種方法分別對各個箱子中的數據進行處理。

對數據進行分箱主要有以下四種方法:

  1. 等深分箱法:將數據集按記錄行數分箱,每箱具有相同的記錄數,稱為箱子的深度
  2. 等寬分箱法:將數據集在整個屬性值的區間上平均分布,每個箱子的區間范圍是一個常量,稱為箱子寬度
    在整個屬性值的區間上平均分布,即每個箱的區間范圍設定為一個常量,稱為箱子的寬度。
    簡而言之,將變量的取值范圍分為k個等寬的區間,每個區間當作一個分箱。例如年齡變量(0-100之間),可分成 [0,20],[20,40],[40,60],[60,80],[80,100]五個等寬的箱
  3. 最小熵法:在分箱時考慮因變量的取值,使得分箱后箱內達到最小熵
  4. 用戶自定義區間法:根據數據特點,指定分箱的方法

每種分箱具體步驟:
  (1)首先排序數據,並將他們分到等深(等寬)的箱中;
  (2)然后可以按箱的平均值、按箱中值或者按箱的邊界等進行平滑

  1. 按箱的平均值平滑:箱中每一個值被箱中的平均值替換
  2. 按箱的中值平滑:箱中的每一個值被箱中的中值替換
  3. 按箱的邊界平滑:箱中的最大和最小值被視為箱邊界,箱中的每一個值被最近的邊界值替換

等寬分箱:
使用等寬方法將數據組分為3個箱:11,13, 5,10,15,35,72,92,204,215,50,55
我們首先進行排序,排完序后為:   5,10,11,13,15,35,50,55,72,92,204,215
  因為箱中數據寬度要相同,所以每個箱的寬度應是(215-5)/3=70
  即要求箱中數據之差不能超過70.
  所以答案為
  Bin-1:5,10,11,13,15,35,50,55,72;
  Bin-2:92;
  Bin-3:204,215;

平均值平滑
已知一組價格數據:15,21,24,21,25,4,8,34,28
現用等寬(寬度為10)分箱方法對其進行平滑,以對數據中的噪聲進行處理。
步驟:
(1)排序:4,8,15,21,21,24,25,28,34
(2)根據更寬分箱法,寬度為10
  得到:
  Bin-1:4,8
  Bin-2:15,21,21,24,25
  Bin-3:28,34
  (3)根據平均值平滑的定義:箱中的每一個值被箱中的平均值替換
  (3)得到結果:
  Bin-1:6,6
  Bin-2:21,21,21,21,21
  Bin-3:31,31,31

邊界平滑
Bin-1:4,8
Bin-2:15,25,25,25,25( |15-21|=6,|25-21|=4,|25-24|=1)
Bin-3:28,34

第三章 關聯規則挖掘

關聯規則挖掘可以讓我們從數據集中發現項與項(item 與 item)之間的關系,它在我們的生活中有很多應用場景,“購物籃分析”就是一個常見的場景,這個場景可以從消費者交易記錄中發掘商品與商品之間的關聯關系,進而通過商品捆綁銷售或者相關推薦的方式帶來更多的銷售量。所以說,關聯規則挖掘是個非常有用的技術。

搞懂關聯規則中的幾個概念
舉一個超市購物的例子,下面是幾名客戶購買的商品列表:

訂單編號 購買的商品
1 牛奶、面包、尿布
2 可樂、面包、尿布、啤酒
3 牛奶、尿布、啤酒、雞蛋
4 面包、牛奶、尿布、啤酒
5 面包、牛奶、尿布、可樂

支持度計數
給出X在T中出現次數的定義:\(\sigma(X)=|\left \{ t_{i}|X\subseteq t_{i},t_{i}\in T \right \}|\)

支持度
支持度是個百分比,它指的是某個商品組合出現的次數與總次數之間的比例。
支持度:\(sup(X)=\frac{\sigma (X)}{N}\)
在這個例子中,我們能看到“牛奶”出現了 4 次,那么這 5 筆訂單中“牛奶”的支持度就是 4/5=0.8。
同樣“牛奶 + 面包”出現了 3 次,那么這 5 筆訂單中“牛奶 + 面包”的支持度就是 3/5=0.6

置信度
\(con(A->B)=\frac{\sigma (A\cup B)}{\sigma (A)}\)
它指的就是當你購買了商品 A,會有多大的概率購買商品 B
置信度(牛奶→啤酒)=2/4=0.5,代表如果你購買了牛奶,有多大的概率會購買啤酒?
置信度(啤酒→牛奶)=2/3=0.67,代表如果你購買了啤酒,有多大的概率會購買牛奶?
置信度是個條件概念,就是說在 A 發生的情況下,B 發生的概率是多少。

同時滿足最小支持度和最小置信度的關聯規則,稱之為強關聯規則

提升度
我們在做商品推薦的時候,重點考慮的是提升度,因為提升度代表的是“商品 A 的出現,對商品 B 的出現概率提升的”程度。
提升度 (A→B)= 置信度 (A→B)/ 支持度 (B)
\(Lift(A,B)=\frac{con(A->B)}{sup(B)}\)

這個公式是用來衡量 A 出現的情況下,是否會對 B 出現的概率有所提升。
所以提升度有三種可能:
提升度 (A→B)>1:代表有提升,A和B是正相關的;
提升度 (A→B)=1:代表有沒有提升,也沒有下降,A和B獨立;
提升度 (A→B)<1:代表有下降,A和B是負相關。

興趣因子
Lift是對置信度的一種“修正”:考慮了規則后件的支持度。對於二元屬性來說,List與興趣因子等價。
\(I(A,B)=\frac{sup(A,B)}{sup(A)*sup(B)}=\frac{N*\sigma (A,B)}{\sigma(A) *\sigma(B) }\)
興趣因子I(A,B)>1:A和B是正相關的;
興趣因子I(A,B)=1:A和B獨立;
興趣因子I(A,B)<1:A和B是負相關

Apriori 的工作原理

首先我們把上面案例中的商品用 ID 來代表,牛奶、面包、尿布、可樂、啤酒、雞蛋的商品 ID 分別設置為 1-6,上面的數據表可以變為:
訂單編號 購買的商品
1 1、2、3
2 4、2、3、5
3 1、3、5、6
4 2、1、3、5
5 2、1、3、4

Apriori 算法其實就是查找頻繁項集 (frequent itemset) 的過程,所以首先我們需要定義什么是頻繁項集。
頻繁項集就是支持度大於等於最小支持度 (Min Support) 閾值的項集,所以小於最小值支持度的項目就是非頻繁項集,而大於等於最小支持度的的項集就是頻繁項集。

項集這個概念,英文叫做 itemset,它可以是單個的商品,也可以是商品的組合。

我們再來看下這個例子,假設我隨機指定最小支持度是 50%,也就是 0.5。
我們來看下 Apriori 算法是如何運算的:
首先,我們先計算單個商品的支持度,也就是得到 K=1 項的支持度:

商品項集 支持度
1 4/5
2 4/5
3 5/5
4 2/5
5 3/5
6 1/5

因為最小支持度是 0.5,所以你能看到商品 4、6 是不符合最小支持度的,不屬於頻繁項集,於是經過篩選商品的頻繁項集就變成:

商品項集 支持度
1 4/5
2 4/5
3 5/5
5 3/5

在這個基礎上,我們將商品兩兩組合,得到 k=2 項的支持度:

商品項集 支持度
1,2 3/5
1,3 1/5
1,5 2/5
2,3 4/5
2,5 2/5
3,5 3/5

我們再篩掉小於最小值支持度的商品組合,可以得到:

商品項集 支持度
1,2 3/5
2,3 4/5
3,5 3/5

我們再將商品進行 K=3 項的商品組合,可以得到:

商品項集 支持度
1,2,3 3/5
2,3,5 2/5
1,2,5 1/5

再篩掉小於最小值支持度的商品組合,可以得到:

商品項集 支持度
1,2,3 3/5

通過上面這個過程,我們可以得到 K=3 項的頻繁項集{1,2,3},也就是{牛奶、面包、尿布}的組合。

Apriori 算法的遞歸流程:
1、K=1,計算 K 項集的支持度;
2、篩選掉小於最小支持度的項集;
3、如果項集為空,則對應 K-1 項集的結果為最終結果。
否則 K=K+1,重復 1-3 步

Apriori 的改進算法:FP-Growth 算法

Apriori 在計算的過程中有以下幾個缺點
1、可能產生大量的候選集。因為采用排列組合的方式,把可能的項集都組合出來了;
2、每次計算都需要重新掃描數據集,來計算每個項集的支持度。

所以 Apriori 算法會浪費很多計算空間和計算時間,為此人們提出了 FP-Growth 算法:

1、創建了一棵 FP 樹來存儲頻繁項集。在創建前對不滿足最小支持度的項進行刪除,減少了存儲空間。
2、整個生成過程只遍歷數據集 2 次,大大減少了計算量。

所以在實際工作中,我們常用 FP-Growth 來做頻繁項集的挖掘,下面我給你簡述下 FP-Growth 的原理。

創建項頭表(item header table)
創建項頭表的作用是為 FP 構建及頻繁項集挖掘提供索引

這一步的流程是先掃描一遍數據集,對於滿足最小支持度的單個項(K=1 項集)按照支持度從高到低進行排序,這個過程中刪除了不滿足最小支持度的項。(第一步遍歷數據集就刪除了不滿足最小支持度的項,降低了時間復雜度;同時降序排列可以公用祖先節點–null點)

項頭表包括了項目、支持度,以及該項在 FP 樹中的鏈表。初始的時候鏈表為空。

支持度 鏈表
尿布 5
牛奶 4
面包 4
啤酒 3

構造 FP 樹
FP 樹的根節點記為 NULL 節點。
整個流程是需要再次掃描數據集,對於每一條數據,按照支持度從高到低的順序進行創建節點(也就是第一步中項頭表中的排序結果),如果有共用的祖先,則對應的公用祖先節點計數加1,如果不存在就進行創建。直到所有的數據都出現在FP樹中。

同時在創建的過程中,需要更新項頭表的鏈表。

構建子樹

  1. 假設已經完成創建項頭表的工作,省略count+1
  2. 掃描數據集,按照項頭表排列好的結果,一次創建節點
  3. 因為尿布出現在所有訂單中,沒有例外情況,所以這只有一個子節點
  4. 因為牛奶出現在尿布中的所有訂單里,所以只有一個子節點
  5. 由表中數據可得,在出現牛奶的訂單中,面包出現的情況,分為兩種,
    1)出現3次面包,出現在有牛奶的訂單中
    2)出現一次面包,出現在沒有牛奶的訂單中
    故,生成兩個子節點
  6. 后續內容屬於迭代內容,自行體會

通過 條件模式基挖掘頻繁項集

我們就得到了一個存儲頻繁項集的 FP 樹,以及一個項頭表。我們可以通過項頭表來挖掘出每個頻繁項集。
具體的操作會用到一個概念,叫“條件模式基”,它指的是以要挖掘的節點為葉子節點,自底向上求出 FP 子樹,然后將 FP 子樹的祖先節點設置為葉子節點之和。

我以“啤酒”的節點為例,從 FP 樹中可以得到一棵 FP 子樹,將祖先節點的支持度記為葉子節點之和,得到:

你能看出來,相比於原來的 FP 樹,尿布和牛奶的頻繁項集數減少了。這是因為我們求得的是以“啤酒”為節點的 FP 子樹,也就是說,在頻繁項集中一定要含有“啤酒”這個項。
你可以再看下原始的數據,其中訂單 1{牛奶、面包、尿布}和訂單 5{牛奶、面包、尿布、可樂}並不存在“啤酒”這個項,所以針對訂單 1,尿布→牛奶→面包這個項集就會從 FP 樹中去掉,針對訂5 也包括了尿布→牛奶→面包這個項集也會從 FP 樹中去掉,所以你能看到以“啤酒”為節點的 FP 子樹,尿布、牛奶、面包項集上的計數比原來少了 2。

條件模式基不包括“啤酒”節點,而且祖先節點如果小於最小支持度就會被剪枝,所以“啤酒”的條件模式基為空。
同理,我們可以求得“面包”的條件模式基為:

所以可以求得面包的頻繁項集為{尿布,面包},{尿布,牛奶,面包}。同樣,我們還可以求得牛奶,尿布的頻繁項集,這里就不再計算展示。

FP-Growth 算法總結:

  1. 構建項頭表,從高到底排序(以便有共同祖節點)
  2. 對數據集按照項頭表順序進行排序,然后從高到低遞歸繪制層次圖
  3. 按照項頭表,依據第2步結果,從低到高,重新按照節點原則構建層次圖,得到條件模式基。

總結
1、關聯規則算法是最常用的算法,通常用於“購物籃分析”,做捆綁推薦。
2、Apriori 算法在實際工作中需要對數據集掃描多次,會消耗大量的計算時間
3、針對Apriori 算法時間復雜度高, FP-Growth 算法被提出來,通過 FP 樹減少了頻繁項集的存儲以及計算時間。
4、原始模型往往是最接近人模擬的過程,但時間復雜度或空間復雜度高;於是人們就會提出新的方法,比如新型的數據結構,可以提高模型的計算速度。
5、FP Tree算法改進了Apriori算法的I/O瓶頸,巧妙的利用了樹結構,這讓我們想起了BIRCH聚類,BIRCH聚類也是巧妙的利用了樹結構來提高算法運行速度。利用內存數據結構以空間換時間是常用的提高算法運行時間瓶頸的辦法
6、置信度和提升度是對頻繁項集的一種驗證,在篩選最優組合的時候,一般會設置最小支持度,最小置信度,這樣頻繁項集和關聯關系都要滿足這個條件。提升度 (A→B)= 置信度 (A→B)/ 支持度 (B),所以提升度是對滿足前兩者條件的另一種驗證方式,這樣避免一種情況:置信度(A->B)很高,是因為本身支持度(B)很高,實際上和A的出現關系不大。

多層關聯規則挖掘算法

多層關聯規則是一種基於概念分層的關聯規則挖掘方法,概念分層是一種映射,它將底層概念映射到高層概念。概念層次結果通常會用概念樹表示,按照一般到特殊的順序以偏序的形式排列。

假設在事務數據庫中出現的商品都是食品,他們分類信息的概念層次樹有三層,分別代表牛奶或面包,牛奶又分成“牛乳”或者“乳制品”,再下層是各種品牌。

從概念層次樹上第一層開始進行編碼(不包括第零層:食品),例如,某個商品項的編碼為112,第一個數表示“牛奶”類,第二個數1表示“牛乳”,第三個數2表示品牌的名字。這樣再事務數據庫中所有具體商品都被泛化到第三層,同類商品再這個層次上編碼相同

概念泛化后的數據庫T[1]

TID 項集
T1 {111,121,211,221}
T2 {111,211,222,323}
T3 {112,122,221,411}
T4 {111,121}
T5 {111,122,211,221,413}
T6 {211,323,524}
T7 {323,411,524,713}

在第一層上挖掘頻繁1-項集,每個項具有如下形式“1”,···,“2”等,在同一事務中合並相同的編碼,設第一層的最小支持度計數為4,得到第一層上的頻繁1-項集L1,1和頻繁2-項集L[1,2]

第一層上的頻繁1-項集L[1,1]

項集 支持度計數
{1**} 5
{2**} 5

第一層上的頻繁2-項集L[1,2]

項集 支持度計數
{1** ,2**} 4

在第一層上可以得到“牛奶—>面包”的關聯規則,繼續挖掘第二層的頻繁項集,在數據庫T[1]中過濾掉非頻繁的項,得到數據庫T[2]

過濾后的數據庫T[2]

TID 項集
T1 {111,121,211,221}
T2 {111,211,222}
T3 {112,122,221}
T4 {111,121}
T5 {111,122,211,221}
T6 {211}

如果這一層的最小支持度計數還設為4,則可能丟失部分關聯規則,通常在較低層設置較低的最小支持度。設第二層的最小支持度計數為3,分別得到第二層的頻繁1-項集、頻繁2-項集、頻繁3-項集

第二層上的頻繁1-項集L[2,1]

項集 支持度計數
{11*} 5
{12*} 4
{21*} 4
{22*} 4

第二層上的頻繁2-項集L[2,2]

項集 支持度計數
{11 * ,12 * } 4
{11 * ,21 * } 3
{11 * ,22 * } 4
{12 * ,22 * } 3
{21 * ,22 * } 3

第二層上的頻繁3-項集L[2,3]

項集 支持度計數
{11 * ,12 * ,22 * } 3
{11 * ,21 * ,22 * } 3

同理,可以得到第三層的頻繁項集

第三層上的頻繁1-項集L[3,1]

項集 支持度計數
{111} 4
{211} 4
{221} 3

第三層上的頻繁2-項集L[3,2]

項集 支持度計數
{111,211} 3

上述過程挖掘的頻繁項集都位於同一層上,在此基礎上還可以挖掘跨層頻繁項集。對上述算法稍作修改即可實現。
在挖掘跨層頻繁項集的過程中,L[1,1]、L[1,2]和L[2,1]的生成過程同上,生成的候選3-項集的過程略有不同,不僅要從L[2,1]生成,還要加上L[1,1]一並生成,通過掃描T[2]后,得到新的頻繁2-項集

新的第二層上的頻繁2-項集L[2,2]

項集 支持度計數
{11 * ,12 * } 4
{11 * ,21 * } 3
{11 * ,22 * } 4
{12 * ,22 * } 3
{21 * ,22 * } 3
{11 * ,2 * * } 4
{12 * ,2 * * } 3
{21*,1**} 3
{22*,1**} 4

從新的L[2,2]可以看出,產生了跨層的頻繁2-項集。需要注意的是,具有祖先和后代關系的兩個項不能入選頻繁2-項集

新的第二層上的頻繁3-項集L[2,3]

項集 支持度計數
{11 * ,12 * ,22 * } 3
{11 * ,21 * ,22 * } 3
{21 * ,22 * ,1 * * } 3

得到的L[3,1]和上邊L[3,1]相同,產生候選2-項集要與L[1,1]和L[2,1]一起考慮,最終得到的L[3,2]

新的第三層上的頻繁2-項集L[3,2]

項集 支持度計數
{111,211} 3
{111,21 * } 3
{111,22 * } 3
{111,2 * * } 4
{11 * ,211} 3
{1 * * ,211} 3

具有祖先和后代關系的兩個項不會被加入頻繁項集。從L[3,2]生成候選3-項集,驗證后,得到第三城的跨層頻繁3-項集

新的第三層上的頻繁3-項集L[3,3]

項集 支持度計數
{111,21 * ,22 * } 3

序列模式挖掘

序列模式的定義
序列是元素e1,e2,···,en構成的有序串,記為<e1,e2,···,en>,其中每一個元素可以是簡單項或者項集。假設每個元素都是簡單項,則序列的長度是序列中事件的個數。給定序列s1=<a1,a2,···,am>,s2=<b1,b2,···,bn>(n>=m),如果存在整數1<=i1<i2<···<im<=n,使得a1=b1,a2=b2,···,am=bm,則成s1是s2的子序列,或稱s2包含s1。

一個序列\(s_{2}\)=<\(b_{1}\),\(b_{2}\),···,\(b_{n}\)>包括另一個\(s_{1}\)=<\(a_{1}\),\(a_{2}\),···,\(a_{m}\)>,如果存在整數1<=\(i_{1}\)<\(i_{2}\)<···<\(i_{m}\)<=n,可得\(a_{1}\subseteq b_{i_{1}}\),\(a_{2}\subseteq b_{i_{2}}\),···,\(a_{m}\subseteq b_{i_{m}}\)。例如,<(7)(3,8)(9)(4,5,6)(8)>有七個元素,序列長度為8,包括<(3)(4,5)(8)>,其中(3)\(\subseteq\)(3,8),(4,5) \(\subseteq\) (4,5,6),(8)\(\subseteq\) (8)。<(3)(5)>不包含在<(3,5)>中,反之亦然。如果使用購物籃例子,假設每個項目集是一次購買的商品,那么前者表示第三項和第五項被一個接一個地購買,而后者表示第三項和第五項被一起購買。

序列模式地定義:如果定義序列數據庫S是元組<SID,s>的集合,其中SID是序列ID,s是序列。在序列數據庫S中,任何支持度大於等於最小支持度閾值min_sup的序列都是頻繁的,一個頻繁的序列被稱為序列模式

GSP算法

  • GSP算法是一個典型的序列模式挖掘算法,它是通過采用產生並檢驗一個候選序列的方式,是基於優先級原則的一個算法。這是一個典型的序列模式挖掘算法。
  • 算法描述
  1. 掃描序列數據庫,得到長度為1的序列模式L1,,作為初始的種子集。
  2. 根據長度為i的種子集Li通過連接操作和剪切操作生成長度為i+1的候選序列模式Ci+1;然后掃描序列數據庫,計算每個候選序列模式的支持數,產生長度為i+1的序列模式Li+1,並將Li+1作為新的種子集。
  3. 重復第二步,知道沒有新的序列模式或者新的候選序列模式產生為止。

L1=>C2=>L2=>C3=>L3=>C4=>L4······

產生候選序列模式主要分成兩步

  1. 連接階段:如果去掉序列模式s1的第一個項目與去掉序列模式s2的最后一個項目所得到的序列相同,則可以將s1與s2進行連接,即將s2的最后一個項目添加到s1中。
  2. 剪切階段:若某候選序列模式的某個子序列不是序列模式,則此候選序列模式不可能是序列模式,將它從候選序列模式刪除。

L1=>C2=>L2=>C3=>L3=>C4=>L4······

一組候選序列的產生是通過在先前掃描通過的序列模式上進行自我結合的。在第k次掃描的時候,只要每個它的每個length-(k-1)的子序列實在第k-1次掃描的時候找到的一個序列模式,那么這個序列就是候選序列。當在一次掃描的過程中沒有發現候選序列或者沒有候選序列的產生的時候算法就停止了。

Sequential patterns with length 3 After join After Pruning
<(1,2)3> <(1,2)(3,4)> <(1,2)(3,4)>
<(1,2)4> <(1,2) 3 5>
<1(3,4)>
<(1,3)5>
<2(3,4)>
<2 3 5>

如上圖所示,在連接的過程中,種子序列<(1,2) 3>和種子序列<2 (3,4)>連接可產生候選4序列<(1,2)(3,4)>;和種子序列<2 3 5>連接可產生候選4序列<(1,2) 3 5>。其余的序列均不滿足連接條件,在剪枝過程中,候選4序列<(1,2) 3 5>被減去,因為其連續子序列<1,3,5>不包含3序列模式集合L3中。

GSP算法存在的問題

  1. 如果序列數據庫的規模比較大,則有可能產生大量的候選序列模式;
  2. 需要對序列數據庫進行循環掃描
  3. 對於序列模式的長度比較長的情況,算法很難處理

Freespan算法

  • Free Span算法執行的過程
  1. 首先給定序列數據庫S及最小支持度閾值\(\varsigma\)。掃描S找到S中的頻繁項集,並以降序排列生成f list列表。
  2. 執行下面步驟:
    (1)第1遍掃描S,構造頻繁項矩陣;
    (2)生成長度為2的序列模式,循環項模式的標記和投影數據庫的標記;
    (3)再次掃描S,生成循環項模式和投影數據;
    (4)對生成的投影數據庫遞歸調用矩陣投影挖掘算法挖掘更長的候選模式。

FreeSpan算法優點
它將頻繁序列和頻繁模式的挖掘統一起來,把挖掘工作限制在投影數據庫中,還能限制序列分片的增長。它能有效地發現完整地序列模式,同時大大減少產生候選序列所需地開銷,比基於Apriori的GSP算法快很多。

FreeSpan算法缺點
它可能會產生許多投影數據庫,如果一個模式在數據庫中的每個序列中出現,該模式的投影數據庫將不會縮減;另外,一個長度為k的序列可能在任何位置增長,那么長度為k+1的候選序列必須對每個可能的組合情況進行考察,這樣所需的開銷是比較大的。

PrefixSpan算法

PrefixSpan算法的全稱是Prefix-Projected Pattern Growth,即前綴投影的模式挖掘。里面有前綴和投影兩個詞。那么我們首先看看什么是PrefixSpan算法中的前綴prefix。

在PrefixSpan算法中的前綴prefix通俗意義講就是序列數據前面部分的子序列。如果用嚴格的數學描述,前綴是這樣的:對於序列A={a1,a2,...ana1,a2,...an}和序列B={b1,b2,...bmb1,b2,...bm},n≤mn≤m,滿足a1=b1,a2=b2...an−1=bn−1,而an⊆bn,則稱A是B的前綴。比如對於序列數據B=<a(abc)(ac)d(cf)>,而A=<a(abc)a>,則A是B的前綴。當然B的前綴不止一個,比如< a >, < aa >, <a(ab)> 也都是B的前綴。

看了前綴,我們再來看前綴投影,其實前綴投影這兒就是我們的后綴,有前綴就有后綴嘛。前綴加上后綴就可以構成一個我們的序列。下面給出前綴和后綴的例子。對於某一個前綴,序列里前綴后面剩下的子序列即為我們的后綴。如果前綴最后的項是項集的一部分,則用一個“_”來占位表示。

下面這個例子展示了序列<a(abc)(ac)d(cf)>的一些前綴和后綴,還是比較直觀的。要注意的是,如果前綴的末尾不是一個完全的項集,則需要加一個占位符。

前綴 后綴(前綴投影)
< a > <(abc)(ac)d(cf)>
< aa > <(_bc)(ac)d(cf)>
< a(ab) > <(_c)(ac)d)cf>

PrefixSpan算法思想
現在我們來看看PrefixSpan算法的思想,PrefixSpan算法的目標是挖掘出滿足最小支持度的頻繁序列。那么怎么去挖掘出所有滿足要求的頻繁序列呢。回憶Aprior算法,它是從頻繁1項集出發,一步步的挖掘2項集,直到最大的K項集。PrefixSpan算法也類似,它從長度為1的前綴開始挖掘序列模式,搜索對應的投影數據庫得到長度為1的前綴對應的頻繁序列,然后遞歸的挖掘長度為2的前綴所對應的頻繁序列····以此類推,一直遞歸到不能挖掘到更長的前綴挖掘為止。

比如對應於我們第二節的例子,支持度閾值為50%。里面長度為1的前綴包括< a >, < b >, < c >, < d >, < e >, < f >,< g >我們需要對這6個前綴分別遞歸搜索找各個前綴對應的頻繁序列。如下圖所示,每個前綴對應的后綴也標出來了。由於g只在序列4出現,支持度計數只有1,因此無法繼續挖掘。我們的長度為1的頻繁序列為< a >, < b >, < c >, < d >, < e >,< f >。去除所有序列中的g,即第4條記錄變成<e(af)cbc>

      現在我們開始挖掘頻繁序列,分別從長度為1的前綴開始。這里我們以d為例子來遞歸挖掘,其他的節點遞歸挖掘方法和D一樣。方法如下圖,首先我們對d的后綴進行計數,得到{a:1, b:2, c:3, d:0, e:1, f:1,_f:1}。注意f和_f是不一樣的,因為前者是在和前綴d不同的項集,而后者是和前綴d同項集。由於此時a,d,e,f,_f都達不到支持度閾值,因此我們遞歸得到的前綴為d的2項頻繁序列為 。接着我們分別遞歸db和dc為前綴所對應的投影序列。首先看db前綴,此時對應的投影后綴只有<_c(ae)>,此時_c,a,e支持度均達不到閾值,因此無法找到以db為前綴的頻繁序列。現在我們來遞歸另外一個前綴dc。以dc為前綴的投影序列為<_f>, <(bc)(ae)>, ,此時我們進行支持度計數,結果為{b:2, a:1, c:1, e:1, _f:1},只有b滿足支持度閾值,因此我們得到前綴為dc的三項頻繁序列為 。我們繼續遞歸以 為前綴的頻繁序列。由於前綴 對應的投影序列<(_c)ae>支持度全部不達標,因此不能產生4項頻繁序列。至此以d為前綴的頻繁序列挖掘結束,產生的頻繁序列為

    同樣的方法可以得到其他以< a >, < b >, < c >, < e >, < f >為前綴的頻繁序列。

PrefixSpan算法流程
輸入:序列數據集S和支持度閾值αα

    輸出:所有滿足支持度要求的頻繁序列集

    1)找出所有長度為1的前綴和對應的投影數據庫

    2)對長度為1的前綴進行計數,將支持度低於閾值αα的前綴對應的項從數據集S刪除,同時得到所有的頻繁1項序列,i=1.

    3)對於每個長度為i滿足支持度要求的前綴進行遞歸挖掘:

      a) 找出前綴所對應的投影數據庫。如果投影數據庫為空,則遞歸返回。

      b) 統計對應投影數據庫中各項的支持度計數。如果所有項的支持度計數都低於閾值αα,則遞歸返回。

      c) 將滿足支持度計數的各個單項和當前的前綴進行合並,得到若干新的前綴。

      d) 令i=i+1,前綴為合並單項后的各個前綴,分別遞歸執行第3步。

PrefixSpan算法小結

  • PrefixSpan算法由於不用產生候選序列,且投影數據庫縮小的很快,內存消耗比較穩定,作頻繁序列模式挖掘的時候效果很高。比起其他的序列挖掘算法比如GSP,FreeSpan有較大優勢,因此是在生產環境常用的算法。
  • PrefixSpan運行時最大的消耗在遞歸的構造投影數據庫。如果序列數據集較大,項數種類較多時,算法運行速度會有明顯下降。因此有一些PrefixSpan的改進版算法都是在優化構造投影數據庫這一塊。比如使用偽投影計數。

第四章 分類與回歸算法

數據分類主要包含兩個步驟:第一步,事先利用已有數據樣本建立一個數學模型,這一步通常稱為“訓練”,為建立模型的學習過程提供的具有類標號的數據稱為“訓練集”;第二步,使用模型,對未知分類的對象進行分類。

決策樹算法

決策樹簡介

  • 類似於流程圖的樹結構
  • 每個內部節點表示在一個屬性上的測試
  • 每個分枝代表一個測試輸出
  • 每個樹葉節點代表類或類分布

決策樹類型
決策樹分為分類樹和回歸樹兩種,分類樹相對離散變量做決策樹,回歸樹則對連續變量做決策樹。
根據決策樹的不同屬性,可將其分為以下幾種。

  1. 決策樹內節點的測試屬性可能是單變量的,即每個內節點只包括一個屬性;也可能是多變量的,例如,多個屬性的線性組合,即訊在包括多個屬性的內節點。
  2. 每個內節點分支的數量取決於測試屬性值的個數。如果每個內節點只有兩個分支則稱之為二叉決策樹。
  3. 分類結果既可能是兩類有可能是多類,如果二叉決策樹的結果只能有兩類則稱之為布爾決策樹

決策樹構造過程

  1. 自頂向下的分治方式構造判定樹
  2. 從代表所有訓練樣本的單個根節點開始
  3. 使用分類屬性(如果是量化屬性,則需先進行離散化)
  4. 遞歸的通過選擇相應的測試屬性,來划分樣本,一旦一個屬性出現在一個節點上,就不在該節點的任何后代上出現
  5. 測試屬性是根據某種啟發信息或者是統計信息來進行選擇(如:信息增益)

決策樹學習采用自頂向下的分治方式構造判定樹。決策樹生成算法分成兩個步驟:第一步是樹的生成,開始時所有訓練樣本都在根節點,然后遞歸進行數據分片;第二步是樹的修建。決策樹停止分割的條件包括:一個節點上的數據都是屬於同一個類別;沒有屬性可以再用於對數據進行分割。

預備知識:信息的定量描述

  • 若概率很大,受信者事先已有所估計,則該消息信息量就很小;
  • 若概率很小,受信者感覺很突然,該消息所含信息量就很大。
    例:在一個口袋中,有100個球,其中1個是紅球,另外99個是綠球,現在你隨意抓一個球。
    如果事先預言家告訴你將抓到綠球,你會覺得驚訝嗎?
    如果預言家告訴你將抓到紅球,則覺得他的確有神算能力。

信息量的定義

根據客觀事實和人們的習慣概念,函數f(p)應滿足以下條件:
f(p)應是概率p的嚴格單調遞減函數,即當p1>p2, f(p1)<f(p2);
當p=1時,f(p)=0;
當p=0時,f(p)=∞;
兩個獨立事件的聯合信息量應等於它們分別的信息量之和。

若一個消息x出現的概率為p,則這一消息所含的信息量為
\(I(X_{i})=-logP(X_{i})\) 單位:bit
例:
拋一枚均勻硬幣,出現正面與反面的信息量是多少?
I(正)= I(反)= \(-log_{2}\) 0.5=1b
拋一枚畸形硬幣,出現正面與反面的概率分別是1/4,3/4,出現正面與反面時的信息量是多少?
I(正)= \(-log_{2}\) 1/4=2b;I(反)= \(-log_{2}\) 3/4=0.415b

信息熵
信源含有的信息量是信源發出的所有可能消息的平均不確定性
信息論創始人香農把信源所含有的信息量稱為信息熵(entropy),是指每個符號所含信息量的統計平均值。m種符號的平均信息量為:

\[H(X)=-\sum_{i=1}^{n}p(X_{i})I(X_{i})=-\sum_{i=1}^{n}p(X_{i})logp(X_{i}) \]

拋一枚均勻硬幣的信息熵是多少?
𝐻(𝑋)=−(0.5𝑙𝑜𝑔0.5+0.5𝑙𝑜𝑔0.5)=1𝑏𝑖𝑡
拋一枚畸形硬幣,出現正面與反面的概率分別是1/4,3/4,出現正面與反面時的信息熵是多少?
𝐻(𝑋)=−(1/4 𝑙𝑜𝑔 1/4+3/4 𝑙𝑜𝑔 3/4)=0.811𝑏𝑖𝑡

條件熵
如果信源X與隨機變量Y不是互相獨立的,收信者接收到信息Y。那么,用條件熵H(X|Y)來度量收信者再收到隨機變量Y之后,隨機變量X仍然存在的不確定性。設X對應信源符號Xi,Y對應信源符號Yj,P(Xi|Yj)為當Y為Yj時,X為Xi的概率,則有:

\[H(X|Y)=-\sum_{i=1}^{n}\sum_{j=1}^{n}P(X_{i}|Y_{j})logP(X_{i}|Y_{j}) \]

平均互信息量
用它來表示信號Y所能提供的關於X的信息量的大小,用I(X,Y)表示:
I(X|Y)=H(X)-H(X|Y)

信息增益
D在屬性A上“分裂后”,標識各個元組所需信息量減少多少,用信息增益(Information Gain)來表示:
Gain(A) = Info(D) - InfoA(D)
Info(D)就是前面所介紹的信息熵
ID3算法選擇信息增益最大的屬性作為當前的“分裂屬性”。(這樣做的考慮是什么?)
這樣做使得目前要完成最終分類所需的信息量最小

ID3算法

(信息熵越大越不確定)

高爾夫活動決策表

編號 天氣 溫度 濕度 風速 活動
1 炎熱 取消
2 炎熱 取消
3 炎熱 進行
4 適中 進行
5 寒冷 正常 進行
6 寒冷 正常 取消
7 寒冷 正常 進行
8 適中 取消
9 寒冷 正常 進行
10 適中 正常 進行
11 適中 正常 進行
12 適中 進行
13 炎熱 正常 進行
14 適中 取消

對於這個分類問題中,分類屬性為“活動”,分類個數為2,分別為“進行”和取消兩個類別。對於當前數據集合D,有9條元組屬於分類“進行”,另外5條屬於分類“取消”。為零對D中的元組進行分類,所需要的期望值定義為:

\[Info(D)=-\sum_{i=1}^{m}p_{i}log_{2}(p_{i}) \]

其中\(p_{i}\)是D中任意元組屬於分類\(C_{i}\)的概率,用\(\frac{|C_{i,D}|}{|D|}\)來估計,即用D中屬於各個分類的元組所占的比例來估計概率\(p_{i}\)。Info(D)就是前面所介紹的信息熵,它是識別D中元組所屬分類所需要的信息期望。在此例中:

\[Info(D)=-\frac{9}{14}log_{2}(\frac{9}{14})-\frac{5}{14}log_{2}(\frac{5}{14})=0.940(bit) \]

為了構造決策樹的根節點,先要選擇一個屬性作為分裂節點,使得D分裂后的信息量減少最多。下面分別計算按照某個屬性A“分裂后”的信息熵:

\[Info(D)=\sum_{j=1}^{v}\frac{|D_{j}|}{|D|}*Info(D_{j}) \]

假設屬性A有v個離散的值,D中元組被划分為v個子集合\(D_{j}\),計算得到\(Info_{A}(D)\)
先以屬性“天氣”為例

按照“天氣”屬性划分數據

編號 天氣 溫度 濕度 風速 活動
9 寒冷 正常 進行
11 適中 正常 進行
1 炎熱 取消
2 炎熱 取消
8 適中 取消
3 炎熱 進行
7 寒冷 正常 進行
12 適中 進行
13 炎熱 正常 進行
4 適中 進行
5 寒冷 正常 進行
10 適中 正常 進行
6 寒冷 正常 取消
14 適中 取消

“天氣”屬性有3個不同的值:{“晴”,“陰”,“雨”},划分后的3個子集合,在分類屬性“活動上的純度也不同,在“天氣”取值為“陰”的這個子集合里,純度最高,都為進行

\[Info_{天氣}(D)=\frac{5}{14}*Info(D_{晴}))+\frac{4}{14}*Info(D_{陰}))+\frac{5}{14}*Info(D_{雨})) \]

\[Info(D_{晴})=-\frac{2}{5}log_{2}(\frac{2}{5})-\frac{3}{5}log_{2}(\frac{3}{5})=0.971 \]

\[Info(D_{陰})=-\frac{4}{4}log_{2}(\frac{4}{4})=0 \]

\[Info(D_{雨})=-\frac{2}{5}log_{2}(\frac{2}{5})-\frac{3}{5}log_{2}(\frac{3}{5})=0.971 \]

\[Info_{天氣}(D)=\frac{5}{14}*0.971+\frac{4}{14}*0+\frac{5}{14}*0.971=0.694 \]

可以看出,分裂后的數據集合D的信息熵明顯減少,這說明分類所需要信息減少,這個減少的信息量,ID3算法稱之為信息增益(偏向分支的的屬性):
信息增益選擇大的,但並不是信息增益越大在決策樹中最有益

\[Gain(A)=Info(D)-Info_{A}(D) \]

\[Gain(天氣)=0.940-0.694=0.246 \]

\[Gain(溫度)=0.940-0.911=0.029 \]

\[Gain(濕度)=0.940-0.789=0.151 \]

\[Gain(風速)=0.940-0.892=0.048 \]

因為屬性“天氣”的信息增益最大,因此根節點選擇“天氣”屬性。由於\(D_{晴}\)\(D_{雨}\)的分類屬性上不純,兩個分類標簽都存在,因此需要進一步遞歸地進行分裂。

D晴按照屬性“濕度”划分結果

編號 天氣 溫度 濕度 風速 活動
9 寒冷 正常 進行
11 適中 正常 進行
1 炎熱 取消
2 炎熱 取消
8 適中 取消

D晴按照屬性“風速”划分結果

編號 天氣 溫度 濕度 風速 活動
4 適中 進行
5 寒冷 正常 進行
10 適中 正常 進行
6 寒冷 正常 取消
14 適中 取消

對子集合\(D_{晴}\)\(D_{雨}\)選擇分類屬性時,根據信息增益,分別選取了“濕度”和“風速”屬性,可以發現,按照這兩個屬性分別划分后的子集合,純度都很高。
決策樹形成過程:

信息論在ID3算法中的應用

先驗熵:在沒有接收到其它任何屬性值時候,活動進行與否的熵。

H(活動) = - (9/14)log (9/14) - (5/14)log (5/14) = 0.94
H(活動|晴天)=−P(進行|晴天)logP(進行|晴天)−P(取消|晴天)logP(取消|晴天)=- (2/5)log2(2/5) - (3/5)log2(3/5) = 0.971
H(活動|陰天)=−P(進行|陰天)logP(進行|陰天)−P(取消|陰天)logP(取消|陰天)=- (4/4)log2(4/4) = 0
H(活動|雨天)=−P(進行|雨天)logP(進行|雨天)−P(取消|雨天)logP(取消|雨天) = - (3/5)
log2(3/5)- (2/5)log2(2/5) =0.971
則條件熵如下:
H(活動|天氣)=5/14∗H(活動|晴天)+4/14∗H(活動|陰天)+5/14∗H(活動|雨天)= (5/14)
0.971 + (4/14)0 +(5/14)0.971=0.693
恰好就是\(Info_{天氣}(D)\),所以得出結論,信息增益就是平均互信息量
H(活動,天氣)=H(活動)-H(活動|天氣)=0.94-0.694=0.246
可以看出,選擇測試屬性A對於分類提供的信息越大,選擇A之后對分類的不確定程度就越小。不確定程度的減少量就是信息的增益。

C4.5算法

增益率(Gain ratio)

  • 信息增益傾向於選擇多值屬性
  • 它傾向於選擇取值較多的屬性
  • 極端情況:\(Info_{product_ID}(D)=0\)

C4.5算法中采用Gain ratio代替Information gain
引入分裂信息,代表按照屬性A分裂樣本D的廣度和均勻性:

\[SplitInfo_{A}(D)=-\sum_{j=1}^{n}\frac{D_{j}}{D}*log_{2}(\frac{D_{j}}{D}) \]

增益率:\(GainRate(A)=\frac{Gain(A)}{SplitInfo_{A}(D)}\)

選擇具有最大信息增益率的屬性划分數據集

C4.5算法:信息增益率 (Gain ratio)

C4.5算法既可以處理離散型屬性,也可以處理連續值屬性。

  • 對於離散型屬性,C4.5算法的處理方法與ID3相同
  • 對於某個連續值屬性A,假設在某個節點上的數據集的樣本數量為total,C4.5算法將作以下處理:
  1. 將該節點上的所有數據樣本按照連續值屬性的具體數值,由小到大進行排序,得到屬性值的取值序列:\({A_{1},A_{2},......,A_{total}}\)
  2. 在取值序列生成 total-1個分割點。第 i(0<i<total)個分割點取值為:\(v_{i}=(\frac{A_{i}+A_{i+1}}{2})\)
  3. 它可以將該節點上的數據集划分為兩個子集
  4. 從total-1個分割點中選擇最佳分割點,即對於每個分割點Vi ,將D划分為兩個集合,選取使得InfoA(D) 最小的點。

Gain(income)=0.029
gain_ratio(income) = 0.029/1.557 = 0.019

CART算法

CART算法采用最小Gini系數選擇內部節點的分裂屬性。

Gini系數:

\[Gini(D)=1-\sum_{i=1}^{m}p_{i}^{2} \]

\[Gini_{A}(D)=\frac{|D_{1}|}{|D|}Gini(D_{1})+\frac{|D_{2}|}{|D|}Gini(D_{2}) \]

CART算法選擇具有最小\(Gini_{A}(D)\)的屬性(不純度減少最大) 用於分裂節點 (需要枚舉所有可能的分裂情況)

CART算法形成分類樹步驟

  • 對於連續屬性,需要計算其分割閾值,按分割閾值將其離散化,並計算其Gini系數
  • 對於離散屬性,需將樣本集按照該離散屬性取值的可能子集進行划分,如該離散屬性有n個取值,則其有效子集為 \({{\rm{2}}^{\rm{n}}} - 2\) 個(全集和空集除外)
  • 屬性“天氣”有三個特征值:“晴”、“陰”、“雨”。使用“天氣”屬性對D划分后的子集如下:
       1. 划分點:“晴”,划分后的子集合:{晴},{陰,雨};
       2. 划分點:“陰”,划分后的子集合:{陰},{晴,雨};
       3. 划分點:“雨”,划分后的子集合:{雨},{晴,陰}。
  • 對上述每一種划分,都可將D划分為兩個子集。
  • CART特點是構造了二叉樹,並且每個內部結點都恰好具有兩個分支。
    例子:

過擬合與決策樹剪枝

欠擬合是指模型擬合程度不高,數據距離擬合曲線較遠,或指模型沒有很好地捕捉到數據特征,不能夠很好地擬合數據。

為將所有訓練樣本分類,節點不斷分裂,分支越來越多,這種過程很可能過分適應了訓練數據集中的“噪聲”,這種現象稱為“過擬合”。

從圖中可以看出,隨着樹的增長,決策樹在訓練集上的精度是單調上升的,在測試集上的精度呈先上升后下降的趨勢。出現上述情況主要有如下原因:

  1. 訓練樣本集中含有隨機錯誤或噪聲造成樣本沖突。
  2. 屬性不能完全作為分類標准,決策存在巧合的規律性。
  3. 數據分裂過程中,部分節點樣本過少,缺乏統計意義。
    精度是精確性的度量,表示被分為正例的示例中實際為正例的比例,precision=TP/(TP+FP)

預剪枝(pre-pruning)

  • 通過提前停止樹的構建而對樹剪枝,一旦停止,當前的節點就是葉節點。此葉節點的類別設置為當前樣本子集內出現次數最多的類別。
       1. 定義一個高度,當決策樹的高度達到此值時,即停止決策樹的生長;
       2. 定義一個閾值,當到達某節點的樣本個數小於該值時,停止樹的生長;
       3. 定義一個閾值,如當前分支對性能增益小於該值時,停止樹生長;
  • 預剪枝不必生成整棵決策樹且算法相對簡單,效率很高,適合解決大規模問題。但是,預剪枝方法存在兩個問題:
       1. 很難精確地估計何時停止決策樹的生長;
       2. 預剪枝存在視野效果問題,也就是說可能當前的擴展會造成過渡擬合訓練數據,但更進一步的擴展能夠滿足要求,也有可能准確地擬合訓練數據。這將使得算法過早地停止決策樹的構造。

后剪枝(post-pruning)
構造完整的決策樹,允許過度擬合訓練數據;然后,對那些置信度不夠的節點子樹用葉節點代替。該葉子的類標號設為子樹根節點所對應的子集中戰術類別最多的類別。
后剪枝方法主要有以下幾個方法:

  1. Reduced-Error Pruning(REP,錯誤率降低剪枝)
  2. Pesimistic-Error Pruning(PEP,悲觀錯誤剪枝)
  3. Cost-Complexity Pruning(CCP,代價復雜度剪枝)
  4. EBP(Error-Based Pruning)(基於錯誤的剪枝)

錯誤率降低剪枝(REP)

  • 數據被分成兩個樣例集合:一個訓練集用來形成學習到的決策樹,一個分離的剪枝集用來評估修剪這個決策樹的影響。
  • 該剪枝方法考慮將樹上的每個節點作為修剪的候選對象,決定是否修剪這個結點由如下步驟組成:
       1. 刪除以此結點為根的子樹
       2. 使其成為葉子結點
       3. 賦予該結點關聯的訓練數據的最常見分類
       4. 當修剪后的樹對於驗證集合的性能不會比原來的樹差時,才真正刪除該結點
  • 因為訓練集合的過擬合,使得驗證集合數據能夠對其進行修正,反復進行上面的操作,從底向上的處理結點,刪除那些能夠最大限度的提高驗證集合的精度的結點,直到進一步修剪有害為止(有害指修剪會減低驗證集合的精度)。

REP將決策樹上的每一個節點都作為修剪的候選對象,修建過程如下

  1. 自底向上,對於樹T上的每一顆子樹,使它成為葉節點,葉節點標記為了子樹對應訓練集子集中占數最多的類別,生成一顆新樹。
  2. 在剪枝集上,如果新樹能夠的到一個較小或相等的分類錯誤,而且子樹S中不包含具有相同性質的子樹,即S的所有下屬子樹的錯誤率都不小於該子樹時,刪除S,用葉子節點代替。
  3. 重復此過程,知道進一步的剪枝會降低剪枝集上的精度為止。

從圖中可觀察到Node4本身關於剪枝集的誤差為0,而它的子樹Node8和Node9的誤差之和為1>0,所以Node4應該被葉節點代替。

使用REP方法具有如下優點:

  1. 剪枝后的決策樹時關於測試集的具有高精度的組數,並且時規模最小的子樹。
  2. 計算復雜性是線性的,每一個非葉節點只需要訪問一次就可以評估其子樹被修剪的收益。
  3. 使用獨立測試集,與原始決策樹比較,修剪后的決策樹對於未來新實例的預測偏差較小。

缺點:

REP在數據量較少的情況下很少應用,因為REP偏向於過度修剪,在剪枝過程中,那些在剪枝集中不會出現的一些很稀少的訓練數據實例所對應的分枝都要被刪除。當剪枝集比訓練集規模小很多的時候,這個問題更加突出。

幾種屬性選擇度量的對比

信息增益:

偏向於多值屬性,一個屬性的信息增益越大,表明該屬性的減少樣本的熵的能力更強,這個屬性使得數據由不確定性變成確定性的能力越強。所以,如果是取值更多的屬性,更容易使得數據更“純”(尤其是連續型數值),其信息增益更大,決策樹會首先挑選出這個屬性作為樹的頂點。結果訓練出來的形狀是一顆龐大且深度很淺的樹,遮掩的划分是極為不合適的。
增益率:

增益率引入了分裂信息,取值數目多的屬性分裂信息也會變大。將增益除以分裂信息,再加上一些額外操作,可以有效地解決信息增益過大地問題。增益率傾向於不平等地分裂,使得其中一個子集比其它子集要小得多。
Gini系數:

傾向於多值屬性,當類數目較大時,計算比較復雜,它傾向於大小相等地分區和純度。

K最近鄰(KNN)算法原理

當K=4時,未知點會根據最近鄰原理選取3個五角星,1個三角形,依據少數服從多數原理,將未知點歸為五角星類別;當K=11時,未知點根據最近鄰原理會選取5個五角星,6個三角形,此時未知點歸屬為三角形類別。
K值過大時,意味着最后選取的參考樣本點數量較大,極限的情況則是考慮所有的樣本,此時就會存在一個明顯的問題,當訓練樣本集不平衡時,此時占數多的類別更占優勢。所以較大的K值能夠減小噪聲的影響,但會使類別之間的界限變得模糊;但K值過小時,極限來看便是取最近的樣本點,這樣的學習缺少了泛化能力,同時很容易受噪聲數據和異常值的影響。因此,K值的設定在KNN算法中十分關鍵,取值過大易造成欠擬合效果,取值過小易造成過擬合效果。常見的確定K值的方法有:
取訓練集中樣本總數的平方根。
根據驗證集,通過交叉驗證確定K值。

\(O(n^{3})\)
KNN算法基本過程如下:

  1. 距離計算:計算E與所有訓練樣本的距離
  2. 尋找近鄰:選擇E在訓練集中的K個近鄰樣本(K=3)
  3. 確定類別:將這K個近鄰樣本中占多數的分類賦予E

距離的計算
每個樣本由n個數值型屬性構成
兩個樣本間的距離用“歐氏距離”表示:
\(D(X,Y)=\sqrt{\sum_{i=1}^{n}(x_{i}-y_{i})^{2}}\)
D(John, Rachel)=sqrt [(35-41)2+(95K-215K)2 +(3-2)2]

優點:

  • 簡單,易於理解,易於實現
  • 無需估計參數,無需訓
  • 對噪聲數據不敏感
    不足:
  • 需要存儲所有的樣本
  • 計算復雜度高
  • 可理解性差,無法給出像決策樹那樣的規則

d樹可以幫助我們在很快地找到與測試點最鄰近的K個訓練點。不再需要計算測試點和訓練集中的每一個數據的距離。

kd樹是二叉樹的一種,是對k維空間的一種分割,不斷地用垂直於坐標軸的超平面將k維空間切分,形成k維超矩形區域,kd樹的每一個結點對應於一個k維超矩形區域。

kd樹的構造

首先我們需要構造kd數,構造方法如下:

  1. 選取\(x^{(1)}\)為坐標軸,以訓練集中的所有數據\(x^{(1)}\)坐標中的中位數作為切分點,將超矩形區域切割成兩個子區域。將該切分點作為根結點,由根結點生出深度為1的左右子結點,左節點對應\(x^{(1)}\)坐標小於切分點,右結點對應\(x^{(1)}\)坐標大於切分點
  2. 對深度為j的結點,選擇\(x^{(1)}\)為切分坐標軸,1=j(mod k)+1,以該結點區域中訓練數據\(x^{(1)}\)坐標的中位數作為切分點,將區域分為兩個子區域,且生成深度為j+1的左、右子結點。左節點對應\(x^{(1)}\)坐標小於切分點,右結點對應\(x^{(1)}\)坐標大於切分點
  3. 重復2,直到兩個子區域沒有數據時停止。

我們用圖像來走算法!

我們有二維數據集

將他們在坐標系中表示如下:

開始:選擇\(x^{(1)}\)為坐標軸,中位數為6,即(6,5)為切分點,切分整個區域

                                                               
再次划分區域

\(x^{(2)}\)為坐標軸,選擇中位數,可知左邊區域為-3,右邊區域為-12。所以左邊區域切分點為(1,-3),右邊區域切分點坐標為(17,-12)


                                                             
再次對區域進行切分,同上步,我們可以得到切分點,切分結果如下:


                                            
最后分割的小區域內只剩下一個點或者沒有點。我們得到最終的kd樹如下圖

kd樹完成K近鄰的搜索

當我們完成了kd樹的構造之后,我們就要想怎么利用kd樹完成K近鄰的搜索呢???

接下來,又是拋出算法的時候了

為了方便說明,我們采用二維數據的栗子。假設現在要尋找p點的K個近鄰點(p點坐標為(a,b)),也就是離p點最近的K個點。設S是存放這K個點的一個容器。

新鮮的算法來了:

  1. 根據p的坐標和kd樹的結點向下進行搜索(如果樹的結點是以來切分的,那么如果p的坐標小於c,則走左子結點,否則走右子結點)
  2. 到達葉子結點時,將其標記為已訪問。如果S中不足k個點,則將該結點加入到S中;如果S不空且當前結點與p點的距離小於S中最長的距離,則用當前結點替換S中離p最遠的點
  3. 如果當前結點不是根節點,執行(a);否則,結束算法
    (a)回退到當前結點的父結點,此時的結點為當前結點(回退之后的結點)。將當前結點標記為已訪問,執行(b)和(c);如果當前結點已經被訪過,再次執行(a)。

(b)如果此時S中不足k個點,則將當前結點加入到S中;如果S中已有k個點,且當前結點與p點的距離小於S中最長距離,則用當前結點替換S中距離最遠的點。

(c)計算p點和當前結點切分線的距離。如果該距離大於等於S中距離p最遠的距離並且S中已有k個點,執行3;如果該距離小於S中最遠的距離或S中沒有k個點,從當前結點的另一子節點開始執行1;如果當前結點沒有另一子結點,執行3。

以上的1,2,3我們會稱為算法中的1,算法中的2,算法中的3

為了方便描述,我對結點進行了命名,如下圖。

藍色斜線表示該結點標記為已訪問,紅色下划線表示在此步確定的下一要訪問的結點

我們現在就計算p(-1,-5)的3個鄰近點。


                                   
我們拿着(-1,-5)尋找kd樹的葉子結點。

執行算法中的1。

  • p點的-1與結點A的x軸坐標6比較,-1<6,向左走。
  • p點的-5與結點B的y軸坐標-3比較,較小,往左走。
  • 因為結點C只有一個子結點,所以不需要進行比較,直接走到結點H。

進行算法中的2,標記結點H已訪問,將結點H加入到S中。

此時

執行算法中的3,當前結點H不是根結點

  • 執行(a),回退到父結點C,我們將結點C標記為已訪問
  • 執行(b),S中不足3個點,將結點C加入到S中
  • 執行(c)計算p點和結點C切分線的距離,可是結點C沒有另一個分支,我們開始執行算法中的3。
                                                                    


                                       
當前結點C不是根結點

  • 執行(a),回退到父結點B,我們將結點B標記為已訪問
  • 執行(b),S中不足3個點,將結點B加入到S中
  • 執行(c)計算p點和結點B切分線的距離,兩者距離為,小於S中的最大距離。(S中的三個點與p的距離分別為\(\sqrt{|(-1)-(-4)|^{2}+|(-5)-(-10)|^{2}}\)\(\sqrt{|(-1)-(-6)|^{2}+|(-5)-(-5)|^{2}}\)\(\sqrt{|(-1)-(-1)|^{2}+|(-5)-(-3)|^{2}}\)。所以我們需要從結點B的另一子節點D開始算法中的1。
     


                                                                                     
                                       
從結點D開始算法中的1

  • p點的-1與結點D的x軸坐標-2比較,-1 >  -2,向右走。
  • 找到了葉子結點J,標記為已訪問。

開始算法中的2

  • S不空,計算當前結點J與p點的距離,為18.2,大於S中的最長距離
  • 所以我們不將結點J放入S中
                                                                                          

執行算法中的3,當前結點J不為根結點

  1. 執行(a),回退到父結點D,標記為已訪問。
  2. 執行(b),S中已經有3個點,當前結點D與p點距離為,小於S中的最長距離(結點H與p點的距離),將結點D替換結點H。
  3. 執行(c),計算p點和結點D切分線的距離,兩者距離為1,小於S中最長距離,所以我們需要從結點D的另一子節點I開始算法中的1。
                                                                                              

從結點I開始算法中的1,結點I已經是葉子結點

直接進行到算法中的2

  • 標記結點I為已訪問
  • 計算當前結點I和p點的距離為\(\sqrt{305}\),大於S中最長距離,不進行替換。
     

執行算法中的3.

當前結點I不是根結點

  • 執行(a),回退到父結點D,但當前結點D已經被訪問過。
  • 再次執行(a),回退到結點D的父結點B,也標記為訪問過
  • 再次執行(a),回退到結點B的父結點A,結點A未被訪問過,標記為已訪問。
  • 執行(b),結點A和p點的距離為,大於S中的最長距離,不進行替換
  • 執行(c),p點和結點A切分線的距離為7,大於S中的最長距離,不進行替換


                                       
執行算法中的3,發現當前結點A是根結點,結束算法。

得到p點的3個鄰近點,為(-6,-5)、(1,-3)、(-2,-1)

kd樹就這么的完成了他的任務。

總的來說,就是以下幾步

1、找到葉子結點,看能不能加入到S中

2、回退到父結點,看父結點能不能加入到S中

3、看目標點和回退到的父結點切分線的距離,判斷另一子結點能不能加入到S中

Adaboost算法

Adaboost算法的基本流程:

  1. 初始化訓練數據的權值分布,每個數據所占權重相同,設共有N個訓練數據樣本,則各個數據所分配的權重為1/N
  2. 基於當前數據權重分布生成分類器,得出分類器的分類誤差率e,並選取分類誤差率最低的分類器作為新的分類器
  3. 利用該分類器的分類誤差率e計算此分類器子啊投票決策中所占權重 \(\alpha\)
  4. 根據該分類器的分類情況調整訓練數據的權重分布 $\omega $
    重復步驟2,3直至當前集成學習器的預測誤差為0或達到分類器規定閾值。

總的來說,這個步驟有點像神經網絡學習fp、bp的過程。

Adaboost的缺點

  1. 速度慢,在一定程度上依賴於訓練數據集合和弱學習器的選擇;
  2. 訓練數據不足或者弱學習器太“弱”,都將導致其訓練精度的下降;
  3. Boosting易受到噪聲的影響,因為它在迭代過程中總是給噪聲分配較大的權重,使得這些噪聲在以后的迭代中受到更多的關注。

Bagging算法

Bagging是與Boosting算法思想相對的集成算法,它包括以下主要思想。
  1. 通過T次隨機采樣,對應的得到T個采樣集
  2. 基於每個采樣集獨立訓練出T個弱學習器
  3. 通過集合策略將弱學習器集成和升級到強學習器

在Bagging中重點是隨機采樣,一般采用自助采樣法(Bootstraping)

Bootstraping(自助法)采樣
來自成語“pull up by your own bootstraps”,意思是依靠自己的力量,稱為自助法;
它是一種有放回的抽樣方法。

  1. 從樣本集中重采樣(有重復的)選出n個樣本
  2. 在所有屬性上,對這n個樣本建立分類器
  3. 重復以上兩步m次,即獲得了m個分類器
  4. 將待分類數據放在這m個分類器上,最后根據這m個分類器的投票結果,決定數據屬於哪一類

Bagging和Boosting的各自特點
Boosting注重對真實結果的逼近擬合,側重偏差。降低偏差的方法是不斷地修正預測結果和真是結果間的距離。
Bagging還注重在多個數據集/多種環境下的訓練,側重方差。降低方差的方法就是利用相互交叉的訓練集讓每個學習器都得到充分的訓練。
Bagging的訓練速度較Boosting更快,其性能依賴於基分類器的穩定性。如果基分類器不穩定,那么Bagging有助於降低訓練數據的隨機波動導致的誤差;如果基分類器穩定,那么集成分類器的誤差主要有基分類器的偏倚引起。

隨機森林

隨機森林在bagging基礎上做了修改。

  1. 從樣本集中用Bootstrap采樣選出n個樣本;
  2. 從所有屬性中隨機選擇k個屬性,選擇最佳分割屬性作為節點建立CART決策樹;
  3. 重復以上兩步m次,即建立了m棵CART決策樹
  4. 這m個CART形成隨機森林,通過投票表決結果,決定數據屬於哪一類

特點

  1. 具有需要調整的參數少,不容易過度擬合,分類速度快,能高效處理大樣本數據等特點;
  2. 隨機森林(RF)通過同時改變樣本和特征子集來獲得不同的弱分類器;
  3. 隨機森林的訓練可以通過並行處理來實現

分類器算法的評估

一文讓你徹底理解准確率,精准率,召回率,真正率,假正率,ROC/AUC

以二分類為例,假設類別1為正,類別0為負,那么,對於數據測試結果有下面4種情況。

  • 真正值TP(True Positive):預測類別為正,實際類別為正。
  • 假正值FP(False Positive):預測類別為正,實際類別為負。
  • 假負值FN(False Negative):預測類別為負,實際類別為正。
  • 真負值TN(True Negative):預測類別為負,實際類別為負。

准確率(Accuracy): \(\frac{(TP+TN)}{(TP+FP+TN+FN)}\)

精確率(Precision): \(p=\frac{TP}{(TP+FP)}\)

召回率(Recall): \(r = \frac{TP}{(TP+FN)}\)

F1分數(F1-score): F1-score= \(\frac{p*r}{2(p+r)}\)

回歸分析

  • 確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法。
  • 按照涉及的變量的多少,分為一元回歸和多元回歸分析
  • 按照因變量的多少,可分為簡單回歸分析和多重回歸分析
  • 按照自變量和因變量之間的關系類型,可分為線性回歸分析和非線性回歸分析。

回歸和分類區別
   回歸會給出一個具體的結果,例如房價的數據,根據位置、周邊、配套等等這些維度,給出一個房價的預測。
   分類相信大家都不會陌生,生活中會見到很多的應用,比如垃圾郵件識別、信用卡發放等等,就是基於數據集,作出二分類或者多分類的選擇。

淺層: 兩者的的預測目標變量類型不同,回歸問題是連續變量,分類問題離散變量。
中層: 回歸問題是定量問題,分類問題是定性問題。
高層: 回歸與分類的根本區別在於輸出空間是否為一個度量空間。

分類和聚類區別

分類和聚類的概念是比較容易混淆的。

對於分類來說,在對數據集分類時,我們是知道這個數據集是有多少種類的,比如對一個學校的在校大學生進行性別分類,我們會下意識很清楚知道分為“男”,“女”

而對於聚類來說,在對數據集操作時,我們是不知道該數據集包含多少類,我們要做的,是將數據集中相似的數據歸納在一起。比如預測某一學校的在校大學生的好朋友團體,我們不知道大學生和誰玩的好玩的不好,我們通過他們的相似度進行聚類,聚成n個團體,這就是聚類。

按照李春葆老師的話說,聚類是將數據對象的集合分成相似的對象類的過程。使得同一個簇(或類)中的對象之間具有較高的相似性,而不同簇中的對象具有較高的相異性。如下圖所示

二、 聚類的定義

我們這樣來對聚類進行定義。聚類可形式描述為:D={o1,o2,…,on}表示n個對象的集合,oi表示第i(i=1,2,…,n)個對象,Cx表示第x(x=1,2,…,k)個簇,CxÍD。用sim(oi,oj)表示對象oi與對象oj之間的相似度。若各簇Cx是剛性聚類結果,則各Cx需滿足如下條件:

其中,條件①和②表示所有Cx是D的一個划分,條件③表示簇內任何對象的相似度均大於簇間任何對象的相似度。

聚類的整體流程如下:

三、聚類的方法

根據定義我們知道,聚類,簡單的來說,是通過“臭味相投”的原理來進行選擇“戰友”的。
那么這個“臭味相投”的原理或准則是什么呢?
前人想出了四種相似度的比對方法,即距離相似度度量、密度相似度度量、連通性相似度度量和概念相似度度量。

3.1距離相似度量

距離相似度度量是指樣本間的距離越近,那么這倆樣本間的相似度就越高。距離這個詞我們可以這么理解,把數據集的每一個特征當做空間上的一個維度,這樣就確定了兩個點,這兩個點間的“連接”直線就可以當做是它們的距離。一般有三種距離度量,曼哈頓距離、歐氏距離、閔可夫斯基距離,這三個距離表示方式都是原始距離的變形,具體形式如下:

因為相似度與距離是反比的關系,因此在確定好距離后可以設計相似函數如下:

其中,K-means算法就是基於距離的聚類算法

3.2密度相似度度量

密度相似度的出發點是 “物以類聚,人以群分”,相同類別的物體往往會“抱團取暖”,也就是說,每個團體都會圍在一個圈子里,這個圈子呢,密度會很大,所以就有密度相似度度量這一考察形式。
密度是單位區域內的對象個數。密度相似性度量定義為:

   density(Ci,Cj)=|di-dj|

  其中di、dj表示簇Ci、Cj的密度。其值越小,表示密度越相近,Ci、Cj相似性越高。這樣情況下,簇是對象的稠密區域,被低密度的區域環繞。

其中,DBSCAN就是基於密度的聚類算法

3.3連通性相似度度量

數據集用圖表示,圖中結點是對象,而邊代表對象之間的聯系,這種情況下可以使用連通性相似性,將簇定義為圖的連通分支,即圖中互相連通但不與組外對象連通的對象組。

也就是說,在同一連通分支中的對象之間的相似性度量大於不同連通分支之間對象的相似性度量。

3.4概念相似度度量

若聚類方法是基於對象具有的概念,則需要采用概念相似性度量,共同性質(比如最近鄰)越多的對象越相似。簇定義為有某種共同性質的對象的集合。

四、聚類的評定標准

說了這么多聚類算法,我們都知道,聚類算法沒有好壞,但聚類之后的結果根據數據集等環境不同有着好壞之分,那么該怎么評價聚類的好壞呢?

一個好的聚類算法產生高質量的簇,即高的簇內相似度和低的簇間相似度。通常估聚類結果質量的准則有內部質量評價准則和外部質量評價准則。比如,我們可以用CH指標來進行評定。CH指標定義如下:

其中:

traceB表示簇間距離,traceW表示簇內距離,CH值越大,則聚類效果越好。

邏輯回歸

邏輯回歸主要解決二分類問題
邏輯回歸的輸入就是線性回歸的輸出

第五章 聚類算法

k-means(k均值)

第一種方法容易收到隨機取值的影響

輪廓系數法

追求內部聚類最小化,外部距離最大化

k-means算法小結

優點:

  1. 原理簡單(靠近中心點) , 實現容易
  2. 聚類效果中,上(依賴K的選擇)
  3. 空間復雜度o(N),時間復雜度o(IKN)

N為樣本點個數,K為中心點個數,I為迭代次數

缺點:

  1. 對離群點,噪聲敏感(中心點易 偏移)
  2. 很難發現大小差別很大的簇及進行增量計算
  3. 結果不一定是全局最優,只能保證局部最優(與 K的個數及初值選取有關)

Canopy算法配合初始聚類

Canopy算法的優缺點

優點:

  1. Kmeans對噪聲抗干擾較弱,通過Canopy對比, 將較小的NumPoint的Cluster直接去掉有利於抗干擾。
  2. Canopy選擇出來的每個Canopy的centerPoint作為K會更精確。
  3. 只是針對每個Canopy的內做Kmeans聚類,減少相似計算的數量。

缺點:

1.算法中T1、T2的確定問題,依舊可能落入局部最優解

k-means++

分母A是當前點到所有點距離的平方和,分子是當前點到距離點的平方,這個算法的方法就是比如選取2作為質心,下一個就選取離2最遠的15作為質心

二分k-means

實現流程:

●1.所有點作為一個簇
●2.將該簇一分為二
●3.選擇能最大限度降低聚類代價函數(也就是誤差平方和)的簇划分為兩個簇。
●4.以此進行下去,直到簇的數目等於用戶給定的數目k為止(或誤差平方和達到閾值)。

例如將下列簇分成五個簇

隱含的一個原則

因為聚類的誤差平方和能夠衡量聚類性能,該值越小表示數據單越接近於他們的質心,聚類效果就越好。所以需要對誤差平方和最大的簇進行再一次划分, 因為誤差平方和越大,表示該簇聚類效果越不好,越有可能是多個簇被當成了一個簇,所以我們首先需要對這個簇進行划分。

二分K均值算法可以加速K-means算法的執行速度,因為它的相似度計算少了並且不受初始化問題的影響,因為這里不存在隨機點的選取,且每一步都保證了誤差最小.

K-medoids(k-中心聚類算法)

K-medoids和K-means是有區別的,不一樣的地方在於中心點的選取
● K-means中, 將中心點取為當前cluster中所有數據點的平均值,對異常點很敏感!
● K-medoids中, 將從當前cluster中選取到其他所有(當 前cluster中的)點的距離之和最小的點作為中心

算法流程:

(1)總體n個樣本點中任意選取k個點作為medoids
(2)按照與medoids最近的原則,將剩余的n-k個點分配到當前最佳的medoids代表的類中
(3)對於第i個類中除對應medoids點外的所有其他點,按順序計算當其為新的medoids時,代價函數的值,遍歷所有可能,選取代價函數最小時對應的點作為新的medoids
(4)重復2-3的過程,直到所有的medoids點不再發生變化或已達到設定的最大迭代次數
(5)產出最終確定的k個類

k-medoids對噪聲魯棒性好。

例:當一個cluster樣本點只有少數幾個,如(1,1) (1,2) (2,1) (1000,1000) 。其中(1000,1000) 是噪聲。如果按照k-means質心大致會處在(1,1) (1000,1000) 中間即((1+1000)/2,(1+1000)/2),這顯然不是我們想要的。這時k-medoids就可以避免這種情況,他會在(1,1) (1,2) (2,1) (1000,1000) 中選出一個樣本點使cluster的絕對誤差最小,計算可知一定會在前三個點中選取。
k-medoids只能對小樣本起作用,樣本大,速度就太慢了,當樣本多的時候,少數幾個噪音對k-means的質心影響也沒有想象中的那么重,所以k-means的應用明顯比k-medoids多。

Mini Batch K-Means(小批量k均值算法)

適合大數據的聚類算法
大數據量是什么量級?通常當樣本量大於1萬做聚類時,就需要考慮選用Mini Batch K-Means算法。
Mini Batch KMeans使用了Mini Batch (分批處理)的方法對數據點之間的距離進行計算。
Mini Batch計算過程中不必使用所有的數據樣本,而是從不同類別的樣本中抽取一部分樣本來代表各自類型進行計算。由於計算樣本量少,所以會相應的減少運行時間,但另一方面抽樣也必然會帶來准確度的下降。

該算法的迭代步驟有兩步:
(1)從數據集中隨機抽取一些數據形成小批量,把他們分配給最近的質心
(2)更新質心

與Kmeans相比,數據的更新在每一個小的樣本集上。 對於每一個小批量,通過計算平均值得到更新質心,並把小批量里的數據分配給該質心,隨着迭代次數的增加,這些質心的變化是逐漸減小的,直到質心穩定或者達到指定的迭代次數,停止計算。

DBSCAN算法

基本概念: ( Density-Based Spatial Clustering of Applications with Noise )
核心對象:若某個點的密度達到算法設定的閾值則其為核心點。(即r鄰域內點的數量不小於minPts ,例如設置當在一個范圍內點數大於3個的為核心對象)
\(\epsilon\)-鄰域的距離閾值:設定的半徑r

半徑值和閾值需要自己設置,不需要設置k值
\(\epsilon\)小 M大 多噪聲
\(\epsilon\)小 M小 高密度簇
\(\epsilon\)大 M小 簇小

直接密度可達:若某點p在點q的r鄰域內,且q是核心點則p-q直接密度可達。
密度可達:若有一個點的序列q0、q1、··· qk ,對任意qi-qi-1是直接密度可達的,則稱從q0到qk密度可達,這實際上是直接密度可達的"傳播"。
密度相連:若xi與xj均由xk密度可達,則稱xi和xj密度相連,密度相連是對稱關系
邊界點:屬於某一個類的非核心點,不能發展下線了
噪聲點:不屬於任何一個類簇的點,從任何一一個核心點出發都是密度不可達的

DBSCAN算法優點:

  • 可以對任意形狀的數據集進行聚類
  • 不需提前指定聚類個數
  • 聚類的同時可發現異常點。(在上述算法中,暫時標記的噪聲點有可能是噪聲或是邊界點,邊界點在之后的循環會被標記其所屬聚類,最后剩下的未被改變過的噪聲點將是真正的異常點)
  • 對數據集中的異常點不敏感

DBSCAN算法缺點:

  • 對於密度不均勻的數據集,聚類效果較差
  • 當數據集較大時,聚類收斂時間較長
  • 當數據集較大時,要求較大的內存支持,I\O開銷大

OPTICS算法

DBSCAN算法使用中有以下兩個問題:

初始參數領域半徑(ε)和領域最小點數(Minpts)需要手動設置,並且聚類的質量十分依賴這兩個參數的取值
由於算法針對全局密度,當數據集的密度變化較大時,可能識別不出某些簇
針對以上問題,OPTICS進行了完善,在密度高低配置上,OPTICS算法增加了兩個新的概念以降低聚類結果對初始參數的敏感度。且OPTICS算法並不顯式的產生數據集聚類,而是輸出一個以樣本點輸出次序為橫軸,以可達距離為縱軸的圖。這個排序代表了各樣本點基於密度的聚類結構,從中可以得到基於任何半徑和閾值的聚類。

OPTICS主要概念:

核心距離

核心距離是一個點成為核心點的最小領域半徑

可達距離

DBSCAN中有三個連接各密集區域的重要概念:直接密度可達、密度可達、密度相連

參考博文

KNN算法和kd樹詳解(例子+圖示)

淺談機器學習-回歸與分類的區別

分類聚類區別及聚類概述

teletubbies的博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM