K-Means 算法詳解

K-Means 是一種常用的無監督學習算法,廣泛應用于數據聚類分析。本文將詳細講解 K-Means 算法的原理、步驟、公式以及 Python 實現,幫助你深入理解這一經典算法。

什么是 K-Means 算法?

K-Means 算法是一種基于原型的聚類算法,其目標是將數據集分成K個簇(clusters),使得同一簇內的數據點盡可能相似,不同簇之間的數據點盡可能不同。每個簇由其中心(即質心,centroid)表示。

K-Means 算法的步驟

K-Means 算法的主要步驟如下:

  1. 初始化:隨機選擇 K個數據點作為初始質心。
  2. 分配簇:將每個數據點分配到距離其最近的質心對應的簇。
  3. 更新質心:計算每個簇的質心,即簇內所有數據點的平均值。
  4. 重復步驟 2 和 3:直到質心不再發生變化(或變化很小),或者達到預設的迭代次數。

詳細步驟解釋

  1. 初始化

    • 從數據集中隨機選擇K 個點作為初始質心。這些質心可以是數據集中的實際點,也可以是隨機生成的點。
  2. 分配簇

    • 計算每個數據點到所有質心的距離(通常使用歐氏距離)。對于數據點 ( x i ) \ (x_i ) ?(xi?) 和質心 ( μ j ) (\mu_j) (μj?),歐氏距離計算公式為:
      d ( x i , μ j ) = ∑ m = 1 M ( x i m ? μ j m ) 2 \ d(x_i, \mu_j) = \sqrt{\sum_{m=1}^M (x_{im} - \mu_{jm})^2} \ ?d(xi?,μj?)=m=1M?(xim??μjm?)2 ??
    • 將每個數據點分配到距離其最近的質心對應的簇,即:
      C i = { x p : ∥ x p ? μ i ∥ ≤ ∥ x p ? μ j ∥ , ? j , 1 ≤ j ≤ k } \ C_i = \{ x_p : \| x_p - \mu_i \| \leq \| x_p - \mu_j \|, \forall j, 1 \leq j \leq k \} \ ?Ci?={xp?:xp??μi?xp??μj?,?j,1jk}?
  3. 更新質心

    • 對每個簇 ( C i ) \ ( C_i ) ?(Ci?),計算簇內所有數據點的平均值,并將該平均值作為新的質心。新的質心計算公式為:
      μ i = 1 ∣ C i ∣ ∑ x j ∈ C i x j \ \mu_i = \frac{1}{|C_i|} \sum_{x_j \in C_i} x_j \ ?μi?=Ci?1?xj?Ci??xj??
  4. 重復

    • 重復分配簇和更新質心的步驟,直到質心位置不再發生變化或達到最大迭代次數。

K-Means 算法的優化目標

K-Means 算法的優化目標是最小化所有數據點到其所屬簇質心的距離平方和。優化目標函數可以表示為:
J = ∑ i = 1 k ∑ x j ∈ C i ∥ x j ? μ i ∥ 2 \ J = \sum_{i=1}^k \sum_{x_j \in C_i} \| x_j - \mu_i \|^2 \ ?J=i=1k?xj?Ci??xj??μi?2?

該目標函數也稱為聚類內的總平方誤差(Total Within-Cluster Sum of Squares,簡稱 TSS)。

K-Means 算法的優缺點

優點

  1. 簡單易懂:K-Means 算法原理簡單,容易實現。
  2. 速度快:算法收斂速度快,適合處理大規模數據集。
  3. 適用范圍廣:在許多實際問題中表現良好。

缺點

  1. 選擇 ( k ) 值的困難:需要預先指定簇的數量 ( k ),而合適的 ( k ) 值通常不易確定。
  2. 對初始值敏感:初始質心的選擇會影響最終結果,可能陷入局部最優解。
  3. 對異常值敏感:異常值可能會顯著影響質心的位置。

K-Means 算法的 Python 實現

下面通過 Python 代碼實現 K-Means 算法,并以一個示例數據集展示其應用。

導入庫

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeansplt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號

生成示例數據集

# 生成示例數據集
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.show()

應用 K-Means 算法

# 應用 K-Means 算法
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)# 可視化聚類結果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='x')
plt.show()

原始數據集

在這里插入圖片描述

結果解釋

在上面的示例中,我們生成了一個有 4 個簇的示例數據集,并使用 K-Means 算法對其進行聚類。最終,我們通過可視化展示了聚類結果以及每個簇的質心。

總結

K-Means 算法是一種簡單而有效的聚類算法,廣泛應用于各種數據分析和機器學習任務中。本文詳細介紹了 K-Means 算法的原理、步驟、公式以及 Python 實現。雖然 K-Means 算法有一些缺點,但通過合理選擇參數和預處理數據,可以在許多實際應用中取得良好的效果。希望本文能幫助你更好地理解和應用 K-Means 算法。

我的同系列其他博客

支持向量機(SVM算法詳解)
回歸算法詳解
knn算法詳解
GBDT算法詳解
XGBOOST算法詳解
CATBOOST算法詳解
隨機森林算法詳解
lightGBM算法詳解
對比分析:GBDT、XGBoost、CatBoost和LightGBM
機器學習參數尋優:方法、實例與分析

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

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

相關文章

Linux分區以及磁盤管理

目錄 一、磁盤 1.磁盤結構 1.1物理結構 1.2數據結構 2.1磁盤容量 2.2磁盤接口類型 2.磁盤分區的表示 3.MBR與磁盤分區表示 4.磁盤分區結構 二、文件系統 1、類型 三、命令 1.檢測并確認新硬盤 2.創建系統文件(格式化) 2.1mkfs命令 2.2SWAP 3.掛載、卸載文件系統…

Simulink中三相PMSM配置及使用

1. 模塊介紹 Simulink提供了專門用于電力系統仿真,包括電機的動態建模和控制的電機模型,其中,永磁同步電機模塊 Permanent Magnet Synchronous Machine 支持實現三相或五相永磁同步電機模擬,電機繞組采用星型連接,在這…

【圖像分類】Yolov8 完整教程 |分類 |計算機視覺

目標:用YOLOV8進行圖像分類。 圖像分類器。 學習資源:https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 記錄計算機視覺學習道路上的所思所得。 1、文件結構化 劃分數據集:train,val,test 知道怎么劃分數據集很重要。 文件夾…

應用圖撲 HT for Web 搭建拓撲關系圖

拓撲結構在計算機網絡設計和通信領域中非常重要,因為它描述了網絡中的設備(即“點”)如何相互連接(即通過“線”)。這種結構不僅涉及物理布局,即物理拓撲,還可以涉及邏輯或虛擬的連接方式&#…

【系統架構設計師】計算機組成與體系結構 ③ ( 層次化存儲結構 | 寄存器 | 高速緩存 | 內存 | 外存 )

文章目錄 一、層次化存儲結構1、層次化存儲結構2、層次化存儲結構 - 示例說明3、程序員可操作的部分 計算機 采用 分級存儲結構 , 主要目的是 為了 解決 容量 / 價格 / 速度 之間的矛盾 ; 一、層次化存儲結構 1、層次化存儲結構 計算機 存儲器 按照存儲速度 由快到慢 進行排序 …

吐血推薦!3款視頻生成工具,全部國產,都免費

AI視頻大模型的爆發,讓創作爆款視頻不再是專業人士的能力。 今天二師兄給大家推薦3款免費的視頻生成工具。 01 可靈 推薦指數 : 五顆星 先看效果 可靈大模型測試 可靈大模型是快手AI團隊自主研發的視頻生成大模型,具備強大的視頻創作能力&a…

【經典面試題】RabbitMQ如何防止重復消費?

RabbitMQ的消息消費是有確認機制的,正常情況下,消費者在消費消息成功后,會發送一個確認消息,消息隊列接收到之后,就會將該消息從消息隊列中刪除,下次也就不會再投遞了。 但是如果存在網絡延遲的問題&#…

教程:在 Kubernetes 集群上部署 WordPress 網站

WordPress 是專為每個人設計的開源軟件,強調創建網站、博客或應用程序的可訪問性、性能、安全性和易用性。WordPress 是一個基于 PHP 的內容管理系統(CMS),使用 MySQL 作為數據存儲,目前很多網站、電商獨立站、個人博客…

AI新紀元-GPT-5

GPT-5:引領AI新紀元 隨著OpenAI首席技術官米拉穆拉蒂的確認,GPT-5的發布正在逐漸接近我們。從GPT-4到GPT-5的躍遷,不僅標志著技術層面的巨大進步,更是AI智能水平的一次質的飛躍。穆拉蒂將這一進步比喻為從高中生到博士生的成長&am…

深入比較:Symfony與Laravel框架的異同

引言 在現代Web開發領域,PHP框架扮演著至關重要的角色。Symfony和Laravel是兩個非常流行的PHP框架,它們各自有著獨特的設計理念、功能特性和社區支持。本文將深入探討這兩個框架的不同之處,包括設計理念、架構、性能、學習曲線、社區支持等方…

推薦系統三十六式學習筆記:原理篇.模型融合14|一網打盡協同過濾、矩陣分解和線性模型

目錄 從特征組合說起FM模型1.原理2.模型訓練3.預測階段4.一網打盡其他模型5.FFM 總結 在上一篇文章中,我們講到了使用邏輯回歸和梯度提升決策樹組合的模型融合辦法,用于CTR預估,給這個組合起了個名字,叫“輯度組合”。這對組合中&…

Yokogawa AQ6370E 10與AQ6370E 20 光譜儀的區別?

Yokogawa AQ6370E 20相比AQ6370E 10在波長準確度上有哪些改進? AQ6370E 20在波長準確度上相對于AQ6370E 10有明顯的提升,這對于需要高精度波長測量的應用來說是非常有益的。 波長精度提升:AQ6370E 20的波長精度相比AQ6370E 10有所提升&#…

SQL面試題練習 —— 查詢每個用戶的第一條和最后一條記錄

目錄 1 題目2 建表語句3 題解 題目來源:小紅書。 1 題目 現有一張訂單表 t_order 有訂單ID、用戶ID、商品ID、購買商品數量、購買時間,請查詢出每個用戶的第一條記錄和最后一條記錄。樣例數據如下: ---------------------------------------…

個人支付系統實現

基礎首頁: 訂單: 智能售卡系統 基于webmanworkerman開發 禁用函數檢查 使用這個腳本檢查是否有禁用函數。命令行運行curl -Ss https://www.workerman.net/check | php 如果有提示Function 函數名 may be disabled. Please check disable_functions in …

外星生命在地球的潛在存在:科學、哲學與社會的交織

外星生命在地球的潛在存在:科學、哲學與社會的交織 摘要:近年來,關于外星生命是否存在的討論日益激烈。有研究表明,外星人可能已經在地球漫步,這一觀點引發了廣泛的科學、哲學和社會學思考。本文將從科學角度探討外星…

線程池FutureTask淺談

一,概述 FuturnTask實現了Future與Runnable接口,筆者知道,ThreadPoolExecutor#submit可以傳入Callable接口而非Runnable,區別點在于Callable可以返回值,而整個FuturnTask可以理解為Callable設計,用來優雅地異步獲取執行結果,無需手動Condition去實現。 圍繞此,需知道…

鴻蒙開發系統基礎能力:【@ohos.wallpaper (壁紙)】

壁紙 說明: 本模塊首批接口從API version 7開始支持。后續版本的新增接口,采用上角標單獨標記接口的起始版本。 導入模塊 import wallpaper from ohos.wallpaper;WallpaperType 定義壁紙類型。 系統能力: 以下各項對應的系統能力均為SystemCapability…

python接口自動化的腳本

使用Requests庫進行GET請求 Requests是Python中最常用的HTTP庫,用于發送HTTP請求。下面是一個簡單的GET請求示例,用于從API獲取數據。 import requests url = "https://api.example.com/data" response = requests.get(url) if response.status_code == 200:prin…

【項目實訓】falsk后端連接數據庫以及與前端vue進行通信

falsk連接數據庫 我們整個項目采用vueflaskmysql的框架,之前已經搭建好了mysql數據庫,現在要做的是使用flask連接到數據庫并測試 安裝flask 首先安裝flask pip install flask 進行數據庫連接 數據庫連接需要使用到pymysql庫以及flask庫 連接數據庫…

通過注釋語句,簡化實體類的定義(省略get/set/toString的方法)

引用Java的lombok庫,減少模板代碼,如getters、setters、構造函數、toString、equals和hashCode方法等 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructorData&#xf…