【機器學習聚類算法實戰-5】機器學習聚類算法之DBSCAN聚類、K均值聚類算法、分層聚類和不同度量的聚集聚類實例分析

34889d2e7fec4a02bb0ae3a22b011a2a.png

🎩 歡迎來到技術探索的奇幻世界👨?💻

📜 個人主頁:@一倫明悅-CSDN博客

?🏻 作者簡介:?C++軟件開發、Python機器學習愛好者

🗣??互動與支持💬評論?? ? ?👍🏻點贊?? ? ?📂收藏?? ? 👀關注+

如果文章有所幫助,歡迎留下您寶貴的評論,

點贊加收藏支持我,點擊關注,一起進步!

目錄

前言 ? ?

正文

01-?DBSCAN聚類算法簡介 ? ?

02-?基于K均值的顏色量化實戰 ? ?

03-?分層聚類:結構化區域與非結構化區域 ? ?

04-?不同度量的聚集聚類實戰 ? ?

總結


前言 ? ?

??????????DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚類算法是一種基于密度的聚類算法,能夠有效地發現任意形狀的聚類,并能夠處理噪聲數據。該算法通過定義特定半徑內的數據點數量來構建具有足夠密度的聚類,并將稀疏區域或孤立點識別為噪聲。DBSCAN算法的優勢在于無需指定聚類數目,適用于各種數據形狀和大小的數據集。

????????K均值聚類算法是一種基于距離的聚類算法,將數據點分為K個簇以最小化每個簇內數據點到簇中心的距離平方和。該算法需要提前指定簇的數量K,并通過隨機初始化簇中心和迭代更新樣本的簇分配來進行聚類。K均值聚類算法的優勢在于簡單易理解、實現方便,但對初始質心敏感,且對異常值敏感。

????????分層聚類是一種層次化的聚類方法,根據數據間的相似性逐步合并聚類簇,形成一個完整的聚類層次結構。分層聚類方法包括凝聚聚類(agglomerative clustering)和分裂聚類(divisive clustering)兩種主要策略。凝聚聚類從單個樣本開始,逐步合并最相似的聚類,形成一個樹狀結構;分裂聚類則從一個包含所有樣本的聚類開始,逐步分裂為子聚類。分層聚類的優勢在于可以同時得到不同層次的聚類結果,幫助分析數據的聚類結構。

????????不同度量的聚集實例分析包括了選擇不同的距離度量或相似性度量來計算數據點之間的距離,并應用于聚類算法中。常用的距離度量包括歐氏距離、曼哈頓距離、余弦相似度等,不同的度量方式會影響聚類結果的質量和形狀。選擇合適的度量方式對于聚類算法的效果至關重要,需要根據具體數據的特點和問題需求進行選擇。例如,在處理圖像數據時,可以選擇使用像素之間的歐氏距離;在自然語言處理領域,可以選擇余弦相似度度量文本之間的相似性。通過實例分析不同度量方式在聚類任務中的應用,可以更好地理解數據間的相似性和差異性,提高聚類算法的效果和準確性。

正文

01-?DBSCAN聚類算法簡介 ? ?

??????????DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚類算法是一種基于密度的聚類算法,能夠有效地發現任意形狀的聚類,并可以處理噪聲數據。下面是對DBSCAN聚類算法的詳細分析,包括原理和步驟:

????????原理分析:

????????DBSCAN算法基于以下兩個重要概念來實現聚類:

?????????核心對象(Core Point):如果一個數據點的鄰域內至少包含指定數量的數據點(MinPts),則該點被認為是核心對象。

?????????直接密度可達(Directly Density Reachable):如果一個數據點在另一個數據點的鄰域內,且另一個數據點是核心對象,則該數據點通過核心對象直接密度可達。????????

????????基于以上概念,DBSCAN算法將數據點分為三種類型:????????

????????核心對象:在其鄰域內至少包含 MinPts 個數據點的數據點。

????????邊界點:不是核心對象,但位于核心對象的鄰域內。

????????噪聲點(Noise Point):既不是核心對象,也不是邊界點。

????????步驟分析:

????????參數設置:設定兩個參數,eps?表示鄰域的半徑,MinPts?表示一個核心對象所需的最少數據點個數。

????????核心對象識別:對數據集中的每個數據點進行遍歷,計算其鄰域內的數據點數目,標記核心對象。(核心對象滿足在其鄰域內至少包含 MinPts 個數據點)

????????聚類擴展:從任意未訪問的核心對象開始,探索其直接密度可達的數據點進行連接并形成一個聚類。若邊界點位于多個核心對象的鄰域內,則將其分配給其中一個核心對象的聚類

????????噪聲點處理:將未分配到任何聚類的噪聲點處理為離群點。

????????算法特點:

????????自動確定聚類數目:無需事先指定聚類數目,只需設定鄰域半徑?eps?和最小數據點數?MinPts

????????適用于任意形狀的簇:DBSCAN能夠有效地捕捉數據中的任意形狀的聚類。

????????對噪聲數據魯棒:能夠將孤立點或噪聲數據識別為離群點,不會干擾聚類過程。

????????高效性:相對于K均值等算法,DBSCAN在處理大規模數據集時更為高效。

????????下面給出具體代碼分析應用過程:?這段代碼演示了如何使用DBSCAN算法對生成的樣本數據進行聚類,并對聚類結果進行評估和可視化。

  1. 首先,使用?make_blobs?生成了三個簇的樣本數據,并進行了標準化處理。
  2. 然后,通過?DBSCAN?對標準化后的數據進行聚類,設置了?eps=0.3?和?min_samples=10?作為參數。
  3. 計算了聚類結果中的核心樣本點,并對每個樣本點進行了標記。
  4. 使用不同的評估指標(如均勻性、完整性、V-measure 等)評估了聚類結果的質量。
  5. 最后,通過可視化展示了聚類結果。將核心點和邊界點以不同的大小和顏色進行繪制,用黑色表示噪聲點。
import numpy as npfrom sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler# #############################################################################
# Generate sample data
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4,random_state=0)X = StandardScaler().fit_transform(X)# #############################################################################
# Compute DBSCAN
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)print('Estimated number of clusters: %d' % n_clusters_)
print('Estimated number of noise points: %d' % n_noise_)
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("Adjusted Rand Index: %0.3f"% metrics.adjusted_rand_score(labels_true, labels))
print("Adjusted Mutual Information: %0.3f"% metrics.adjusted_mutual_info_score(labels_true, labels))
print("Silhouette Coefficient: %0.3f"% metrics.silhouette_score(X, labels))# #############################################################################
# Plot result
import matplotlib.pyplot as plt# Black removed and is used for noise instead.
unique_labels = set(labels)
colors = [plt.cm.Spectral(each)for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):if k == -1:# Black used for noise.col = [0, 0, 0, 1]class_member_mask = (labels == k)xy = X[class_member_mask & core_samples_mask]plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),markeredgecolor='k', markersize=14)xy = X[class_member_mask & ~core_samples_mask]plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),markeredgecolor='k', markersize=6)plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.savefig("../5.png", dpi=500)

????????實例運行結果如下圖所示:

  • 圖中不同顏色的點表示不同的聚類簇,同一簇內的點顏色相同。
  • 大點表示核心樣本點,小點表示邊界點。
  • 黑色的點表示噪聲點,即未分配到任何簇的樣本點。
  • 圖像中心的聚類簇密集程度較高,周圍的樣本點則較為分散,符合DBSCAN對于密度聚類的特點。
  • 通過圖像可以直觀地觀察到聚類結果,評估聚類算法的性能和有效性。

7ec14c8bf5ff413187d9fea870f972b1.png

02-?基于K均值的顏色量化實戰 ? ?

?????????基于K均值的顏色量化是一種常用的圖像處理技術,可以將一幅彩色圖像中的顏色數量減少,從而減小圖像的尺寸,降低存儲和處理的復雜度。下面是對基于K均值的顏色量化的詳細分析:

????????原理分析:

  1. 數據準備:將彩色圖像中的每個像素看作是一個三維向量,表示紅、綠、藍(RGB)分量的取值。數據準備階段即將圖像中的所有像素點按照RGB值組織成一個數據集。
  2. K均值算法:將數據集中的像素點以RGB向量的形式聚類成K個簇,使得每個像素點被分配到與之最近的簇中心,從而實現顏色壓縮。
  3. 迭代優化:迭代地更新簇中心,直至達到收斂條件(如中心點不再變化、迭代次數達到上限等)。
  4. 顏色替換:將每個簇的顏色替換為該簇內所有像素點的平均顏色值。

????????實現步驟:

  1. 初始化:隨機選擇K個像素點作為初始的簇中心。
  2. 簇分配:計算每個像素點與各個簇中心的距離,將其分配到最近的簇中心。
  3. 更新中心:更新每個簇中心為該簇內所有像素點的平均值。
  4. 迭代:重復步驟2和3直至滿足終止條件。
  5. 顏色替代:將每個像素點的顏色替換為其所屬簇的簇中心顏色。

????????算法特點:

  • 簡單高效:K均值算法實現簡單,易于理解和實現。
  • 需預先確定K值:K均值算法需要事先確定聚類的數量K,不同的K值可能導致不同的聚類結果。
  • 對初始化敏感:簇中心的初始化對最終結果有較大影響,可能會陷入局部最優解。
  • 適用性廣泛:K均值算法在顏色量化等應用領域效果較好,但對于異性方差較大的數據不太適用。

????????應用領域:

  • 圖像壓縮:通過減少顏色數量,可以降低圖像的尺寸和存儲空間。
  • 圖像處理:在圖像編輯中,顏色量化可以用于圖像風格遷移、圖像復原等領域。
  • 數據可視化:顏色量化也常用于將圖像的顏色數目減少用于數據可視化等領域。

????????下面給出具體代碼分析應用過程:?這段代碼實現了基于K均值的顏色量化,并使用了scikit-learn庫中的KMeans模型進行顏色壓縮。以下是對代碼的簡要解釋和對生成的圖像的詳細分析:

  1. 加載中國宮殿的圖像,并將圖像轉換為浮點數表示,范圍在[0,1]之間。
  2. 將圖像轉換為2D的numpy數組,以便用于K均值算法。
  3. 隨機選擇1000個像素點的子樣本用于訓練K均值模型,并擬合模型。
  4. 使用訓練好的K均值模型對整個圖像進行顏色壓縮,并預測各像素點的顏色類別。
  5. 使用隨機選擇的顏色作為參考,對整個圖像進行顏色壓縮并預測顏色類別。
  6. 定義recreate_image()函數以重新構建壓縮后的圖像。
  7. 顯示原始圖像、K均值顏色壓縮后的圖像和隨機顏色壓縮后的圖像。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin
from sklearn.datasets import load_sample_image
from sklearn.utils import shuffle
from time import timen_colors = 64# Load the Summer Palace photo
china = load_sample_image("china.jpg")# Convert to floats instead of the default 8 bits integer coding. Dividing by
# 255 is important so that plt.imshow behaves works well on float data (need to
# be in the range [0-1])
china = np.array(china, dtype=np.float64) / 255# Load Image and transform to a 2D numpy array.
w, h, d = original_shape = tuple(china.shape)
assert d == 3
image_array = np.reshape(china, (w * h, d))print("Fitting model on a small sub-sample of the data")
t0 = time()
image_array_sample = shuffle(image_array, random_state=0)[:1000]
kmeans = KMeans(n_clusters=n_colors, random_state=0).fit(image_array_sample)
print("done in %0.3fs." % (time() - t0))# Get labels for all points
print("Predicting color indices on the full image (k-means)")
t0 = time()
labels = kmeans.predict(image_array)
print("done in %0.3fs." % (time() - t0))codebook_random = shuffle(image_array, random_state=0)[:n_colors]
print("Predicting color indices on the full image (random)")
t0 = time()
labels_random = pairwise_distances_argmin(codebook_random,image_array,axis=0)
print("done in %0.3fs." % (time() - t0))def recreate_image(codebook, labels, w, h):"""Recreate the (compressed) image from the code book & labels"""d = codebook.shape[1]image = np.zeros((w, h, d))label_idx = 0for i in range(w):for j in range(h):image[i][j] = codebook[labels[label_idx]]label_idx += 1return image# Display all results, alongside original image
plt.figure(1)
plt.clf()
plt.axis('off')
plt.title('Original image (96,615 colors)')
plt.imshow(china)
plt.savefig("../3.png", dpi=500)
plt.figure(2)
plt.clf()
plt.axis('off')
plt.title('Quantized image (64 colors, K-Means)')
plt.imshow(recreate_image(kmeans.cluster_centers_, labels, w, h))
plt.savefig("../4.png", dpi=500)
plt.figure(3)
plt.clf()
plt.axis('off')
plt.title('Quantized image (64 colors, Random)')
plt.imshow(recreate_image(codebook_random, labels_random, w, h))
plt.savefig("../5.png", dpi=500)
plt.show()

????????實例運行結果如下圖所示:

  1. 原始圖像(96,615種顏色):展示了原始彩色圖像,顏色細節豐富。
  2. K均值顏色壓縮后的圖像(64種顏色):經過K均值算法壓縮處理,僅采用64種顏色表達圖像,顏色數量減少,但整體色調保持。
  3. 隨機顏色壓縮后的圖像(64種顏色):使用隨機選取的顏色進行壓縮后的圖像,色調會略有不同于K均值方法,但也達到了顏色量化的目的。

1a26343e815c4e98bef87b6218d1cd5b.png

?7015656436d64f5d803fdfcdb27006cf.png

253abd99d691403dba1814b7cd131117.png

03-?分層聚類:結構化區域與非結構化區域 ? ?

?????????分層聚類是一種聚類分析方法,它通過逐步合并或分裂聚類來構建聚類層次結構。在圖像處理領域中,分層聚類可以針對圖像中的結構化區域(如邊緣、紋理等)和非結構化區域(如背景、平坦區域等)進行分析和處理。下面是對分層聚類在處理結構化區域與非結構化區域的詳細分析:

結構化區域和非結構化區域的特點:

  • 結構化區域:通常指圖像中具有明顯紋理、邊緣、形狀等特征的區域,這些區域具有一定的規律性和重復性。
  • 非結構化區域:指圖像中較為平坦、連續的區域,缺乏明顯的紋理和邊緣特征,整體呈現較為均勻的顏色分布。

分層聚類在處理結構化區域和非結構化區域的應用:

  1. 結構化區域

    • 特征提取:分層聚類可以幫助提取結構化區域的特征,如邊緣檢測、紋理分析等,從而實現對結構化區域的定位和描述。
    • 分割和識別:通過分層聚類,可以將圖像中相似的結構化區域劃分到同一聚類中,并進一步實現目標分割和識別。
  2. 非結構化區域

    • 背景提取:分層聚類可以幫助識別并提取出圖像中的非結構化背景區域,實現對圖像中主體與背景的分離。
    • 顏色量化:將非結構化區域進行聚類處理,可以實現對顏色的量化和壓縮,減少圖像中的細節和噪聲。

實現方法:

  1. 分層聚類算法選擇:常用的分層聚類算法包括層次聚類、BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)等,根據應用場景選擇適合的算法。
  2. 特征提取與表示:針對結構化區域和非結構化區域提取合適的特征向量,可以是顏色、紋理、邊緣等特征。
  3. 聚類處理:根據提取的特征向量進行分層聚類,構建聚類層次結構,將相似的區域合并或分裂。
  4. 結果分析和后處理:對于結構化區域,可以進一步處理提取的特征信息,對于非結構化區域,可以根據聚類結果進行后續處理,如背景提取、顏色量化等操作。

應用場景:

  • 醫學圖像分析:對醫學圖像中的病變結構和正常組織進行區分和分析。
  • 地圖圖像處理:識別地圖中的道路、水域等結構化區域以及其他地物。
  • 圖像分割:將圖像分割為不同的結構和區域,便于進一步處理和分析。

????????通過分層聚類對結構化區域和非結構化區域進行分析和區分,有助于更好地理解圖像內容、實現圖像分割和特征提取,并在各種圖像處理應用中發揮作用。

?????下面給出具體代碼分析應用過程:這段代碼主要是使用了 scikit-learn 庫進行分層聚類(Hierarchical Clustering)的示例代碼,針對生成的瑞士卷數據集(Swiss Roll Dataset)進行了無連接約束和有連接約束兩種情況的聚類分析,并將結果通過 3D 散點圖可視化展示。下面對代碼和生成的圖像進行詳細分析:

  1. 首先,使用 make_swiss_roll 生成含有噪音的瑞士卷數據集 X,然后將其變窄處理。

  2. 接著,使用 AgglomerativeClustering 進行分層聚類。首先對無連接約束的情況進行聚類(ward 連接方式,將數據分為 6 類),計算耗時并輸出結果。

  3. 接著,根據數據結構構建連接度矩陣(這里使用的是最近的 10 個鄰居),再次使用 AgglomerativeClustering 進行有連接約束的聚類,同樣分為 6 類,計算耗時并輸出結果。

  4. 最后,根據聚類結果繪制兩幅3D散點圖,分別展示了無連接約束和有連接約束下的聚類效果,并在標題中顯示了計算耗時。

import time as time
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_swiss_roll# #############################################################################
# Generate data (swiss roll dataset)
n_samples = 1500
noise = 0.05
X, _ = make_swiss_roll(n_samples, noise=noise)
# Make it thinner
X[:, 1] *= .5# #############################################################################
# Compute clustering
print("Compute unstructured hierarchical clustering...")
st = time.time()
ward = AgglomerativeClustering(n_clusters=6, linkage='ward').fit(X)
elapsed_time = time.time() - st
label = ward.labels_
print("Elapsed time: %.2fs" % elapsed_time)
print("Number of points: %i" % label.size)# #############################################################################
# Plot result
fig = plt.figure()
ax = p3.Axes3D(fig)
ax.view_init(7, -80)
for l in np.unique(label):ax.scatter(X[label == l, 0], X[label == l, 1], X[label == l, 2],color=plt.cm.jet(np.float(l) / np.max(label + 1)),s=20, edgecolor='k')
plt.title('Without connectivity constraints (time %.2fs)' % elapsed_time)
plt.savefig("../4.png", dpi=500)# #############################################################################
# Define the structure A of the data. Here a 10 nearest neighbors
from sklearn.neighbors import kneighbors_graph
connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)# #############################################################################
# Compute clustering
print("Compute structured hierarchical clustering...")
st = time.time()
ward = AgglomerativeClustering(n_clusters=6, connectivity=connectivity,linkage='ward').fit(X)
elapsed_time = time.time() - st
label = ward.labels_
print("Elapsed time: %.2fs" % elapsed_time)
print("Number of points: %i" % label.size)# #############################################################################
# Plot result
fig = plt.figure()
ax = p3.Axes3D(fig)
ax.view_init(7, -80)
for l in np.unique(label):ax.scatter(X[label == l, 0], X[label == l, 1], X[label == l, 2],color=plt.cm.jet(float(l) / np.max(label + 1)),s=20, edgecolor='k')
plt.title('With connectivity constraints (time %.2fs)' % elapsed_time)
plt.savefig("../5.png", dpi=500)
plt.show()

????????實例運行結果如下圖所示:

  • 無連接約束聚類結果:圖像中展示了數據點按照聚類結果著色,并在三維空間中展示其分布情況。不同顏色代表不同的聚類簇,展示了數據點的聚類效果。
  • 有連接約束聚類結果:同樣是根據聚類結果著色展示數據點的分布情況,不同顏色代表不同的聚類簇。由于考慮了數據點之間的連接性,聚類效果可能會有所不同。

c0ecadd22144418a87fc1668bd776884.png

aa0acfa4d4db4f30a68c4d32e458b366.png?

04-?不同度量的聚集聚類實戰 ? ?

?????????在數據挖掘和機器學習領域中,聚集聚類(Agglomerative Clustering)是一種常見的聚類算法,它通過不斷地將最相近的數據點或簇進行合并來構建聚類結構。在聚集聚類中,存在多種不同的度量方法用于衡量數據點之間的相似性或距離,從而影響最終的聚類結果。以下是一些常用的度量方法:

  1. 歐氏距離(Euclidean Distance):最常見的距離度量方法之一,計算兩個數據點之間的直線距離。歐氏距離適用于數據特征為連續值的情況。

  2. 曼哈頓距離(Manhattan Distance):也稱為城市街區距離,計算兩個數據點在各個坐標軸上的距離總和。適用于特征為連續值的情況。

  3. 切比雪夫距離(Chebyshev Distance):計算兩個數據點在各個坐標軸上的最大差值。適用于處理數據縮放不一致的情況。

  4. 閔可夫斯基距離(Minkowski Distance):歐氏距離和曼哈頓距離的泛化形式,可以通過參數來控制距離的計算方式。

  5. 余弦相似度(Cosine Similarity):用于衡量兩個向量之間的夾角余弦值,而非距離,適用于處理文本數據或稀疏數據。

????????選擇合適的距離度量方法對聚集聚類的結果影響巨大,不同的數據特點和應用場景可能需要不同的度量方法來獲得最佳的聚類效果。在實際應用中,可以根據數據的特征和領域知識來選擇合適的距離度量方法,以及調整算法參數來優化聚類結果。

?????下面給出具體代碼分析應用過程:這段代碼主要是對生成的波形數據進行聚類分析,并使用不同的距離度量(余弦距離、歐氏距離、曼哈頓距離)來比較聚類結果。代碼中的主要步驟包括:

  1. 生成具有三種波形模式的數據集,每種模式有30個樣本。
  2. 繪制基本波形數據的真實標簽情況,展示每種波形模式的數據分布情況。
  3. 計算不同波形類別之間的平均距離,并繪制熱圖展示不同度量方式下的類間距離情況。
  4. 使用層次聚類算法(Agglomerative Clustering)對數據進行聚類,分別使用余弦距離、歐氏距離、曼哈頓距離進行聚類,并繪制聚類結果圖像。
import matplotlib.pyplot as plt
import numpy as npfrom sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import pairwise_distancesnp.random.seed(0)# Generate waveform data
n_features = 2000
t = np.pi * np.linspace(0, 1, n_features)def sqr(x):return np.sign(np.cos(x))X = list()
y = list()
for i, (phi, a) in enumerate([(.5, .15), (.5, .6), (.3, .2)]):for _ in range(30):phase_noise = .01 * np.random.normal()amplitude_noise = .04 * np.random.normal()additional_noise = 1 - 2 * np.random.rand(n_features)# Make the noise sparseadditional_noise[np.abs(additional_noise) < .997] = 0X.append(12 * ((a + amplitude_noise)* (sqr(6 * (t + phi + phase_noise)))+ additional_noise))y.append(i)X = np.array(X)
y = np.array(y)n_clusters = 3labels = ('Waveform 1', 'Waveform 2', 'Waveform 3')# Plot the ground-truth labelling
plt.figure()
plt.axes([0, 0, 1, 1])
for l, c, n in zip(range(n_clusters), 'rgb',labels):lines = plt.plot(X[y == l].T, c=c, alpha=.5)lines[0].set_label(n)plt.legend(loc='best')plt.axis('tight')
plt.axis('off')
plt.suptitle("Ground truth", size=20)
plt.savefig("../5.png", dpi=500)# Plot the distances
for index, metric in enumerate(["cosine", "euclidean", "cityblock"]):avg_dist = np.zeros((n_clusters, n_clusters))plt.figure(figsize=(5, 4.5))for i in range(n_clusters):for j in range(n_clusters):avg_dist[i, j] = pairwise_distances(X[y == i], X[y == j],metric=metric).mean()avg_dist /= avg_dist.max()for i in range(n_clusters):for j in range(n_clusters):plt.text(i, j, '%5.3f' % avg_dist[i, j],verticalalignment='center',horizontalalignment='center')plt.imshow(avg_dist, interpolation='nearest', cmap=plt.cm.gnuplot2,vmin=0)plt.xticks(range(n_clusters), labels, rotation=45)plt.yticks(range(n_clusters), labels)plt.colorbar()plt.suptitle("Interclass %s distances" % metric, size=18)plt.tight_layout()
plt.savefig("../4.png", dpi=500)# Plot clustering results
for index, metric in enumerate(["cosine", "euclidean", "cityblock"]):model = AgglomerativeClustering(n_clusters=n_clusters,linkage="average", affinity=metric)model.fit(X)plt.figure()plt.axes([0, 0, 1, 1])for l, c in zip(np.arange(model.n_clusters), 'rgbk'):plt.plot(X[model.labels_ == l].T, c=c, alpha=.5)plt.axis('tight')plt.axis('off')plt.suptitle("AgglomerativeClustering(affinity=%s)" % metric, size=20)plt.savefig("../3.png", dpi=500)
plt.show()

????????實例運行結果如下圖所示:

  • Ground truth圖像:展示了真實標簽下每種波形模式的數據分布情況,可以清晰地看到不同波形之間的差異。
  • Interclass distances熱圖:展示了不同波形類別之間的平均距離,淺色表示距離較遠,深色表示距離較近,有助于比較不同距離度量方式下的類間相似性。
  • AgglomerativeClustering聚類結果圖像:展示了使用不同距禈度量方式進行聚類后的結果。每種波形模式使用不同顏色表示,可以觀察到不同聚類方法下對數據的聚類效果。

013c7c32cd34488c8f7f13caca29eb31.png

312ad3dee81147cab00d5ab769b232e5.png?

49fe47518060427d8c273a398a0ebef6.png?

aa0880557c954a44adad874075e2ebaf.png?

38e61d04b9eb448aac04a6b56cd1931e.png?

ab18683c7db6411bae1534a948cf9f95.png?

4d271121531c49269d31d76a11f7e85f.png?

總結

??????????在機器學習領域,常用的聚類算法包括DBSCAN聚類算法、K均值聚類算法、以及分層聚類算法。這些算法在處理不同類型的數據和應用場景中都有各自的優勢和適用性。

  1. DBSCAN聚類算法(Density-Based Spatial Clustering of Applications with Noise):

    • 優點:能夠發現任意形狀的聚類,對噪聲數據比較魯棒。
    • 工作原理:通過定義鄰域內的數據點密度來確定聚類,從而將高密度區域劃分為一個聚類,并能夠有效處理密度不均勻的數據集。
  2. K均值聚類算法(K-Means Clustering):

    • 優點:簡單且高效,適用于大規模數據集。
    • 工作原理:將數據點劃分為K個簇,通過不斷迭代更新簇的中心點和重新分配數據點來最小化簇內的方差。
  3. 分層聚類算法(Hierarchical Clustering):

    • 優點:能夠構建聚類簇之間的層次結構,不需要預先指定簇的數量。
    • 工作原理:通過不斷合并或分裂數據點或簇來構建聚類層次結構,可分為凝聚性層次聚類和分裂性層次聚類兩種方法。
  4. 不同度量的聚集

    • 聚集聚類是一種基于簇的層次聚類算法,采用不同的距離或相似度度量方法來決定簇之間的合并順序。
    • 不同度量方法會影響聚類的結果,常用的度量包括歐氏距離、曼哈頓距離、切比雪夫距離、閔可夫斯基距離和余弦相似度等。

????????總的來說,選擇適合數據特點和需求的聚類算法和距離度量方法是十分重要的。DBSCAN適用于發現任意形狀的聚類,K均值適用于均衡分布的數據,分層聚類適用于構建聚類層次結構。同時,根據數據的特點和任務需求選擇合適的距離度量方法也是關鍵的一步。

?

?

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

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

相關文章

MYSQL課堂練習

學生表:studentsno&#xff0c;sname&#xff0c;ssex&#xff0c;sage&#xff0c;sdept)學號&#xff0c;姓名&#xff0c;性別&#xff0c;年齡&#xff0c;所在系 sno為主鍵課程表:Course(cno&#xff0c;cname&#xff0c;) 課程號&#xff0c;課程名 cno為主鍵 學生選課…

申報照明工程設計乙級資質關于財務審計報告的要求

申報照明工程設計乙級資質時&#xff0c;關于財務審計報告的要求通常包括以下幾點&#xff1a; 審計報告類型&#xff1a;需要提供由具有法定資質的會計師事務所出具的財務審計報告。如果是企業已經運營滿一個會計年度&#xff0c;應提交最近一個完整會計年度的年度審計報告。如…

Rust:struct 與字節序列的相互轉換

在 Rust 中&#xff0c;將結構體&#xff08;struct&#xff09;與字節序列&#xff08;Vec<u8>&#xff09;相互轉換的常見方法是使用序列化和反序列化庫。Rust 有一個流行的序列化庫叫做 serde&#xff0c;它支持多種數據格式。為了將結構體轉換為字節序列&#xff0c;…

保障餐飲場所安全:定期送檢可燃氣體報警器

在餐飲行業&#xff0c;火災隱患一直備受關注。餐廳、茶飲店等場所常常使用燃氣設備&#xff0c;而這些設備帶來了潛在的安全隱患。 為了及時發現并預防可燃氣體泄漏&#xff0c;可燃氣體報警器的定期送檢顯得尤為重要。那么&#xff0c;為什么可燃氣體報警器需要定期送檢呢&a…

【MySQL精通之路】系統變量-動態系統變量

許多服務器系統變量是動態的&#xff0c;可以在運行時進行設置。 參見“變量賦值的SET語法”。 有關設置系統變量的權限要求的描述&#xff0c;請參閱“系統變量權限” 【MySQL精通之路】系統變量-系統變量權限-CSDN博客 下表列出了所有適用于mysqld的動態系統變量。 該表列出…

java 設計模式(三)-- 單例模式

引言 單例模式是一種常用的軟件設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來獲取這個實例。單例模式在Java中實現起來相對簡單&#xff0c;但實現方式有多種&#xff0c;每種方式都有其特點和適用場景。 一、單例模式的實現方式 1. 懶漢…

【Linux】從零開始認識進程間通信 —— 管道

送給大家一句話&#xff1a; 人要成長&#xff0c;必有原因&#xff0c;背后的努力與積累一定數倍于普通人。所以&#xff0c;關鍵還在于自己。 – 楊絳 從零開始認識進程間通信 1 為什么要進程間通信2 進程如何通信3 進程通信的常見方式4 管道4.1 什么是管道4.2 管道通信的系…

交叉編譯程序,提示 incomplete type “struct sigaction“ is not allowed

問題描述 incomplete type "struct sigaction" is not allowed解決辦法 在代碼的最頂端添加如下代碼即可 #define _XOPEN_SOURCE此定義不是簡單的宏定義&#xff0c;是使程序符合系統環境的不可缺少的部分 _XOPEN_SOURCE為了實現XPG&#xff1a;The X/Open Porta…

零一萬物Yi-1.5開源,34B/9B/6B多尺寸,34B超Qwen1.5-72B

前言 近年來&#xff0c;大型語言模型&#xff08;LLM&#xff09;在各個領域展現出驚人的能力&#xff0c;為人們的生活和工作帶來了巨大的改變。然而&#xff0c;大多數開源 LLM 的性能仍然無法與閉源模型相媲美&#xff0c;這限制了 LLM 在科研和商業領域的進一步應用。為了…

element-plus表格的表單校驗如何實現,重點在model和prop

文章目錄 vue&#xff1a;3.x element-plus&#xff1a;2.7.3 重點&#xff1a; 1) tableData放到form對象里 2) form-item的prop要寫成tableData.序號.屬性 <!--table-表單校驗--> <template><el-form ref"forms" :model"form"><e…

leetcode 207.課程表

思路&#xff1a;拓補排序 數據結構中的知識&#xff0c;這道題其實本質上就是判斷在課程表的這個有向圖當中是否有環存在&#xff0c;如果有環&#xff0c;說明不能學完&#xff1b;沒有環說明可以。判斷有無環的做法是拓補排序最好解決。 下面就是拓補排序的做法了&#xf…

安裝mpi4py與dlio_profiler_py的總結

安裝mpi4py mpi4py是一個Python庫&#xff0c;它提供了與MPI&#xff08;Message Passing Interface&#xff09;兼容的接口&#xff0c;使得Python程序能夠利用MPI實現并行計算。mpi4py 的核心是基于MPI標準的C/C實現&#xff0c;它能夠在高性能計算環境下進行高效的并行處理…

軟考之信息系統管理知識點(3)

流水線&#xff1a;是指在程序執行時多條指令重疊進行操作的一種準并行處理實現技術。各種部件同時處理是針對不同指令而言的&#xff0c;它們可同時為多條指令的不同部分進行工作&#xff0c;以提高各部件的利用率和指令的平均執行速度。 編譯得過程 關系數據庫是表的集合 …

【全網最全】2024電工杯數學建模A題前兩問完整解答+21頁初步參考論文+py代碼+保獎思路等(后續會更新成品論文)

您的點贊收藏是我繼續更新的最大動力&#xff01; 一定要點擊如下的卡片鏈接&#xff0c;那是獲取資料的入口&#xff01; 【全網最全】2024電工杯數學建模A題前兩問完整解答21頁初步參考論文py代碼保獎思路等&#xff08;后續會更新成品論文&#xff09;「首先來看看目前已有…

力扣:92. 反轉鏈表 II(Java)

目錄 題目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代碼實現&#xff1a; 題目描述&#xff1a; 給你單鏈表的頭指針 head 和兩個整數 left 和 right &#xff0c;其中 left < right 。請你反轉從位置 left 到位置 right 的鏈表節點&#xff0c;返回 反轉后的…

Springboot 開發 -- 創建Spring Boot Starter

一、簡介 Spring Boot Starter是Spring Boot生態中非常重要的一部分&#xff0c;它允許開發者通過簡單的依賴管理來快速集成各種功能和庫。在開發過程中&#xff0c;我們經常會遇到一些通用的功能或配置&#xff0c;如果每次都需要手動添加這些配置和依賴&#xff0c;那么將會…

網絡采集受限?如何解決指紋識別、IP封禁、驗證碼、賬號多登等問題

網頁采集是什么 網頁采集&#xff0c;也常被稱作網絡采集、網絡數據抓取&#xff0c;是一種通過自動化工具從網站上獲取信息的技術。這些技術通過訪問網頁&#xff0c;解析頁面上的內容&#xff0c;并提取出有價值的數據&#xff0c;如文本、圖片、鏈接等。 網頁采集通常用于…

Leedcode34. 在排序數組中查找元素的第一個和最后一個位置_Java解法

Problem: 34. 在排序數組中查找元素的第一個和最后一個位置 題目描述思路解題方法復雜度Code 題目描述 34. 在排序數組中查找元素的第一個和最后一個位置 力扣鏈接 給定一個按照升序排列的整數數組 nums&#xff0c;和一個目標值 target。找出給定目標值在數組中的開始位置…

Python 調整PDF文件的頁面大小

在處理PDF文件時&#xff0c;我們可能會遇到這樣的情況&#xff1a;原始PDF文檔不符合我們的閱讀習慣&#xff0c;或者需要適配不同顯示設備等。這時&#xff0c;我們就需要及時調整PDF文檔中的頁面尺寸&#xff0c;以滿足不同應用場景的需求。 利用Python語言的高效性和靈活性…

Linux--網絡通信(一)概述

網絡通信概述 網絡通信本質上是一種進程間通信&#xff0c;是位于網絡中不同主機上的進程之間的通信&#xff0c;屬于 IPC 的一種&#xff0c; 通常稱為 socket IPC。所以網絡通信是為了解決在網絡環境中&#xff0c;不同主機上的應用程序之間的通信問題。 大概可以分為三個層…