機器學習 K-Means聚類 無監督學習

目錄

K-Means 聚類:從原理到實踐的完整指南

什么是 K-Means 聚類?

應用場景舉例

K-Means 算法的核心原理

K-Means 算法的步驟詳解

可視化理解

K-Means 的優缺點分析

優點

缺點

如何選擇合適的 K 值?

1. 肘部法(Elbow Method)

2. 輪廓系數(Silhouette Score)

K-Means 的改進算法

總結


一.K-Means 聚類:從原理到實踐的完整指南

聚類分析是機器學習中一種重要的無監督學習方法,它能夠將相似的數據點自動分組,發現數據中潛在的結構和模式。在眾多聚類算法中,K-Means 因其簡單、高效和廣泛的適用性而成為最受歡迎的算法之一。本文將深入解析 K-Means 聚類算法的原理、實現步驟、優缺點及實際應用案例。

1.什么是 K-Means 聚類?

K-Means 是一種迭代式的聚類算法,其核心思想是將 n 個數據點劃分為 k 個不同的簇(Cluster),使得每個簇內的數據點具有較高的相似度,而不同簇之間的數據點差異較大。

"K" 代表我們想要創建的簇的數量,"Means" 則指每個簇的中心點(質心),算法通過計算數據點與質心的距離來決定數據點的歸屬。

    應用場景舉例

    K-Means 在實際生活中有著廣泛應用:

    • 客戶分群:電商平臺根據用戶購買行為將客戶分為不同群體,進行精準營銷
    • 文本聚類:將新聞文章按主題自動分類
    • 圖像分割:識別圖像中不同的物體區域
    • 異常檢測:發現數據中的異常值或離群點
    • 市場細分:根據消費者特征劃分不同的市場群體

    2.無監督學習與有監督學習的區別

    • 有監督學習:需要X和Y數據,Y作為監督信號,模型通過Y優化預測結果(如分類、回歸)。
    • 無監督學習:僅使用X數據,無Y標簽,通過數據內在結構進行聚類(如K-means)。

    3.K-Means 算法的核心原理

    K-Means 算法的工作流程基于以下關鍵概念:

    1. 簇(Cluster):具有相似特征的數據點集合
    2. 質心(Centroid):每個簇的中心點,是該簇內所有數據點的平均值
    3. 距離度量:通常使用歐氏距離衡量數據點與質心的相似度
    4. 目標函數:最小化所有數據點到其所屬簇質心的距離之和(平方誤差和)

    4.K-Means 算法的步驟詳解

    K-Means 算法通過迭代方式逐步優化聚類結果,具體步驟如下:

    1. 確定 K 值:根據業務需求或數據特點,指定要創建的簇數量 K

    2. 初始化質心:隨機選擇 K 個數據點作為初始質心

    3. 分配數據點:計算每個數據點到 K 個質心的距離,將數據點分配到距離最近的質心所在的簇

    4. 更新質心:計算每個簇內所有數據點的平均值,作為新的質心

    5. 重復迭代:重復步驟 3 和步驟 4,直到質心不再顯著變化或達到預設的最大迭代次數

    6. 輸出結果:得到最終的 K 個簇及對應的質心

    可視化理解

    想象在二維平面上有一些散點,K-Means 的過程就像是:

    • 先在平面上隨機放 K 個 "種子" 點(初始質心)
    • 每個點都選擇離自己最近的種子點 "站隊"
    • 每個隊伍計算出自己的 "中心位置"(新質心)
    • 所有點根據新的中心位置重新選擇隊伍
    • 重復以上過程,直到每個隊伍的中心位置穩定下來

    5.K-Means的評價指標(輪廓系數)

    • 輪廓系數用于評估聚類效果,公式涉及兩個關鍵指標:
      • a_i:樣本點與同簇其他點距離的平均值(簇內距離)。
      • b_i:樣本點到其他簇所有點距離的最小平均值(簇間距離)。
    • 單個樣本的輪廓系數計算公式為:
      s_i = (b_i - a_i)\max(a_i, b_i)
    • 整體輪廓系數為所有樣本輪廓系數的平均值,取值范圍為?[-1, 1]
      • 接近?1:聚類效果優秀。
      • 接近?-1:聚類效果差(樣本可能被誤分到其他簇)。
      • 接近?0:樣本位于簇邊界。

    6.K-Means 的優缺點分析

    優點

    • 算法簡單易懂,實現方便
    • 計算效率高,對大數據集表現良好
    • 聚類結果可解釋性強
    • 適用于高維數據

    缺點

    • 需要預先指定 K 值,而最佳 K 值往往不明確
    • 對初始質心的選擇敏感,可能導致不同的聚類結果
    • 對噪聲和異常值敏感
    • 不太適合發現非凸形狀的簇
    • 當簇的大小差異較大時表現不佳

    7.如何選擇合適的 K 值?

    選擇合適的 K 值是 K-Means 聚類的關鍵挑戰之一。以下是兩種常用方法:

    1. 肘部法(Elbow Method)

    肘部法通過繪制 "K 值 - 誤差平方和" 曲線來確定最佳 K 值:

    • 計算不同 K 值(如 1 到 10)對應的聚類結果
    • 計算每個 K 值下的誤差平方和(SSE),即所有數據點到其簇質心的距離平方之和
    • 繪制 K 值與 SSE 的關系曲線
    • 曲線中 "肘部" 對應的 K 值即為最佳選擇,此時 SSE 開始趨于平穩

    2. 輪廓系數(Silhouette Score)

    輪廓系數用于衡量聚類結果的質量:

    • 取值范圍為 [-1, 1]
    • 接近 1 表示樣本聚類合理
    • 接近 0 表示樣本可能位于兩個簇的邊界
    • 接近 - 1 表示樣本可能被分到錯誤的簇

    選擇輪廓系數最高的 K 值作為最佳聚類數量。

    K-Means 的改進算法

    由于基本 K-Means 存在一些局限性,研究者提出了多種改進算法:

    • K-Means++:改進了初始質心的選擇方法,使質心盡可能遠離,提高聚類效果
    • Mini-Batch K-Means:對大數據集更高效,使用部分樣本計算質心
    • Bisecting K-Means:層次化聚類方法,通過不斷二分簇來構建聚類結果
    • Kernel K-Means:利用核函數將數據映射到高維空間,能夠處理非凸形狀的簇

    在 scikit-learn 中,KMeans類默認使用n_init='auto'參數,會根據數據情況自動選擇合適的初始質心數量,實際上已經包含了 K-Means++ 的改進。

    總結

    K-Means 聚類是一種簡單而強大的無監督學習算法,能夠有效地發現數據中的自然分組。盡管它存在需要預先指定 K 值、對初始質心敏感等局限性,但通過合理選擇參數和結合其他評估方法,K-Means 仍然是數據分析和挖掘中的重要工具。

    在實際應用中,建議:

    1. 對數據進行標準化處理,消除量綱影響
    2. 結合多種方法確定最佳 K 值
    3. 多次運行算法,避免因初始質心選擇不當導致的局部最優
    4. 可視化聚類結果,直觀理解數據結構

    二.案例實現(酒類數據聚類)

    1.K-Means參數

    源碼如下

    • n_clusters:指定聚類中心數量(K值)。
    • init:初始化質心方法(默認?k-means++,優于隨機初始化)。
    • n_init:初始化質心的次數(默認10次,避免因初始質心選擇不佳影響結果)。
    • max_iter:單次K-Means算法的最大迭代次數(默認300)。

    2.讀取數據

    數據特征:卡路里、氮濃度、酒精濃度、價格。data.txt部分內容如下:

    第一列的name與訓練無關不要讀取

    import pandas as pd
    import numpy as np
    beer = pd.read_table('data.txt',sep=' ')#注意sep劃分數據
    X=beer.iloc[:,1:]

    2.遍歷K值,計算輪廓系數選擇最優K(本例K=2最佳)。

    from sklearn.cluster import KMeans
    from sklearn import metrics
    scores=[]
    k=range(2,10)
    for i in k:km=KMeans(n_clusters=i)km.fit(X)labels=km.labels_score=metrics.silhouette_score(X,labels)scores.append(score)
    best_k=k[np.argmax(scores)]
    print('best_k=',best_k)

    3.訓練模型并輸出聚類標簽。

    km=KMeans(n_clusters=best_k)
    km.fit(X)
    labels=km.labels_
    beer['cluster']=labels
    beer.sort_values('cluster',inplace=True)
    print('輪廓系數: ',metrics.silhouette_score(beer.iloc[:,1:5],beer.cluster))

    4.完整代碼

    import pandas as pd
    import numpy as np
    beer = pd.read_table('data.txt',sep=' ')#注意sep劃分數據
    X=beer.iloc[:,1:]from sklearn.cluster import KMeans
    from sklearn import metrics
    scores=[]
    k=range(2,10)
    for i in k:km=KMeans(n_clusters=i)km.fit(X)labels=km.labels_score=metrics.silhouette_score(X,labels)scores.append(score)
    best_k=k[np.argmax(scores)]
    print('best_k=',best_k)
    km=KMeans(n_clusters=best_k)
    km.fit(X)
    labels=km.labels_
    beer['cluster']=labels
    beer.sort_values('cluster',inplace=True)
    print('輪廓系數: ',metrics.silhouette_score(beer.iloc[:,1:5],beer.cluster))

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/918357.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/918357.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/918357.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    RabbitMQ面試精講 Day 16:生產者優化策略與實踐

    【RabbitMQ面試精講 Day 16】生產者優化策略與實踐 開篇 歡迎來到"RabbitMQ面試精講"系列第16天,今天我們聚焦RabbitMQ生產者優化策略與實踐。在消息隊列系統中,生產者的性能表現直接影響整個系統的吞吐量和可靠性。掌握生產者優化技巧不僅能…

    Android 系統的安全 和 三星安全的區別

    維度Android(AOSP 通用)Samsung(Knox 強化)本質差異一句話信任根標準 Verified Boot(公鑰由谷歌或 OEM 托管)額外在 自家 SoC 里燒錄 Knox 密鑰 熔絲位,一旦解鎖即觸發 Knox 0x1 熔斷&#xff…

    開源大模型實戰:GPT-OSS本地部署與全面測評

    文章目錄一、引言二、安裝Ollama三、Linux部署GPT-OSS-20B模型四、模型測試4.1 AI幻覺檢測題題目1:虛假歷史事件題目2:不存在的科學概念題目3:虛構的地理信息題目4:錯誤的數學常識題目5:虛假的生物學事實4.2 算法題測試…

    【無標題】命名管道(Named Pipe)是一種在操作系統中用于**進程間通信(IPC)** 的機制

    命名管道(Named Pipe)是一種在操作系統中用于進程間通信(IPC) 的機制,它允許不相關的進程(甚至不同用戶的進程)通過一個可見的文件系統路徑進行數據交換。與匿名管道(僅存在于內存&a…

    Baumer相機如何通過YoloV8深度學習模型實現危險區域人員的實時檢測識別(C#代碼UI界面版)

    《------往期經典推薦------》 AI應用軟件開發實戰專欄【鏈接】 序號 項目名稱 項目名稱 1 1.工業相機 + YOLOv8 實現人物檢測識別:(C#代碼,UI界面版) 2.工業相機 + YOLOv8 實現PCB的缺陷檢測:(C#代碼,UI界面版) 2 3.工業相機 + YOLOv8 實現動物分類識別:(C#代碼,U…

    本文章分享一個本地錄音和實時傳輸錄音給app的功能(杰理)

    我用的是杰理手表sdk,該功能學會就可自行在任何杰里sdk上做,庫函數大致一樣,學會運用這個方向就好。1.我們要驗證這個喇叭和麥是否正常最簡單的的辦法,就是直接萬用表測試,直接接正負極,看看是否通路&#…

    Netty-Rest搭建筆記

    0.相關知識Component、Repository、ServiceRepository //Scope設置bean的作用范圍 Scope("singleton")//單例 prototype每次創建都會給一個新實例。 public class BookDaoImpl implements BookDao { //生命周期public void save() {System.out.println("book d…

    工作筆記-----lwip網絡任務初始化問題排查

    工作筆記-----基于FreeRTOS的lwIP網絡任務初始化問題排查 Author:明月清了個風Date: 2025/8/10PS:新項目中在STMF7開發板上基于freeRTOS和lwIP開發網口相關任務,開發過程中遇到了網口無法連接的問題,進行了一系列的排查…

    Kotlin動態代理池+無頭瀏覽器協程化實戰

    我看到了很多作者展示了Kotlin在爬蟲領域的各種高級用法。我需要從中提取出最"牛叉"的操作,也就是那些充分利用Kotlin語言特性,使爬蟲開發更高效、更強大的技巧。 我準備用幾個主要部分來組織內容,每個部分會突出Kotlin特有的"…

    PDF編輯工具,免費OCR識別表單

    軟件介紹 今天推薦一款功能全面的PDF編輯工具——PDF XChange Editor,支持文本、圖片編輯及OCR識別,還能一鍵提取表單信息,滿足多樣化PDF處理需求。 軟件優勢 該軟件完全免費,下載后雙擊圖標即可直接運行,無需安裝&…

    OpenEnler等Linux系統中安裝git工具的方法

    在歐拉系統中安裝 Git使用 yum 包管理器安裝(推薦,適用于歐拉等基于 RPM 的系統):# 切換到 root 用戶(若當前不是) su - root# 安裝 Git yum install -y git驗證安裝是否成功:git --version若輸…

    UE5 第三人稱視角如何設置camera移動旋轉

    “奇怪,這blog不支持md格式嗎”## 第1步:設置玩家Pawn 創建一個藍圖類,繼承自 Pawn,在游戲模式(Game Mode)中,將這個Pawn設置為默認 在組件面板中,添加一個 Spring Arm 組件 在組件面…

    OpenCV 入門教程:開啟計算機視覺之旅

    目錄 一、引言? 二、OpenCV 簡介 ?(一)什么是 OpenCV (二)OpenCV 的特點與優勢 (三)OpenCV 的應用領域 三、環境搭建 (一)安裝 OpenCV 庫? 四、OpenCV 基礎操作 &#xf…

    C++高頻知識點(十九)

    文章目錄91. TCP斷開連接的時候為什么必須4次而不是3次?92. 為什么要區分用戶態和內核態?93. 說說編寫socket套接字的步驟1. 服務器端編寫步驟1.1 創建套接字1.2 綁定套接字1.3 監聽連接1.4 接受連接1.5 數據傳輸1.6 關閉套接字2. 客戶端編寫步驟2.1 創建…

    一個基于 epoll 實現的多路復用 TCP 服務器程序,相比 select 和 poll 具有更高的效率

    /*5 - 使用epoll實現多路復用 */ #include <stdio.h> // 標準輸入輸出函數庫 #include <stdlib.h> // 標準庫函數&#xff0c;包含exit等 #include <string.h> // 字符串處理函數 #include <unistd.h> // Unix標準函…

    元數據管理與數據治理平臺:Apache Atlas 通知和業務元數據 Notifications And Business Metadata

    文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。Apache Atlas 框架是一套可擴展的核心基礎治理服務&#xff0c;使企業能夠有效、高效地滿足 Hadoop 中的合規性要求&#xff0c;并支持與整個企…

    rem:CSS中的相對長度單位

    &#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

    【10】C#實戰篇——C# 調用 C++ dll(C++ 導出函數、C++導出類)

    文章目錄1 導出C 類函數 、導出 C函數1.1 .h文件1.2 .cpp 文件1.3 C# 調用2 C與C#數據類型對應3 保姆級教程&#xff08;項目搭建、代碼、調用&#xff0c;圖文并茂&#xff09;1 導出C 類函數 、導出 C函數 C 生成動態庫.dll 詳細教程&#xff1a; C 生成動態庫.dll 及 C調用…

    Flutter 與 Android NDK 集成實戰:實現高性能原生功能

    Flutter 與 NDK 集成實現 Flutter 可以通過 Platform Channels 與原生代碼&#xff08;包括使用 NDK 編寫的 C/C 代碼&#xff09;進行交互。以下是實現 Flutter 與 NDK 集成的步驟&#xff1a; 基本步驟 1. 創建 Flutter 項目 flutter create flutter_ndk_example cd flutter_…

    elementui cascader 遠程加載請求使用 選擇單項等

    背景&#xff1a;小程序與后端使用自定義表單渲染視圖。發現若沒有全選&#xff08;如&#xff1a;省市縣全部選擇&#xff0c;指定的市3級&#xff09;在pc端就會無法渲染出已經選擇的區縣名稱。 解決方案&#xff1a;參考官方文檔&#xff0c;設置屬性可獨立勾選element ui c…