1. 程式人生 > >K-means-:在聚類時發現異常

K-means-:在聚類時發現異常

11月4日和5日,BigML加入哈馬德濱哈利法大學卡達計算研究所(QCRI),將機器學習學校帶到卡達的多哈我們很高興有機會與QCRI合作。

在會議期間,Sanjay Chawla博士討論了他的異常聚類演算法,k-means-我們認為使用我們的特定領域語言實現機器學習工作流程WhizzML的變體來實現它的變體是一種有趣的練習 

k均值演算法的通常過程如下。它從一些資料集,一些數量的簇k和一些預期的異常值l開始它隨機選取k個質心,並根據哪一個最接近,將資料集的每個點分配給這些質心中的一個。到目前為止,它就像香草k-means一樣。在vanilla k-means中,您現在可以找到每個聚類的均值並將其設定為新的質心。

然而,在k-means中,你首先找到l離指定質心最遠的點,並從資料集中過濾它們。使用剩餘點找到新的質心。通過去除這些點,我們將發現不受異常值影響的質心,因此不同(並且希望更好)質心。

我們已經在BigML(叢集資源)中實現了k-means但這不是香草k-means。不是通過平均叢集中的所有點來找到新的質心,而是通過對點進行取樣並使用梯度下降方法來更快地實現BigML。BigML也比vanilla k-means選擇更好的初始條件。我們將改編Chawla的k-means,而不是失去這些好處,在核心迭代中使用完整的BigML叢集資源。

這個WhizzML指令碼是我們實現的核心。

(定義(得到- 異常 DS - ID  過濾- DS  ķ  升)
  (讓(叢集- ID(建立- 和- 等待- 叢集 { “K”  ķ
                                             “資料集”已 過濾- ds })
        batchcentroid - id(create - and - wait - batchcentroid
                            { “cluster”  cluster - id
                             “dataset”  ds - id
                             “all_fields”是 真的
                             “距離”是 真的
                             “output_dataset”  true })
        batchcentroid(獲取 batchcentroid - id)
        centroid - ds(batchcentroid  “output_dataset_resource”)
        sample - id(create - and - wait - sample  centroid - ds)
        field - id(((fetch  centroid - ds)“objective_field”)“id”)
        異常(獲取 樣本- id { “row_order_by”(str  “ - ”  field - id)
                                    “模式”  “線性”
                                    “行”  l
                                    “index”  true }))
    (刪除* [ batchcentroid - id  sample - id ])
    { “cluster-id”  cluster - id
     “centroid-ds”  centroid - ds
     “例項”((異常 “樣本”)“行”)}))

讓我們逐行檢查。在移除我們的異常之前,讓我們執行整個k-mean序列,而不是在演算法的每個步驟中移除l個異常值。

cluster - id(建立- 和- 等待- 叢集 { “k”  k  “資料集”  過濾- ds })

然後很容易建立一個批量質心,其中輸出資料集與附加的質心之間的距離。

batchcentroid - id(create - and - wait - batchcentroid { “cluster”  cluster - id
                                                 “dataset”  ds - id
                                                 “all_fields”是 真的
                                                 “距離”是 真的
                                                 “output_dataset”
                                                   真的 })

要獲得特定點,我們需要使用BigML示例資源來獲取最遠的點。

sample - id(create - and - wait - sample  centroid - ds)

我們現在可以找到與第l個例項關聯的距離,然後過濾掉距離原始資料集的距離大於所有距離的所有點。

異常(獲取 樣本- id { “row_order_by”(str  “ - ”  field - id)
                            “模式”  “線性”
                            “行”  l
                            “index”  true }))

我們重複這個過程,直到質心穩定,這是通過在演算法的後續迭代中通過異常值組之間的Jaccard係數的閾值來確定的,或者直到我們達到使用者設定的某個最大迭代次數。

您可以在GitHub或BigML庫中找到完整的程式碼

那麼當我們執行這個指令碼時會發生什麼?讓我們嘗試紅葡萄酒質量資料集。這是使用13的k(使用BigML g-means叢集選擇)和10的l的結果。

我們可以匯出叢集摘要報告,並將其與具有相同k的vanilla BigML叢集進行比較正如您所期望的那樣,通過去除外圍點,k-均值減去兩個結果時質心標準差的平均值更小:0.00128對0.00152。

我們作為異常值刪除的點數怎麼樣?我們知道它們是否真的異常嗎?當我們通過BigML異常探測器執行葡萄酒資料集時,我們可以根據隔離森林獲得前十個異常。與指令碼找到的十個異常值相比,我們看到共有六個例項。這是一個體面的協議,我們已經刪除了真正的異常值。

我們希望您喜歡BigML如何使用研究來輕鬆定製ML演算法的演示。