【字節跳動】數據挖掘面試題0007:Kmeans原理,何時停止迭代

文章大綱

      • K-means 原理與迭代停止條件
      • ?? 一、K-Means核心思想
      • 🔁 二、迭代步驟詳解
        • 關鍵數學操作
      • ?? 三、何時停止迭代?
        • Kmeans 算法實現代碼
      • ?? 四、面試常見擴展問題
        • 1. K值如何選擇?
        • 2. 初始質心影響結果嗎?
        • 3. 算法缺陷與改進
      • 💎 五、總結與面試回答要點

K-means 原理與迭代停止條件

以下是針對數據挖掘面試題中K-Means原理及迭代停止條件的清晰解析,結合算法本質與面試考點整理,便于你快速掌握核心要點。


?? 一、K-Means核心思想

K-Means是無監督聚類算法,目標是將n個數據點劃分為k個簇(cluster),使得簇內距離最小化,簇間距離最大化。其迭代過程是EM(Expectation-Maximization)算法的特例,分兩步交替進行:

    1. E步(分配點):固定質心,將每個點分配到最近的質心所屬簇。
    1. M步(更新質心):固定簇分配,根據簇內點重新計算質心位置。

💡 通俗比喻
假設有k個班主任(質心)在教室隨機站位,學生(數據點)選擇最近的班主任排隊。
班主任隨后走到隊伍中心點,學生重新排隊。重復此過程直到班主任不再移動。
在這里插入圖片描述


🔁 二、迭代步驟詳解

以下流程圖展示單次迭代過程:
在這里插入圖片描述

關鍵數學操作
  • 距離計算:常用歐式距離 ∥ x i ? μ j ∥ 2 \|x_i - \mu_j\|^2 xi??μj?2,決定點所屬簇。
  • 質心更新:質心 μ j \mu_j μj? = 1 ∣ C j ∣ ∑ x i ∈ C j x i \frac{1}{|C_j|} \sum_{x_i \in C_j} x_i Cj?1?xi?Cj??xi?,即簇內所有點的均值。

?? 三、何時停止迭代?

停止條件決定算法收斂時機,常見以下四類

停止條件類型判斷標準應用場景代碼參數示例
1. 質心變化量≤閾值新舊質心距離 < ε(如 ε=1e-4)精確收斂要求高時tol=0.0001
2. 簇分配不再變化無點改變所屬簇需穩定分類結果時無顯式參數,自動檢測
3. 目標函數收斂SSE(簇內平方和)下降量 < δ(如 δ=0.01)關注聚類質量優化時通過SSE監控
4. 達到最大迭代次數迭代次數 ≥ max_iter(如 300)防止無限循環/耗時敏感場景max_iter=100
  • Kmeans 算法停止迭代的條件通常有以下幾種:
    • 質心不再變化:新計算的質心與上一次的質心完全相同(或差異小于某個極小閾值),說明聚類已經收斂。
    • 達到最大迭代次數:設置一個最大迭代次數(如 100 次),避免算法陷入無限循環。
    • 簇分配不再變化:所有數據點的簇分配在兩次迭代之間沒有改變。

📌 注意

  • 條件1~3滿足任一即停止,條件4是 強制終止 的保底策略
  • 條件1與2不等價:質心微小移動可能不引起重新分配,但SSE仍在優化。
Kmeans 算法實現代碼
import numpy as np
import matplotlib.pyplot as pltdef kmeans(X, K, max_iterations=100):"""K-means聚類算法實現參數:X: 輸入數據,形狀為(n_samples, n_features)K: 聚類的數量max_iterations: 最大迭代次數返回:centroids: 最終的質心坐標,形狀為(K, n_features)labels: 每個數據點的聚類標簽,形狀為(n_samples,)"""# 1. 隨機初始化質心:從輸入數據中隨機選擇K個點作為初始質心# replace=False# 表示抽樣時不允許重復選擇同一個元素,確保每次選擇的索引都是唯一的。centroids = X[np.random.choice(len(X), K, replace=False)]for iteration in range(max_iterations):# 2. 分配數據點到最近的質心# 計算每個數據點到每個質心的歐氏距離# np.linalg.norm:計算向量的范數(默認是歐氏范數,即平方和開根號)distances = np.array([np.linalg.norm(X - centroid, axis=1) for centroid in centroids])# 為每個數據點分配最近質心的索引作為聚類標簽# NumPy 中用于查找數組中最小值索引的函數調用,在 Kmeans 算法中用于將每個數據點分配到最近的質心。labels = np.argmin(distances, axis=0)# 3. 更新質心:計算每個簇內所有點的平均值作為新質心new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])# 檢查停止條件:如果新舊質心之間的差異小于閾值,則認為算法收斂# np.allclose(centroids, new_centroids) 是 NumPy 中用于比較兩個數組是否幾乎相等的函數,在 Kmeans 算法中用于判斷聚類是否收斂。if np.allclose(centroids, new_centroids):print(f"Converged after {iteration+1} iterations")breakcentroids = new_centroidsreturn centroids, labels# 生成示例數據:創建3個不同的高斯分布數據集
np.random.seed(42)  # 設置隨機種子,確保結果可重現
X = np.vstack([np.random.normal([0, 0], 1, size=(100, 2)),    # 第一個簇:均值[0,0],標準差1np.random.normal([5, 5], 1, size=(100, 2)),    # 第二個簇:均值[5,5],標準差1np.random.normal([10, 0], 1, size=(100, 2))    # 第三個簇:均值[10,0],標準差1
])# 運行Kmeans算法,將數據聚為3類
K = 3
centroids, labels = kmeans(X, K)# 可視化聚類結果
plt.figure(figsize=(8, 6))
# 繪制數據點,使用不同顏色表示不同的簇
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6)
# 繪制最終的質心位置,使用紅色X標記
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, marker='X')
plt.title('Kmeans Clustering Results')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

在這里插入圖片描述

在這里插入圖片描述


?? 四、面試常見擴展問題

1. K值如何選擇?
  • 肘部法則(Elbow Method):繪制K-SSE曲線,選SSE驟降點。
  • 輪廓系數(Silhouette Score):衡量簇內緊密度與簇間分離度,接近1表示聚類合理。
2. 初始質心影響結果嗎?
  • 隨機初始化可能導致局部最優。
  • 改進方案:K-Means++,通過概率分布選擇分散的初始質心。
3. 算法缺陷與改進
  • 缺陷對異常值敏感、假設簇為球形分布、依賴K值預設
  • 改進
    • 異常值處理:離群點檢測(如DBSCAN)
    • 非球形簇:譜聚類或核K-Means。

💎 五、總結與面試回答要點

  • 原理EM框架下的交替優化(分配點 → 更新質心)
  • 停止條件質心穩定/簇分配不變/SSE收斂/達到最大迭代次數
  • 考點延伸
    • 結合RFM模型解釋K-Means應用(用戶分層場景)。
    • 時間復雜度: O ( K ? n ? d ) O(K \cdot n \cdot d) O(K?n?d)(n樣本數,d特征數,K簇數)。

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

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

相關文章

209、長度最小的子數組

題目&#xff1a; 解答&#xff1a; 滑動窗口&#xff0c;左右指針指向窗口兩端&#xff0c;窗口為[left,right]&#xff0c;leftright時窗口只包含一個元素。 窗口內元素和sum>target時&#xff0c;left,推出左側一個元素;sum<target時&#xff0c;right&#xff0c;加…

關機精靈——自動化與便利性

文章目錄 背景目標實現下載 背景 自動化與便利性&#xff1a; 讓電腦在用戶無需值守或干預的情況下&#xff0c;在特定時間點&#xff08;倒計時結束&#xff09;或任務完成后自動關閉。節能與環保&#xff1a; 避免電腦在完成工作后或無人使用時繼續空耗電力。時間管理與健康…

L2CAP協議詳解:分段重組、QoS控制與多協議復用設計(面試寶典)

本文系統解析L2CAP協議的知識圖譜&#xff0c;掌握面試核心考點&#xff0c;并通過真題演練提升實戰能力。建議配合協議分析工具進行抓包實踐&#xff0c;加深對協議機制的理解。 一、L2CAP 在藍牙協議棧中的核心定位 L2CAP&#xff08;Logical Link Control and Adaptation P…

微軟服務器安全問題

微軟云服務器安全深度解析&#xff1a;挑戰、應對與未來展望——構建韌性“安全之盾”的持續博弈&#xff01; 在當今數字化時代&#xff0c;云計算已成為眾多企業和組織運行業務的核心基礎設施和“數字生命線”&#xff0c;而微軟云&#xff08;Azure&#xff09;作為全球領先…

后臺管理系統的誕生 - 利用AI 1天完成整個后臺管理系統的微服務后端+前端

AI創作系列(11)&#xff1a;后臺管理系統的誕生 - 利用AI 1天完成整個后臺管理系統的微服務后端前端 真實記錄&#xff1a;我決定為海貍IM添加一個后臺管理系統。從早上開始&#xff0c;到晚上結束&#xff0c;僅僅1天時間&#xff0c;我就完成了整個后臺管理系統的微服務后端和…

開發自動駕駛系統所需工具

硬件開發平臺 傳感器系統 環境感知工具包括&#xff1a; 激光雷達&#xff1a;通過發射激光脈沖并接收反射光來測量距離&#xff0c;構建點云數據以描繪周圍環境的三維結構。例如&#xff0c;Velodyne的VLP-16激光雷達每秒可發射約30萬次激光脈沖&#xff0c;生成高密度的點…

Node.js特訓專欄-實戰進階:12. 數據庫事務處理與并發控制

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 數據庫事務處理與并發控制:原理、實踐與性能優化 一、事務基礎:ACID特性與實現原理 1.1 ACID特性詳解 事…

計算機網絡(五)數據鏈路層 MAC和ARP協議

目錄一、鏈路二、MAC地址三、ARP協議ARP工作流程?&#xff1a;?一、鏈路鏈路&#xff1a;一個結點到相鄰結點的物理線路數據鏈路&#xff1a;在鏈路的基礎上增加一些必要的軟件&#xff08;協議的實現&#xff09;和硬件&#xff08;網絡適配器&#xff09;。網絡中的主機、路…

DVWA SQL Injection 漏洞分析與利用

前言 Level: Low 漏洞分析 復現步驟 防御措施 Level: Medium 漏洞分析 mysql_real_escape_string()核心作用 示例對比 復現步驟 防御措施 Level: High 漏洞分析 復現步驟 防御措施 Level: Impossible 安全措施分析 防護要點 測試驗證 自動化工具使用&#x…

RabbitMQ:消息隊列的輕量級王者

&#x1f680; 一句話定位 RabbitMQ是分布式系統的"消息快遞員"&#xff0c;負責在系統間可靠傳遞信息&#xff0c;讓服務解耦更高效。 &#x1f31f; 核心應用場景 1. 異步解耦 場景&#xff1a;用戶注冊后發短信/郵件 用法&#xff1a;注冊服務發消息 → Rabbit…

Android系統默認賦予瀏覽器權限以及Android惡意覆蓋導致谷歌瀏覽器授權失敗的解決辦法

Android系統默認賦予瀏覽器權限以及Android惡意覆蓋導致谷歌瀏覽器授權失敗的解決辦法 一、Android系統默認賦予瀏覽器權限 只要是設計到默認賦權&#xff0c;就在framework下找這個類&#xff1a;base/services/core/java/com/android/server/pm/permission/DefaultPermissi…

矩陣的秩 線性代數

定義和求法 關于秩的幾個重要式子 例題 給出秩&#xff0c;那我們就有三個知識點&#xff0c;一個是用定義&#xff0c;一個是用求法&#xff0c;一個是重要式子。 題目沒什么好翻譯的&#xff0c;基本就是赤裸裸的跟你坦白了直說了。 接下來就是解法了。用定義的話就是說這個…

【大模型】基于MCP的mysql 服務構建及使用(python語言)

前言 ? 在之前使用dify來編排AI智能體&#xff0c;有這樣的一個場景&#xff0c;希望智能體能自動讀取數據庫數據&#xff0c;獲得統計數據&#xff08;問數&#xff09;&#xff0c;最終生成報告。 ? 當時實現思路是&#xff0c;通過知識庫告訴大模型相關表的字段定義&…

OA退位,如何打造安全便捷的跨網文件傳輸與即時通訊平臺?

隨著醫院信息化建設深入推進&#xff0c;OA 系統在日常流程審批和文件流轉中扮演著不可或缺的角色。然而&#xff0c;面對“內網?外網”強隔離的安全要求&#xff0c;OA 在跨域傳輸上仍然存在審批延遲、人工干預、病毒風險等痛點。 一、OA 在跨網傳輸中的 “ 最后一公里 ” 難…

LlamaIndex的多輪對話引擎使用說明

一、背景 LlamaIndex提供2種交互引擎&#xff1a;查詢引擎和聊天引擎。&#xff08;詳情請看這里&#xff09;查詢引擎默認沒有上下文信息&#xff0c;也就是說默認是單輪對話。 在RAG系統中&#xff0c;單輪對話/單次查詢的場景較少&#xff0c;而多輪對話則是最常見的場景&…

【CSS-14.1-全局樣式表common.css】構建高效可維護的 common.css:現代前端CSS架構指南

在前端開發中&#xff0c;CSS管理一直是項目可維護性的關鍵挑戰。據統計&#xff0c;約35%的樣式問題源于缺乏統一的CSS架構規范。common.css&#xff08;或稱全局樣式表&#xff09;作為項目的基礎樣式層&#xff0c;能夠有效解決以下問題&#xff1a; 樣式碎片化&#xff1a…

laravel基礎:php artisan make:model Flight --all 詳解

在 Laravel 中執行命令: php artisan make:model Flight --all這個命令會為你創建與模型 Flight 相關的一整套文件結構。Laravel 的 Artisan 命令行工具是一個強大的代碼生成器,可以幫助你快速生成常見的應用組件。我們來詳細解析一下這個命令的各個部分以及它產生的效果。 …

poi java 刪除word的空白頁

開發的時候遇到的問題&#xff0c;特此記錄一下 使用Apache POI&#xff08;Java庫&#xff09;刪除Word文檔中的空白頁時&#xff0c;需針對不同場景處理。以下是具體實現方法和代碼示例&#xff1a; 基礎刪除&#xff08;段落/分頁符&#xff09;? 通過刪除多余段落標記或…

獲取Android應用日志教程

ADB&#xff0c;全稱為Android Debug Bridge&#xff0c;是Android開發中一個重要的命令行工具。它用于與Android設備進行通信&#xff0c;提供了多種功能來幫助開發者進行調試和應用管理。 一、環境準備 1.PC下載附件中的安裝包。 2.在設備上啟用開發者選項和 USB 調試 在安卓…

【Axum】Rust Web 高效構建:Axum 框架從入門到精通指南

目錄 一、環境準備與項目創建1.1 安裝 Rust 工具鏈1.2 創建項目并添加依賴 二、Axum 核心架構解析三、項目結構設計四、核心代碼實現4.1 應用入口 (src/main.rs)4.2 數據模型 (src/models.rs)4.3 路由配置 (src/routes.rs)4.4 認證服務 (src/services/auth.rs)4.5 用戶處理器 (…