AI人工智能 數(shù)據(jù)聚類算法

2020-09-23 16:25 更新

以下是數(shù)據(jù)聚類的幾種常用算法 -

K-Means 算法 K均值聚類算法是眾所周知的數(shù)據(jù)聚類算法之一。 我們需要假設(shè)簇的數(shù)量已經(jīng)是已知的。 這也被稱為平面聚類。 它是一種迭代聚類算法。 該算法需要遵循以下步驟 -

第1步 - 需要指定所需的K個(gè)子組的數(shù)量。 第2步 - 修復(fù)群集數(shù)量并將每個(gè)數(shù)據(jù)點(diǎn)隨機(jī)分配到群集。 換句話說,我們需要根據(jù)群集數(shù)量對數(shù)據(jù)進(jìn)行分類。

在這一步中,計(jì)算聚類質(zhì)心。

由于這是一種迭代算法,因此需要在每次迭代中更新 K 個(gè)質(zhì)心的位置,直到找到全局最優(yōu)值或換句話說質(zhì)心到達(dá)其最佳位置。

以下代碼將有助于在 Python 中實(shí)現(xiàn) K-means 聚類算法。 我們將使用 Scikit-learn 模塊。

導(dǎo)入必需的軟件包 -

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans

以下代碼行將通過使用 sklearn.dataset包中的 make_blob 來生成包含四個(gè) blob 的二維數(shù)據(jù)集。

from sklearn.datasets.samples_generator import make_blobs


X, y_true = make_blobs(n_samples = 500, centers = 4,
            cluster_std = 0.40, random_state = 0)

可以使用下面的代碼可視化數(shù)據(jù)集 -

plt.scatter(X[:, 0], X[:, 1], s = 50);
plt.show()

得到以下結(jié)果 -

img

在這里,將 kmeans 初始化為 KMeans 算法,以及多少個(gè)群集 (n_clusters) 所需的參數(shù)。

kmeans = KMeans(n_clusters = 4)

需要用輸入數(shù)據(jù)訓(xùn)練 K-means 模型。

kmeans.fit(X)
y_kmeans = kmeans.predict(X)
plt.scatter(X[:, 0], X[:, 1], c = y_kmeans, s = 50, cmap = 'viridis')


centers = kmeans.cluster_centers_

下面給出的代碼將根據(jù)數(shù)據(jù)繪制和可視化機(jī)器的發(fā)現(xiàn),并根據(jù)要找到的聚類數(shù)量進(jìn)行擬合。

plt.scatter(centers[:, 0], centers[:, 1], c = 'black', s = 200, alpha = 0.5);
plt.show()

得到以下結(jié)果 - img

均值偏移算法

它是另一種在無監(jiān)督學(xué)習(xí)中使用的流行和強(qiáng)大的聚類算法。 它不做任何假設(shè),因此它是非參數(shù)算法。 它也被稱為分層聚類或均值聚類分析。 以下將是該算法的基本步驟 -

  • 首先,需要從分配給它們自己的集群的數(shù)據(jù)點(diǎn)開始。
  • 現(xiàn)在,它計(jì)算質(zhì)心并更新新質(zhì)心的位置。
  • 通過重復(fù)這個(gè)過程,向簇的頂點(diǎn)靠近,即朝向更高密度的區(qū)域移動。
  • 該算法停止在質(zhì)心不再移動的階段。

在下面的代碼的幫助下,在 Python 中實(shí)現(xiàn)了 Mean Shift 聚類算法。使用 Scikit-learn 模塊。

導(dǎo)入必要的軟件包 -

import numpy as np
from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")

以下代碼將通過使用 sklearn.dataset 包中的 make_blob 來生成包含四個(gè) blob 的二維數(shù)據(jù)集。

from sklearn.datasets.samples_generator import make_blobs

可以用下面的代碼可視化數(shù)據(jù)集 -

centers = [[2,2],[4,5],[3,10]]
X, _ = make_blobs(n_samples = 500, centers = centers, cluster_std = 1)
plt.scatter(X[:,0],X[:,1])
plt.show()

執(zhí)行上面示例代碼,得到以下結(jié)果 -

img

現(xiàn)在,我們需要用輸入數(shù)據(jù)來訓(xùn)練 Mean Shift 聚類模型。

ms = MeanShift()
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_

以下代碼將按照輸入數(shù)據(jù)打印聚類中心和預(yù)期的聚類數(shù)量 -

print(cluster_centers)
n_clusters_ = len(np.unique(labels))
print("Estimated clusters:", n_clusters_)
[[ 3.23005036 3.84771893]
[ 3.02057451 9.88928991]]
Estimated clusters: 2

下面給出的代碼將有助于根據(jù)數(shù)據(jù)繪制和可視化機(jī)器的發(fā)現(xiàn),并根據(jù)要找到的聚類數(shù)量進(jìn)行裝配。

colors = 10*['r.','g.','b.','c.','k.','y.','m.']
   for i in range(len(X)):
   plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10)
plt.scatter(cluster_centers[:,0],cluster_centers[:,1],
   marker = "x",color = 'k', s = 150, linewidths = 5, zorder = 10)
plt.show()

執(zhí)行上面示例代碼,得到以下結(jié)果 -

img

測量群集性能

現(xiàn)實(shí)世界的數(shù)據(jù)不是自然地組織成許多獨(dú)特的群集。 由于這個(gè)原因,要想象和推斷推理并不容易。 這就是為什么需要測量聚類性能及其質(zhì)量。 它可以在輪廓分析的幫助下完成。

輪廓分析

該方法可用于通過測量群集之間的距離來檢查聚類的質(zhì)量。 基本上,它提供了一種通過給出輪廓分?jǐn)?shù)來評估像集群數(shù)量這樣的參數(shù)的方法。 此分?jǐn)?shù)是衡量一個(gè)群集中每個(gè)點(diǎn)與相鄰群集中的點(diǎn)的距離的度量。

分析輪廓分?jǐn)?shù) 得分范圍為[-1,1]。 以下是對這個(gè)分?jǐn)?shù)的分析 -

  • 得分為 +1分 - 得分接近 +1表示樣本距離相鄰集群很遠(yuǎn)。
  • 得分為 0分 - 得分 0 表示樣本與兩個(gè)相鄰群集之間的決策邊界處于或非常接近。
  • 得分為 -1分 - 得分為負(fù)分?jǐn)?shù)表示樣本已分配到錯(cuò)誤的群集。

計(jì)算輪廓分?jǐn)?shù)

在本節(jié)中,我們將學(xué)習(xí)如何計(jì)算輪廓分?jǐn)?shù)。

輪廓分?jǐn)?shù)可以通過使用以下公式來計(jì)算 - img

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號