乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      手把手教你如何利用K均值聚類實(shí)現(xiàn)異常值的識(shí)別

       千鋒Python學(xué)堂 2019-08-26

      首先,借助于Python隨機(jī)生成兩組二維數(shù)據(jù),用于后文的實(shí)戰(zhàn)。為了能夠更加直觀地洞察該數(shù)據(jù),我們將其繪制成散點(diǎn)圖。

      # 導(dǎo)入第三方包
      import numpy as np
      import matplotlib.pyplot as plt
      # 隨機(jī)生成兩組二元正態(tài)分布隨機(jī)數(shù)
      np.random.seed(1234)
      mean1 = [0.5, 0.5]
      cov1 = [[0.3, 0], [0, 0.1]]
      x1, y1 = np.random.multivariate_normal(mean1, cov1, 5000).T
      mean2 = [0, 8]
      cov2 = [[0.8, 0], [0, 2]]
      x2, y2 = np.random.multivariate_normal(mean2, cov2, 5000).T
      # 繪制兩組數(shù)據(jù)的散點(diǎn)圖
      plt.rcParams['axes.unicode_minus'] = False
      plt.scatter(x1, y1)
      plt.scatter(x2, y2)
      # 顯示圖形
      plt.show()

      手把手教你如何利用K均值聚類實(shí)現(xiàn)異常值的識(shí)別

      如上圖所示,圖中藍(lán)色和紅色之間形成鮮明的簇,其中每個(gè)簇內(nèi)包含5000個(gè)數(shù)據(jù)。如果數(shù)據(jù)中存在異常點(diǎn),目測(cè)藍(lán)色的簇可能會(huì)包含更多異常,因?yàn)閿?shù)據(jù)點(diǎn)相對(duì)分散一些。

      K均值聚類的介紹

      K均值聚類算法的思路非常通俗易懂,就是不斷地計(jì)算各樣本點(diǎn)與簇中心之間的距離,直到收斂為止,其具體的步驟如下:

      (1)從數(shù)據(jù)中隨機(jī)挑選k個(gè)樣本點(diǎn)作為原始的簇中心。

      (2)計(jì)算剩余樣本與簇中心的距離,并把各樣本標(biāo)記為離k個(gè)簇中心最近的類別。

      (3)重新計(jì)算各簇中樣本點(diǎn)的均值,并以均值作為新的k個(gè)簇中心。

      (4)不斷重復(fù)(2)和(3),直到簇中心的變化趨于穩(wěn)定,形成最終的k個(gè)簇。

      也許上面的4個(gè)步驟還不足以讓讀者明白Kmeans的執(zhí)行過程,可以結(jié)合下圖更進(jìn)一步地理解其背后的思想。

      手把手教你如何利用K均值聚類實(shí)現(xiàn)異常值的識(shí)別

      如上圖所示,通過9個(gè)子圖對(duì)Kmeans聚類過程加以說明:子圖1,從原始樣本中隨機(jī)挑選兩個(gè)數(shù)據(jù)點(diǎn)作為初始的簇中心,即子圖中的兩個(gè)五角星;子圖2,將其余樣本點(diǎn)與這兩個(gè)五角星分別計(jì)算距離(距離的度量可選擇歐氏距離、曼哈頓距離等),然后將每個(gè)樣本點(diǎn)劃分到離五角星最近的簇,即子圖中按虛線隔開的兩部分;子圖3,計(jì)算兩個(gè)簇內(nèi)樣本點(diǎn)的均值,得到新的簇中心,即子圖中的五角星;子圖4,根據(jù)新的簇中心,繼續(xù)計(jì)算各樣本與五角星之間的距離,得到子圖5的劃分結(jié)果和子圖6中新的簇內(nèi)樣本均值;以此類推,最終得到理想的聚類效果,如子圖9所示,圖中的五角星即最終的簇中心點(diǎn)。

      在上文中,我們生成了兩組隨機(jī)數(shù)據(jù),從圖中一眼就可以看出需聚為兩類,然而在實(shí)際應(yīng)用中,很多數(shù)據(jù)都無法通過可視化或直覺判斷聚類的個(gè)數(shù)(即K值)。但這不代表沒有方法鎖定最佳的K值,在書《從零開始學(xué)Python數(shù)據(jù)分析與挖掘》的第十五章介紹了“拐點(diǎn)法”、“輪廓系數(shù)法”和“間隔統(tǒng)計(jì)量法”,感興趣的朋友可以去了解一下。這里就使用書中的自定義函數(shù),測(cè)試一下K應(yīng)該對(duì)應(yīng)的值:


      # 將兩組數(shù)據(jù)集匯總到數(shù)據(jù)框中
      X = pd.DataFrame(np.concatenate([np.array([x1, y1]), np.array([x2, y2])], axis=1).T)
      X.rename(columns = {0:'x1',1:'x2'}, inplace = True)
      # 自定義函數(shù)的調(diào)用
      k_SSE(X, 10)

      手把手教你如何利用K均值聚類實(shí)現(xiàn)異常值的識(shí)別

      如上圖所示,當(dāng)簇的個(gè)數(shù)為2時(shí)形成了一個(gè)明顯的“拐點(diǎn)”,因?yàn)?K值從1到2時(shí),折線的斜率都比較大,但是值為3時(shí)斜率突然就降低了很多,并且之后的簇對(duì)應(yīng)的斜率都變動(dòng)很小。所以,合理的值應(yīng)該為2,與模擬的兩個(gè)簇?cái)?shù)據(jù)相吻合。

      異常點(diǎn)識(shí)別原理

      使用K均值聚類的思想識(shí)別數(shù)據(jù)中的異常點(diǎn)還是非常簡單的,具體步驟如下:

      • 利用“拐點(diǎn)法”、“輪廓系數(shù)法”、“間隔統(tǒng)計(jì)量法”或者“經(jīng)驗(yàn)法”確定聚類的個(gè)數(shù);

      • 基于具體的K值,對(duì)數(shù)據(jù)實(shí)施K均值聚類的應(yīng)用;

      • 基于聚類的結(jié)果,計(jì)算簇內(nèi)每個(gè)點(diǎn)到簇中心的距離;

      • 將距離跟閾值相比較,如果其大于閾值則認(rèn)為是異常,否則正常;

      案例實(shí)戰(zhàn)

      為了驗(yàn)證我們?cè)谇拔乃f的的直覺(“目測(cè)藍(lán)色的簇可能會(huì)包含更多異常”),接下來通過構(gòu)造自定義函數(shù),計(jì)算簇內(nèi)的每個(gè)點(diǎn)與簇中心的距離,并判斷其是否超過閾值的異常點(diǎn)下方代碼可能有點(diǎn)長,但仔細(xì)閱讀并查看對(duì)應(yīng)的注釋內(nèi)容,相信你一定能夠理解代碼的思想。


      def kmeans_outliers(data, clusters, is_scale = True):
      # 指定聚類個(gè)數(shù),準(zhǔn)備進(jìn)行數(shù)據(jù)聚類
      kmeans = KMeans(n_clusters=clusters)
      # 用于存儲(chǔ)聚類相關(guān)的結(jié)果
      cluster_res = []
      # 判斷是否需要對(duì)數(shù)據(jù)做標(biāo)準(zhǔn)化處理
      if is_scale:
      std_data = scale(data) # 標(biāo)準(zhǔn)化
      kmeans.fit(std_data) # 聚類擬合
      # 返回簇標(biāo)簽
      labels = kmeans.labels_
      # 返回簇中心
      centers = kmeans.cluster_centers_
      for label in set(labels):
      # 計(jì)算簇內(nèi)樣本點(diǎn)與簇中心的距離
      diff = std_data[np.array(labels) == label,] - \
      - np.array(centers[label])
      dist = np.sum(np.square(diff), axis=1)
      # 計(jì)算判斷異常的閾值
      UL = dist.mean() + 3*dist.std()
      # 識(shí)別異常值,1表示異常,0表示正常
      OutLine = np.where(dist > UL, 1, 0)
      raw_data = data.loc[np.array(labels) == label,]
      new_data = pd.DataFrame({'Label':label,'Dist':dist,'OutLier':OutLine})
      # 重新修正兩個(gè)數(shù)據(jù)框的行編號(hào)
      raw_data.index = new_data.index = range(raw_data.shape[0])
      # 數(shù)據(jù)的列合并
      cluster_res.append(pd.concat([raw_data,new_data], axis = 1))
      else:
      kmeans.fit(data) # 聚類擬合
      # 返回簇標(biāo)簽
      labels = kmeans.labels_
      # 返回簇中心
      centers = kmeans.cluster_centers_
      for label in set(labels):
      # 計(jì)算簇內(nèi)樣本點(diǎn)與簇中心的距離
      diff = np.array(data.loc[np.array(labels) == label,]) - \
      - np.array(centers[label])
      dist = np.sum(np.square(diff), axis=1)
      UL = dist.mean() + 3*dist.std()
      OutLine = np.where(dist > UL, 1, 0)
      raw_data = data.loc[np.array(labels) == label,]
      new_data = pd.DataFrame({'Label':label,'Dist':dist,'OutLier':OutLine})
      raw_data.index = new_data.index = range(raw_data.shape[0])
      cluster_res.append(pd.concat([raw_data,new_data], axis = 1))
      # 返回?cái)?shù)據(jù)的行合并結(jié)果
      return pd.concat(cluster_res)
      # 調(diào)用函數(shù),返回異常檢測(cè)的結(jié)果
      res = kmeans_outliers(X,2,False)
      # res
      # 繪圖
      sns.lmplot(x="x1", y="x2", hue='OutLier', data=res,
      fit_reg=False, legend=False)
      plt.legend(loc='best')
      plt.show()

      手把手教你如何利用K均值聚類實(shí)現(xiàn)異常值的識(shí)別

      如上圖所示,藍(lán)色的點(diǎn)即為異常點(diǎn)。從藍(lán)色點(diǎn)的分布來看,上面那一簇所對(duì)應(yīng)的異常點(diǎn)比較多(與之前的預(yù)判一致),而下面簇的異常點(diǎn)較少,且全部集中在散點(diǎn)的右側(cè)。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多