【scipy 基礎】--聚類

来源:https://www.cnblogs.com/wang_yb/archive/2023/11/01/17802261.html
-Advertisement-
Play Games

物以類聚,聚類演算法使用最優化的演算法來計算數據點之間的距離,並將它們分組到最近的簇中。 Scipy的聚類模塊中,進一步分為兩個聚類子模塊: vq(vector quantization):提供了一種基於向量量化的聚類演算法。 vq模塊支持多種向量量化演算法,包括K-means、GMM(高斯混合模型)和WA ...


物以類聚,聚類演算法使用最優化的演算法來計算數據點之間的距離,並將它們分組到最近的簇中。

Scipy的聚類模塊中,進一步分為兩個聚類子模塊:

  1. vq(vector quantization):提供了一種基於向量量化的聚類演算法。

vq模塊支持多種向量量化演算法,包括K-meansGMM(高斯混合模型)和WAVG(均勻分佈)。

  1. hierarchy:提供了一種基於層次聚類的聚類演算法。

hierarchy模塊支持多種層次聚類演算法,包括wardelbowcentroid

總之,Scipy中的vqhierarchy模塊都提供了一種基於最小化平方誤差的聚類演算法,
它們可以幫助我們快速地對大型數據集進行分組,從而更好地理解數據的分佈和模式。

1. vq 聚類

vq 聚類演算法的原理是將數據點映射到一組稱為“超空間”的低維向量空間中,然後將它們分組到最近的簇中。

首先,我們創建一些測試數據:(創建3個類別的測試數據)

import numpy as np
import matplotlib.pyplot as plt

data1 = np.random.randint(0, 30, (100, 3))
data2 = np.random.randint(30, 60, (100, 3))
data3 = np.random.randint(60, 100, (100, 3))

data = np.concatenate([data1, data2, data3])

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.scatter(data[:, 0], data[:, 1], data[:, 2])
plt.show()

image.png
data1data2data3分佈在3個區域,
每個數據集有100條數據,每條數據有3個屬性

1.1. 白化數據

聚類之前,一般會對數據進行白化,所謂白化數據,是指將數據集中的每個特征或每個樣本的值都統一為同一個範圍。
這樣做的目的是為了消除特征之間的量綱和數值大小差異,使得不同特征具有相似的重要性,從而更容易進行聚類演算法。

在聚類之前對數據進行白化處理也被稱為預處理階段。

from scipy.cluster.vq import whiten

# 白化數據
normal_data = whiten(data)

# 繪製白化後的數據
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.scatter(normal_data[:, 0], normal_data[:, 1], normal_data[:, 2])
plt.show()

image.png
從圖中可以看出,數據的分佈情況沒有改變,只是數據的範圍從0~100變成0.0~3.5
這就是白化的效果。

1.2. K-means

白化之後,就可以用K-meas方法來進行聚類運算了。
scipyvq模塊中有2個聚類函數:kmeanskmeans2

kmeans函數最少只要傳入兩個參數即可:

  1. 需要聚類的數據,也就是上一步白化的數據
  2. 聚類的數目

返回值有2部分:

  1. 各個聚類的中心點
  2. 各個點距離聚類中心點的歐式距離的平均值
from scipy.cluster.vq import kmeans 

center_points, distortion = kmeans(normal_data, 3)
print(center_points)
print(distortion)
# 運行結果
[[1.632802   1.56429847 1.51635413]
 [0.48357948 0.55988559 0.48842058]
 [2.81305235 2.84443275 2.78072325]]
0.5675874109728244

把三個聚類點繪製在圖中來看更加清楚:

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.scatter(normal_data[:, 0], 
           normal_data[:, 1], 
           normal_data[:, 2])
ax.scatter(
    center_points[:, 0],
    center_points[:, 1],
    center_points[:, 2],
    color="r",
    marker="^",
    linewidths=5,
)

plt.show()

image.png
圖中3個紅色的點就是聚類的中心點。

1.3. K-means2

kmeans2函數使用起來和kmeans類似,但是返回值有區別,
kmeans2的返回的是:

  1. 聚類的中心點坐標
  2. 每個聚類中所有點的索引
from scipy.cluster.vq import kmeans2

center_points, labels = kmeans2(normal_data, 3)
print(center_points)
print(labels)
# 運行結果
[[2.81305235 2.84443275 2.78072325]
 [1.632802   1.56429847 1.51635413]
 [0.48357948 0.55988559 0.48842058]]
[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 ... ...
 0 0 0 0]

可以看出,計算出的聚類中心點center_pointskmeans一樣(只是順序不一樣),
labels0,1,2三種值,代表normal_data中每個點屬於哪個分類。

kmeans2除了返回了聚類中心點,還有每個數據點屬於哪個聚類的信息,
所以我們繪圖時,可以將屬於不同聚類的點標記不同的顏色。

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
arr_data = [[], [], []]
for idx, nd in enumerate(normal_data):
    arr_data[labels[idx]].append(nd)

data = np.array(arr_data[0])
ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='lightblue')
data = np.array(arr_data[1])
ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='lightgreen')
data = np.array(arr_data[2])
ax.scatter(data[:, 0], data[:, 1], data[:, 2], color='lightyellow')

ax.scatter(
    center_points[:, 0],
    center_points[:, 1],
    center_points[:, 2],
    color="r",
    marker="^",
    linewidths=5,
)

plt.show()

image.png

2. hierarchy 聚類

hierarchy聚類演算法的步驟比較簡單:

  1. 將每個樣本視為一個簇
  2. 計算各個簇之間的距離,將距離最近的兩個簇合併為一個簇
  3. 重覆第二個步驟,直至到最後一個簇
from scipy.cluster.hierarchy import ward, fcluster, dendrogram
from scipy.spatial.distance import pdist

# 計算樣本數據之間的距離
# normal_data是之前白化之後的數據
dist = pdist(normal_data)

# 在距離上創建Ward連接矩陣
Z = ward(dist)

# 層次聚類之後的平面聚類
S = fcluster(Z, t=0.9, criterion='distance')
print(S)
# 運行結果
[20 26 23 18 18 22 18 28 21 22 28 26 27 27 20 17 23 20 26 23 17 25 20 22
 ... ...
  5 13  3  4  2  9  9 13 13  8 11  6]

返回的S中有300個數據,和normal_data中的數據一樣多,S中數值接近的點,分類越接近。

從數值看聚類結果不那麼明顯,scipy的層次聚類提供了一個dendrogram方法,內置了matpltlib的功能,
可以把層次聚類的結果用圖形展示出來。

P = dendrogram(Z, no_labels=True)
plt.show()

image.png
從這個圖可以看出每個數據分別屬於哪個層次的聚類。
最底層的葉子節點就是normal_datad中的各個數據,這些數據的索引信息可以從 P 中獲取。

# P是一個字典,包含聚類之後的信息
# key=ivl 是圖中最底層葉子節點在 normal_data 中的索引
print(P["ivl"])
# 運行結果
['236', '269', '244', ... ... '181', '175', '156', '157']

3. 總結

聚類分析可以幫助我們發現數據集中的內在結構、模式和相似性,從而更好地理解數據。
使用Scipy庫,可以幫助我們高效的完成數據的聚類分析,而不用去具體瞭解聚類分析演算法的實現方式。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景 現代網路環境中,敏感數據的處理是至關重要的。敏感數據包括個人身份信息、銀行賬號、手機號碼等,泄露這些數據可能導致用戶隱私泄露、財產損失等嚴重後果。因此,對敏感數據進行脫敏處理是一種必要的安全措施。 比如頁面上常見的敏感數據都是加*遮擋處理過的,如下圖所示。 接下來本文將以Spring Boot ...
  • 來源:blog.csdn.net/mu_wind/article/details/113806680 初識線程池 我們知道,線程的創建和銷毀都需要映射到操作系統,因此其代價是比較高昂的。出於避免頻繁創建、銷毀線程以及方便線程管理的需要,線程池應運而生。 線程池優勢 降低資源消耗:線程池通常會維護一些 ...
  • wmproxy wmproxy已用Rust實現http/https代理, socks5代理, 反向代理, 靜態文件伺服器,四層TCP/UDP轉發,內網穿透,後續將實現websocket代理等,會將實現過程分享出來,感興趣的可以一起造個輪子 項目地址 國內: https://gitee.com/tic ...
  • ArrayList簡介 ArrayList是List介面的實現類,底層基於數組實現,容量可根據需要動態增加,相當於動態數組。ArrayList繼承於AbstractList,並且還實現了Cloneable、Serializable、RandomAccess介面。 List:表明是列表數據結構,可以通 ...
  • 響應數據 @ResponseBody 類型:方法註解、類註解 位置:Controller方法、類上 作用:將方法返回值直接響應,如果返回值類型是 實體對象/集合 ,將會轉換為json格式響應 說明:@RestController = @Controller + @ResponseBody 統一響應結 ...
  • 大家普遍認知中,字元串拼接要使用StringBuilder,那為什麼idea會建議你是用“+”呢,那到底StringBuilder 和 “+”有什麼具體區別呢,我們一起來探究一下。 ...
  • /** * 1、業務場景 * 1、定時執行時,可能出現數據量大,執行不完,線程直接被終止掉,丟數據。 */ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; ...
  • 本人是tex新手,如果各位大佬有更好的方法歡迎分享,不勝感激。 適用情況 本文適用於使用\begin{thebibliography}和\bibitem排序的情況,如果使用bibtex排序那麼網上很多教程。 在使用tex發現不會自動排序非常僵硬,即如下情況: 在參考文獻的位置引用排在第二個,但是在原 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...