8.機器學習之聚類演算法

来源:https://www.cnblogs.com/bonheur/archive/2020/03/13/12469906.html
-Advertisement-
Play Games

分類是在一群已經知道類別標號的樣本中,訓練一種分類器,讓其能夠對某種未知的樣本進行分類,分類演算法屬於一種有監督的學習。分類演算法的分類過程就是建立一種分類模型來描述預定的數據集或概念集,通過分析由屬性描述的資料庫元組來構造模型。分類的目的就是使用分類對新的數據集進行劃分,其主要涉及分類規則的準確性、過 ...


分類是在一群已經知道類別標號的樣本中,訓練一種分類器,讓其能夠對某種未知的樣本進行分類,分類演算法屬於一種有監督的學習。分類演算法的分類過程就是建立一種分類模型來描述預定的數據集或概念集,通過分析由屬性描述的資料庫元組來構造模型。分類的目的就是使用分類對新的數據集進行劃分,其主要涉及分類規則的準確性、過擬合、矛盾劃分的取捨等。
————————————————

聚類是在一群未知類別標號的樣本上,用某種演算法將他們分成若幹類別,這是一種無監督學習。給定一組數據點,我們可以用聚類演算法將每個數據點分到特定的組中,理論上屬於同一組的數據點應該有相似的屬性和/或特征,而屬於不同組的數據點應該有非常不同的屬性和/或特征。所以在給定的數據集中,我們可以通過聚類演算法將其分成一些不同的組。

聚類是一種將數據點按一定規則分群(分組)的機器學習技術。其主要研究數據間邏輯上或物理上的相互關係。聚類分析本身不是一個特定的演算法,而是要解決的一般任務。它可以通過各種演算法來實現,這些演算法在理解群集的構成以及如何有效地找到它們方面存在顯著差異。由聚類所組成的簇是一組數據對象的集合,這些對象與同一簇中的對象彼此類似,與其他簇中的對象相異。其分析結果不僅可以揭示數據間的內在聯繫與區別,還可以為進一步的數據分析與知識發現提供重要依據。

監督學習:當我們根據一組給定的預測因數變數或自變數去預測一個目標變數時,這些問題被稱為監督學習問題。

無監督學習:沒有任何固定目標變數的這些問題被稱為無監督學習問題。在這些問題中,我們只有自變數而沒有目標/因變數。

 

K-Means 聚類演算法原理詳解

簡單來說K-Means 聚類演算法接受一個未標記的數據集,然後將數據聚類成不同的組,同時,k-means演算法也是一種無監督學習。

簇的兩個屬性:聚類的主要目的不僅僅是創建簇,而是創建好的和有意義的簇。

1)組中的所有數據點應該彼此相似;

2)來自不同組的數據點應儘可能不同;

簇第一個屬性:Inertia評估。Inertia實際上計算簇內所有點到該簇的質心的距離的總和。我們為所有簇計算這個總和,最終Inertia值是所有這些距離的總和。簇內的這個距離稱為簇內距離(intracluster distance.)。因此,Inertia為我們提供了簇內距離的總和:

現在,你認為一個好的簇的Inertia值應該是什麼?小的Inertia好還是大的Inertia好?我們希望同一簇中的點彼此相似,因此它們之間的距離應儘可能小。記住這一點,Inertia越小,聚類越好。

簇第二個屬性:Dunn Index,我們現在知道Inertia試圖最小化簇內距離,它正試圖劃分更緊湊的簇。換句話說如果一個簇的質心與該簇中的點之間的距離很小,則意味著這些點彼此更接近。因此,Inertia可確保滿足簇的第一個屬性。但它並不關心第二個屬性,不同的簇應儘可能彼此不同,這就是Dunn Index可以用來評估的地方。

除了質心和點之間的距離,Dunn Index還考慮了兩個簇之間的距離,兩個不同簇的質心之間的距離稱為簇間距離(inter-cluster distance)。Dunn Index指數的公式:

Dunn Index是簇間距離的最小值與簇內距離的最大值之比。我們希望最大化Dunn Index,Dunn Index的值越大,簇就越好。為了最大化Dunn Index的值,分子應該是最大的。在這裡,我們採用最小的簇間距離。因此,即使是最近的簇之間的距離也應該更大,這最終將確保簇彼此遠離。此外,分母應該是最小的,以最大化Dunn Index。在這裡,我們採取最大的簇內距離。同樣,這裡的直覺也是一樣的。簇質心和點之間的最大距離總和應該最小,這最終將確保劃分的簇緊湊。

 

什麼是K-means聚類:

回想一下簇的第一個屬性,它表明簇中的點應該彼此相似。因此,我們的目標是最小化簇內點之間的距離。有一種演算法試圖通過它們的質心最小化簇中點的距離,那就是K-means聚類技術。K-means是一種基於質心的演算法,或基於距離的演算法,我們計算將點分配給一個簇的距離。在K-means中,每個聚類都與一個質心相關聯。K-means演算法的主要目的是最小化點與它們各自的簇質心之間的距離之和。

“求點群中心的演算法”:歐氏距離(Euclidean Distance):(差的平方和的平方根)

 

舉個例子來瞭解K-means實際上是如何工作的:

 我們有這8個點,我們想要應用K-means來為這些點劃分簇。下麵將演示我們是怎樣做到的。

第一步:選擇簇的數目k

K-means的第一步是選擇簇的數目k。

第二步:從數據中選擇k個隨機點作為質心

接下來,我們為每個簇隨機選擇質心。假設我們想要有2個簇,所以k在這裡等於2。然後我們隨機選擇質心:這裡,紅色和綠色圓圈代表這些簇的質心。

  

第三步:將所有點分配給到某個質心距離最近的簇

一旦我們初始化了質心,我們就將每個點分配給到某個質心距離最近的簇:在這裡,你可以看到更接近紅點的點被分配給紅色簇,而更接近綠點的點被分配給綠色簇。

 

第四步:重新計算新形成的簇的質心

現在,一旦我們將所有點分配到任一簇中,下一步就是計算新形成的簇的質心:在這裡,紅色和綠色叉號是新的質心。

第五步:重覆第三步和第四步

然後我們重覆第三步和第四步:計算質心並基於它們與質心的距離將所有點分配給簇的步驟是單次迭代。但我們什麼時候應該停止這個過程?它不能永遠運行下去對吧?

 停止K-means聚類的標準基本上有三種停止標準可用於停止K-means演算法:新形成的簇的質心不會改變數據點保留在同一個簇中達到最大迭代次數如果新形成的簇的質心沒有變化,我們就可以停止演算法。即使在多次迭代之後,所有簇都還是相同的質心,我們可以說該演算法沒有學習任何新模式,並且它是停止訓練的標誌。另一個明顯的跡象表明,在多次迭代訓練的之後,如果數據點仍然都在同一簇中,我們應該停止訓練過程。最後,如果達到最大迭代次數,我們可以停止訓練。假設我們將迭代次數設置為100。在停止之前,該過程將重覆100次迭代。

 

演算法實現步驟(總結):

1. 確定要聚類的數量,並隨機初始化它們各自的中心點(質心);

2. 計算每個點分別到k個聚類中心的聚類,然後將該點分到最近的聚類中心,這樣就行成了k個簇;

3. 再重新計算每個簇的質心(均值,即向量各維取平均);

4. 重覆以上2~3步,直到質心的位置不再發生變化或者達到設定的迭代次數。

 

K-means聚類演算法面臨的挑戰

1)使用K-means時我們面臨的普遍挑戰之一是簇的大小不同。假設我們有以下幾點:

 與中心簇相比,左側和最右側的簇的點的數量比較少。現在,如果我們在這些點上應用K-means聚類,結果將是這樣的:

2)K-means的另一個挑戰是當原始點的密度不同時。比如下麵這些原始點:

這裡,紅色簇中的點比較鬆散,而其餘簇中的點緊密地堆積在一起。現在,如果我們在這些點上應用K-means,我們將得到這樣的簇:

 

我們可以看到緊湊的點已分配給同一個簇。而實際鬆散分佈但在同一簇中的點卻分配給不同的簇。效果並不理想,我們能做些什麼呢?

解決方案一:是使用更多的簇進行劃分。因此,在所有上述場景中,我們可以擁有更多的簇,而不是使用3個簇。也許設置k = 10可能會產生更有意義的簇。

解決方案二:K-means ++為K-means聚類選擇初始簇質心。還記得我們如何在K-means聚類中隨機初始化質心嗎?這也可能有問題,因為我們每次都可能得到不同的簇。因此,為瞭解決隨機初始化的這個問題,有一種稱為K-means ++的演算法可用於為K-means選擇初始值或初始簇質心。

 

K-means++演算法介紹:

在某些情況下,如果簇的初始化不合適,K-means可能導致產生壞的簇。這就是K-means ++產生作用的地方。它指定了在使用標準K-means聚類演算法向前推進之前初始化簇質心的過程。使用K-means ++演算法,我們優化了隨機選擇簇質心的步驟。在使用K-means ++初始化時,即(init='K-means++'),我們更有可能找到與最佳K-means解決方案競爭的解決方案。

使用K-means ++初始化質心的步驟是:

1)從我們想要聚類的數據點隨機均勻地選擇第一個簇;這類似於我們在K-means中所做的,但不是隨機挑選所有質心,而是在這裡選擇一個質心;

2)接下來,我們計算每個數據點到已經選擇的簇的質心的距離(D(x));

3)然後,從數據點中選擇新的簇質心;

4)重覆步驟2和3,直到選擇了k個簇。

舉個例子來更清楚地理解這一點。假設我們有以下幾點,我們想在這裡劃分3個簇:

現在,第一步是隨機選擇一個數據點作為簇質心:

 

假設我們選擇綠點作為初始質心。現在,我們將使用此質心計算每個數據點與質心的距離(D(x)):

下一個質心將是其平方距離(D(x)2)離當前質心最遠的那個點:

在這種情況下,紅點將被選為下一個質心。現在,為了選擇最後一個質心,我們將計算所有點到其最近的質心的距離,其中具有最大平方距離的點作為下一個質心:

我們將選擇最後一個質心為:

 

 初始化質心後,我們可以繼續使用K-means演算法。使用K-means ++初始化質心往往會改善聚類結果。雖然相對於隨機初始化而言計算成本很高,但隨後的K-means通常會更快地收斂。

 

如何在K-means聚類中選擇正確的簇的個數?

每個人在使用K-means時最常見的疑問之一就是如何選擇合適數量的簇。那麼,讓我們看看一種技術,它將幫助我們為K-means演算法選擇正確的簇的個數。老實說,我們可以擁有任意數量的簇。你能猜出可能的最大簇數是多少嗎?我們想到將每個點分配給一個單獨的簇。因此,在這種情況下,簇的數量將等於點數或觀察數量。所以,最大可能的簇數將等於數據集中的觀察數。

但我們如何才能確定最佳簇數?我們可以做的一件事是繪製圖形,其中x軸表示簇的數量,y軸將是評估度量。我們暫時說是Inertia(樣本到其最近的聚類中心的平方距離的總和)。也可以選擇任何其他評估指標,如Dunn Index;代價函數/畸變函數(Distortion function:要使k-means最後的分類結果最好,也就是要是K-均值最小化,是要最小化所有的數據點與其所關聯的聚類中心點之間的距離之和);...... 。

接下來,我們將從一個小的簇值開始,比如說2使用2個簇訓練模型,計算該模型的Inertia,最後將其繪製在上圖中。假設我們得到Inertia大約為1000:

 現在,我們將增加簇的數量,再次訓練模型,並繪製Inertia。這是我們得到的圖:

當我們將簇值從2更改為4時,Inertia急劇下降。隨著我們進一步增加簇的數量,Inertia的下降變得緩慢並最終變得穩定。Inertia的減小幅度變為常數時對應的簇的個數可以選擇作為我們數據的正確簇的個數。

 在這裡,我們可以選擇6到10之間的任意數量的簇的個數。我們可以有7個,8個甚至9個簇。你還必須在確定簇的個數時查看計算成本。如果我們增加簇的數量,計算成本也會增加。因此,如果你沒有高計算資源,我的建議是選擇較少數量的簇。K值的選擇主要還是根據經驗以及利用k-means聚類的目的來決定。

 

【補充】K-Medians 是與 K-Means 有關的另一個聚類演算法,除了不是用均值而是用組的中值向量來重新計算組中心。這種方法的優點是對異常值不敏感(因為使用中值),但對於較大的數據集要慢得多,因為在計算中值向量時,每次迭代都需要對數據進行排序。  

k-means 演算法的優點:

1)法簡單快捷,容易理解,速度快,真正在做的是計算點和組中心之間的距離:非常少的計算!因此它具有線性複雜度 O(n);
2)對所有的數據樣本都進行聚類;
3)對滿足高斯分佈、均勻分佈的數據類型聚類效果表較好。

k-means演算法的缺點:

1)需要事先確定聚類個數;

2)對初始聚類中心敏感,而K-means 也是從隨機選擇的聚類中心開始,所以可能在不同的演算法中產生不同的聚類結果(結果可能不可重覆並缺乏一致性,其他聚類方法更加一致);

3)對孤立點和雜訊點相對敏感。

 

 

參考文章:

1. https://baijiahao.baidu.com/s?id=1643772188521178944&wfr=spider&for=pc

2. https://baijiahao.baidu.com/s?id=1625408992304959354&wfr=spider&for=pc

3. https://blog.csdn.net/songguangfan/article/details/90770289

4. https://www.sohu.com/a/286841039_654419


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、動態HTML 1.爬蟲跟反爬蟲 2.動態HTML連載 (1)JavaScript (2)jQuery (3)Ajax (4)DHTML (5)Python採集動態數據 從JavaScript代碼入手採集​;Python第三方庫運行JavaScript,直接採集你在瀏覽器中看到的頁面 二、Sele ...
  • [TOC] getattr詳解 前言 這兩天在優化騰訊雲遷移平臺( "SmartMS" )的中間件( )時. 其中某些介面由於涉及多種伺服器系統類型, 遷移類型的判斷.導致往往一個介面動輒70 80行. 隨便進行一個介面的修改, 調試, 參數的變更. 都將花費好幾分鐘的時間去縷縷中間的邏輯.加上同一 ...
  • 靜態類型和動態類型、類型虛函數與多態、typeid、dynamic_cast、static_cast關鍵字的使用場合 ...
  • Celery 是一個 基於python開發的分散式非同步消息任務隊列,通過它可以輕鬆的實現任務的非同步處理, 如果你的業務場景中需要用到非同步任務,就可以考慮使用celery, 舉幾個實例場景中可用的例子: 你想對100台機器執行一條批量命令,可能會花很長時間 ,但你不想讓你的程式等著結果返回,而是給你返 ...
  • 為什麼要使用輸出控制符: 我們知道在電腦中數據是以二進位的形式存儲在電腦中的,但是01組成的代碼既可以表示數據也可以表示指令。如果不用輸出控制符變成我們想要的樣子的話,很容易的造成誤解。 如果01組成的代碼表示的是數據的話,那麼同樣的 01 代碼組合不同的輸出格式就會有不同的輸出結果。所以需要使 ...
  • 抽象類 抽象類必須用 abstract 修飾,子類必須實現抽象類中的抽象方法,如果有未實現的,那麼子類也必須用 abstract 修飾。抽象類預設的許可權修飾符為 public,可以定義為 public 或 procted,如果定義為 private,那麼子類則無法繼承。抽象類不能創建對象 抽象類和普 ...
  • 代碼示例全部保存在,歡迎star:https://github.com/EnochZg/golang examples 安裝組件 使用 先創建ini尾碼的配置文件,本文以config.ini為例 在main函數中加入以下代碼讀取username配置 運行後即可讀取到username的值,上文中的Se ...
  • 自從Java發佈以來,基本數據類型就是Java語言的一部分,分別是byte, short, int, long, char, float, double, boolean. 其中: 整型:byte, short, int, long 字元型:char 浮點型:float, double 布爾型:bo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...