聚類算法

分類是算法基于已有標簽的數據進行學習并對新數據進行分類,而聚類則是在完全沒有標簽的情況下,有算法“猜測”哪些數據像是應該“堆”在一起的,并且讓算法給不同的“堆”里的數據貼上一個數字標簽。

一、K 均值聚類算法

關于k-means,可以 參考 k-means學習筆記》
用手工生成的數據集來展示聚類算法的工作原理。

#聚類算法
import numpy as np
import matplotlib.pyplot as plt #導入畫圖工具
from sklearn.datasets import make_blobs #導入數據生成工具
from sklearn.cluster import KMeans #導入 KMeans 工具

#生成份數為1的數據集
blobs = make_blobs(random_state=1, centers=1)
X_blobs = blobs[0]

#繪制散點圖
plt.scatter(X_blobs[:,0], X_blobs[:,1],c='r', edgecolors='k')
#plt.show()

#要求 KMeans 將數據聚為3類
kmeans = KMeans(n_clusters=3)

kmeans.fit(X_blobs)

#畫圖
x_min, x_max = X_blobs[:, 0].min()-0.5, X_blobs[:, 0].max() + 0.5
y_min, y_max = X_blobs[:, 1].min()-0.5, X_blobs[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),
                     np.arange(y_min, y_max, .02))
Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1)
plt.clf()
plt.imshow(Z, interpolation='nearest',
           extent=(xx.min(), xx.max(), yy.min(), yy.max()),
           cmap=plt.cm.summer, aspect='auto', origin='lower')

plt.plot(X_blobs[:,0], X_blobs[:,1], 'r.', markersize=5)

#用藍色的叉號代表聚類的中心
centeroids= kmeans.cluster_centers_
plt.scatter(centeroids[:, 0], centeroids[:, 1],
            marker='x', s=150, linewidths=3, color='b', zorder=10)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()

#打印 KMEANS 進行聚類的標簽
print(" K均值的聚類標簽:\n{}".format(kmeans.labels_))

生成的數據集為:


9.4blobs.png

經過KMEANS 聚類的結果為:


9.4k_means.png
 K均值的聚類標簽:
[1 1 0 2 2 2 1 1 0 2 1 2 1 0 1 2 2 1 0 0 2 0 1 1 1 1 2 1 1 1 0 0 1 1 2 0 2
 0 1 0 2 1 0 0 2 2 2 1 0 1 0 1 2 0 2 2 0 2 2 1 2 0 2 1 0 2 0 0 1 2 2 1 2 2
 2 1 2 1 1 0 2 0 2 2 0 1 2 1 0 0 2 1 0 0 2 2 1 2 2 1]

1. 如圖所示,指定了K 均值的n_clusters=3,所以K 均值將數據點聚為3類,圖中的X號,就代表了K均值對數據進行聚類的3個中心點。
2. K均值對數據的聚類和分類有點相似,是用 0, 1, 2三個數字來代表數據的類,并且存儲在.labels_屬性中。
3. K均值算法的局限性是,塔認為,每個數據點到聚類中心的方向都是同等重要的,這樣一來,對于“形狀”復雜的數據集來說。 K均值就不能很好的工作。

二、凝聚聚類算法

凝聚聚類(agglomerative clustering)指的是許多基于相同原則構建的聚類算法,這一原則是:算法首先聲明每個點是自己的簇,然后合并兩個最相似的簇,直到滿足某種停止準則為止。scikit-learn中實現的停止準則是簇的個數,因此相似的簇被合并,直到僅剩下指定個數的簇。

1.可以參考 《聚類算法:凝聚層次聚類》
2.關于樹狀圖的繪制可以參考 《python 凝聚聚類之樹狀圖》
以下以圖形化的方式來展現凝聚聚類算法的工作機制(數據集仍舊使用上述生成值)

#凝聚聚類算法機制可視化
import matplotlib.pyplot as plt #導入畫圖工具
from sklearn.datasets import make_blobs #導入數據生成工具
from scipy.cluster.hierarchy import dendrogram, ward

#生成份數為1的數據集
blobs = make_blobs(random_state=1, centers=1)
X_blobs = blobs[0]

#使用連線的方式進行可視化
# 在數據組 X_blobs 上應用 ward 聚類函數,返回聚類過程中所跨越距離的數組
linkage = ward(X_blobs)
# 繪制樹狀圖
dendrogram(linkage)
ax= plt.gca()

plt.xlabel("Ssmple index")
plt.ylabel("Cluster distance")
plt.show()

執(zhí)行結果如圖:


9.5.png

從圖中可以看到,凝聚聚類算法是自下而上,不斷的合并相似的聚類中心,以便讓類別越來越少,同時,每個聚類中心的距離也就 越來越遠,這種逐漸生成聚類的方法稱為 Hierarchy clustering.
與K 均值聚類類似,凝聚聚類算法也無法對“形狀”復雜的數據進行正確的聚類。

三、DBSCAN聚類算法

DBSCAN 基于密的有噪聲應用空間聚類(Density-Based Spatial Clustering of Applications with Noise)是一個比較有代表性的基于密度的聚類算法,與機遇層次聚類方法不同,它將簇定義為密度相連的點的最大集合,能夠把具有足夠高密度的區(qū)域劃分為簇,并可在噪聲的空間數據庫中發(fā)現任意形狀的聚類。
簡單講,DBSCAN 是通過對特征空間內的密度進行檢測,密度大的地方它會認為是一個類,而密度相對小的地方它會認為是一個分界線。

詳細的原理以及介紹可以參考這篇博文 《DBSCAN方法及應用》

仍舊使用上述的數據進行聚類。

#DBSCAN 聚類算法
from sklearn.datasets import make_blobs #導入數據生成工具
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt #導入畫圖工具

#生成份數為1的數據集
blobs = make_blobs(random_state=1, centers=1)
X_blobs = blobs[0]

db = DBSCAN()

cluster = db.fit_predict(X_blobs)

#繪制散點圖
plt.scatter(X_blobs[:,0], X_blobs[:,1],c=cluster, cmap=plt.cm.cool,
            s=60, edgecolors='k')

plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

plt.show()

執(zhí)行結果為:


9.6DBSCAN.png
聚類標簽為:
[-1  0 -1  0 -1  0  0  0  0  0  0  0  0  0 -1  0  0  0  0  0  0  0  0  0  0
 -1  0  0 -1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 -1  0  0
  0  0  0  0  0  0  0 -1  0  0  0  0  0  0 -1  0  0  0  0  0  0  0  0  0 -1
 -1  0  0  0  0 -1  0  0 -1  0  0 -1  0  0  0  0  0  0  0  0 -1  0  0  0 -1]

從圖中可以看出,中間深色的數據點密度相對較大,因此 DBSCAN 把它們歸為一類,外圍淺色的數據點,DBSCAN 認為不屬于任何一類,所以放入了“噪聲”這個類別,因此,聚類標簽中會有-1這種 類別,代表噪聲。

注:關于DBSCAN 的參數詳解,可以參考《 用scikit-learn學習DBSCAN聚類 》
下面再嘗試調整 DBSCAN 中非常重要的兩個參數

3.1 eps

eps :考慮劃入同一類的樣本有多遠,該值設置越大,則聚類所覆蓋的數據點越多。eps默認是0.5

#DBSCAN 聚類算法
from sklearn.datasets import make_blobs #導入數據生成工具
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt #導入畫圖工具

#生成份數為1的數據集
blobs = make_blobs(random_state=1, centers=1)
X_blobs = blobs[0]

#2.設置 eps =2
db1 = DBSCAN(eps=2)
clusters1 = db1.fit_predict(X_blobs)
#繪制散點圖
plt.scatter(X_blobs[:,0], X_blobs[:,1],c=clusters1, cmap=plt.cm.cool,
            s=60, edgecolors='k')

plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

plt.show()

#打印聚類個數
print('\n\neps=2時,聚類標簽為:\n{}'.format(clusters))

執(zhí)行結果如下:

eps=2時,聚類標簽為:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
9.6eps=2.png

可以看出,所有的點都變成了淺色,并不代表所有的點都是噪聲,而是所有的點都被劃歸到一個類中了,因為增加了 eps 的值,所以把更遠的數據點都拉入到這個聚類中了。

3.2 min_samples

min_samples:指定的是在某個數據點周圍,被看成聚類核心點的個數,即樣本點要成為核心對象所需要的?-鄰域的樣本數閾值。值越大,則核心數據點越少,噪聲也就越多。min_samples 默認為 5。

#DBSCAN 聚類算法
from sklearn.datasets import make_blobs #導入數據生成工具
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt #導入畫圖工具

#生成份數為1的數據集
blobs = make_blobs(random_state=1, centers=1)
X_blobs = blobs[0]

#3.設置 min_samples=20
db2 = DBSCAN(min_samples=20)
clusters2 = db2.fit_predict(X_blobs)
#繪制散點圖
plt.scatter(X_blobs[:,0], X_blobs[:,1],c=clusters2, cmap=plt.cm.cool,
            s=60, edgecolors='k')

plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

plt.show()

#打印聚類個數
print('\n\nmin_samples=20時,聚類標簽為:\n{}'.format(clusters2))

執(zhí)行結果如下:

min_samples=20時,聚類標簽為:
[-1 -1 -1 -1 -1 -1 -1 -1 -1  0 -1 -1  0 -1 -1 -1 -1 -1  0 -1 -1  0  0  0 -1
 -1  0  0 -1 -1 -1 -1 -1 -1 -1  0 -1 -1  0  0  0 -1  0 -1  0 -1 -1 -1 -1 -1
  0 -1 -1 -1 -1  0 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1
 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0 -1 -1 -1 -1 -1 -1 -1 -1]
9.6min_samples=20.png

可以看出,淺色數據點變多了,也就是噪聲變多了,即聚類中被劃為 1 的數據點變少了。

DBSCAN聚類算法總結

1.雖然 DBSCAN 聚類算法并不直接指定 clusters的數量,但是通過 min_samples 和 eps 參數,相當于間接的指定了 clusters的數量。尤其是 eps 參數尤為重要,因為它規(guī)定了某一簇的范圍大小。
2.在實際應用中,如果將數據集先用 StandardScaler 或者 MinMaxScaler 進行處理,那么 DBSCAN 聚類算法的表現會更好。因為,這兩種預處理方法把數據的范圍控制的比較集中。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容