国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【機(jī)器學(xué)習(xí)】聚類算法(二)

這篇具有很好參考價(jià)值的文章主要介紹了【機(jī)器學(xué)習(xí)】聚類算法(二)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

五、基于密度的算法

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

5.1?DBSCAN 算法

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

import sys # 導(dǎo)入 sys 模塊,用于訪問系統(tǒng)相關(guān)的參數(shù)和功能
import os # 導(dǎo)入 os 模塊,用于處理文件和目錄
import math # 導(dǎo)入 math 模塊,用于進(jìn)行數(shù)學(xué)運(yùn)算
import random # 導(dǎo)入 random 模塊,用于生成隨機(jī)數(shù)
from sklearn import datasets # 導(dǎo)入 sklearn 的 datasets 模塊,用于加載數(shù)據(jù)集
import numpy as np # 導(dǎo)入 numpy 模塊,用于進(jìn)行科學(xué)計(jì)算,簡(jiǎn)寫為 np


# Import helper functions
dir_path = os.path.dirname(os.path.realpath(__file__)) # 獲取當(dāng)前文件的絕對(duì)路徑
sys.path.insert(0, dir_path + "/../utils") # 將 utils 目錄添加到系統(tǒng)路徑中,方便導(dǎo)入其中的模塊
from utils.data_manipulation import normalize # 從 utils.data_manipulation 模塊中導(dǎo)入 normalize 函數(shù),用于對(duì)數(shù)據(jù)進(jìn)行歸一化處理
from utils.data_operation import euclidean_distance # 從 utils.data_operation 模塊中導(dǎo)入 euclidean_distance 函數(shù),用于計(jì)算歐幾里得距離
sys.path.insert(0, dir_path + "/../unsupervised_learning/") # 將 unsupervised_learning 目錄添加到系統(tǒng)路徑中,方便導(dǎo)入其中的模塊
from principal_component_analysis import PCA # 從 principal_component_analysis 模塊中導(dǎo)入 PCA 類,用于進(jìn)行主成分分析


# 定義 DBSCAN 類,用于實(shí)現(xiàn) DBSCAN 算法
class DBSCAN():
    # 初始化方法,接受兩個(gè)參數(shù):eps 和 min_samples
    def __init__(self, eps=1, min_samples=5):
        self.eps = eps # eps 表示鄰域半徑,用于判斷兩個(gè)樣本是否為鄰居
        self.min_samples = min_samples # min_samples 表示核心點(diǎn)的最小鄰居數(shù),用于判斷一個(gè)樣本是否為核心點(diǎn)
        # List of arrays (clusters) containing sample indices
        self.clusters = [] # clusters 表示聚類結(jié)果,是一個(gè)列表,每個(gè)元素是一個(gè)數(shù)組,表示一個(gè)簇,包含了樣本的索引
        self.visited_samples = [] # visited_samples 表示已經(jīng)訪問過的樣本的索引,是一個(gè)列表
        # Hashmap {"sample_index": [neighbor1, neighbor2, ...]}
        self.neighbors = {} # neighbors 表示每個(gè)樣本的鄰居,是一個(gè)字典,鍵是樣本的索引,值是一個(gè)數(shù)組,表示該樣本的鄰居的索引
        self.X = None   # Dataset # X 表示數(shù)據(jù)集,是一個(gè)二維數(shù)組,每一行是一個(gè)樣本,每一列是一個(gè)特征


    # 定義一個(gè)私有方法,用于獲取一個(gè)樣本的鄰居,接受一個(gè)參數(shù):sample_i,表示樣本的索引
    def _get_neighbors(self, sample_i):
        neighbors = [] # 定義一個(gè)空列表,用于存儲(chǔ)鄰居的索引
        for _sample_i, _sample in enumerate(self.X): # 遍歷數(shù)據(jù)集中的每個(gè)樣本及其索引
            if _sample_i != sample_i and euclidean_distance( # 如果樣本的索引不等于 sample_i,且樣本與 sample_i 對(duì)應(yīng)的樣本的歐幾里得距離小于 eps
                    self.X[sample_i], _sample) < self.eps:
                neighbors.append(_sample_i) # 則將該樣本的索引添加到鄰居列表中
        return np.array(neighbors) # 返回鄰居列表,轉(zhuǎn)換為 numpy 數(shù)組


    # 定義一個(gè)私有方法,用于擴(kuò)展一個(gè)簇,接受兩個(gè)參數(shù):sample_i 和 neighbors,分別表示樣本的索引和鄰居
    def _expand_cluster(self, sample_i, neighbors):
        cluster = [sample_i] # 定義一個(gè)列表,用于存儲(chǔ)簇中的樣本的索引,初始值為 sample_i
        # Iterate through neighbors
        for neighbor_i in neighbors: # 遍歷鄰居中的每個(gè)樣本的索引
            if not neighbor_i in self.visited_samples: # 如果該樣本的索引不在已訪問過的樣本列表中
                self.visited_samples.append(neighbor_i) # 則將該樣本的索引添加到已訪問過的樣本列表中
                # Fetch the samples distant neighbors
                self.neighbors[neighbor_i] = self._get_neighbors(neighbor_i) # 獲取該樣本的鄰居,并存儲(chǔ)到 neighbors 字典中
                # Make sure the neighbors neighbors are more than min_samples
                if len(self.neighbors[neighbor_i]) >= self.min_samples: # 如果該樣本的鄰居數(shù)大于等于 min_samples,即該樣本是一個(gè)核心點(diǎn)
                    # Choose neighbors of neighbor except for sample
                    distant_neighbors = self.neighbors[neighbor_i][ # 選擇該樣本的鄰居中除了 sample_i 之外的樣本,作為遠(yuǎn)鄰
                        np.where(self.neighbors[neighbor_i] != sample_i)]
                    # Add the neighbors neighbors as neighbors of sample
                    self.neighbors[sample_i] = np.concatenate( # 將遠(yuǎn)鄰添加到 sample_i 的鄰居中
                        (self.neighbors[sample_i], distant_neighbors))
                    # Expand the cluster from the neighbor
                    expanded_cluster = self._expand_cluster( # 從該樣本開始遞歸地?cái)U(kuò)展簇
                        neighbor_i, self.neighbors[neighbor_i])
                    # Add expanded cluster to this cluster
                    cluster = cluster + expanded_cluster # 將擴(kuò)展后的簇添加到當(dāng)前簇中
            if not neighbor_i in np.array(self.clusters): # 如果該樣本的索引不在已經(jīng)形成的簇中
                cluster.append(neighbor_i) # 則將該樣本的索引添加到當(dāng)前簇中
        return cluster # 返回當(dāng)前簇


    # 定義一個(gè)私有方法,用于獲取簇的標(biāo)簽,即每個(gè)樣本所屬的簇的編號(hào)
    def _get_cluster_labels(self):
        # Set default value to number of clusters
        # Will make sure all outliers have same cluster label
        labels = len(self.clusters) * np.ones(np.shape(self.X)[0]) # 定義一個(gè)數(shù)組,用于存儲(chǔ)簇的標(biāo)簽,初始值為簇的個(gè)數(shù),這樣可以保證所有的離群點(diǎn)都有相同的標(biāo)簽
        for cluster_i, cluster in enumerate(self.clusters): # 遍歷每個(gè)簇及其編號(hào)
            for sample_i in cluster: # 遍歷簇中的每個(gè)樣本的索引
                labels[sample_i] = cluster_i # 將樣本的標(biāo)簽設(shè)置為簇的編號(hào)
        return labels # 返回簇的標(biāo)簽


    # 定義一個(gè)公開方法,用于對(duì)數(shù)據(jù)集進(jìn)行聚類,接受一個(gè)參數(shù):X,表示數(shù)據(jù)集
    def predict(self, X):
        self.X = X # 將數(shù)據(jù)集賦值給 self.X
        n_samples = np.shape(self.X)[0] # 獲取數(shù)據(jù)集的樣本數(shù)
        for sample_i in range(n_samples): # 遍歷每個(gè)樣本的索引
            if sample_i in self.visited_samples: # 如果該樣本已經(jīng)訪問過
                continue # 則跳過該樣本
            self.neighbors[sample_i] = self._get_neighbors(sample_i) # 獲取該樣本的鄰居,并存儲(chǔ)到 neighbors 字典中
            if len(self.neighbors[sample_i]) >= self.min_samples: # 如果該樣本的鄰居數(shù)大于等于 min_samples,即該樣本是一個(gè)核心點(diǎn)
                self.visited_samples.append(sample_i) # 則將該樣本的索引添加到已訪問過的樣本列表中
                new_cluster = self._expand_cluster( # 從該樣本開始擴(kuò)展一個(gè)新的簇
                    sample_i, self.neighbors[sample_i])
                self.clusters.append(new_cluster) # 將新的簇添加到聚類結(jié)果中


        cluster_labels = self._get_cluster_labels() # 獲取簇的標(biāo)簽
        return cluster_labels


def main(): # 定義一個(gè)主函數(shù),用于執(zhí)行聚類任務(wù)
    # Load the dataset
    X, y = datasets.make_moons(n_samples=300, noise=0.1) # 加載數(shù)據(jù)集,使用 sklearn 的 datasets 模塊中的 make_moons 函數(shù)生成兩個(gè)月牙形狀的數(shù)據(jù),X 是特征矩陣,y 是真實(shí)的類別標(biāo)簽


    # Cluster the data using DBSCAN
    clf = DBSCAN(eps=0.17, min_samples=5) # 創(chuàng)建一個(gè) DBSCAN 類的實(shí)例,指定 eps 和 min_samples 參數(shù)
    y_pred = clf.predict(X) # 調(diào)用 predict 方法對(duì)數(shù)據(jù)集 X 進(jìn)行聚類,返回聚類后的類別標(biāo)簽


    # Project the data onto the 2 primary principal components
    pca = PCA() # 創(chuàng)建一個(gè) PCA 類的實(shí)例,用于進(jìn)行主成分分析
    pca.plot_in_2d(X, y_pred, title="DBSCAN") # 調(diào)用 plot_in_2d 方法將數(shù)據(jù)集 X 投影到兩個(gè)主成分上,并根據(jù)聚類后的類別標(biāo)簽 y_pred 繪制散點(diǎn)圖,標(biāo)題為 "DBSCAN"
    pca.plot_in_2d(X, y, title="Actual Clustering") # 調(diào)用 plot_in_2d 方法將數(shù)據(jù)集 X 投影到兩個(gè)主成分上,并根據(jù)真實(shí)的類別標(biāo)簽 y 繪制散點(diǎn)圖,標(biāo)題為 "Actual Clustering"


if __name__ == "__main__": # 如果當(dāng)前文件是主程序
    main() # 則調(diào)用主函數(shù)

輸出:

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

5.2 OPTICS算法

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

OPTICS 聚類算法演示

這段代碼的目的是使用 OPTICS 算法對(duì)六個(gè)簇的數(shù)據(jù)進(jìn)行聚類分析,并與不同的 epsilon 值的 DBSCAN 聚類進(jìn)行比較。代碼的主要步驟如下:

  • 導(dǎo)入所需的模塊,包括 matplotlib 用于繪圖,numpy 用于數(shù)值計(jì)算,sklearn 用于機(jī)器學(xué)習(xí)

  • 生成樣本數(shù)據(jù),每個(gè)簇的數(shù)據(jù)服從不同的正態(tài)分布,共有 1500 個(gè)點(diǎn)

  • 創(chuàng)建一個(gè) OPTICS 聚類器對(duì)象,設(shè)置相關(guān)的參數(shù),如最小樣本數(shù),聚類穩(wěn)定性參數(shù),最小簇大小等

  • 對(duì)樣本數(shù)據(jù)進(jìn)行擬合,得到 OPTICS 聚類的結(jié)果,包括每個(gè)點(diǎn)的可達(dá)性距離,核心距離,排序和簇標(biāo)簽

  • 使用 cluster_optics_dbscan 函數(shù),根據(jù) OPTICS 聚類的輸出,按照不同的 epsilon 值進(jìn)行 DBSCAN 聚類,得到兩組不同的簇標(biāo)簽

  • 繪制四個(gè)子圖,分別顯示可達(dá)性圖,OPTICS 聚類結(jié)果,epsilon 為 0.5 和 2 時(shí)的 DBSCAN 聚類結(jié)果

  • 調(diào)整子圖的布局,避免重疊,并顯示圖形

這段代碼可以展示 OPTICS 聚類的優(yōu)勢(shì),即不需要指定簇的個(gè)數(shù),也不需要指定 epsilon 參數(shù),而是可以根據(jù)數(shù)據(jù)的密度分布自動(dòng)地進(jìn)行聚類。同時(shí),也可以展示不同的 epsilon 值對(duì) DBSCAN 聚類的影響,即 epsilon 值越大,簇的個(gè)數(shù)越少,噪聲點(diǎn)越多。

# 導(dǎo)入 matplotlib 的 gridspec 模塊,用于繪制子圖
import matplotlib.gridspec as gridspec
# 導(dǎo)入 matplotlib 的 pyplot 模塊,用于繪制圖形
import matplotlib.pyplot as plt
# 導(dǎo)入 numpy 模塊,用于進(jìn)行數(shù)值計(jì)算
import numpy as np


# 從 sklearn.cluster 模塊導(dǎo)入 OPTICS 和 cluster_optics_dbscan 函數(shù)
from sklearn.cluster import OPTICS, cluster_optics_dbscan


# 生成樣本數(shù)據(jù)


# 設(shè)置隨機(jī)數(shù)種子,保證每次運(yùn)行結(jié)果一致
np.random.seed(0)
# 設(shè)置每個(gè)簇的點(diǎn)數(shù)為 250
n_points_per_cluster = 250


# 生成六個(gè)簇的數(shù)據(jù),每個(gè)簇的數(shù)據(jù)服從正態(tài)分布,不同簇的均值和方差不同
C1 = [-5, -2] + 0.8 * np.random.randn(n_points_per_cluster, 2)
C2 = [4, -1] + 0.1 * np.random.randn(n_points_per_cluster, 2)
C3 = [1, -2] + 0.2 * np.random.randn(n_points_per_cluster, 2)
C4 = [-2, 3] + 0.3 * np.random.randn(n_points_per_cluster, 2)
C5 = [3, -2] + 1.6 * np.random.randn(n_points_per_cluster, 2)
C6 = [5, 6] + 2 * np.random.randn(n_points_per_cluster, 2)
# 將六個(gè)簇的數(shù)據(jù)合并成一個(gè)數(shù)組
X = np.vstack((C1, C2, C3, C4, C5, C6))


# 創(chuàng)建一個(gè) OPTICS 聚類器對(duì)象,設(shè)置最小樣本數(shù)為 50,聚類穩(wěn)定性參數(shù)為 0.05,最小簇大小為 0.05
clust = OPTICS(min_samples=50, xi=0.05, min_cluster_size=0.05)


# 對(duì)數(shù)據(jù)進(jìn)行擬合,得到聚類結(jié)果
clust.fit(X)


# 使用 cluster_optics_dbscan 函數(shù),根據(jù) OPTICS 聚類器的輸出,按照不同的 epsilon 值進(jìn)行 DBSCAN 聚類
# epsilon 是 DBSCAN 聚類的一個(gè)參數(shù),表示兩個(gè)點(diǎn)之間的最大距離,小于等于 epsilon 的點(diǎn)被認(rèn)為是相鄰的
# 當(dāng) epsilon 為 0.5 時(shí),得到 labels_050 數(shù)組,表示每個(gè)點(diǎn)的簇標(biāo)簽
labels_050 = cluster_optics_dbscan(
    reachability=clust.reachability_,
    core_distances=clust.core_distances_,
    ordering=clust.ordering_,
    eps=0.5,
)
# 當(dāng) epsilon 為 2 時(shí),得到 labels_200 數(shù)組,表示每個(gè)點(diǎn)的簇標(biāo)簽
labels_200 = cluster_optics_dbscan(
    reachability=clust.reachability_,
    core_distances=clust.core_distances_,
    ordering=clust.ordering_,
    eps=2,
)


# 創(chuàng)建一個(gè)空間數(shù)組,表示每個(gè)點(diǎn)的序號(hào)
space = np.arange(len(X))
# 創(chuàng)建一個(gè)可達(dá)性數(shù)組,表示每個(gè)點(diǎn)的可達(dá)性距離,可達(dá)性距離是 OPTICS 聚類的一個(gè)概念,表示一個(gè)點(diǎn)到其最近的核心點(diǎn)的距離
# 核心點(diǎn)是指在其 epsilon 鄰域內(nèi)有足夠多的點(diǎn)的點(diǎn)
# 可達(dá)性數(shù)組按照 OPTICS 聚類器的排序進(jìn)行排列
reachability = clust.reachability_[clust.ordering_]
# 創(chuàng)建一個(gè)標(biāo)簽數(shù)組,表示每個(gè)點(diǎn)的簇標(biāo)簽,按照 OPTICS 聚類器的排序進(jìn)行排列
labels = clust.labels_[clust.ordering_]
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False  # 用來(lái)正常顯示負(fù)號(hào)
# 創(chuàng)建一個(gè)圖形對(duì)象,設(shè)置大小為 10 x 7
plt.figure(figsize=(10, 7))
# 創(chuàng)建一個(gè)網(wǎng)格對(duì)象,用于放置子圖,設(shè)置網(wǎng)格為 2 x 3
G = gridspec.GridSpec(2, 3)
# 創(chuàng)建四個(gè)子圖對(duì)象,分別放在網(wǎng)格的不同位置
ax1 = plt.subplot(G[0, :])
ax2 = plt.subplot(G[1, 0])
ax3 = plt.subplot(G[1, 1])
ax4 = plt.subplot(G[1, 2])


# 繪制可達(dá)性圖,可達(dá)性圖是一種顯示 OPTICS 聚類結(jié)果的圖形,橫軸是點(diǎn)的序號(hào),縱軸是點(diǎn)的可達(dá)性距離
# 不同的顏色表示不同的簇,黑色的點(diǎn)表示噪聲點(diǎn),即沒有被分配到任何簇的點(diǎn)
# 可達(dá)性圖可以幫助選擇合適的 epsilon 值進(jìn)行 DBSCAN 聚類
colors = ["g.", "r.", "b.", "y.", "c."]
# 對(duì)于每個(gè)簇,用相應(yīng)的顏色繪制其點(diǎn)的序號(hào)和可達(dá)性距離
for klass, color in zip(range(0, 5), colors):
    Xk = space[labels == klass]
    Rk = reachability[labels == klass]
    ax1.plot(Xk, Rk, color, alpha=0.3)
# 對(duì)于噪聲點(diǎn),用黑色繪制其點(diǎn)的序號(hào)和可達(dá)性距離
ax1.plot(space[labels == -1], reachability[labels == -1], "k.", alpha=0.3)
# 用黑色實(shí)線繪制 epsilon 為 2 的水平線,表示 DBSCAN 聚類的一個(gè)劃分點(diǎn)
ax1.plot(space, np.full_like(space, 2.0, dtype=float), "k-", alpha=0.5)
# 用黑色虛線繪制 epsilon 為 0.5 的水平線,表示 DBSCAN 聚類的另一個(gè)劃分點(diǎn)
ax1.plot(space, np.full_like(space, 0.5, dtype=float), "k-.", alpha=0.5)
# 設(shè)置縱軸的標(biāo)簽為“可達(dá)性(epsilon 距離)”
ax1.set_ylabel("可達(dá)性(epsilon 距離)")
# 設(shè)置標(biāo)題為“可達(dá)性圖”
ax1.set_title("可達(dá)性圖")


# 繪制 OPTICS 聚類的結(jié)果,橫軸是數(shù)據(jù)的第一個(gè)特征,縱軸是數(shù)據(jù)的第二個(gè)特征
# 不同的顏色表示不同的簇,黑色的加號(hào)表示噪聲點(diǎn)
colors = ["g.", "r.", "b.", "y.", "c."]
# 對(duì)于每個(gè)簇,用相應(yīng)的顏色繪制其點(diǎn)的特征值
for klass, color in zip(range(0, 5), colors):
    Xk = X[clust.labels_ == klass]
    ax2.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3)
# 對(duì)于噪聲點(diǎn),用黑色加號(hào)繪制其點(diǎn)的特征值
ax2.plot(X[clust.labels_ == -1, 0], X[clust.labels_ == -1, 1], "k+", alpha=0.1)
# 設(shè)置標(biāo)題為“自動(dòng)聚類\nOPTICS”
ax2.set_title("自動(dòng)聚類\nOPTICS")


# 繪制 epsilon 為 0.5 時(shí)的 DBSCAN 聚類結(jié)果,橫軸是數(shù)據(jù)的第一個(gè)特征,縱軸是數(shù)據(jù)的第二個(gè)特征
# 不同的顏色表示不同的簇,黑色的加號(hào)表示噪聲點(diǎn)
colors = ["g.", "r.", "b.", "c."]
# 對(duì)于每個(gè)簇,用相應(yīng)的顏色繪制其點(diǎn)的特征值
for klass, color in zip(range(0, 4), colors):
    Xk = X[labels_050 == klass]
    ax3.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3)
# 對(duì)于噪聲點(diǎn),用黑色加號(hào)繪制其點(diǎn)的特征值
ax3.plot(X[labels_050 == -1, 0], X[labels_050 == -1, 1], "k+", alpha=0.1)
# 設(shè)置標(biāo)題為“在 0.5 epsilon 切割處的聚類\nDBSCAN”
ax3.set_title("在 0.5 epsilon 切割處的聚類\nDBSCAN")


# 繪制 epsilon 為 2 時(shí)的 DBSCAN 聚類結(jié)果,橫軸是數(shù)據(jù)的第一個(gè)特征,縱軸是數(shù)據(jù)的第二個(gè)特征
# 不同的顏色表示不同的簇,黑色的加號(hào)表示噪聲點(diǎn)
colors = ["g.", "m.", "y.", "c."]
# 對(duì)于每個(gè)簇,用相應(yīng)的顏色繪制其點(diǎn)的特征值
for klass, color in zip(range(0, 4), colors):
    Xk = X[labels_200 == klass]
    ax4.plot(Xk[:, 0], Xk[:, 1], color, alpha=0.3)
# 對(duì)于噪聲點(diǎn),用黑色加號(hào)繪制其點(diǎn)的特征值
ax4.plot(X[labels_200 == -1, 0], X[labels_200 == -1, 1], "k+", alpha=0.1)
# 設(shè)置標(biāo)題為“在 2.0 epsilon 切割處的聚類\nDBSCAN”
ax4.set_title("在 2.0 epsilon 切割處的聚類\nDBSCAN")


# 調(diào)整子圖的布局,避免重疊
plt.tight_layout()
# 顯示圖形
plt.show()

輸出:(噪聲-灰色)

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

  • 可達(dá)性圖:顯示了每個(gè)點(diǎn)的可達(dá)性距離,即一個(gè)點(diǎn)到其最近的核心點(diǎn)的距離??蛇_(dá)性圖可以幫助選擇合適的 epsilon 值進(jìn)行 DBSCAN 聚類,不同顏色的區(qū)域表示不同的簇。

  • OPTICS 聚類:顯示了 OPTICS 算法自動(dòng)識(shí)別的簇,不需要指定簇的個(gè)數(shù)或 epsilon 值。不同顏色的點(diǎn)表示不同的簇,黑色的加號(hào)表示噪聲點(diǎn),即沒有被分配到任何簇的點(diǎn)。

  • DBSCAN 聚類:顯示了在不同的 epsilon 值下,使用 DBSCAN 算法的聚類結(jié)果,與 OPTICS 聚類進(jìn)行比較??梢钥闯?,epsilon 值的變化會(huì)影響 DBSCAN 聚類的效果,epsilon 值越大,簇的個(gè)數(shù)越少,噪聲點(diǎn)越少。OPTICS 聚類則可以更好地適應(yīng)不同密度的簇。

5.3 Mean Shift 算法

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

示例(scikit-learn)

# 導(dǎo)入 numpy 模塊,用于進(jìn)行數(shù)值計(jì)算
import numpy as np
# 從 sklearn.cluster 模塊導(dǎo)入 MeanShift 函數(shù),用于進(jìn)行 Mean-Shift 聚類
from sklearn.cluster import MeanShift
# 從 sklearn.datasets 模塊導(dǎo)入 make_blobs 函數(shù),用于生成樣本數(shù)據(jù)
from sklearn.datasets import make_blobs
# 導(dǎo)入 matplotlib.pyplot 模塊,用于繪制圖形
import matplotlib.pyplot as plt
# 使用 make_blobs 函數(shù)生成 300 個(gè)樣本,分為 3 個(gè)簇,設(shè)置隨機(jī)數(shù)種子為 42
# veri 是一個(gè)二維數(shù)組,表示樣本的特征值,_ 是一個(gè)一維數(shù)組,表示樣本的真實(shí)標(biāo)簽,這里不需要用到
veri, _ = make_blobs(n_samples=300, centers=3, random_state=42)
# 創(chuàng)建一個(gè) Mean-Shift 聚類器對(duì)象,設(shè)置帶寬參數(shù)為 2,帶寬參數(shù)決定了鄰域的大小
mean_shift = MeanShift(bandwidth=2)
# 對(duì)樣本數(shù)據(jù)進(jìn)行擬合,得到 Mean-Shift 聚類的結(jié)果
mean_shift.fit(veri)
# 獲取聚類的中心點(diǎn),是一個(gè)二維數(shù)組,每一行表示一個(gè)中心點(diǎn)的坐標(biāo)
kume_merkezleri = mean_shift.cluster_centers_
# 獲取聚類的標(biāo)簽,是一個(gè)一維數(shù)組,表示每個(gè)樣本所屬的簇的編號(hào)
etiketler = mean_shift.labels_
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False  # 用來(lái)正常顯示負(fù)號(hào)
# 創(chuàng)建一個(gè)圖形對(duì)象,設(shè)置大小為 8 x 6
plt.figure(figsize=(8, 6))
# 繪制樣本點(diǎn)的散點(diǎn)圖,橫軸是數(shù)據(jù)的第一個(gè)特征,縱軸是數(shù)據(jù)的第二個(gè)特征,顏色由聚類標(biāo)簽決定,使用 viridis 色彩映射,點(diǎn)的大小為 50,透明度為 0.7
plt.scatter(veri[:, 0], veri[:, 1], c=etiketler, cmap='viridis', s=50, alpha=0.7)
# 繪制聚類中心點(diǎn)的散點(diǎn)圖,橫軸是中心點(diǎn)的第一個(gè)坐標(biāo),縱軸是中心點(diǎn)的第二個(gè)坐標(biāo),顏色為紅色,標(biāo)記為 X,點(diǎn)的大小為 200,設(shè)置圖例為“簇中心”
plt.scatter(kume_merkezleri[:, 0], kume_merkezleri[:, 1], color='red', marker='X', s=200, label='簇中心')
# 設(shè)置橫軸的標(biāo)簽為“特征 1”
plt.xlabel('特征 1')
# 設(shè)置縱軸的標(biāo)簽為“特征 2”
plt.ylabel('特征 2')
# 設(shè)置標(biāo)題為“Mean-Shift 聚類”
plt.title('Mean-Shift 聚類')
# 顯示圖例
plt.legend()
# 顯示圖形
plt.show()

輸出結(jié)果:

【機(jī)器學(xué)習(xí)】聚類算法(二),機(jī)器學(xué)習(xí),算法,聚類,人工智能,數(shù)據(jù)挖掘

參考網(wǎng)址:

https://scikit-learn.org/stable/auto_examples/cluster/plot_optics.html#sphx-glr-auto-examples-cluster-plot-optics-py

https://scikit-learn.org/stable/modules/clustering.html#

附-scikit-learn OPTICS參數(shù)說明:

OPTICS(Ordering Points To Identify the Clustering Structure)算法說明

OPTICS(Ordering Points To Identify the Clustering Structure)是一種從向量數(shù)組中估算聚類結(jié)構(gòu)的算法,與DBSCAN密切相關(guān),它找到高密度的核心樣本并從它們擴(kuò)展聚類[1]。與DBSCAN不同的是,OPTICS保留了可變鄰域半徑的聚類層次結(jié)構(gòu)。相對(duì)于當(dāng)前scikit-learn實(shí)現(xiàn)的DBSCAN,OPTICS更適用于大型數(shù)據(jù)集。

聚類結(jié)果可以使用類似DBSCAN的方法(cluster_method='dbscan')或者[1]中提出的自動(dòng)技術(shù)(cluster_method='xi')來(lái)提取。

這個(gè)實(shí)現(xiàn)與原始的OPTICS不同之處在于,它首先在所有點(diǎn)上執(zhí)行k最近鄰搜索以識(shí)別核心大小,然后在構(gòu)建聚類順序時(shí)僅計(jì)算與未處理點(diǎn)的距離。請(qǐng)注意,我們沒有使用堆來(lái)管理擴(kuò)展候選者,因此時(shí)間復(fù)雜度為O(n^2)。

詳細(xì)信息請(qǐng)參閱[用戶指南 <optics>]。

參數(shù):

  • min_samples:int > 1 或介于 0 和 1 之間的浮點(diǎn)數(shù),默認(rèn)為 5??紤]一個(gè)點(diǎn)為核心點(diǎn)的鄰域中的樣本數(shù)。同時(shí),陡峭區(qū)域的上下點(diǎn)不能有超過 min_samples 個(gè)連續(xù)的非陡峭點(diǎn)。表達(dá)為絕對(duì)數(shù)量或樣本數(shù)量的分?jǐn)?shù)(至少為2)。

  • max_eps:float,默認(rèn)為 np.inf。兩個(gè)樣本被認(rèn)為在彼此鄰域中的最大距離。 np.inf 的默認(rèn)值將識(shí)別所有尺度上的聚類;減小 max_eps 將導(dǎo)致更短的運(yùn)行時(shí)間。

  • metric:str 或可調(diào)用對(duì)象,默認(rèn)為 'minkowski'。用于距離計(jì)算的度量。可以使用scikit-learn或scipy.spatial.distance中的任何度量。

  • p:int,默認(rèn)為 2。Minkowski距離的參數(shù)。當(dāng)p = 1時(shí),相當(dāng)于使用曼哈頓距離(l1),當(dāng)p = 2時(shí),相當(dāng)于使用歐氏距離(l2)。對(duì)于任意p,將使用Minkowski距離(l_p)。

  • metric_params:字典,默認(rèn)為 None。度量函數(shù)的附加關(guān)鍵字參數(shù)。

  • cluster_method:str,默認(rèn)為 'xi'。用于使用計(jì)算的可達(dá)性和排序提取聚類的提取方法??赡艿闹禐?"xi" 和 "dbscan"。

  • eps:float,默認(rèn)為 None。兩個(gè)樣本被認(rèn)為在彼此鄰域中的最大距離。默認(rèn)情況下,它假定與 max_eps 相同的值。僅在 cluster_method='dbscan' 時(shí)使用。

  • xi:介于 0 和 1 之間的浮點(diǎn)數(shù),默認(rèn)為 0.05。確定達(dá)到性圖上構(gòu)成聚類邊界的最小陡峭度。例如,在達(dá)到性圖中,上升點(diǎn)由從一個(gè)點(diǎn)到其后繼的比率最多為 1-xi 定義。僅在 cluster_method='xi' 時(shí)使用。

  • predecessor_correction:bool,默認(rèn)為 True。根據(jù)OPTICS計(jì)算的前任來(lái)修正聚類[2]。這個(gè)參數(shù)對(duì)大多數(shù)數(shù)據(jù)集的影響很小。僅在 cluster_method='xi' 時(shí)使用。

  • min_cluster_size:int > 1 或介于 0 和 1 之間的浮點(diǎn)數(shù),默認(rèn)為 None。OPTICS聚類中的最小樣本數(shù),表示為絕對(duì)數(shù)量或樣本數(shù)量的分?jǐn)?shù)(至少為2)。如果為 None,則使用 min_samples 的值。僅在 cluster_method='xi' 時(shí)使用。

  • algorithm:{'auto', 'ball_tree', 'kd_tree', 'brute'},默認(rèn)為 'auto'。用于計(jì)算最近鄰居的算法。

  • leaf_size:int,默認(rèn)為 30。傳遞給BallTree或KDTree的葉子大小。這可能會(huì)影響構(gòu)建和查詢的速度,以及存儲(chǔ)樹所需的內(nèi)存。最佳值取決于問題的性質(zhì)。

  • n_jobs:int,默認(rèn)為 None。運(yùn)行最近鄰搜索的并行作業(yè)數(shù)。None 表示使用1個(gè)處理器,除非在 joblib.parallel_backend 上下文中。-1 表示使用所有處理器。

屬性:

  • labels_:形狀為 (n_samples,) 的數(shù)組。給定給 fit() 的數(shù)據(jù)集中每個(gè)點(diǎn)的聚類標(biāo)簽。噪聲樣本和不包括在 cluster_hierarchy_ 的葉簇中的點(diǎn)標(biāo)記為 -1。

  • reachability_:形狀為 (n_samples,) 的數(shù)組。每個(gè)樣本的可達(dá)性距離,由對(duì)象順序索引。使用 clust.reachability_[clust.ordering_] 來(lái)按簇順序訪問。

  • ordering_:形狀為 (n_samples,) 的數(shù)組。樣本索引的簇排序列表。

  • core_distances_:形狀為 (n_samples,) 的數(shù)組。每個(gè)樣本變?yōu)楹诵狞c(diǎn)的距離,由對(duì)象順序索引。永遠(yuǎn)不會(huì)成為核心的點(diǎn)的距離為inf。使用 clust.core_distances_[clust.ordering_] 來(lái)按簇順序訪問。

  • predecessor_:形狀為 (n_samples,) 的數(shù)組。樣本從中到達(dá)的點(diǎn),由對(duì)象順序索引。種子點(diǎn)的前任為 -1。

  • cluster_hierarchy_:形狀為 (n_clusters, 2) 的數(shù)組。每行表示簇的形式為 [start, end],所有索引都是包容的。簇根據(jù) (end, -start)(升序)排序,以便較大的簇包含在較小的簇之后。由于 labels_ 不反映層次結(jié)構(gòu),通常 len(cluster_hierarchy_) > np.unique(optics.labels_)。請(qǐng)注意,這些索引是 ordering_ 的,即 X[ordering_][start:end + 1] 形成一個(gè)簇。僅在 cluster_method='xi' 時(shí)可用。

  • [1] Ankerst, Mihael, Markus M. Breunig, Hans-Peter Kriegel, and J?rg Sander. "OPTICS: ordering points to identify the clustering structure." ACM SIGMOD Record 28, no. 2 (1999): 49-60.

  • [2] Schubert, Erich, Michael Gertz. "Improving the Cluster Structure Extracted from OPTICS Plots." Proc. of the Conference "Lernen, Wissen, Daten, Analysen" (LWDA) (2018): 318-329.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-782800.html

到了這里,關(guān)于【機(jī)器學(xué)習(xí)】聚類算法(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包