0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

介紹一種基于最小化平方誤差的聚類算法

冬至子 ? 來源:數(shù)據(jù)之書 ? 作者:databook ? 2023-08-09 16:01 ? 次閱讀

物以類聚, 「聚類算法 使用最優(yōu)化的算法來計算數(shù)據(jù)點之間的距離,并將它們分組到最近的簇中。

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

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

「vq模塊」 支持多種向量量化算法,包括K-means、GMM(高斯混合模型)和WAVG(均勻分布)。

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

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

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

1. vq 聚類

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

首先,我們創(chuàng)建一些測試數(shù)據(jù):(創(chuàng)建3個類別的測試數(shù)據(jù))

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()

圖片

data1,data2,data3分布在3個區(qū)域,
每個數(shù)據(jù)集有 「100條」 數(shù)據(jù),每條數(shù)據(jù)有 「3個屬性」 。

1.1. 白化數(shù)據(jù)

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

在聚類之前對數(shù)據(jù)進行 「白化處理」 也被稱為 「預處理」 階段。

from scipy.cluster.vq import whiten

# 白化數(shù)據(jù)
normal_data = whiten(data)

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

圖片

從圖中可以看出,數(shù)據(jù)的分布情況沒有改變,只是數(shù)據(jù)的范圍從0~100變成0.0~3.5。
這就是白化的效果。

1.2. K-means

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

kmeans函數(shù)最少只要傳入兩個 參數(shù) 即可:

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

「返回值」 有2部分:

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

center_points, distortion = kmeans(normal_data, 3)
print(center_points)
print(distortion)
# 運行結(jié)果
[[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()

圖片

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

1.3. K-means2

kmeans2函數(shù)使用起來和kmeans類似,但是返回值有區(qū)別,
kmeans2的返回的是:

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

center_points, labels = kmeans2(normal_data, 3)
print(center_points)
print(labels)
# 運行結(jié)果
[[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除了返回了聚類中心點,還有每個數(shù)據(jù)點屬于哪個聚類的信息
所以我們繪圖時,可以將屬于不同聚類的點標記不同的顏色。

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()

圖片

2. hierarchy 聚類

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

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

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

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

# 層次聚類之后的平面聚類
S = fcluster(Z, t=0.9, criterion='distance')
print(S)
# 運行結(jié)果
[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個數(shù)據(jù)」 ,和normal_data中的數(shù)據(jù)一樣多,S中數(shù)值接近的點,分類越接近。

從數(shù)值看聚類結(jié)果不那么明顯,scipy的層次聚類提供了一個dendrogram方法,內(nèi)置了matpltlib的功能,
可以把層次聚類的結(jié)果用圖形展示出來。

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

圖片
從這個圖可以看出每個數(shù)據(jù)分別屬于哪個層次的聚類。
最底層的葉子節(jié)點就是normal_data中的各個數(shù)據(jù),這些數(shù)據(jù)的索引信息可以從 P 中獲取。

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

3. 總結(jié)

聚類分析可以幫助我們發(fā)現(xiàn)數(shù)據(jù)集中的內(nèi)在結(jié)構、模式和相似性,從而更好地理解數(shù)據(jù)。
使用Scipy庫,可以幫助我們高效的完成數(shù)據(jù)的聚類分析,而不用去具體了解聚類分析算法的實現(xiàn)方式。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19100

    瀏覽量

    228813
  • 向量機
    +關注

    關注

    0

    文章

    166

    瀏覽量

    20833
  • GMM
    GMM
    +關注

    關注

    0

    文章

    5

    瀏覽量

    7244
收藏 人收藏

    評論

    相關推薦

    一種基于GiST的層次算法

    層次方法是聚類分析的個重要方法。該文利用通用搜索樹實現(xiàn)了一種新的層次
    發(fā)表于 04-23 10:10 ?24次下載

    一種基于層次的屬性全局離散算法

    本文摒棄了以往利用斷點集來進行離散算法思想,提出了一種新的基于粗糙集和分裂的層次的全局離散
    發(fā)表于 12-29 17:15 ?3次下載

    一種改進的FCM算法及其在赤潮預測中的應用

    一種改進的FCM算法及其在赤潮預測中的應用:針對傳統(tǒng)FCM算法的不足,文中提出了一種改進的F
    發(fā)表于 03-15 15:38 ?26次下載

    一種原型模糊的初始方法

    一種原型模糊的初始方法 模糊是非監(jiān)督
    發(fā)表于 10-21 16:02 ?986次閱讀

    一種有效的多關系算法

    一種有效的多關系算法_鄧左祥
    發(fā)表于 01-03 15:24 ?0次下載

    一種改進的BIRCH算法方法

    為解決傳統(tǒng)BIRCH算法對數(shù)據(jù)對象輸入順序敏感、結(jié)果不穩(wěn)定的問題,提出了一種改進的BIRCH算法。該
    發(fā)表于 11-10 15:52 ?1次下載
    <b class='flag-5'>一種</b>改進的BIRCH<b class='flag-5'>算法</b><b class='flag-5'>聚</b><b class='flag-5'>類</b>方法

    一種改進的凝聚型層次算法

    在比特流未知協(xié)議識別過程中,針對如何將得到的多協(xié)議數(shù)據(jù)幀分為單協(xié)議數(shù)據(jù)幀這問題,提出了一種改進的凝聚型層次算法。該
    發(fā)表于 11-21 08:58 ?0次下載
    <b class='flag-5'>一種</b>改進的凝聚型層次<b class='flag-5'>聚</b><b class='flag-5'>類</b><b class='flag-5'>算法</b>

    K均值算法的MATLAB實現(xiàn)

    K-means算法是最簡單的一種算法算法的目的是使各個樣本與所在
    發(fā)表于 12-01 14:07 ?2w次閱讀
    K均值<b class='flag-5'>聚</b><b class='flag-5'>類</b><b class='flag-5'>算法</b>的MATLAB實現(xiàn)

    一種新的人工魚群混合算法

    人工魚群是一種隨機搜索優(yōu)化算法,具有較快的收斂速度,對問題的機理模型與描述無嚴格要求,具有廣泛的應用范圍。本文在該算法的基礎上,結(jié)合傳統(tǒng)的K-means
    發(fā)表于 12-04 16:18 ?0次下載

    一種新的基于流行距離的譜算法

    本文提出了一種新的基于流行距離的譜算法,這是一種新型的聚類分析算法。不僅能夠?qū)θ我獾姆且?guī)則形
    發(fā)表于 12-07 14:53 ?3次下載

    基于最小重構誤差向量圖像檢索算法

    針對局部聚合描述符向量( VLAD)模型中對特征軟量化時權重系數(shù)的取值不確定性和特征量化誤差較大問題,提出一種具有最小重構誤差的權重系數(shù)分配算法
    發(fā)表于 12-18 09:56 ?0次下載
    基于<b class='flag-5'>最小</b>重構<b class='flag-5'>誤差</b>向量圖像檢索<b class='flag-5'>算法</b>

    一種基于MapReduce的圖結(jié)構算法

    圖結(jié)構(SCAN)是一種著名的基于密度的圖算法。該
    發(fā)表于 12-19 11:05 ?0次下載
    <b class='flag-5'>一種</b>基于MapReduce的圖結(jié)構<b class='flag-5'>聚</b><b class='flag-5'>類</b><b class='flag-5'>算法</b>

    一種改進的聯(lián)合相似度推薦算法

    協(xié)同過濾算法由于推薦效果良好,而被廣泛應用于推薦領域,但其在數(shù)據(jù)稀疏及冷啟動的情況下會導致推薦效果明顯下降。在數(shù)據(jù)稀疏情況下,為充分利用用戶的歷史信息以提髙算法的推薦精度,提出一種改進的
    發(fā)表于 03-18 11:17 ?10次下載
    <b class='flag-5'>一種</b>改進的<b class='flag-5'>聚</b><b class='flag-5'>類</b>聯(lián)合相似度推薦<b class='flag-5'>算法</b>

    一種自適應的關聯(lián)融合算法

    為解決傳統(tǒng)算法多數(shù)需要預先設定聚參數(shù)且無法有效識別異常點和噪聲點的問題,提出一種自適應的關聯(lián)融合
    發(fā)表于 04-01 16:16 ?13次下載
    <b class='flag-5'>一種</b>自適應的關聯(lián)融合<b class='flag-5'>聚</b><b class='flag-5'>類</b><b class='flag-5'>算法</b>

    一種基于分塊集成的圖像算法

    的圖像算法( Block integration Based Image Clustering,BI-CⅠ。首先,將圖像數(shù)據(jù)分為若干矩陣塊;然后,利用核范數(shù)矩陣回歸構造基于某矩陣塊的系數(shù)矩陣,同時提岀了
    發(fā)表于 05-29 14:20 ?3次下載