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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

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

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

Scipy的聚類模塊中,進(jìn)一步分為兩個(gè)聚類子模塊:

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

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

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

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

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

1. vq 聚類

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

首先,我們創(chuàng)建一些測(cè)試數(shù)據(jù):(創(chuàng)建3個(gè)類別的測(cè)試數(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個(gè)區(qū)域,
每個(gè)數(shù)據(jù)集有 「100條」 數(shù)據(jù),每條數(shù)據(jù)有 「3個(gè)屬性」 。

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

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

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

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ù)的分布情況沒(méi)有改變,只是數(shù)據(jù)的范圍從0~100變成0.0~3.5。
這就是白化的效果。

1.2. K-means

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

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

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

「返回值」 有2部分:

  1. 各個(gè)聚類的中心點(diǎn)
  2. 各個(gè)點(diǎn)距離聚類中心點(diǎn)的歐式距離的平均值
from scipy.cluster.vq import kmeans 

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

把三個(gè)聚類點(diǎn)繪制在圖中來(lái)看更加清楚:

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個(gè)紅色的點(diǎn)就是聚類的中心點(diǎn)。

1.3. K-means2

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

  1. 聚類的中心點(diǎn)坐標(biāo)
  2. 每個(gè)聚類中所有點(diǎn)的索引
from scipy.cluster.vq import kmeans2

center_points, labels = kmeans2(normal_data, 3)
print(center_points)
print(labels)
# 運(yùn)行結(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]

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

kmeans2除了返回了聚類中心點(diǎn),還有每個(gè)數(shù)據(jù)點(diǎn)屬于哪個(gè)聚類的信息,
所以我們繪圖時(shí),可以將屬于不同聚類的點(diǎn)標(biāo)記不同的顏色。

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聚類算法的步驟比較簡(jiǎn)單:

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

# 計(jì)算樣本數(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)
# 運(yùn)行結(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個(gè)數(shù)據(jù)」 ,和normal_data中的數(shù)據(jù)一樣多,S中數(shù)值接近的點(diǎn),分類越接近。

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

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

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

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

3. 總結(jié)

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

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

    關(guān)注

    68

    文章

    19286

    瀏覽量

    229852
  • 向量機(jī)
    +關(guān)注

    關(guān)注

    0

    文章

    166

    瀏覽量

    20879
  • GMM
    GMM
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    7258
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一種基于GiST的層次算法

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

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

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

    一種改進(jìn)的FCM算法及其在赤潮預(yù)測(cè)中的應(yīng)用

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

    一種原型模糊的初始方法

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

    一種有效的多關(guān)系算法

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

    一種改進(jìn)的BIRCH算法方法

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

    一種改進(jìn)的凝聚型層次算法

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

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

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

    一種新的人工魚(yú)群混合算法

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

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

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

    基于最小重構(gòu)誤差向量圖像檢索算法

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

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

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

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

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

    一種自適應(yīng)的關(guān)聯(lián)融合算法

    為解決傳統(tǒng)算法多數(shù)需要預(yù)先設(shè)定聚參數(shù)且無(wú)法有效識(shí)別異常點(diǎn)和噪聲點(diǎn)的問(wèn)題,提出一種自適應(yīng)的關(guān)聯(lián)融合
    發(fā)表于 04-01 16:16 ?13次下載
    <b class='flag-5'>一種</b>自適應(yīng)的關(guān)聯(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ù)矩陣回歸構(gòu)造基于某矩陣塊的系數(shù)矩陣,同時(shí)提岀了
    發(fā)表于 05-29 14:20 ?3次下載