spss實現k均值聚類

機器學習中的k均值聚類屬於無監督學習,所謂k指的是簇類的個數,也即均值向量的個數。算法初始狀態下,要根據我們設定的k隨機生成k箇中心向量,隨機生成中心向量的方法既可以隨機從樣本中抽取k個樣本作爲中心向量,也可以將中心向量固定在樣本的維度範圍之內,避免中心向量過偏遠離大多數樣本點。然後每個樣本點需要與k箇中心向量分別計算歐氏距離,取歐氏距離最小的中心向量作爲該樣本點的簇類中心,當第一輪迭代完成之後,中心向量需要更新,更新的方法是每個中心向量取前一次迭代所得到各自簇類樣本點的均值,故稱之爲均值向量。迭代終止的條件是,所有樣本點的簇類中心都不在發生變化。
在spss中導入的二維數據如下所示:
在這裏插入圖片描述
點擊菜單欄的“分析”,找到“分類”選中“k-均值聚類”
在這裏插入圖片描述
將需要進行聚類的變量選入右側框中
在這裏插入圖片描述
聚類數由用戶設定,方法一般選擇“迭代與分類”,“讀取初始聚類中心”和“寫入最終聚類中心”一般不勾選,除非自定義的聚類中心(自定義聚類中心一般意義不大),如果最後想將最終迭代得到的聚類中心寫入指定文件,那麼可以勾選第二個複選框。
在這裏插入圖片描述
設定迭代次數,收斂條件默認爲0,即當前均值向量與前一次迭代得到的均值向量之差。
在這裏插入圖片描述
保存按鈕,勾選以上覆選框,最終得到的結果會包含以上兩個信息。
在這裏插入圖片描述
選項按鈕中,一般勾選以上覆選框,spss會統計出初始聚類的中心向量以及每個樣本的聚類信息(包括每個樣本所屬類別,與各自簇類中心向量的歐氏距離)。之後,點擊“確定”按鈕,完成均值聚類。
得到初始聚類中心和迭代歷史記錄,我們發現第二次迭代的時候,聚類中心就已經不變了。
在這裏插入圖片描述
以下是每個樣本所屬類別以及每個樣本與各自簇類中心的歐氏距離。
在這裏插入圖片描述
在這裏插入圖片描述
以上是最終得到的聚類中心的橫縱座標,以及聚類中心與中心之間的歐氏距離、每個類別中的樣本數量。
以下是通過python編程實現k-均值聚類算法所得結果:

最終得到的聚類中心:
[[ 2.6265299   3.10868015]
 [-2.46154315  2.78737555]
 [-3.53973889 -2.89384326]
 [ 2.65077367 -2.79019029]]

在這裏插入圖片描述
顯然,與spss得到的聚類結果是一樣的。
關於均值聚類的簇類數(即k值),目前並沒有方法能確切地確定k的值是多少,但是通常可以通過枚舉法和肘方法來大致確定k。
所謂枚舉法,即通過取不同的k值來觀察最終的聚類結果,選取最優結果所對應的k作爲該均值聚類的最終k值。
肘方法是通過繪製不同的k所對應的樣本數據點與各自聚類中心的距離平均值來確定k。

import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt

cluster1 = np.random.uniform(0.5, 2.0, (2, 15))
cluster2 = np.random.uniform(2.5, 4.0, (2, 15))
X = np.hstack((cluster1, cluster2)).T

fig = plt.figure()
ax1 = fig.add_subplot(121)
plt.scatter(X[:, 0], X[:, 1], marker="^", color='m', edgecolors='k', alpha=0.8, s=50)
plt.title("Raw data")

K = range(1, 10)
meandistortions = []
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])

ax2 = fig.add_subplot(122)
plt.plot(K, meandistortions, 'bx-')
plt.xlabel('number of clusters K', fontsize=15)
plt.ylabel('Average distance to centroid', fontsize=15)
plt.title('Elbow for KMeans clustering');
plt.show()

在這裏插入圖片描述
通過左圖我們發現該樣本數據集明顯應該分爲兩個簇類,即k=2,當然如果在複雜數據集的情況下我們可能無法用右眼直接看出簇類數,此時就要藉助右圖的肘方法,即選取某一點該點的前一點至該點下降最快,而該點至該點的後一個點緩慢下降的點所對應的橫軸作爲均值聚類的k值。 右圖由於曲線長得像人的手臂,而且尋找的點又恰好在“肘部”,故稱爲肘方法。但是有些情況下的曲線不一定是上述所說的手臂形狀,此時無法尋找到“肘部”,所以肘方法不一定對所有數據集都適用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章