大家都很清楚SPC的中文叫統(tǒng)計過程控制耘拇,它的作用是發(fā)現(xiàn)過程數(shù)據(jù)中的異常行為缺狠,SPC有8種以上的判異規(guī)則,每一中判異規(guī)則對應可能的異常原因型雳,非常實用当凡。
現(xiàn)在大數(shù)據(jù)、機器學習應用越來越廣泛纠俭,而機器學習算法的一個常見應用就算異常檢測沿量,接下來的一系列內(nèi)容的更新都會分別介紹不同的機器學習算法來進行異常檢測,包括算法基本原理冤荆、系統(tǒng)實現(xiàn)和應用朴则。
注意:SPC是異常判定的一種方法,其他機器學習同樣可以做異常判定钓简,不要認為標題的K均值算法是SPC哦乌妒,標題而已。但我們可以把其他異常判定算法的異常判定結(jié)果放到SPC控制圖中外邓。
本文介紹的是一種叫做K-mean(k均值)的聚類分析方法撤蚊。
“ 聚類分析(英語:Cluster analysis)亦稱為群集分析,是對于統(tǒng)計數(shù)據(jù)分析的一門技術(shù)损话,在許多領域受到廣泛應用拴魄,包括機器學習,數(shù)據(jù)挖掘席镀,模式識別匹中,圖像分析以及生物信息,顧客分類豪诲,文章分類等顶捷。聚類是把相似的對象通過靜態(tài)分類的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性屎篱,常見的包括在坐標系中更加短的空間距離等服赎。一般把數(shù)據(jù)聚類歸納為一種非監(jiān)督式學習葵蒂。”
K均值算法過程如下:
- 首先我們選擇一些類/組重虑,并隨機初始化它們各自的中心點践付。中心點是與每個數(shù)據(jù)點向量長度相同的位置。這需要我們提前預知類的數(shù)量(即中心點的數(shù)量)缺厉。
- 計算每個數(shù)據(jù)點到中心點的距離永高,數(shù)據(jù)點距離哪個中心點最近就劃分到哪一類中。
- 計算每一類中中心點作為新的中心點提针。
- 重復以上步驟命爬,直到每一類中心在每次迭代后變化不大為止。也可以多次隨機初始化中心點辐脖,然后選擇運行結(jié)果最好的一個饲宛。
隨機選擇2個點(k=2)C1和C2,將剩下的所有點,根據(jù)距離C1和C2的距離的遠近,劃分給C1或者C2
根據(jù)獲得的兩類點嗜价,重新計算兩類點中的質(zhì)心(到該類所有點的距離最短)重新將所有的點歸到兩個新的質(zhì)心的其中之一艇抠。 重復上面的過程,直到每一類中心在每次迭代后變化不大為止久锥。
k均值Python實現(xiàn)算法如下:
簡單一點练链,我們用一維數(shù)據(jù)來演示(檢測數(shù)據(jù)很多是一維的)。
1)導入機器學習模塊(這里我們使用了scikit-learn)
<pre style="box-sizing: border-box; margin: 0px 0px 1rem; padding: 0px; border: none; outline: none; -webkit-tap-highlight-color: transparent; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; overflow: auto; display: block; color: rgb(33, 37, 41); -webkit-font-smoothing: antialiased; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;"> import pandas as pd import numpy as np from sklearn.cluster import KMeans
</pre>
2)算法實現(xiàn)
<pre style="box-sizing: border-box; margin: 0px 0px 1rem; padding: 0px; border: none; outline: none; -webkit-tap-highlight-color: transparent; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; overflow: auto; display: block; color: rgb(33, 37, 41); -webkit-font-smoothing: antialiased; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;"> y =[470,509,500,511,435,489,483,483,482,483,504,472,464,481,501,581,507,558,569,467,382,464,482,474,482,478,477,536,485,502,489,507,432,507,470,482,485,482,505,470,487,476] km = KMeans(n_clusters=2) km.fit(y) y['fcst'] = km.predict(y)
</pre>
輸入一個y奴拦,定義分成兩類(自動一類正常媒鼓,一類不正常), 字段fcst記錄了預測的分類結(jié)果错妖,有兩個分類0和1绿鸣,但我們不知道哪一類才算正常,我們一個合理的假定暂氯,分類中多的是正常的潮模,少的是異常的。
3)異常判定的處理
<pre style="box-sizing: border-box; margin: 0px 0px 1rem; padding: 0px; border: none; outline: none; -webkit-tap-highlight-color: transparent; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; overflow: auto; display: block; color: rgb(33, 37, 41); -webkit-font-smoothing: antialiased; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 300; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;"> `label0 = y[y.fcst==0]['fcst'].count()
label1 = y[y.fcst==1]['fcst'].count()
if label1<=label0:
y['isAbnormal ']=y['fcst']
else:
y.loc[y['fcst'] == 0, 'isAbnormal'] = 1
y.loc[y['fcst'] == 1, 'isAbnormal'] = 0
y.columns = ['data','fcst','isAbnormal']
y['isAbnormal']= y['isAbnormal'].astype(int)
y = y[['data','isAbnormal']]`
</pre>
記錄分類為1的數(shù)量和分類為0的數(shù)量痴施,最終用字段isAbnormal記錄是否異常擎厢,0為正常,1為異常辣吃。
結(jié)果如下:
至此动遭,我們已經(jīng)完成了一種機器學習的異常檢測。
SPC系統(tǒng)實現(xiàn):
接下來看看我們在SPC系統(tǒng)上的實現(xiàn)神得。
我們把K均值算法得到的異常點厘惦,直接顯示在SPC控制圖上,請看下圖哩簿。也可以選擇不顯示宵蕉。
這樣我們就可以在SPC控制圖上顯示其他異常判定算法的異常判定結(jié)果了≡途玻現(xiàn)在知道機器學習怎么和SPC結(jié)合在一起如何使用了吧。
如果你想了解上面的功能的測試羡玛,
下方鏈接可以在線體驗和上圖完成一樣的功能别智。