天天看點

機器學習(四):K-means聚類算法

文章目錄

      • K-means介紹
      • K-means原理
      • Sklearn實作
      • K值的選擇
      • K-means的優缺點
        • 優點
        • 缺點
      • K-means與KNN的差別

K-means介紹

這是寫機器學習筆記以來的第一個無監督學習算法,最常見的無監督學習就是聚類,也就是将無标記的資料分成幾種叢集,這些叢集是根據某種相似度名額進行劃分的。例如歐式距離等。聚類常常被用來探索資料集,例如推薦系統,會使用聚類定位一個使用者感興趣的産品。市場營銷會對相似使用者進行分組等等

而K-means是最流行的聚類算法之一,由于它的速度以及穩定性廣受歡迎。其中K代表的是K類,也就是聚成幾類,Means代表的是中心。這個算法的本質就是确定K類的中心點,當你找到了這些中心點,也就是完成了聚類

K-means原理

k-means的原理非常簡單,具體步驟如下:

  1. 選取k個點作為初始類的中心(圖心),點是随機抽取的,sklearn可選取最優點
  2. 将每個點配置設定到離它最近的圖心,形成k個類群,然後重新計算每個類的圖心
  3. 重複第二步,直到類不發生變化,或者設定最大疊代次數,當疊代次數一到就停止疊代

Sklearn實作

引用資料分析45講的資料集,具體資料集在這 資料集下載下傳位址

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')
data = pd.read_csv(r'C:\Users\11060\Desktop\data.csv',encoding='gbk')
X_train = data[['2019年國際排名','2018世界杯','2015亞洲杯']]
df = pd.DataFrame(X_train)
model = KMeans(n_clusters=3
              # max_iter=100, 最大疊代次數
              # n_init=10 初始化中心次數,選取較好的中心點
              # init='k-means++'  初始值的標明方式,預設為優化過的k-means++方式,
              # algorithm    k-means的實作算法,有auto、full、elkan三種方式
              )
X_train_scaled = StandardScaler().fit_transform(X_train)
model.fit(X_train_scaled)
y_predict = model.predict(X_train_scaled)
result = pd.concat((data,pd.DataFrame(y_predict)),axis=1)
result.rename({0:'聚類後的資料分布'},inplace=True,axis=1)
print(result)

# output
    國家  2019年國際排名  2018世界杯  2015亞洲杯  聚類後的資料分布
0       中國         73       40        7         0
1       日本         60       15        5         2
2       南韓         61       19        2         2
3       伊朗         34       18        6         2
4       沙特         67       26       10         2
5      伊拉克         91       40        4         0
6      卡達        101       40       13         1
7      阿聯酋         81       40        6         0
8   烏茲别克斯坦         88       40        8         0
9       泰國        122       40       17         1
10      越南        102       50       17         1
11      阿曼         87       50       12         1
12      巴林        116       50       11         1
13      北韓        110       50       14         1
14      印尼        164       50       17         1
15      澳洲         40       30        1         2
16     叙利亞         76       40       17         1
17      約旦        118       50        9         1
18     科威特        160       50       15         1
19    巴勒斯坦         96       50       16         1
           

K值的選擇

如果K值不能由問題的上下文确定,最優的聚類數量通過肘部法來估計,肘部法通過使用不同的K值繪制出代價函數的值,随着K值增加,平均偏差也會增加,每個聚類将會包含更少的執行個體,同時執行個體也更加靠近各自對應的圖心,然而,K值的增加,對平均離差的提升将會減少,離差提升最陡時的K值稱為肘部,下面構造一個資料集來示範肘部法:

c1x = np.random.uniform(0.5,1.5,(1,10))
c1y = np.random.uniform(0.5,1.5,(1,10))
c2x = np.random.uniform(3.5,4.5,(1,10))
c2y = np.random.uniform(3.5,4.5,(1,10))
x = np.hstack((c1x,c2x))
y = np.hstack((c1y,c2y))
X = np.vstack((x,y)).T
K = range(1,10)
meanDispersions = []
for k in K:
    kemans = KMeans(n_clusters=k)
    kemans.fit(X)
    meanDispersions.append(sum(np.min(cdist(X,kemans.cluster_centers_,'euclidean'),axis=1))/X.shape[0])
f,ax = plt.subplots(1,2,figsize=(15,6))
plt.subplot(121)
plt.scatter(x,y)
plt.subplot(122)
plt.plot(K,meanDispersions,'bx-')
plt.show()
           
機器學習(四):K-means聚類算法

可以明顯的看到拐點是在K=2的地方,當K>2時,平均離差逐漸平緩,是以可以确定K值為2。

在本次的球隊資料集中,同樣畫出圖

機器學習(四):K-means聚類算法

由于資料不像構造的資料一樣分割明顯,但是還是可以選則K=4作為最優參數,因為當K>4是,圖像下降變慢。

K-means的優缺點

優點

  • 原理容易了解,可解釋性
  • 易于實作
  • 穩定性高

缺點

  • 在大資料集上收斂速度慢
  • 對異常值敏感
  • K值的不确定性
  • 資料集大的時候,計算時間影響較大
  • 對初始值選取敏感

K-means與KNN的差別

  • K-means是無監督學習,且為聚類算法,KNN是有監督學習,分類算法
  • K-means的K代表的是K個簇,KNN代表的是K個鄰居

繼續閱讀