數據挖掘算法概要

前言

數據挖掘是經過對大量數據的清理及處理以發現信息,並應用於分類,推薦系統,預測等方面的過程。python

以爲本文有幫助請點贊mark下。謝謝!git

本文Github源碼,歡迎 star & fork程序員

1、數據挖掘過程

1.數據選擇github

分析業務需求後,選擇應用於需求業務相關的數據:業務原始數據、公開的數據集、也可經過爬蟲採集網站結構化的數據。明確業務需求並選擇好針對性的數據是數據挖掘的先決條件。算法

2.數據預處理數據庫

一般選擇好的數據會有噪音,不完整等缺陷,須要對數據進行清洗,缺失項處理,集成,轉換以及概括:
python字符串處理(至關方便)、正則式匹配、pandas、beautifulsoup處理Html標籤等等工具。網絡

3.特徵工程/數據轉換數據結構

根據選擇的算法,對預處理好的數據提取特徵,並轉換爲特定數據挖掘算法的分析模型。app

4.數據挖掘dom

使用選擇好的數據挖掘算法對數據進行處理後獲得信息。

5.解釋與評價

對數據挖掘後的信息加以分析解釋,並應用於實際的工做領域。

2、數據挖掘經常使用算法簡介

1.關聯分析算法

關聯規則在於找出具備最小支持度閾值和最小置信度閾值的不一樣域的數據之間的關聯。在關聯規則的分析算法研究中,算法的效率是核心的問題。
經典的算法有:Apriori算法,AprioriTid算法,FP-growth算法;

2.分類算法

決策樹算法:以樹形結構表示分類或者決策集合,產生規則或者發現規律。主要有ID3算法,C4.5算法, SLIQ算法, SPRINT算法, RainForest算法;

樸素Bayes分類算法:利用Bayes定理機率統計的方法,選擇其中機率比較大的類別進行分類;

CBA(Classification Based on Association)算法:基於關聯規則的分類算法;

MIND(Mining in Database)算法 :採用數據庫中用戶定義的函數(user-definedfunction,簡稱UDF)來實現分類的算法;

神經網絡分類算法:利用訓練集對多個神經的網絡進行訓練,並用訓練好的模型對樣本進行分類;

粗集理論:粗集理論的特色是不須要預先給定某些特徵或屬性的數量描述,而是直接從給定問題出發,經過不可分辨關係和不可分辨類肯定問題的近似域,從而找出問題中的內在規律;

遺傳算法:遺傳算法是模擬生物進化過程,利用複製(選擇)、交叉(重組)和變異(突變)3個基本方法優化求解的技術;

3.聚類算法

聚類分析與分類不一樣,聚類分析處理的數據對象的類是未知的。聚類分析就是將對象集合分組爲由相似的對象組成 的多個簇的過程。分爲3類方法:

Ipartitioning method(劃分方法) 給定1個N個對象或者元組的數據庫,1個劃分方法構建數據的K個劃分,每1個劃分表示1個聚簇,而且K<N。經典算法是K-MEAN(K平均值);

hierarchical method(層次方法)
對給定數據對象集合進行層次的分解,經典算法是BIRTH算法;

grid based method(基於網格的方法) 這種方法採用一個多分辨率的網格數據結構。將空間量化爲有限數目的單元,這些單元造成了網格結構,全部聚類分析都在網格上進行。經常使用的算法有STING,SkWAVECLUSTER和 CLIQUE;

小結

隨着數據量的日益積累以及數據庫種類的多樣化,各類數據挖掘方法做用範圍有限,都有侷限性,所以採用單一方法難以獲得決策所需的各類知識。但它們的有機組合具備互補性,多方法融合將成爲數據挖掘算法的發展趨勢。

3、數據挖掘算法實現

一、相關知識

(1)距離度量:在數據挖掘中須要明確樣本數據類似度,一般能夠計算樣本間的距離,以下爲經常使用距離度量的介紹。

樣本數據以:
樣本數據

座標

曼哈頓距離: 也稱曼哈頓街區距離,就如從街區的一個十字路口點到另外一個十字路口點的距離,
二維空間(多維空間按同理擴展)用公式表示爲

歐氏距離:表示爲點到點的距離。二維空間(多維空間按同理擴展)的公式表示爲

閔可夫斯基距離:是一組距離方法的歸納,當 p=1 既是曼哈頓距離,當 p=2 既是歐氏距離。當p越大,單一維度的差值對總體的影響就越大。

閔可夫斯基距離(包括歐氏距離,曼哈頓距離)的優缺點:

優勢:應用普遍。

缺點:沒法考慮各份量的單位以及各份量分佈(方差,指望)的差別性。(其中個份量的單位差別可使用數據的標準化來消除,下面會有介紹。)

餘弦相關係數:樣本數據視爲向量,經過兩向量間的夾角餘弦值確認相關性,數值範圍[-1,1]。 -1表示負相關,0表示無關,1表示正相關。


餘弦相關係數的優缺點:

優勢:餘弦類似度與向量的幅值無關,只與向量的方向相關,在文檔類似度(TF-IDF)和圖片類似性(histogram)計算上都有它的身影;
並且在樣本數值稀疏的時候仍可使用。

缺點:餘弦類似度受到向量的平移影響,上式若是將 x 平移到 x+1, 餘弦值就會改變。(能夠理解爲受樣本的起始標準的影響,接下來介紹的皮爾遜相關係數能夠消除這個影響)

皮爾遜相關係數:計算出了樣本向量間的相關性,數值範圍[-1,1]。

考慮計算的遍歷的次數,有一個替代公式能夠近似計算皮爾遜相關係數:

皮爾遜相關係數優勢:可消除每一個份量標準不一樣(分數膨脹)的影響,具備平移不變性和尺度不變性。

(2)數據標準化:參考文章

各份量計算距離而各份量的單位尺度差別很大,可使用數據標準化消除不一樣份量間單位尺度的影響,,加速模型收斂的效率,經常使用的方法有三種:

min-max 標準化:將數值範圍縮放到(0,1),但沒有改變數據分佈。max爲樣本最大值,min爲樣本最小值。


z-score 標準化:將數值範圍縮放到0附近, 通過處理的數據符合標準正態分佈。u是平均值,σ是標準差。


修正的標準z-score:修正後能夠減小樣本數據異常值的影響。將z-score標準化公式中的均值改成中位數,將標準差改成絕對誤差。

其中asd絕對誤差:u爲中位數,card(x)爲樣本個數

(3) 算法的效果評估:

十折交叉驗證:將數據集隨機分割成十個等份,每次用9份數據作訓練集,1份數據作測試集,如此迭代10次。十折交叉驗證的關鍵在於較平均地分爲10份。

N折交叉驗證又稱爲留一法:用幾乎全部的數據進行訓練,而後留一個數據進行測試,並迭代每一數據測試。留一法的優勢是:肯定性。

二、協同過濾推薦算法

代碼實現、數據集及參考論文 電影推薦——基於用戶、物品的協同過濾算法

...
示例:
r = Recommendor()

print("items base協同推薦 slope one")
#items base協同推薦算法 Slope one
r.slope_one_recommendation('lyy')

print("items base協同推薦 cos")
#items base協同推薦算法  修正餘弦類似度 
r.cos_recommendation('lyy')

print("users base協同推薦")
#userbase協同推薦算法 
r.user_base_recommendation("lyy")

(1)基於用戶的協同推薦算法

這個方法是利用類似用戶的喜愛來進行推薦:若是要推薦一個樂隊給你,會查找一個和你相似的用戶,而後將他喜歡的樂隊推薦給你。

算法的關鍵在於找到類似的用戶,迭代計算你與每一個用戶對相同樂隊的評分距離,來肯定誰是你最類似的用戶,距離計算能夠用曼哈頓距離,皮爾斯相關係數等等。

基於用戶的協同推薦算法算法的缺點:

擴展性:隨着用戶數量的增長,其計算量也會增長。這種算法在只有幾千個用戶的狀況下可以工做得很好,但達到一百萬個用戶時就會出現瓶頸。稀疏性:大多數推薦系統中,物品的數量要遠大於用戶的數量,所以用戶僅僅對一小部分物品進行了評價,這就形成了數據的稀疏性。好比亞馬遜有上百萬本書,但用戶只評論了不多一部分,因而就很難找到兩個類似的用戶了。

(2)基於物品的協同推薦算法

基於用戶的協同過濾是經過計算用戶之間的距離找出最類似的用戶(須要將全部的評價數據在讀取在內存中處理進行推薦),並將類似用戶評價過的物品推薦給目標用戶。而基於物品的協同過濾則是找出最類似的物品(經過構建一個物品的類似度模型來作推薦),再結合用戶的評價來給出推薦結果。

基於物品的協同推薦算法經常使用有以下兩種:

修正餘弦類似度算法:

以物品的評分做爲物品的屬性值,經過對比物品i,j的工有的用戶相對評分的計算相關性s(i,j)。與皮爾遜相關係數的原理相同,共有用戶對物品的每一評分R(u,j),R(u,i)須要減去該用戶評分的平均值R(`u)而消除分數膨脹。


修正餘弦類似度的優勢:經過構建物品模型的方式,擴展性好,佔用內存小;消除分數膨脹的影響;

修正餘弦類似度的缺點:稀疏性,須要基於用戶的評分數據;

Slope One推薦算法:

第一步,計算平均差值:

dev(i,j)爲遍歷全部共有物品i,j的共有用戶u的評分平均差別。

card(Sj,i(X))則表示同時評價過物品j和i的用戶數。
slopeone

第二歩,使用加權的Slope One算法:

PWS1(u)j表示咱們將預測用戶u對物品j的評分。

求合集i屬於S(u)-j,用戶u所含的全部物品i(除了j之外)。

dev(i,j)爲遍歷全部共有物品i,j的共有用戶u的評分平均差別。

C(ji)也就是card(Sj,i(X))表示同時評價過物品j和i的用戶數。

Slope One算法優勢:算法簡單;擴展性好,只須要更新共有屬性的用戶評價,而不須要從新載入整個數據集。

Slope One算法的缺點:稀疏性,須要基於用戶的評分數據;

三、分類算法

(1)基於物品特徵值的KNN分類算法

代碼實現 鳶尾花KNN分類算法

...

 # KNN算法
    def knn(self, oj_list):
        weight_dict = {"Iris-setosa":0.0, "Iris-versicolor":0.0, "Iris-virginica":0.0}
        for atuple in oj_list:
            weight_dict[atuple[1]] += (1.0 / atuple[0])
        rel_class = [(key, value) for key, value in weight_dict.items()]
        #print(sorted(rel_class, key=lambda x:x[1], reverse=True))
        rel_class = sorted(rel_class, key=lambda x:x[1], reverse=True)[0][0]
        return rel_class
        
...

前面咱們討論的協同推薦算法須要在用戶產生的各類數據上面進行分析,所以也稱爲社會化過濾算法,而這種算法一般有數據的稀疏性,算法可擴展性以及依賴於用戶的數據的缺點,而基於物品特徵值分類算法能夠改善這些問題。算法分爲兩步:

第一步、選取特徵值

算法的關鍵在於挑取有表明區分意義的特徵及分值。以Iris花的示例,選取花萼長度, 花萼寬度,花瓣長度,花瓣寬度特徵值。

第二歩、計算距離

好比計算測試集與訓練集特徵值之間的曼哈頓距離,獲得k個最近鄰後並經過加權後的結果預測分類。

KNN分類算法的缺點:沒法對分類結果的置信度進行量化;是被動學習的算法,每次測試須要須要遍歷全部的訓練集後才能分類。

(2)貝葉斯分類算法

代碼實現 區分新聞類別樸素貝葉斯分類算法

...
def train_data(self):
        #訓練組的條件機率
        for word in self.vocabulary:
            for category,value in self.prob.items():
                if word not in self.prob[category]:
                    count = 0
                else :
                    count = self.prob[category][word]
                #優化條件機率公式
                self.prob[category][word] = (count + 1) / (self.total[category] + len(self.vocabulary)) 
                
...

貝葉斯分類算法是基於機率的分類算法。相比於KNN分類算法,它是主動學習的算法,它會根據訓練集創建一個模型,並用這個模型對新樣本進行分類,速度也會快不少。
貝葉斯分類算法的理論基礎是基於條件機率的公式(應用於現實中P(X|Y&Z)不直觀得出,而P(Y|X)*P(Z|X)比較直觀得出),並假設已存在的子事件(y,z...實際應用中會有多個)間是相互獨立的(所以也稱爲樸素貝葉斯),當y,z事件假設爲獨立便有:


以下舉例推測買牛奶和有機食品,再會買綠茶的機率:

第一步:計算先驗機率及條件機率

先驗機率:爲單獨事件發生的機率,如P(買綠茶),P(有機食品)

條件機率(後驗機率):y事件已經發生,觀察y數據集後得出x發生的機率。如P(買有機食品|買綠茶),經過如下公式計算(nc表示y數據集下x的發生頻數,n爲y數據集的總數):


上式存在一個缺陷,當一個條件機率 P(y|x)爲0時,總體的預測結果P(x) P(y|x) P(z|x)只能爲0,這樣便不能更全面地預測。

修正後的條件機率:(公式摘自Tom Mitchell《機器學習》。m是一個常數,表示等效樣本大小。決定常數m的方法有不少,咱們這裏可使用預測結果的類別來做爲m,好比投票有同意和否決兩種類別,因此m就爲2。p則是相應的先驗機率,好比說同意機率是0.5,那p(同意)就是0.5。):

第二歩:根據貝葉斯公式作出預測

由公式計算比較y&z事件發生下,不一樣x事件發生的機率差別,如得出P(x=喜歡),P(x=不喜歡) 的機率大小,預測爲機率比較大的事件。
由於P(y)*p(z)在上式都同樣,所以公式能夠簡化爲計算機率最大項而預測分類:

貝葉斯算法的優勢:可以給出分類結果的置信度;它是一種主動學習算法,速度更快。

貝葉斯算法的缺點:須要特定格式;數值型數據須要轉換爲類別計算機率或用高斯分佈計算機率;

(2)邏輯迴歸分類算法

代碼實現 區分貓的圖片

注:邏輯迴歸分類算法待後續加入網絡層,更新爲神經網絡分類算法。

...
# cost函數,計算梯度
def propagate(w, b, X, Y):
    m = X.shape[1]      
    A = sigmoid(np.dot(w.T, X) + b)            
    cost = -1 / m * np.sum(Y * np.log(A) + (1 - Y) * np.log(1 - A))        
    dw = 1 / m * np.dot(X, (A - Y).T)  
    db = 1 / m * np.sum(A - Y) 
...

邏輯迴歸分類算法實現了輸入特徵向量X,而輸出Y(範圍0~1)預測X的分類。

第一步,獲得關於X線性迴歸函數

能夠經過線性迴歸獲得WX + b,其中W是權重,b是誤差值。但不能用本式表述預測的值,由於輸出Y的值須要在(0~1)區間;

第二歩,經過激活函數轉換

激活函數的特色是能夠將線性函數轉換爲非線性函數,而且有輸出值有限,可微分,單調性的特色。本例使用sigmoid,使輸出爲預測值Y=sigmoid(WX+b);

第三歩,構建Cost函數

訓練W,b更好的預測真實的類別須要構建Cost代價函數,y^爲sigmoid(WX+b)的預測分類值,y爲實際分類值(0或者1):

其中L(y^,y)稱爲損失函數

訓練的目的就是爲了讓L(y^,y)足夠小,也就是當y實際分類值爲1時,y^要儘可能偏向1。y實際分類值爲0時,y^儘可能小接近0。

第四步,梯度降低獲得Cost函數的極小值


經過對W,b兩個參數求偏導,不斷迭代往下坡的的位置移動(對w,b值往極小值方向作優化,其中α爲學習率控制降低的幅度),全局最優解也就是代價函數(成本函數)J (w,b)這個凸函數的極小值點。

第五步、經過訓練好的W,b預測分類。

四、聚類算法

(1)層次聚類

代碼實現 狗的種類層次聚類

層次聚類將每條數據都看成是一個分類,每次迭代的時候合併距離最近的兩個分類,直到剩下一個分類爲止。

(2)K-means++聚類

代碼實現 Kmean++聚類

注:Kmean算法與Kmean++區別在於初始的中心點是直接隨機選取k各點。

...
        #kmean初始化隨機k箇中心點
        #random.seed(1)
        #center = [[self.data[i][r] for i in range(1, len((self.data)))]  
                  #for r in random.sample(range(len(self.data)), k)]
            
        # Kmean ++ 初始化基於距離分量隨機選k箇中心點
        # 1.隨機選擇一個點
        center = []
        center.append(random.choice(range(len(self.data[0]))))
        # 2.根據距離的機率選擇其餘中心點
        for i in range(self.k - 1):
            weights = [self.distance_closest(self.data[0][x], center) 
                     for x in range(len(self.data[0])) if x not in center]
            dp = [x for x in range(len(self.data[0])) if x not in center]
            total = sum(weights)
            #基於距離設定權重
            weights = [weight/total for weight in weights]
            num = random.random()
            x = -1
            i = 0
            while i < num :
                x += 1
                i += weights[x]
            center.append(dp[x])
        ...

k-means++算法可歸納爲:

(1)基於各點到中心點得距離份量,依次隨機選取到k個元素做爲中心點:
先隨機選擇一個點。重複如下步驟,直到選完k個點。

計算每一個數據點dp(n)到各個中心點的距離(D),選取最小的值D(dp);

根據D(dp)距離所佔的分量來隨機選取下一個點做爲中心點。

(2)根據各點到中心點的距離分類;

(3)計算各個分類新的中心點。
重複(二、3),直至知足條件。


參考文獻

數據挖掘算法概述

面向程序員數據挖掘指南

相關文章
相關標籤/搜索