KMeans 算法深度解析:從原理到實戰

一、算法概述:無監督學習的聚類利器?

在機器學習的無監督學習領域,聚類算法是探索數據內在結構的重要工具。KMeans 算法作為劃分式聚類的代表,因其簡單高效的特性,成為數據科學家工具箱中的必備技能。該算法通過將 n 個數據點劃分為 k 個簇,使得每個數據點屬于離其最近的均值(簇中心)所在的簇,最終實現 "物以類聚" 的效果。?

核心目標函數?

KMeans 的核心是最小化簇內平方和(Within-Cluster Sum of Squares, WCSS),數學表達式為:?

J(c,μ)=i=1∑k?x∈Ci?∑?∥x?μi?∥2

其中:?

  • ?k是預設的簇數量?
  • ?Ci?是第 i 個簇的樣本集合?
  • ?μi?是第 i 個簇的質心(均值向量)?
  • ?c(x)表示樣本 x 所屬的簇索引?

這個目標函數本質上是尋找 k 個質心,使得所有樣本到其所屬質心的歐氏距離平方和最小。?

二、算法原理:三步迭代優化過程?

1. 初始化聚類中心(關鍵第一步)?

傳統隨機初始化?

最直接的方法是從數據集中隨機選取 k 個樣本作為初始質心。但這種方法存在明顯缺陷:?

  • 可能陷入局部最優(如圖 1 所示,不同初始化導致不同聚類結果)?
  • 極端情況下可能產生空簇(當 k > 樣本量時)?

KMeans++ 優化初始化(工業級方案)?

步驟如下:?

  1. 隨機選擇第一個質心?μ1?對于每個樣本 x,計算其到最近已選質心的距離?D(x)2?以?D(x)2作為權重,隨機選擇下一個質心,重復直到選滿 k 個?

優點:保證初始質心盡可能分散,提升算法收斂質量,減少局部最優影響。?

2. 分配樣本到最近質心(硬聚類過程)?

對于每個樣本點?xj?,計算其與所有質心?μi?的歐氏距離:??

cj?=argi=1..kmin?∥xj??μi?∥2

將樣本分配到距離最小的簇,形成當前劃分?{C1?,C2?,...,Ck?}。?

3. 重新計算簇質心(更新迭代中心)?

對每個簇?Ci?,計算所有樣本的均值作為新質心:?

?μi(t+1)?=∣Ci?∣1?x∈Ci?∑?x?

重復步驟 2-3,直到質心不再變化或達到最大迭代次數。?

收斂條件?算法終止的兩種情況:?

  1. 質心位置穩定:?μi(t+1)?=μi(t)?對所有 i 成立
  2. ?目標函數收斂:?∣J(t+1)?J(t)∣<?(預設極小值)?

三、算法特性:優勢與局限性分析?

顯著優勢?

  1. 計算效率高:時間復雜度為?

    O(nkt),適用于中等規模數據集(n≤10^5)?

  1. 實現簡單:核心步驟僅包含距離計算和均值求解,易于工程實現?
  1. 幾何意義明確:基于歐氏距離的劃分方式符合直觀幾何理解?

主要局限性?

  1. K 值需預先指定:實際應用中缺乏客觀的 K 值確定方法(需結合業務經驗或肘部法則)?
  1. 對初始質心敏感:不同初始化可能導致差異較大的聚類結果(需 KMeans++ 等技術優化)?
  1. 對非凸數據不友好:適用于球形簇,對環形、月牙形等非凸分布效果不佳(如圖 2 所示)?
  1. 對噪聲敏感:離群點會顯著影響簇質心計算(可結合離群點檢測預處理)?

四、工程實現:從手動編碼到 Scikit-learn 實戰?

手動實現簡化版(Python)?

?

TypeScript

取消自動換行復制

import numpy as np?

?

class SimpleKMeans:?

def __init__(self, n_clusters=2, max_iter=100, random_state=42):?

self.k = n_clusters?

self.max_iter = max_iter?

self.centers = None?

?

def fit(self, X):?

# 初始化質心(隨機選擇k個樣本)?

np.random.seed(self.random_state)?

idx = np.random.choice(len(X), self.k, replace=False)?

self.centers = X[idx]?

?

for _ in range(self.max_iter):?

# 分配樣本?

distances = np.linalg.norm(X[:, None] - self.centers, axis=2)?

labels = np.argmin(distances, axis=1)?

?

# 更新質心?

new_centers = np.array([X[labels==i].mean(axis=0) for i in range(self.k)])?

?

# 檢查收斂?

if np.allclose(self.centers, new_centers):?

break?

self.centers = new_centers?

return self?

?

def predict(self, X):?

distances = np.linalg.norm(X[:, None] - self.centers, axis=2)?

return np.argmin(distances, axis=1)?

?

Scikit-learn 專業實現?

?

TypeScript

取消自動換行復制

from sklearn.datasets import make_blobs?

from sklearn.cluster import KMeans?

import matplotlib.pyplot as plt?

?

# 生成模擬數據?

X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)?

?

# 模型訓練?

kmeans = KMeans(n_clusters=4, init='k-means++', n_init=10, max_iter=300, random_state=0)?

y_pred = kmeans.fit_predict(X)?

?

# 結果可視化?

plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', edgecolors='k')?

plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', marker='x', label='Centers')?

plt.legend()?

plt.title("KMeans Clustering Result")?

plt.show()?

?

關鍵參數解析?

?

參數名?

含義?

推薦值?

init?

初始化方法?

'k-means++'(默認)?

n_init?

重復初始化次數?

10(默認,自動選擇最優結果)?

max_iter?

單次運行最大迭代數?

300(默認)?

tol?

收斂閾值?

1e-4(默認)?

n_clusters?

簇數量?

需業務 / 技術手段確定?

?

五、進階技巧:提升聚類效果的關鍵方法?

1. 確定最佳 K 值?

肘部法則(Elbow Method)?

繪制 WCSS 隨 K 值變化曲線,選擇曲線拐點(如圖 3 所示)。缺點:拐點不明顯時難以判斷。?

?

TypeScript

取消自動換行復制

from sklearn.metrics import pairwise_distances_argmin?

wcss = []?

for k in range(1, 11):?

kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42)?

kmeans.fit(X)?

wcss.append(kmeans.inertia_) # inertia_即WCSS?

plt.plot(range(1, 11), wcss, marker='o')?

plt.title('Elbow Method')?

plt.xlabel('Number of clusters')?

plt.ylabel('WCSS')?

plt.show()?

?

輪廓系數(Silhouette Score)?

計算樣本 i 的輪廓系數:??

s(i)=max(a(i),b(i))b(i)?a(i)?

其中:?

  • ?

    a(i):樣本 i 到同簇其他樣本的平均距離?

  • ?

    b(i):樣本 i 到最近異簇樣本的平均距離?

取值范圍 [-1,1],越接近 1 表示聚類效果越好。?

?

TypeScript

取消自動換行復制

from sklearn.metrics import silhouette_score?

silhouette_scores = []?

for k in range(2, 11):?

kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42)?

labels = kmeans.fit_predict(X)?

silhouette_scores.append(silhouette_score(X, labels))?

plt.plot(range(2, 11), silhouette_scores, marker='o')?

plt.title('Silhouette Score Analysis')?

plt.xlabel('Number of clusters')?

plt.ylabel('Silhouette Score')?

plt.show()?

?

2. 處理非球形數據?

當數據分布為非凸形狀時,可采用:?

  • 核 KMeans(引入核函數將數據映射到高維空間)?
  • DBSCAN 等密度聚類算法(適用于任意形狀簇)?

3. 大規模數據優化?

MiniBatchKMeans?

通過隨機選取樣本子集(mini-batch)計算質心,降低每次迭代計算量,適用于 n>10^5 的場景:?

?

TypeScript

取消自動換行復制

from sklearn.cluster import MiniBatchKMeans?

mbk = MiniBatchKMeans(n_clusters=4, batch_size=100, random_state=0)?

mbk.fit(X)?

?

分布式實現?

利用 MapReduce 框架并行計算距離矩陣,常見于 Spark MLlib 的 KMeans 實現。?

六、應用場景:數據驅動的業務實踐?

1. 客戶分群分析?

通過用戶行為數據(消費頻率、客單價、互動時長等)劃分客戶群體,實現精準營銷:?

  • 高價值客戶(重點維護)?
  • 潛力客戶(定向激勵)?
  • 沉睡客戶(喚醒活動)?

2. 圖像分割處理?

將像素點的 RGB 值作為特征進行聚類,實現圖像壓縮與目標分割(如圖 4 所示,左圖為原始圖像,右圖為 4 簇聚類結果)。?

3. 異常檢測?

將正常樣本聚類后,遠離所有簇中心的樣本視為異常點(需結合業務閾值調整)。?

4. 文本聚類?

對文檔詞向量進行聚類,實現新聞分類、主題發現等(需配合 TF-IDF 或 Word2Vec 等特征工程)。?

七、總結與拓展?

KMeans 算法作為聚類分析的入門級算法,雖有一定局限性,但通過合理的初始化方法(KMeans++)、科學的 K 值選擇(肘部法則 + 輪廓系數)和針對性優化(MiniBatch),能夠在多數實際場景中發揮重要作用。對于復雜數據分布,建議結合層次聚類、密度聚類等算法進行對比分析。?

拓展學習資源?

  1. 算法原理論文:《A comparison of the K-means algorithm and the fuzzy ISODATA algorithm》?
  1. Scikit-learn 官方文檔:KMeans?
  1. 可視化工具:D3.js KMeans 演示?

掌握 KMeans 算法不僅是理解無監督學習的重要起點,更能為深入學習 DBSCAN、層次聚類、高斯混合模型等高級聚類算法打下堅實基礎。在實際應用中,結合領域知識進行特征工程和結果解讀,才能讓算法真正發揮數據洞察的價值。

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

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

相關文章

Chrome 瀏覽器前端與客戶端雙向通信實戰

Chrome 前端&#xff08;即頁面 JS / Web UI&#xff09;與客戶端&#xff08;C 后端&#xff09;的交互機制&#xff0c;是 Chromium 架構中非常核心的一環。下面我將按常見場景&#xff0c;從通道、流程、技術棧幾個角度做一套完整的分析&#xff0c;特別適合你這種在分析和改…

Server2003 B-1 Windows操作系統滲透

任務環境說明&#xff1a; 服務器場景&#xff1a;Server2003&#xff08;開放鏈接&#xff09; 服務器場景操作系統&#xff1a;Windows7 1.通過本地PC中滲透測試平臺Kali對服務器場景Windows進行系統服務及版本掃描滲透測試&#xff0c;并將該操作顯示結果中Telnet服務對應的…

滲透實戰PortSwigger靶場:lab13存儲型DOM XSS詳解

進來是需要留言的&#xff0c;先用做簡單的 html 標簽測試 發現面的</h1>不見了 數據包中找到了一個loadCommentsWithVulnerableEscapeHtml.js 他是把用戶輸入的<>進行 html 編碼&#xff0c;輸入的<>當成字符串處理回顯到頁面中&#xff0c;看來只是把用戶輸…

使用React+ant Table 實現 表格無限循環滾動播放

數據大屏表格數據&#xff0c;當表格內容超出&#xff08;出現滾動條&#xff09;時&#xff0c;無限循環滾動播放&#xff0c;鼠標移入暫停滾動&#xff0c;鼠標移除繼續滾動&#xff1b;數據量小沒有超出時不需要滾動。 *使用時應注意&#xff0c;滾動區域高度父元素高度 - 表…

機器人現可完全破解驗證碼:未來安全技術何去何從?

引言 隨著計算機視覺技術的飛速發展&#xff0c;機器學習模型現已能夠100%可靠地解決Google的視覺reCAPTCHAv2驗證碼。這標志著一個時代的結束——自2000年代初以來&#xff0c;CAPTCHA&#xff08;"全自動區分計算機與人類的圖靈測試"的縮寫&#xff09;一直是區分…

大模型安全測試報告:千問、GPT 全系列、豆包、Claude 表現優異,DeepSeek、Grok-3 與 Kimi 存在安全隱患

大模型安全測試報告&#xff1a;千問、GPT 全系列、豆包、Claude 表現優異&#xff0c;DeepSeek、Grok-3 與 Kimi 存在安全隱患 引言 隨著生成式人工智能技術的快速演進&#xff0c;大語言模型&#xff08;LLM&#xff09;正在廣泛應用于企業服務、政務系統、教育平臺、金融風…

docker 部署redis集群 配置

docker的網絡模式 網橋模式每次重啟容器都有可能導致容器ip地址變化&#xff0c;需要固定ip的自己自定義網絡&#xff0c;這里介紹的是默認網絡模式 docker創建容器 docker run --name redis6379 -p 6379:6379 -p 16379:16379 -v /etc/redis/redis6379:/etc/redis -d --r…

LabVIEW的AMC架構解析

此LabVIEW 程序基于消息隊列&#xff08;Message Queue&#xff09;機制構建 AMC 架構&#xff0c;核心包含消息生成&#xff08;MessageGenerator &#xff09;與消息處理&#xff08;Message Processor &#xff09;兩大循環&#xff0c;通過隊列傳遞事件與指令&#xff0c;實…

數據庫管理與高可用-MySQL主從復制與讀寫分離

目錄 #1.1MySQL主從復制原理 1.1.1MySQL支持的復制類型 1.1.2復制的工作過程 #2.1MySQL讀寫分離原理 2.1.1常見的MySQL讀寫分離為為兩種 #3.1主從復制讀寫分離的實驗案例 1.1MySQL主從復制的原理 MySQL 主從復制是一種常用的數據同步機制&#xff0c;用于將主數據庫&#xf…

Python60日基礎學習打卡Day45

之前的神經網絡訓練中&#xff0c;為了幫助理解借用了很多的組件&#xff0c;比如訓練進度條、可視化的loss下降曲線、權重分布圖&#xff0c;運行結束后還可以查看單張圖的推理效果。 如果現在有一個交互工具可以很簡單的通過按鈕完成這些輔助功能那就好了&#xff0c;他就是…

React項目的狀態管理:Redux Toolkit

目錄 1、搭建環境 2、Redux Toolkit 包含了什么 3、使用示例 &#xff08;1&#xff09;創建user切片 &#xff08;2&#xff09;合并切片得到store &#xff08;3&#xff09;配置store和使用store 使用js來編寫代碼&#xff0c;方便理解一些 1、搭建環境 首先&#xf…

父組件prop傳向子組件的值,被子組件直接v-model綁定 功能不生效

隱式修改組件屬性會導致功能異常 實際操作中發現&#xff0c;即便是父組件把簡單數據通過prop傳給了子組件&#xff0c;子組件再使用v-model綁定&#xff0c;也不行&#xff0c;響應式還是對異常 原vue2業務中存在組件定義某個類型為Object的屬性&#xff0c;然后將該屬性對象…

c#bitconverter操作,不同變量類型轉byte數組

緣起:串口數據傳輸的基礎是byte數組&#xff0c;write(buff,0,num)或者writeline(string)&#xff0c;如果是字符串傳輸就是string變量就可以了&#xff0c;但是在modbus這類hex傳遞時&#xff0c;就要遇到轉換了&#xff0c;拼湊byte數組時需要各種變量的值傳遞&#xff0c;解…

【Redis】set 類型

set 一. set 類型介紹二. set 命令sadd、smembers、sismemberscard、spop、srandmembersmove、srem集合間操作交集&#xff1a;sinter、sinterstore并集&#xff1a;sunion、sunionstore差集&#xff1a;sdiff、sdiffstore 三. set 命令小結四. set 內部編碼方式五. set 使用場…

02-Redis常見命令

02-Redis常見命令 Redis數據結構介紹 Redis是一個key-value的數據庫&#xff0c;key一般是String類型&#xff0c;不過value的類型多種多樣&#xff1a; 貼心小建議&#xff1a;命令不要死記&#xff0c;學會查詢就好啦 Redis為了方便學習&#xff0c;將操作不同數據類型的命…

Rk3568驅動開發_GPIO點亮LED_12

需求&#xff1a; 用配置寄存器方式控制點燈非常原始&#xff0c;現在采用更方便的Linux提供的pctrl和gpio子系統編寫字符驅動 1.設備樹配置&#xff1a; 現將開發板中呼吸燈關閉掉防止占用到我需要使用的引腳 /* Narnat 2025-5-29 RK3568 GPIO 無需設置pinctrl*/gpioled{co…

阿里云ACP云計算備考筆記 (3)——云存儲RDS

目錄 第一章 云存儲概覽 1、云存儲通用知識 ① 發展歷史 ② 云存儲的優勢 2、云存儲分類 3、文件存儲業務場景 第二章 塊存儲 1、塊存儲分類 2、云盤的優勢 3、創建云盤 4、管理數據盤 ① 格式化數據盤 ② 掛載數據盤 ③ 通過 API 掛載云盤 5、管理系統盤 ① 更…

亞矩陣云手機實測體驗:穩定流暢背后的技術邏輯?

最近在測試一款云手機服務時&#xff0c;發現亞矩陣的表現出乎意料地穩定。作為一個經常需要多設備協作的開發者&#xff0c;我對云手機的性能、延遲和穩定性要求比較高。經過一段時間的體驗&#xff0c;分享一下真實感受&#xff0c;避免大家踩坑。 ??1. 云手機能解決什么問…

STM32H562----------ADC外設詳解

1、ADC 簡介 STM32H5xx 系列有 2 個 ADC,都可以獨立工作,其中 ADC1 和 ADC2 還可以組成雙模式(提高采樣率)。每個 ADC 最多可以有 20 個復用通道。這些 ADC 外設與 AHB 總線相連。 STM32H5xx 的 ADC 模塊主要有如下幾個特性: 1、可配置 12 位、10 位、8 位、6 位分辨率,…

【Android】雙指旋轉手勢

一&#xff0c;概述 本文參考android.view.ScaleGestureDetector&#xff0c;對雙指旋轉手勢做了一層封裝&#xff0c;采用了向量計算法簡單實現&#xff0c;筆者在此分享下。 二&#xff0c;實例 如下&#xff0c;使用RotateGestureDetector即可委托&#xff0c;實現旋轉手…