日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

今兒想和大家聊聊關于聚類的問題!!!!

在這之前咱們已經聊過 各個算法的優缺點的總結,以及8個回歸類算法、7個正則化算法的總結、5 個集成算法模型、svm算法的全部總結、距離算法總結!!

感興趣的可以翻到之前看看~

大部分人對聚類的認識可以歸納為以下幾個方面:

  1. 數據分組:許多人將聚類視為將數據劃分為不同的組或簇,使得同一組內的數據點更加相似或相關。這種觀點認為聚類是一種無監督學習技術,用于發現數據中的內在結構和模式。

  2. 相似性度量:通常認為聚類算法通過計算數據點之間的相似性或距離來確定它們是否屬于同一簇。相似性度量可以基于歐氏距離、余弦相似度等方法。

  3. 發現未知群體:聚類被視為一種工具,用于發現現有數據中隱藏的未知群體。通過聚類分析,可以發現數據集中的潛在模式、群體或類別,從而幫助了解數據的特征和結構。

  4. 應用領域:人們普遍認為聚類廣泛應用于各個領域,如市場細分、客戶分析、圖像分割、推薦系統等。聚類可以幫助理解和利用大規模數據集,探索數據中的關聯性和趨勢。

然而,值得注意的是,不同人對聚類的認識和理解可能存在差異,因為聚類本質上是一個多樣化的領域,涉及多種算法和技術。此外,聚類也可能面臨一些挑戰,如選擇合適的距離度量、確定最佳簇的數量等。因此,在使用聚類算法時,需要根據具體問題和數據特點進行適當的選擇和調整。

今天就來詳細說說常見的幾種:

  • K均值聚類
  • 層次聚類
  • 密度聚類
  • 譜聚類
  • EM聚類
  • 模糊聚類
以下代碼均可直接運行起來,方便學習!

大家伙如果覺得還不錯!可以點贊、轉發安排起來,讓更多的朋友看到。

K均值聚類

K均值聚類是一種常用的無監督學習算法,用于將數據點劃分為不同的簇,使得同一簇內的數據點彼此相似度較高,不同簇之間的數據點相似度較低。

這個算法的目標是將數據點分為K個簇,其中K是用戶定義的參數。K均值聚類的原理相對簡單,主要思想是通過迭代尋找K個簇的中心點,將每個數據點分配給距離其最近的中心點,然后更新中心點的位置,直到滿足停止條件為止。

原理介紹

1、選擇要分成的簇的數量K。

2、隨機初始化K個中心點,這些中心點可以是從數據集中隨機選擇的數據點。

3、重復以下過程,直到滿足停止條件:

  • 將每個數據點分配到距離其最近的中心點所屬的簇。
  • 對每個簇,計算所有數據點的平均值,并將其作為新的中心點。

停止條件通常可以是以下之一:

  • 中心點不再改變或改變非常小。
  • 數據點不再改變其所屬簇。

公式表達

K均值聚類的主要公式包括:

  1. 距離度量(一般使用歐氏距離):

    對于兩個數據點X和Y,它們之間的歐氏距離可以表示為:

    其中,n是特征的數量。

  2. 計算每個數據點到每個中心點的距離:

    其中,是第i個中心點,表示數據點X到中心點的距離。

  3. 分配數據點到最近的中心點:

    即,將數據點X分配到距離它最近的中心點所屬的簇。

  4. 更新中心點:

    即,將每個簇的中心點更新為該簇內所有數據點的平均值。

一個案例

一個用Python/ target=_blank class=infotextkey>Python實現K均值聚類:

import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 生成隨機數據
np.random.seed(0)
X = np.random.rand(100, 2)

# 使用K均值聚類,假設要分成3個簇
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

# 獲取簇的中心點和每個數據點的所屬簇
centers = kmeans.cluster_centers_
labels = kmeans.labels_

# 繪制數據點和簇中心
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.title('K-Means Clustering')
plt.show()

這段代碼首先生成一些隨機數據,然后使用scikit-learn庫的KMeans類進行聚類,并繪制了數據點和簇中心的圖形。

可以看到K均值聚類是如何將數據點分成不同的簇的,并找到簇的中心點。圖形展示了數據點的分布以及簇中心的位置。

層次聚類

層次聚類 通過構建數據點之間的層次結構來組織簇。這種層次結構通常以樹狀圖(樹狀圖或譜系圖)的形式呈現,可以幫助理解數據點之間的相似性關系以及簇之間的關系。

層次聚類可以分為兩種主要類型:自上而下的凝聚聚類和自下而上的分裂聚類。

原理介紹

  • 凝聚聚類(Agglomerative Clustering):從底部開始,每個數據點被視為一個單獨的簇,然后迭代地合并最接近的簇,直到只剩下一個大的簇。
  • 分裂聚類(Divisive Clustering):從頂部開始,所有數據點被視為一個大的簇,然后逐漸分裂成更小的簇,直到每個數據點都是一個單獨的簇。

層次聚類的主要步驟包括:

  1. 初始化:將每個數據點視為一個獨立的簇。
  2. 合并(對于凝聚聚類)或分裂(對于分裂聚類)簇以創建一個新的層次結構。
  3. 重復步驟2,直到滿足停止條件。

公式表達

在層次聚類中,距離度量是關鍵。常用的距離度量包括歐氏距離、曼哈頓距離、馬氏距離等,具體選擇取決于問題的性質。合并或分裂簇的準則也可以有多種,例如最短距離、最長距離、平均距離等。

一個Python案例

使用 scikit-learn 實現層次聚類:

import numpy as np
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram

# 生成隨機數據
np.random.seed(0)
X = np.random.rand(10, 2)

# 使用凝聚聚類,假設要分成2個簇
agg_clustering = AgglomerativeClustering(n_clusters=2)
agg_clustering.fit(X)

# 繪制樹狀圖(譜系圖)
linkage_matrix = np.column_stack([agg_clustering.children_, agg_clustering.distances_])
dendrogram(linkage_matrix, p=10, truncate_mode='level')

plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Data point index')
plt.ylabel('Distance')
plt.show()

首先生成一些隨機數據,然后使用scikit-learn庫的AgglomerativeClustering類進行凝聚聚類,并繪制了樹狀圖(譜系圖)。樹狀圖顯示了數據點的分層結構,以及簇之間的合并情況。

 

深夜努力寫Python
Python、機器學習算法
22篇原創內容
公眾號
 

密度聚類

密度聚類 根據數據點周圍的密度來發現簇。最著名的密度聚類算法之一是DBSCAN(Density-Based Spatial Clustering of Applications with Noise)。

DBSCAN是一種基于密度的聚類算法,它的主要思想是根據數據點周圍的密度來確定簇的邊界。

與K均值等算法不同,DBSCAN不需要事先指定簇的數量,而且能夠發現各種形狀的簇,同時還能識別異常點(噪聲)。

原理介紹

DBSCAN 算法的核心思想是通過以下兩個參數來定義簇:

1、**ε (epsilon)**:表示半徑,它用來確定一個點的鄰域范圍。

2、MinPts:表示一個點的鄰域內至少包含的數據點數目。

DBSCAN 算法的工作流程如下:

1、隨機選擇一個未被訪問的數據點作為起始點。

2、計算該點的ε鄰域內的數據點數量。

3、如果鄰域內的數據點數目大于等于MinPts,則將該點標記為核心點(Core Point),并將其鄰域內的所有點加入同一簇中。

4、重復以上過程,直到無法找到更多的核心點。

5、選擇下一個未被訪問的數據點,繼續上述過程,直到所有數據點都被訪問。

最終,所有被訪問的點都將屬于某個簇或者被標記為噪聲點。

關鍵概念

  • ε鄰域:對于點P,它的ε鄰域包含了距離點P不超過ε的所有點。
  • 核心點(Core Point):如果點P的ε鄰域內至少包含MinPts個數據點,那么點P被標記為核心點。
  • 邊界點(Border Point):如果點P的ε鄰域內包含少于MinPts個數據點,但它是某個核心點的鄰接點,那么點P被標記為邊界點。
  • 噪聲點(Noise Point):如果點P不是核心點,也不是邊界點,那么點P被標記為噪聲點。

一個案例

使用 Scikit-Learn 中的DBSCAN 做一個密度聚類。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_blobs

# 創建一個隨機數據集
X, _ = make_blobs(n_samples=1000, centers=3, cluster_std=1.0, random_state=42)

# 使用DBSCAN算法進行密度聚類
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan.fit(X)

# 獲取每個點的簇標簽
labels = dbscan.labels_

# 繪制聚類結果
unique_labels = np.unique(labels)
colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))

for label, color in zip(unique_labels, colors):
    if label == -1:
        # 噪聲點用黑色表示
        color = 'k'
    
    class_member_mask = (labels == label)
    xy = X[class_member_mask]
    plt.scatter(xy[:, 0], xy[:, 1], c=color, s=20, label='Cluster %d' % label)

plt.title('DBSCAN Clustering')
plt.legend()
plt.show()

這個示例使用了Scikit-Learn中的DBSCAN類來對一個具有3個簇的數據集進行聚類。

實際情況中,可以根據自己的數據和參數來調整代碼以適應不同的情況。

譜聚類

譜聚類 通過將數據集表示為圖的形式來進行聚類分析。

譜聚類在圖論、線性代數和譜分析等領域有廣泛的應用,它能夠有效地處理復雜的數據結構,并且在一些情況下表現出色。

原理介紹

1、構建相似度圖(Affinity Matrix):首先,將數據集中的樣本視為圖的節點,計算每一對樣本之間的相似度。通常使用高斯核函數來度量相似性,具體計算方式如下:

 

這里,表示樣本和之間的相似度,和是樣本的特征向量,是高斯核的帶寬參數。

2、構建拉普拉斯矩陣(Laplacian Matrix):將相似度矩陣轉換成拉普拉斯矩陣。常用的拉普拉斯矩陣有兩種形式:

a. 無向圖拉普拉斯矩陣(Unnormalized Laplacian):,其中是度矩陣,其對角線元素表示節點的度(與節點相連的邊的數量),是相似度矩陣。

b. 對稱歸一化拉普拉斯矩陣(Normalized Laplacian):,其中是單位矩陣。

3、計算特征向量:通過求解拉普拉斯矩陣的特征值問題,得到其前個最小特征值對應的特征向量,構成矩陣。

4、聚類:將矩陣的每一行作為新的特征向量,然后使用傳統的聚類算法(如K均值)對這些特征向量進行聚類。

一個Python案例

依舊使用 Scikit-Learn 進行實現:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import SpectralClustering
from sklearn.metrics import pairwise_distances
from scipy.sparse import csgraph

# 生成一個隨機的月亮形狀的數據集
X, _ = make_moons(n_samples=1000, noise=0.05, random_state=42)

# 計算相似度矩陣
sigma = 0.2
W = np.exp(-pairwise_distances(X, metric="sqeuclidean") / (2.0 * sigma ** 2))

# 構建對稱歸一化拉普拉斯矩陣
D = np.diag(W.sum(axis=1))
L = D - W
D_sqrt_inv = np.linalg.inv(np.sqrt(D))
L_sym = np.dot(np.dot(D_sqrt_inv, L), D_sqrt_inv)

# 計算特征向量
k = 2  # 聚類數
eigenvalues, eigenvectors = np.linalg.eigh(L_sym)
X_new = eigenvectors[:, :k]

# 使用譜聚類
sc = SpectralClustering(n_clusters=k, affinity="precomputed", random_state=42)
labels = sc.fit_predict(W)

# 可視化結果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="viridis")
plt.title("Spectral Clustering Result")
plt.subplot(1, 2, 2)
plt.scatter(X[:, 0], X[:, 1], c=_, cmap="viridis")
plt.title("Original Data")
plt.show()

首先生成一個月亮形狀的數據集,然后計算相似度矩陣,構建對稱歸一化拉普拉斯矩陣,計算特征向量,最后使用譜聚類對數據集進行聚類,并可視化聚類結果和原始數據。

 

EM聚類

EM聚類 基于概率分布對數據進行建模,通過迭代的期望和最大化步驟來估計模型參數,并將數據分為不同的聚類。EM聚類通常用于處理混合分布的數據,其中每個聚類被建模為一個概率分布。

原理介紹

EM聚類的核心思想是將數據集中的每個樣本視為來自于一個潛在的分布(通常是多元高斯分布)的觀測結果。該算法迭代地執行兩個步驟:

1、Expectation Step(E步驟):在這一步中,計算每個樣本屬于每個聚類的概率,即計算后驗概率。這一步使用當前估計的模型參數(均值和協方差矩陣)來計算后驗概率。

2、Maximization Step(M步驟):在這一步中,基于E步驟中計算得到的后驗概率,更新模型的參數,包括均值和協方差矩陣,以使似然函數最大化。這一步是一個最大似然估計(MLE)步驟。

重復執行E步驟和M步驟,直到收斂或達到預定的迭代次數。

最終,每個樣本將被分配到一個聚類中,同時模型的參數將收斂到使數據最可能的參數值。

公式表達

EM聚類的主要數學公式涉及多元高斯分布。假設有個聚類,每個聚類被建模為一個多元高斯分布:

1、多元高斯分布

多元高斯分布的概率密度函數如下,其中是均值,是協方差矩陣,是樣本特征向量:

2、E步驟:計算每個樣本屬于每個聚類的后驗概率,即條件概率:

其中,表示樣本屬于聚類的后驗概率,是聚類的先驗概率。

3、M步驟:更新模型參數,包括均值和協方差矩陣:

其中, 是更新后的聚類的均值, 是更新后的聚類的協方差矩陣。

一個案例

下面使用EM聚類算法對一個大型數據集進行聚類:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.mixture import GaussianMixture

# 生成一個隨機的大型數據集
X, _ = make_blobs(n_samples=2000, centers=4, random_state=42)

# 使用EM聚類
gmm = GaussianMixture(n_components=4, random_state=42)
labels = gmm.fit_predict(X)

# 可視化結果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="viridis")
plt.title("EM Clustering Result")
plt.show()

代碼中生成了一個包含4個聚類數據集,并使用EM聚類算法對數據進行聚類,并最終可視化聚類結果。

EM 聚類算法能夠有效地識別數據中的聚類結構。

 

模糊聚類

模糊聚類與傳統的硬聚類方法(如K均值)不同,它允許數據點屬于多個不同的聚類,而不是僅屬于一個確定的聚類。

模糊聚類通常使用模糊集合理論來描述數據點與聚類的隸屬度(membership degree),因此也稱為模糊C均值(Fuzzy C-Means,FCM)算法。

原理介紹

模糊聚類的目標是將數據點劃分為多個模糊聚類,每個數據點可以與每個聚類關聯一個隸屬度,表示其屬于該聚類的程度。這個隸屬度通常在0到1之間,0表示不屬于聚類,1表示完全屬于聚類。

FCM的主要思想是最小化數據點與聚類中心之間的加權歐氏距離的平方,其中權重是隸屬度的冪。這可以用以下公式表示:

對于數據點i和聚類:

其中:

  •  是目標函數,要最小化的距離總和。
  •  是數據點的數量。
  •  是聚類的數量。
  •  是數據點i屬于聚類j的隸屬度。
  •  是模糊度(通常大于1,通常設置為2)。
  •  是數據點i的特征向量。
  •  是聚類j的中心。

FCM 的優化過程通常使用迭代方法,通過更新隸屬度和聚類中心來逐步優化目標函數。

一個案例

使用sklearn庫中的FCM算法進行模糊聚類:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score, calinski_harabasz_score, davies_bouldin_score, adjusted_rand_score

from fcmeans import FCM

# 生成模擬數據
n_samples = 3000
n_features = 2
n_clusters = 4
X, y = make_blobs(n_samples=n_samples, n_features=n_features, centers=n_clusters, random_state=42)

# 數據標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 使用FCM進行模糊聚類
fcm = FCM(n_clusters=n_clusters)
fcm.fit(X_scaled)

# 獲取聚類標簽
fuzzy_labels = np.argmax(fcm.u, axis=1)

# 繪制模糊聚類結果
plt.figure(figsize=(10, 6))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=fuzzy_labels, cmap='viridis', s=50, alpha=0.5)
plt.scatter(fcm.centers[:, 0], fcm.centers[:, 1], marker='X', c='red', s=200, label='Cluster Centers')
plt.title('Fuzzy Clustering with FCM')
plt.legend()
plt.show()

# 計算模糊聚類的輪廓系數
silhouette_avg = silhouette_score(X_scaled, fuzzy_labels)
print(f'Silhouette Score: {silhouette_avg}')

# 計算每個數據點的輪廓系數
silhouette_values = silhouette_samples(X_scaled, fuzzy_labels)

# 繪制輪廓系數圖
plt.figure(figsize=(8, 6))
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=fuzzy_labels, cmap='viridis', s=50, alpha=0.5)
plt.title('Silhouette Plot for Fuzzy Clustering')
plt.xlabel('Silhouette Coefficient Values')
plt.ylabel('Cluster Labels')
plt.colorbar()
plt.show()

首先生成模擬數據,然后使用FCM進行模糊聚類。

然后計算了輪廓系數、Calinski-Harabasz指數、Davies-Bouldin指數和調整蘭德指數(如果有真實標簽)。

最后,繪制了模糊聚類結果的散點圖和輪廓系數圖,以可視化評估聚類質量。

注意:需要提前安裝scikit-learnmatplotlibnumpyfcmeans

最后

今天介紹了關于聚類的一些常用算法:K均值聚類、層次聚類、密度聚類、譜聚類、EM聚類、模糊聚類。

分享到:
標簽:算法
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定