【摘錄】寫給程序員的數據挖掘技術

版權歸作者所有,任何形式轉載請聯繫作者。
作者:黃藥師(來自豆瓣)
來源:https://www.douban.com/note/587325115/


第二章,協同過濾——愛你所愛(計算用戶之間有多少共性)
曼哈頓距離(manhattan):各維直接相減(r=1)
歐氏距離(euclidean):利用勾股定理得到(r=2)
上確界距離:(r=∞)
注:r越大,某一維上的差異對最終影響越大


皮爾遜相關係數(pearson):不同用戶的評價尺度,差異很大時,使用。(就是線性迴歸,參看下面的代碼def pearson)
餘弦相似度(cos):數據稀疏時,使用: x × y / (|x| × |y|)  (結果爲1代表完全相似,-1代表完全不相似)


k近鄰:權重百分比 = pearson / ∑pearson。投影 = ∑(打分*權重百分比)


********************另********************
歐氏距離能夠體現個體數值特徵的絕對差異,
所以更多的用於需要從維度的數值大小中體現差異的分析,
如使用用戶行爲指標分析用戶價值的相似度或差異。


餘弦距離更多的是從方向上區分差異,而對絕對的數值不敏感,
更多的用於使用用戶對內容評分來區分興趣的相似度和差異,
同時修正了用戶間可能存在的度量標準不統一的問題(因爲餘弦距離對絕對數值不敏感)。


用戶對內容評分,按5分制,X和Y兩個用戶對兩個內容的評分分別爲(1,2)和(4,5),使用餘弦相似度得到的結果是0.98,兩者極爲相似。但從評分上看X似乎不喜歡2這個 內容,而Y則比較喜歡,餘弦相似度對數值的不敏感導致了結果的誤差,需要修正這種不合理性就出現了調整餘弦相似度,即所有維度上的數值都減去一個均值,比如X和Y的評分均值都是3,那麼調整後爲(-2,-1)和(1,2),再用餘弦相似度計算,得到-0.8,相似度爲負值並且差異不小,但顯然更加符合現實。
********************另********************


第三章,協同過濾——基於物品的過濾
基於用戶的過濾叫內存的協同過濾
基於物品的過濾叫模型的協同過濾


現基於模型,對用戶a進行預測
1、先做產品之間的餘弦相似度。(評分先減平均分,以抵消個人習慣影響)
2、歸一化用戶a的評分,將[1, 5]變爲[-1, 1]
   歸一化公式:NR = 2 * (R-min) / (max-min) - 1
   反歸一化公式:R = (NR + 1) * (max-min) / 2 + min
3、∑(NR * cos) / ∑|cos|  (兩個商品的相似度越高,用戶對此商品的打分,用來預測新商品時就越有效)
4、將上值再反歸一化到[1, 5],得到最終分。


slope one算法
1、偏差(dev):a、b兩商品的打分相減,求和後,除以打分人數。
2、(∑ (score + dev) * card) / ∑card  (利用某人已有的打分,偏差出對該商品的打分,再以偏差人數爲權重加權)


歸一化:(推薦書目:the manga guide to statistics(漫畫統計學))
標準差sd = √ ( ∑(x -  ̄x)^2 / card(x) )
標準分數 = (x -  ̄x) / sd


把均值改爲中位數,可以減少離羣點的劇烈影響: asd = (∑|x - x中位|) / card(x)
標準分數 = (x - x中位) / asd


近鄰分類:找出離此商品最近的商品,看下用戶對它的態度(或看它屬於哪一類),得出結論。
問:爲何書中用的是曼哈頓距離?


normalization將數歸入到[0,1]:(value - min) / (max - min)
standardization使平均值變爲0,效果比前者更好。


第五章,算法評估


注:不要把訓練的數據用來測試。


10折交叉驗證:分10份,9:1這樣測10次。
留一法(leave one out):效率差,但結果準。而且不會像10折法一樣,因爲分法不同,而得出不同結果。
分層採樣(stratification):10折時,每一類的數據均分到每一折裏面。留一法不存在此問題。
混淆矩陣:一目瞭然,數據被錯分到哪裏去了。
kappa統計量:κ = (P(c) - P(r)) / (1 - P(r))   
    P(c)是實際分類的正確率,P(r)是隨機分類的正確率
        kappa > 0.75 結果相當好;< 0.4 結果不太理想;< 0 比隨機結果還差


rote分類器:只對訓練集中出現過的物品進行分類。
近鄰分類器的問題:遇到離羣點時會發生問題。
kNN:考察N個最近的鄰居。距離的倒數做成權重百分比,乘以分數。


更多數據vs更好算法:一個更大的數據集比一個好的算法更有效。所以提高算法的性能使之能處理更多的數據,比單純改良算法更實用。


第六章,樸素貝葉斯
近鄰方法被稱爲惰性學習器(lazy learner),每次都要遍歷。
貝葉斯方法被稱爲勤快學習器(eager learner),通過訓練構建模型,通過模型進行分類。分類速度更快。


P(h|D) = P(h∩D) /  P(D) = P(D|h) * P(h) /  P(D)
先驗概率P(h),後驗概率P(h|D)
最大後驗假設(the maximum a posteriori hypothesis): hmap = arg max P(D|h) * P(h) / P(D)
因爲P(D)都一樣,hmap = arg max P(D|h) * P(h) 
P(h|D) ≈ P(D|h) * P(h)


推薦書:the numerati(當我們變成一堆數字)太虛不喜歡


P(x | y) = nc / n  調整爲:
P(x | y) = (nc + mp) / (n + m)  《機器學習》第179頁
其中m是等效樣本容量,有多少種選擇,如2
p爲概率的先驗估計,通常設爲均勻分佈,如0.5
這樣防止出現概率0的情況,直接破壞結果。


貝葉斯就是計數,對於連續值比如考試分數:
方法一、可以按分數分爲不同的類別,再套貝葉斯。
方法二、高斯分佈。
總體標準差sd = √ ( ∑(x -  ̄x)^2 / card(x) )
樣本標準差sd = √ ( ∑(x -  ̄x)^2 / (card(x) - 1) )
拿到所有數據時,前者更好;只拿到部分時,後者更優。


高斯分佈就是正態分佈,68%在一個標準差內,95%在兩個標準差內。
通過公式算出某個取值的概率。


樸素貝葉斯 vs kNN:
貝葉斯需要的訓練數據更少,性能更好。但無法學到特徵間的相互作用,如我喜歡巧克力,也喜歡粥,但不喜歡巧克力加粥一起喫。
kNN不用假設數據有特定結構,但需要大量內存。訓練集大時的好選擇,如推薦系統、蛋白組學及圖像分類等。


貝葉斯需要各屬性之間互相獨立,才能用乘法去算概率,然而很多時候並不滿足,我們假裝它滿足然後去用,結果效果還不錯。這裏的假裝就是“樸素”的來源。


第七章,非結構化文本分類
有序處理量太大,所以只看詞的出現次數。


P(w|h) = (n + 1) / (n + |vocabulary|)
注:|vocabulary|爲詞彙表中的詞數


概率相乘時,數字太小容易變成0,所以改用math.log()後相加。


停詞:去掉對分類沒有關係的詞,如i a the等
停詞不等於常見詞,work write school等雖常見,但對分類有用。


反對觀點,不要盲目停詞,如:
1、只使用最頻繁的詞時,能夠判定阿拉伯語文檔的寫作地(埃及、蘇丹、敘利亞還是英國)
2、在線聊天時,性犯罪者更多的使用i me you


第八章,聚類
聚類的種類:
1、k-means聚類:需要確定最後分成多少組。
2、層次聚類:開始時每個實例都看成一個簇,每迭代一次就合併兩個最相似的簇,直到最後只有一個簇。


聚類距離計算方式:
1、單連接聚類:使用兩集合中相距最近的兩個元素來計算長度。
2、全連接聚類:使用兩集合中相距最遠的兩個元素來計算長度。
3、平均連接聚類:一個集合中所有元素到另一集中中所有元素距離的平均。


k-means聚類:
1、隨機取n個點作爲類別
2、將每個實例分到離它最近的類別
3、計算每個類別的平均點,作爲新的中心點: ( ̄x,  ̄y,  ̄z, ....)   其中, ̄x = (x1 + x2 + x3 + ... xn) / n
4、以上面的中心點再次分類,直到結果不再變化爲止


此算法開始改善較多,後期只是微調,所以爲了降低運算時間,
將“所有點不再從一個類別移到另一類別”放寬到,
“只有不到1%的點會從一個另類移到另一類別”。


誤差平方和SSE,也稱爲散度scatter:
計算每個點到所屬中心點距離的平方,並求和。
SSE = ∑dist(c,x)^2


多次k-means聚類得到不同結果時,SSE小的結果更好。


k-means++聚類,更好的選擇初始點:
1、先隨機選一箇中心點
2、計算每個實例離各中心點的距離(開始爲1箇中心點,每次增加一箇中心點)
3、每個實例選一個最近距離,作爲選中此實例爲中心點的概率,選一箇中心點
4、重複第2步,直到選夠中心點爲止
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章