Day23_【機器學習—聚類算法—K-Means聚類 及評估指標SSE、SC、CH】

一、聚類算法

概念

? ? ? ? 屬于無監督學習算法,即有特征無標簽,根據樣本之間的相似性,將樣本劃分到不同的類別中。

所謂相似性可以理解為歐氏距離、曼哈頓距離、切比雪夫距離... 。

分類

按顆粒度分為:粗聚類、細聚類。

按實現方法分為: K-means聚類、層次聚類、 DBSCAN聚類、譜聚類

二、K-Means聚類

????????K-Means 是機器學習中最經典、最常用的聚類算法之一

????????目標是在沒有先驗知識的情況下,自動發現數據集中的內在結構和模式

????????適用場景:一般大廠,項目初期在沒有 先備知識的情況下的大廠

實現流程?????

????????????????

  1. 事先確定常數K ,常數K意味著最終的聚類類別數
  2. 隨機選擇 K 個樣本點作為初始聚類中心
  3. 計算每個樣本到 K 個中心的距離,選擇最近的聚類中心點作為標記類別
  4. 根據每個類別中的樣本點,重新計算出新的聚類中心點(平均值),如果計算得出的新中心點與原中心點一樣則停止聚類,否則重新進行第 3 步過程,直到聚類中心不再變化

實現API

sklearn.cluster.KMeans

# 1.導入工具包
import os
os.environ['OMP_NUM_THREADS']='4'
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs #數據生成器
from sklearn.metrics import calinski_harabasz_score  # 評估指標,值越大聚類效果越好
# 2 創建數據集 1000個樣本,每個樣本2個特征,4個質心蔟,數據標準差[0.4, 0.2, 0.2, 0.2],隨機種子22
x, y = make_blobs(n_samples=1000,n_features=2,centers=[[-1,-1], [0,0], [1,1], [2,2]],cluster_std = [0.4, 0.2, 0.2, 0.2],random_state=22)
# x[:, 0]:橫坐標(第一個特征)
# x[:, 1]:縱坐標(第二個特征)
print(x) #坐標
print(y) #標簽
# 參1:橫坐標,參2:縱坐標
plt.scatter(x[:, 0], x[:, 1])
plt.show()
# 3 使用k-means進行聚類, 并使用CH方法評估
es = KMeans(n_clusters=4, random_state=22)
y_pre=es.fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=y_pre)
plt.show()
# 4 模型評估
print(calinski_harabasz_score(x, y_pre))

三、聚類算法的評估指標

1. SSE + 肘部法

SSE
  • 概述:所有的簇 的所有樣本到該簇質心的 誤差的平方和
  • 特點:隨著K值增加,SSE值逐漸減少
  • ?目標:??SSE越小,簇內樣本越聚集,內聚程度越高

????????

肘部法—K值確定
  • 對于n個點的數據集,迭代計算 k from 1 to n,每次聚類完成后計算 SSE
  • SSE 是會逐漸變小的,因為每個點都是它所在的簇中心本身。
  • SSE 變化過程中會出現一個拐點,下降率突然變緩時即認為是最佳 n_clusters 值
  • 在決定什么時候停止訓練時,肘形判據同樣有效,數據通常有更多的噪音,在增加分類無法帶來更多回報時,我們停止增加類別。

????????????????????????

K值增大,SSE值會隨之減小,下降梯度突然變換的時候,那個K的值,就是我們要尋找得最佳值

API實現
#導包
import os
os.environ['OMP_NUM_THREADS']='4'
#導包
from sklearn.cluster import KMeans  #聚類API  采用指定 質心 分簇
import matplotlib.pyplot as plt
from sklearn.datasets import  make_blobs  # 默認會按照高斯分布(正態分布)生成數據集 ,只需要 指定 均值 ,標準差#1、定義函數 演示:SSE+肘部法
def dm01_sse():#0、定義SSE列表 ,目的:每個K值的SSE值sse_list = []#1、獲取數據#參1:樣本數量  參2:特征數量 參3:4個簇的質點  參4:std標準差  參5:固定隨機種子x,y=make_blobs(n_samples=1000,n_features=2,centers=[[-1,-1],[0,0],[1,1],[2,2]],cluster_std=[0.4,0.2,0.2,0.2],random_state=23)#2、for訓練  訓練   獲取每個K值,對應的SSE值for k in range(1,100):#2.1創建模型#參1:簇的數量#參2:最大迭代次數#參3:固定隨機種子es=KMeans(n_clusters=k,max_iter=100,random_state=23)#2.2 訓練模型es.fit(x)#2.3獲取每個簇的sse值sse_value=es.inertia_#2.4將每個K值對應的SSE值,添加到sse_listsse_list.append(sse_value)#3.繪制SSE曲線 -》數據可視化# print(sse_list)#3.1創建畫布plt.figure(figsize=(20,10))#3.2設置標題plt.title("sse value")#3.3設置x軸plt.xticks(range(0,100,3))#參1:K值  參2:該K值所對應的SSE值# o  圓點樣式# r 紅色# - 連接數據點的樣式  實線# color='r'   marker='o'  linestyle='-'plt.plot(range(1,100),sse_list,'or-')plt.xlabel("k")plt.ylabel("sse")plt.grid()plt.show()if __name__ == '__main__':dm01_sse()

?聚類效果評估 – 代碼效果展示SSE誤差平方和,x軸為k值,y軸為SSE值

????????

通過圖像可觀察到 n_clusters=4 sse開始下降趨緩, 最佳值4

2. SC輪廓系數法—高內聚低耦合

輪廓系數法考慮簇內的內聚程度(Cohesion),簇外的分離程度(Separation)

  • 對計算每一個樣本 i 到同簇內其他樣本的平均距離 ai,該值越小,說明簇內的相似程度越大
  • 計算每一個樣本 i 到最近簇 j 內的所有樣本的平均距離 bij,該值越大,說明該樣本越不屬于其他簇 j
  • 根據下面公式計算該樣本的輪廓系數:S = b ?a/max?(a, b)
  • 計算所有樣本的平均輪廓系數
  • 輪廓系數的范圍為:[-1, 1],SC值越大聚類效果越好

????????????????

API實現
#導包
import os
os.environ['OMP_NUM_THREADS']='4'
#導包
from sklearn.cluster import KMeans  #聚類API  采用指定 質心 分簇
import matplotlib.pyplot as plt
from sklearn.datasets import  make_blobs  # 默認會按照高斯分布(正態分布)生成數據集 ,只需要 指定 均值 ,標準差
from sklearn.metrics import silhouette_score,calinski_harabasz_score  #silhouette_score :sc   calinski_harabasz_score:chdef dm02_sc輪廓系數法():#0、定義sc列表 ,目的:每個K值的SSE值sc_list = []#1、獲取數據#參1:樣本數量  參2:特征數量 參3:4個簇的質點  參4:std標準差  參5:固定隨機種子x,y=make_blobs(n_samples=1000,n_features=2,centers=[[-1,-1],[0,0],[1,1],[2,2]],cluster_std=[0.4,0.2,0.2,0.2],random_state=23)#3、遍歷for循環  獲取每個K值 ,計算對應SC值  ,并添加到sc_list列表中for k in range(2,100): #考慮簇外 至少2簇es=KMeans(n_clusters=k,max_iter=100,random_state=23)es.fit(x)y_pre=es.predict(x)sc_value=silhouette_score(x,y_pre)sc_list.append(sc_value)#繪制sc曲線-》數據可視化plt.figure(figsize=(20,10))plt.title("sc value")plt.xticks(range(0,100,3))plt.xlabel("k")plt.ylabel("sc")plt.grid()# 注意  sc 值從2開始plt.plot(range(2,100),sc_list,'or-')plt.show()
if __name__ == '__main__':dm02_sc輪廓系數法()

代碼效果展示 – SC系數

????????

????????????????通過圖像可觀察到 n_clusters=4 取到最大值; 最佳值4

3.CH輪廓系數法—高內聚低耦合加質心

CH 系數考慮簇內的內聚程度簇外的離散程度質心的個數。

CH系數越大越好

  • 類別內部數據的距離平方和越小越好
  • 類別之間的距離平方和越大越好,
  • 聚類的種類數越少越好

????????????????

SSW 的含義:相當于SSE,簇內距離

SSB 的含義:簇間距離

API實現

#導包
import os
os.environ['OMP_NUM_THREADS']='4'
#導包
from sklearn.cluster import KMeans  #聚類API  采用指定 質心 分簇
import matplotlib.pyplot as plt
from sklearn.datasets import  make_blobs  # 默認會按照高斯分布(正態分布)生成數據集 ,只需要 指定 均值 ,標準差
from sklearn.metrics import silhouette_score,calinski_harabasz_score  #silhouette_score :sc   calinski_harabasz_score:chdef dm03_CH系數():#0、定義sc列表 ,目的:每個K值的SSE值ch_list = []#1、獲取數據#參1:樣本數量  參2:特征數量 參3:4個簇的質點  參4:std標準差  參5:固定隨機種子x,y=make_blobs(n_samples=1000,n_features=2,centers=[[-1,-1],[0,0],[1,1],[2,2]],cluster_std=[0.4,0.2,0.2,0.2],random_state=23)#3、遍歷for循環  獲取每個K值 ,計算對應SC值  ,并添加到sc_list列表中for k in range(2,100): #考慮簇外 至少2簇es=KMeans(n_clusters=k,max_iter=100,random_state=23)es.fit(x)y_pre=es.predict(x)sc_value=calinski_harabasz_score(x,y_pre)ch_list.append(sc_value)#繪制sc曲線-》數據可視化plt.figure(figsize=(20,10))plt.title("ch value")plt.xticks(range(0,100,3))plt.xlabel("k")plt.ylabel("ch")plt.grid()# 注意  sc 值從2開始plt.plot(range(2,100),ch_list,'or-')plt.show()
if __name__ == '__main__':dm03_CH系數()

代碼效果展示 – CH系數

????????

通過圖像可觀察到 n_clusters=4 取到最大值; 最佳值4

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

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

相關文章

android seekbar顯示刻度

SeekBar簡介 SeekBar是Android中的一個可交互UI組件,允許用戶通過拖動滑塊在特定范圍內選擇數值。繼承自ProgressBar,但增加了用戶手動調節功能,常用于音量控制、亮度調節等場景。 核心屬性 android:maxHeight // 背景高度 android:progres…

【高并發內存池】五、頁緩存的設計

文章目錄Ⅰ. page cache頁緩存的結構設計Ⅱ. 完善central cache中的 get_span() 函數Ⅲ. 實現頁緩存獲取span對象的接口Ⅰ. page cache頁緩存的結構設計 ? 首先頁緩存還是一個哈希桶的結構,但是和前兩者不同的是,頁緩存的哈希桶中存放的是一個或者多個…

Elasticsearch(text和keyword)區別分析

text:全文檢索類型,經過分詞處理,支持模糊匹配? keyword:精確匹配類型,適用于聚合、排序和過濾? text 1. 核心屬性 ?analyzer屬性?: 指定用于索引和搜索的分詞器 默認使用標準分析器(Standard Analyzer) 示例:"analyzer": "ik_max_word"(中文…

通過tailscale實現一臺電腦上vscode通過ssh連接另一臺電腦上的VMware Linux 虛擬機

當需要通過一臺windows電腦上的vscode來ssh連接另一臺電腦上的linux虛擬機進行遠程操作,可以通過tailscale來實現。 Linux虛擬機上安裝tailscale 由于掛代理下載仍然很慢,而清華鏡像源又沒有tailscale的軟件包,所以可以通過下載 DEB 包安裝…

[Upscayl圖像增強] docs | 前端 | Electron工具(web->app)

鏈接:https://upscayl.org/docs:Upscayl Upscayl是一款桌面應用程序,允許用戶使用人工智能放大和增強圖像。 提供了一個用戶友好的圖形界面(渲染器用戶界面),用戶可以選擇圖像或文件夾,從多種AI…

阿里云通義MoE全局均衡技術:突破專家負載失衡的革新之道

MoE模型的基本原理與核心價值 混合專家模型(Mixture of Experts,MoE)是當前AI大模型領域最重要的架構創新之一,其核心思想是通過多個“專家”網絡協同處理輸入數據,并由門控網絡動態選擇或組合各個專家的輸出&#xf…

macOS中設置環境變量的各文件及作用域

在 macOS 中,~/.zshrc 和 ~/.bash_profile 是 Shell 的配置文件,用于設置環境變量、命令別名、啟動命令等。它們在你每次打開終端時會被自動加載。文件對應 Shell作用~/.zshrcZsh(macOS Catalina 及以后默認)每次打開新的終端窗口…

【華為培訓筆記】OptiX OSN 9600 設備保護專題

OptiX OSN 9600 設備保護專題 1、光層保護 定義 方式 應用

Python開篇撬動未來的萬能鑰匙 從入門到架構的全鏈路指南

💝💝💝歡迎蒞臨我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 持續學習,不斷…

LabVIEW 與 PLC 通訊

在工業自動化領域,LabVIEW 與 PLC 的通訊極為關鍵,它能實現設備間高效的數據交互與協同運作。接下來,將從應用場景、軟件架構、功能實現、特點、開發問題及解決方法等層面展開闡述。 應用場景? 智能工廠生產線監控系統中,LabVIE…

11-FreeRTOS任務相關的其他API函數

數據來源地址:gitee.com FreeRTOS任務相關的其他API函數 一、FreeRTOS任務相關的其他API函數介紹 1、FreeRTOS任務相關API函數介紹(部分常用的) 答: 二、任務狀態查詢API函數 1、獲取任務優先級函數 答: UBaseType_t uxTaskPriorityGet…

ECMAScript(2)核心語法課件(Node.js/React 環境)

📚 ECMAScript 核心語法課件(Node.js/React 環境) 1. 變量與作用域 變量聲明方式 var:函數作用域,存在變量提升(hoisting)console.log(a); // undefined(變量提升) var a…

Selenium 頁面加載超時pageLoadTimeout與 iframe加載關系解析

引言 在 Web 自動化測試中,處理頁面加載超時是每個 Selenium 使用者都會遇到的挑戰。特別是當頁面包含 iframe 時,加載行為變得更加復雜。許多測試工程師困惑于:pageLoadTimeout 究竟能否控制 iframe 的加載?本文將深入探討這一問…

AI面試將重塑企業招聘流程:從效率到精準度的全面升級

每年校招季,HR團隊總被“面試官不夠用”“簡歷太多看不清”“候選人放鴿子”等問題折磨。傳統招聘流程冗長、成本高昂、標準參差,已難以適應快速變化的用人需求。而AI面試技術的突破,正在從底層邏輯上重塑招聘鏈條——從初篩到終面&#xff0…

IOC為什么交由spring容器管理?

根本原因:在 Spring 框架中,將控制反轉(IoC) 交由 Spring 容器管理,是為了解決傳統編程模式中 “對象創建與依賴管理耦合度高” 的核心問題,最終實現代碼的低耦合、高可維護性、高可測試性。要理解這一設計…

Java反射與動態代理學習筆記

Java 反射與動態代理學習筆記反射概述反射允許對成員變量、成員方法和構造方法進行編程訪問,提供了在運行時分析類和對象的能力。獲取Class對象的三種方式方式代碼示例說明Class.forName()Class.forName("全類名")通過類的全限定名獲取Class對象對象.getC…

RAG提示詞分解

RAG提示詞分解 System Message # 智能問答助手&#xff08;RAG系統提示&#xff09;## 角色定義 您是"智能問答助手"&#xff0c;專門基于提供的上下文信息回答用戶問題。## 核心規則 1. **嚴格基于上下文**&#xff1a;僅使用用戶提供的<context>中的信息&…

YOLOv8 在 Intel Mac 上的 Anaconda 一鍵安裝教程

YOLOv8 在 Intel Mac 上的 Anaconda 一鍵安裝教程 本文適用于 Intel 芯片 Mac&#xff0c;通過 Anaconda 快速搭建 YOLOv8 環境&#xff0c;支持 CPU 推理與 Notebook 可視化。 全程一鍵安裝&#xff0c;適合小白和入門用戶。 &#x1f4d1; 目錄 環境準備 一鍵安裝腳本 運行…

Spring 日志文件

Spring 日志文件 文章目錄Spring 日志文件日志有什么用&#xff1f;日志怎么用&#xff1f;自定義日志在程序中獲取日志對象常用日志框架說明使用日志對象打印日志日志格式說明日志級別日志級別有啥用日志級別分類和使用日志持久化保存更簡單的日志輸出——lomboklombok更多注解…

五、誤差反向傳播法(上)

上一章中&#xff0c;我們介紹了神經網絡的學習&#xff0c;并通過數值微分計算了神經網絡的權重參數的梯度&#xff08;嚴格來說&#xff0c;是損失函數關于權重參數的梯度&#xff09;。數值微分雖然簡單&#xff0c;也容易實現&#xff0c;但缺點是計算上比較費時間。本章我…