無監(jiān)督機器學習算法沒有任何監(jiān)督者提供任何指導。 這就是為什么它們與真正的人工智能緊密結合的原因。
在無人監(jiān)督的學習中,沒有正確的答案,也沒有監(jiān)督者指導。 算法需要發(fā)現用于學習的有趣數據模式。
基本上,它是一種無監(jiān)督學習方法,也是用于許多領域的統(tǒng)計數據分析的常用技術。 聚類主要是將觀測集合劃分為子集(稱為聚類)的任務,以同一聚類中的觀測在一種意義上相似并且與其他聚類中的觀測不相似的方式。 簡而言之,可以說聚類的主要目標是根據相似性和不相似性對數據進行分組。
例如,下圖顯示了不同群集中的類似數據 -

以下是數據聚類的幾種常用算法 -
K-Means算法
K均值聚類算法是眾所周知的數據聚類算法之一。 我們需要假設簇的數量已經是已知的。 這也被稱為平面聚類。 它是一種迭代聚類算法。 該算法需要遵循以下步驟 -
第1步 - 需要指定所需的K個子組的數量。
第2步 - 修復群集數量并將每個數據點隨機分配到群集。 換句話說,我們需要根據群集數量對數據進行分類。
在這一步中,計算聚類質心。
由于這是一種迭代算法,因此需要在每次迭代中更新K個質心的位置,直到找到全局最優(yōu)值或換句話說質心到達其最佳位置。
以下代碼將有助于在Python中實現K-means聚類算法。 我們將使用Scikit-learn模塊。
導入必需的軟件包 -
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans
以下代碼行將通過使用sklearn.dataset包中的make_blob來生成包含四個blob的二維數據集。
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)
可以使用下面的代碼可視化數據集 -
plt.scatter(X[:, 0], X[:, 1], s = 50);
plt.show()
得到以下結果 -

在這里,將kmeans初始化為KMeans算法,以及多少個群集(n_clusters)所需的參數。
kmeans = KMeans(n_clusters = 4)
需要用輸入數據訓練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_
下面給出的代碼將根據數據繪制和可視化機器的發(fā)現,并根據要找到的聚類數量進行擬合。
plt.scatter(centers[:, 0], centers[:, 1], c = 'black', s = 200, alpha = 0.5);
plt.show()
得到以下結果 -
均值偏移算法
它是另一種在無監(jiān)督學習中使用的流行和強大的聚類算法。 它不做任何假設,因此它是非參數算法。 它也被稱為分層聚類或均值聚類分析。 以下將是該算法的基本步驟 -
在下面的代碼的幫助下,在Python中實現了Mean Shift聚類算法。使用Scikit-learn模塊。
導入必要的軟件包 -
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來生成包含四個blob的二維數據集。
from sklearn.datasets.samples_generator import make_blobs
可以用下面的代碼可視化數據集 -
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í)行上面示例代碼,得到以下結果 -

現在,我們需要用輸入數據來訓練Mean Shift聚類模型。
ms = MeanShift()
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
以下代碼將按照輸入數據打印聚類中心和預期的聚類數量 -
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
下面給出的代碼將有助于根據數據繪制和可視化機器的發(fā)現,并根據要找到的聚類數量進行裝配。
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í)行上面示例代碼,得到以下結果 -

現實世界的數據不是自然地組織成許多獨特的群集。 由于這個原因,要想象和推斷推理并不容易。 這就是為什么需要測量聚類性能及其質量。 它可以在輪廓分析的幫助下完成。
輪廓分析
該方法可用于通過測量群集之間的距離來檢查聚類的質量。 基本上,它提供了一種通過給出輪廓分數來評估像集群數量這樣的參數的方法。 此分數是衡量一個群集中每個點與相鄰群集中的點的距離的度量。
分析輪廓分數
得分范圍為[-1,1]。 以下是對這個分數的分析 -
在本節(jié)中,我們將學習如何計算輪廓分數。
輪廓分數可以通過使用以下公式來計算 -
這里,`