【機器學習】K-means++: 一種改進的聚類算法詳解


鑫寶Code

🌈個人主頁: 鑫寶Code
🔥熱門專欄: 閑話雜談| 炫酷HTML | JavaScript基礎
?💫個人格言: "如無必要,勿增實體"


文章目錄

  • K-means++: 一種改進的聚類算法詳解
    • 引言
    • 1. K-means算法回顧
      • 1.1 基本概念
      • 1.2 局限性
    • 2. K-means++算法介紹
      • 2.1 初始質心選擇策略
      • 2.2 算法優勢
    • 3. K-means++算法實現步驟
      • 3.1 準備工作
      • 3.2 初始化質心
      • 3.3 迭代優化
      • 3.4 結果評估
    • 4. 實際應用案例
      • 4.1 數據降維
      • 4.2 客戶細分
      • 4.3 文檔分類
    • 5. 總結

K-means++: 一種改進的聚類算法詳解

在這里插入圖片描述

引言

在數據分析與機器學習領域,聚類算法作為無監督學習的重要組成部分,被廣泛應用于數據分組、模式識別和數據挖掘等場景。其中,K-means算法以其簡單直觀和高效的特點,成為最常用的聚類方法之一。然而,經典K-means算法在初始聚類中心的選擇上存在隨機性,可能導致算法陷入局部最優解。為解決這一問題,2007年,David Arthur 和 Sergei Vassilvitskii 提出了K-means++算法,它通過一種智能化的初始化策略顯著提高了聚類質量。本文將深入探討K-means++算法的原理、優勢、實現步驟以及實際應用案例,旨在為讀者提供一個全面且易于理解的K-means++算法指南。

1. K-means算法回顧

在這里插入圖片描述

1.1 基本概念

K-means算法的目標是將數據集劃分為K個簇(clusters),每個簇由距離其質心(centroid)最近的數據點組成。算法迭代執行以下兩個步驟直至收斂:

  • 分配步驟:將每個數據點分配給最近的質心。
  • 更新步驟:重新計算每個簇的質心,即該簇所有點的均值。

1.2 局限性

  • 對初始質心敏感:隨機選擇的初始質心可能導致算法陷入局部最優解。
  • 不適合處理不規則形狀的簇:傾向于形成球形或凸形簇。
  • 難以處理大小和密度變化較大的簇

2. K-means++算法介紹

2.1 初始質心選擇策略

K-means++算法的核心改進在于其初始化過程,具體步驟如下:

  1. 從數據集中隨機選擇第一個質心
  2. 對于每個數據點x,計算其到已選擇的所有質心的最短距離D(x)
  3. 選擇一個新的數據點作為下一個質心,選擇的概率與D(x)成正比,即概率P(x) = D(x) / ΣD(x)
  4. 重復步驟2和3,直到選擇了K個質心。

這種選擇策略確保了質心之間的分散性,從而提高了聚類效果。

2.2 算法優勢

  • 減少局部最優解的風險:更大概率選擇相距較遠的初始質心,提高聚類質量。
  • 理論保證:K-means++能夠給出接近最優解的界,即與最優聚類方案的距離平方誤差最多是理論最小值的8倍。
  • 效率:雖然初始化復雜度有所增加,但整體算法依然保持高效,尤其是對于大規模數據集。

3. K-means++算法實現步驟

3.1 準備工作

  • 確定K值:根據實際需求預先設定簇的數量。
  • 數據預處理:標準化或歸一化數據,以消除量綱影響。

3.2 初始化質心

  • 按照K-means++策略選取K個初始質心。

3.3 迭代優化

  1. 分配數據點:將每個數據點分配給最近的質心。
  2. 更新質心:根據新分配結果,重新計算每個簇的質心。
  3. 檢查收斂:如果質心位置變化不大于預定閾值或達到最大迭代次數,則停止迭代。

3.4 結果評估

  • 使用如輪廓系數、Calinski-Harabasz指數等評價指標評估聚類質量

下面是一個使用Python和scikit-learn庫實現K-means++算法的示例代碼。首先,確保你已經安裝了scikit-learn庫,如果沒有安裝,可以通過運行pip install scikit-learn來安裝。代碼僅供參考

# 導入所需庫
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs# 生成模擬數據
# 這里我們創建一個包含3個類別的數據集,每個類別有不同數量的點和方差
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=[1.0, 1.5, 0.5], random_state=42)# 使用KMeans++算法進行聚類
kmeans_plus = KMeans(n_clusters=3, init='k-means++', random_state=42) # 'k-means++' 是關鍵參數
kmeans_plus.fit(X)# 可視化結果
plt.figure(figsize=(10, 5))# 繪制原始數據點
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c='grey')
plt.title('Original Data')# 繪制K-means++聚類結果
plt.subplot(1, 2, 2)
plt.scatter(X[:, 0], X[:, 1], c=kmeans_plus.labels_, cmap='viridis')
plt.scatter(kmeans_plus.cluster_centers_[:, 0], kmeans_plus.cluster_centers_[:, 1], s=300, c='red', label='Centroids')
plt.title('K-means++ Clustering Result')
plt.legend()plt.show()

這段代碼首先生成了一個具有三個聚類中心的二維模擬數據集,然后使用scikit-learn的KMeans類,并設置init='k-means++'來應用K-means++初始化策略進行聚類。最后,通過matplotlib庫可視化了原始數據點和聚類后的結果,其中紅色點表示各個簇的質心。這個例子簡潔地展示了如何在Python中實施K-means++算法并評估其效果。

4. 實際應用案例

4.1 數據降維

  • 在PCA(主成分分析)之前,使用K-means++進行初步聚類,可以有效降低數據維度,提高后續分析效率。
    在這里插入圖片描述

4.2 客戶細分

  • 在市場營銷中,通過對客戶消費行為數據進行K-means++聚類,企業可以識別不同的客戶群體,定制個性化營銷策略。

4.3 文檔分類

  • 在文本挖掘領域,利用K-means++對文檔向量化后的特征進行聚類,有助于自動分類和主題發現。

5. 總結

K-means++算法通過一種更加智能的初始化策略,顯著改善了經典K-means算法的性能,尤其在解決初始質心選擇的隨機性和局部最優問題上表現出色。它不僅在理論上提供了性能保證,而且在實踐中廣泛應用于多個領域,展現了強大的實用價值。隨著大數據和機器學習技術的發展,K-means++及其變種將繼續在數據科學中扮演重要角色。

End

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

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

相關文章

Java的多彩之旅

Java的多彩之旅,確實是一場技術與創新的盛宴。下面,我們將探索它如何在不同領域展現其魅力和功能,從基礎到前沿,一步步揭開Java的神秘面紗。 基礎開發:清新之源 Java的基礎語法簡潔而嚴謹,是學習之旅的起…

Mongodb的體系結構,語法,底層原理,怎么開發使用,使用場景有哪些?

MongoDB 教材 MongoDB 是一個開源的 NoSQL 數據庫,以其高性能、高可用性和自動擴展性廣受歡迎。本文將詳細介紹 MongoDB 的體系結構、語法、底層原理、開發使用方法及常見使用場景。 目錄 MongoDB 簡介MongoDB 體系結構MongoDB 語法 基本操作高級查詢聚合操作 底…

RDMA建鏈的3次握手和斷鏈的4次揮手流程?

文章目錄 基礎信息建鏈 3次握手斷鏈4次揮手建聯狀態active端passive端 報文結構函數關系其他后記 基礎信息 CM: Communication Management 通信管理 連接管理SIDR: Service ID Resolution Protocol. 作用: enables users of Unreliable Datagram service to locate …

實驗4 圖像空間濾波

1. 實驗目的 ①掌握圖像空間濾波的主要原理與方法; ②掌握圖像邊緣提取的主要原理和方法; ③了解空間濾波在圖像處理和機器學習中的應用。 2. 實驗內容 ①調用 Matlab / Python OpenCV中的函數,實現均值濾波、高斯濾波、中值濾波等。 ②調…

【操作系統期末速成】 EP02 | 學習筆記(基于五道口一只鴨)

文章目錄 一、前言🚀🚀🚀二、正文:??????2.1 考點二:操作系統的功能及接口2.2 考點三:操作系統的發展及分類2.3 考點四:操作系統的運行環境(重要) 一、前言&#x…

從零開始三天學會微信小程序開發(三)

看到不少入門的小程序開發者不斷的問重復性的問題,我們從實戰角度開發了這個課程,希望能夠幫助大家了解小程序開發。 課程分三天: 第一天:微信小程序開發入門第二天:給小程序接入云端數據第三天:完善我的…

MySQL高級-MVCC- readview介紹

文章目錄 1、介紹2、ReadView中包含了四個核心字段:3、版本鏈數據的訪問規則:4、不同的隔離級別,生成ReadView的時機不同: 1、介紹 ReadView(讀視圖)是 快照讀 SQL執行時MVCC提取數據的依據,記錄…

【計算機組成原理實驗】——運算器組成實驗

計組TEC4實驗——運算器組成實驗 1. 實驗目的 (1)掌握算術邏輯運算加、減、乘、與的工作原理。 (2) 熟悉簡單運算器的數據傳送通路。 (3) 驗證實驗臺運算器的8位加、減、與、直通功能。 (4) 驗證實驗臺的4位乘4位功能。 (5) 按給定數據,完成幾種指…

SerDes介紹以及原語使用介紹(4)ISERDESE2原語仿真

文章目錄 前言一、iserdese2_module模塊二、oserdese2_module模塊三、頂層模塊四、仿真結果分析 前言 上文詳細介紹了ISERDESE2原語的使用,本文根據仿真對ISERDESE2原語的使用進一步加深印象。在仿真時,與OSERDESE進行回環。 一、iserdese2_module模塊…

昇思MindSpore學習筆記4--數據集 Dataset

昇思MindSpore學習筆記4--數據集 Dataset 摘要: 昇思MindSpore數據集Dataset的加載、數據集常見操作和自定義數據集方法。 一、數據集 Dataset概念 MindSpore數據引擎基于Pipeline 數據預處理相關模塊: 數據集Dataset加載原始數據,支持文本…

移動端H5應用,使用了postcss-px-to-viewport插件,750設計稿兼容Vant框架

目前在搞一個移動端的H5項目,使用的是Vue3Vant框架。設計稿是750的,而且使用了postcss-px-to-viewport。所以發現使用Vant框架的時候,發現有點問題,好像縮小了,后來百度了一下,是需要設置portcss.config.js…

vue components

vue components intro 組件是帶有名稱的可復用實例。 因為組件是可復用的組件實例,所以它們與根實例接收相同的選項,例如 data、computed、watch、methods 以及生命周期鉤子等。 組成 props: 組件的attributes,可以傳任意類型…

大創項目推薦 題目:基于機器視覺的圖像矯正 (以車牌識別為例) - 圖像畸變校正

文章目錄 0 簡介1 思路簡介1.1 車牌定位1.2 畸變校正 2 代碼實現2.1 車牌定位2.1.1 通過顏色特征選定可疑區域2.1.2 尋找車牌外圍輪廓2.1.3 車牌區域定位 2.2 畸變校正2.2.1 畸變后車牌頂點定位2.2.2 校正 7 最后 0 簡介 🔥 優質競賽項目系列,今天要分享…

題目的起名

整個經濟社會描繪為無數個交織的方程組。機場航班的起降時間、物流的路徑規劃、金屬冶煉的原料配比、工廠店鋪的選址……”而這些方程組的價值在于,“為了實現經濟學最簡單而又最權威的目標——對稀缺資源進行最佳利用,必須快速求出這些方程組的最優解。…

Leetcode3192. 使二進制數組全部等于 1 的最少操作次數 II

Every day a Leetcode 題目來源:3192. 使二進制數組全部等于 1 的最少操作次數 II 解法1:遍歷 由于 nums[i] 會被其左側元素的操作影響,所以我們先從最左邊的 nums[0] 開始思考。 分類討論: 如果 nums[0]1,無需反…

debian 安裝mongodb

安裝所需工具 apt install gnupg curl 添加公鑰 wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add - 添加源 echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt…

amis-editor 注冊自定義組件

建議先將amis文檔從頭到尾,仔細看一遍。 參考:amis - 低代碼前端框架 amis 的渲染過程是將 json 轉成對應的 React 組件。先通過 json 的 type 找到對應的 Component,然后把其他屬性作為 props 傳遞過去完成渲染。 import * as React from …

Linux開發講課17--- 在shell腳本中,如何將一個命令存儲在一個變量中

問: 將一個命令保存到一個變量中,以便稍后再使用(不是命令的輸出,而是命令本身)。 有一個簡單的腳本如下: command"ls"; echo "Command: $command"; #Output is: Command: ls b$com…

c++ 給定一個非常巨大的數組,如何找到它的中值

快速選擇算法&#xff08;最優解&#xff09; #include <iostream> #include <vector> #include <algorithm>using namespace std;class Solution { private:// 快速選擇算法中的分區函數int partition(vector<int>& nums, int left, int right)…

逆向學習匯編篇:參數傳遞與返回地址的使用

本節課在線學習視頻&#xff08;網盤地址&#xff0c;保存后即可免費觀看&#xff09;&#xff1a; ??https://pan.quark.cn/s/b5b046015da2?? 在匯編語言中&#xff0c;函數調用和參數傳遞是編程的基礎組成部分。了解如何在匯編中傳遞參數以及如何處理返回地址對于逆向工…