機器學習(八):K-Means聚類原理與實戰

聲明:未經允許禁止轉載與抄襲。

前言

k k k均值( k k k-means)聚類算法是一種經典的無監督聚類算法,本文將深入解析其理論原理,并在真是數據集上進行算法實踐,話不多說,請看下文。

算法原理

給定樣本集 D = { x 1 , x 2 , … , x m } D=\left\{\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_m\right\} D={x1?,x2?,,xm?},其中每個樣本 x i \mathbf{x}_i xi?都由一個向量表示,例如以周志華老師西瓜書中的西瓜數據集為例,每個樣本都包含兩個屬性密度和含糖量,這兩個屬性值組成的向量便是該樣本的向量表示。

k k k均值算法旨在將樣本集 D D D劃分為 k k k個簇,即 C = { C 1 , C 2 , … , C k } C=\left\{C_1,C_2,\ldots,C_k\right\} C={C1?,C2?,,Ck?},使得每個樣本都被劃分到與其距離最小的簇中。用數學來刻畫就是, k k k均值算法希望能夠最小化所劃分的 k k k個簇的平方誤差,即:
argmin C ∑ i = 1 k ∑ x ∈ C i ∥ x ? μ i ∥ 2 2 \text{argmin}_{C} \sum_{i=1}^k \sum_{\mathbf{x} \in C_i}\left\|\mathbf{x}-\mathbf{\mu}_i\right\|_2^2 argminC?i=1k?xCi??x?μi?22?

其中 μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \boldsymbol{\mu}_i=\frac{1}{\left|C_i\right|} \sum_{\mathbf{x} \in C_{\boldsymbol{i}}} \mathbf{x} μi?=Ci?1?xCi??x 表示簇 C i C_i Ci? 的均值向量, x \mathbf{x} x表示簇 C i C_i Ci?中的樣本。

k k k均值算法事先設定數據集 D D D要劃分為 k k k個簇,初始化時,會先從數據集 D D D中隨機挑選 k k k個樣本作為各個簇的初始均值向量(簇中心)。然后遍歷所有樣本,分別計算各個樣本與各個簇中心的距離,并將樣本劃分到與距離最小的簇中。待到所有樣本都劃分完畢后,將各個簇樣本向量的均值向量作為新的簇均值向量,重復上述的步驟,直到上一輪所有的簇中心均值向量與本輪計算的結果相同為止。該算法的具體算法流程如下:

kmeans-algo

需要注意的是,實際計算過程中為避免計算時間過長,該算法的終止條件不可能這樣嚴苛。西瓜書中給出了兩種方案:

  • 設置一個最大輪數。
  • 設置均值向量的變化閾值,若新簇中心與舊簇中心之間的距離不超過該閾值即可,而不是嚴格不變。

對于 k k k均值聚類算法而言,數據集的預處理和 k k k值的選取同樣十分重要,可以參考博客【機器學習】K-means(非常詳細),限于篇幅原因,本文就不詳細展開。

算法實踐

本文在鳶尾花數據集上進行 k k k均值聚簇算法的實踐。

基于最大輪數終止 k k k均值聚類算法實現如下所示,兩個向量之間的距離計算本文采用了余弦距離

import numpy as np
from scipy.spatial.distance import cdistclass KMeansModel:def rand_pick(self, x, k):"""隨機選取k個簇中心"""n = x.shape[0]indices = np.random.choice(n, k, replace=False)return x[indices]def calculate_distance(self, x, centers):"""計算簇中心與數據樣本之間的余弦距離centers: 簇中心數據 (k, d)x: 樣本 (N, d)"""return cdist(x, centers, metric="cosine")def get_centers(self, k, x, y):"""根據計算結果重新計算簇中心y: 根據距離將數據集劃分的標簽數組 (N)"""centers = np.zeros((k, x.shape[1]))for label in range(k):centers[label] = np.mean(x[y == label], axis=0)return centersdef get_label(self, dis):"""根據距離矩陣將每個樣本劃分到距離最小的簇中心"""return np.argmin(dis, axis=-1)def cluster(self, x, k, times):"""進行KMeans聚類x: 數據樣本 (N, d)k: 類別數tims: 迭代次數"""# 隨機選取k個作為初始簇中心centers = self.rand_pick(x, k)for _ in range(times):# 計算各個樣本到簇中心的距離dis = self.calculate_distance(x, centers)# 根據距離矩陣將樣本進行劃分y = self.get_label(dis)# 重新計算新的簇中心centers = self.get_centers(k, x, y)return y

在鳶尾花數據集上,設置的實驗參數為 k = 3 k=3 k=3 t i m e s = 500 times=500 times=500,即將整個數據集聚為 3 3 3個簇,算法迭代 500 500 500輪終止。

算法額外對比了基于sklearn庫實現的 k k k均值聚簇算法的效果,為更直觀的展示,本文對數據集進行PCA降維,下圖從左到右分別是真實標簽、本文模型的聚類結果、基于sklearn算法的聚類結果。從結果可以看出,本文實現的模型在鳶尾花數據集上效果還是不錯的。

kmeans-vis

結語

以上便是本文的全部內容,如果感覺不錯可以支持一下,若有任何問題敬請批評指正。

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

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

相關文章

判斷矩陣A和矩陣B是否相似?

【例題1】 (1)方法1 (2)方法2 (3)方法3 好題\(^o^)/~ 【注意】當二次多項式有重根時,即判別式為零,此時二次多項式是完全平方。

【10】搭建k8s集群系列(二進制部署)之安裝Dashboard和CoreDNS

一、部署Dashboard 1.1、創建kubernetes-dashboard.yaml文件 完整的yaml配置文件信息如下: # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in …

大數據技術與Scala

集合高級函數 過濾 通過條件篩選集合元素,返回新集合。 映射 對每個元素應用函數,生成新集集合 扁平化 將嵌套集合展平為單層集合。 扁平化映射 先映射后展平,常用于拆分字符串。 分組 按規則將元素分組為Map結構。 歸約 …

數據驅動可視化實戰:圖表狐精準生成圖表的完整數據范式

一、數據輸入黃金法則 圖表狐 - AI圖表生成工具,在線數據可視化要求數據描述必須包含三個核心要素: [主體對象] [量化指標] [維度劃分] 錯誤示例 ?: "展示各部門銷售額對比" 正確示例 ?: "2023年Q1-Q4各部門銷售額&a…

蒼穹外賣(1)-部分環境配置(git、數據庫)

首先配置git 創建好本地倉庫之后 把項目弄到遠程倉庫里去 先進行提交 ,后進行推送 ,然后gitee創建一個倉庫 把這個url復制好 推送后會出來一個 點擊推送,會讓你輸入gitee賬號密碼,輸入自己的賬號密碼,就可以連接遠程倉…

Ubunut18.04 離線安裝MySQL 5.7.35

一、環境準備 1.1 官方下載MySQL5.7.35 完整包 1.2 上傳包 & 解壓 上傳包名稱是:mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle.tar # 切換到上傳目錄 cd /home/MySQL # 解壓: tar -xvf mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle…

Linux(CentOS10) gcc編譯

本例子摘自《鳥哥的linux私房菜-基礎學習第四版》 21.3 用make進行宏編譯 書中的代碼在本機器(版本見下)編譯出錯,改正代碼后發布此文章: #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…

MCP+Blender創建電力塔

MCP(Model Context Protocol)與Blender的結合是當前AI與3D建模領域的熱門技術,它通過協議化的方式讓Claude等AI模型直接控制Blender,實現自動化3D建模。 1. 功能與原理 ? 核心能力:用戶通過自然語言指令(…

Qt與C++數據類型轉換

本文深入探討Qt與C中相似但不同的數據類型處理技巧。 一、QString與std::string的相互轉換 1. QString → std::string 方法1:使用toStdString()(推薦) QString qstr "你好,Qt世界"; std::string str qstr.toStdS…

機器學習+EEG熵進行雙相情感障礙診斷的綜合評估

摘要 雙相情感障礙(BD)是一種常見的精神疾病,特點是躁狂或輕躁狂與抑郁交替發作,其嚴重程度各異,導致準確及時的診斷具有一定的挑戰性。EEG的非線性特征被認為是精神障礙的生物標志物,能夠反映大腦的非線性動態。盡管已有研究證明…

企業應用集成全析:架構、實踐與展望

企業應用集成全析:架構、實踐與展望 一、企業應用集成的基本概念1.1 定義1.2 目標 二、企業應用集成的層次架構2.1 數據集成2.2 應用系統集成2.3 業務流程集成? 三、企業應用集成的關鍵技術3.1 中間件技術3.2 Web 服務技術?3.3 企業服務總線(ESB&#…

【STL】list介紹(附與vector的比較)

文章目錄 1.關于list2.使用2.1 list的構造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素訪問2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…

【Django】教程-12-柱狀圖

【Django】教程-1-安裝創建項目目錄結構介紹 【Django】教程-2-前端-目錄結構介紹 【Django】教程-3-數據庫相關介紹 【Django】教程-4-一個增刪改查的Demo 【Django】教程-5-ModelForm增刪改查規則校驗【正則鉤子函數】 【Django】教程-6-搜索框-條件查詢前后端 【Django】教程…

SQL:DDL(數據定義語言)和DML(數據操作語言)

目錄 什么是SQL? 1. DDL(Data Definition Language,數據定義語言) 2. DML(Data Manipulation Language,數據操作語言) DDL和DML的區別 什么是SQL? SQL(Structured …

Chrome 135 版本開發者工具(DevTools)更新內容

Chrome 135 版本開發者工具(DevTools)更新內容 一、性能(Performance)面板改進 1. 性能面板中的配置文件和函數調用現已顯示來源和腳本鏈接 Performance > Summary(性能 > 概覽)選項卡現在會顯示配…

[ctfshow web入門] web23

前置知識 include:包含一個文件,也可以包含一些其他東西,后續用到再解析 substr:對字符串進行切片,第一個參數是字符串,第二第三個參數出從第a個索引開始切n個,索引從0開始計數。 例如&#xf…

vue3 開發電子地圖功能

文章目錄 一、項目背景二、頁面效果三、代碼1.ElectronicMap.vue2.TransferDeskRSSIMap.vue3.Map.js4.src/stores/index.js Vuex存儲屬性 四、注意點本人其他相關文章鏈接 一、項目背景 項目采用:vue3javaArco DesignSpringBootOpenStreetMap 數據的地圖切片服務。…

oracle 存儲體系結構

oracle 存儲體系結構 參考: Logical Storage Structures (oracle.com)

python-leetcode 66.尋找旋轉排序數組中的最小值

題目: 已知一個長度為n的數組,預先按照升序排列,經由1到n次旋轉后,得到輸入數組,例如,原數組 nums [0,1,2,4,5,6,7] 在變化后可能得到: 若旋轉 4 次,則可以得到 [4,5,6,7,0,1,2]若…

【MATLAB第113期】基于MATLAB的EFAST擴展傅里葉幅度敏感性分析方法(有目標函數)

【MATLAB第113期】基于MATLAB的EFAST擴展傅里葉幅度敏感性分析方法(有目標函數) 一、方法概述 擴展傅里葉幅度敏感性檢驗(EFAST)是一種基于頻域分析的全局敏感性分析方法,能夠同時評估模型參數的一階敏感性&#xff…