文章目錄
-
-
- K-means介紹
- K-means原理
- Sklearn實作
- K值的選擇
- K-means的優缺點
-
- 優點
- 缺點
- K-means與KNN的差別
-
K-means介紹
這是寫機器學習筆記以來的第一個無監督學習算法,最常見的無監督學習就是聚類,也就是将無标記的資料分成幾種叢集,這些叢集是根據某種相似度名額進行劃分的。例如歐式距離等。聚類常常被用來探索資料集,例如推薦系統,會使用聚類定位一個使用者感興趣的産品。市場營銷會對相似使用者進行分組等等
而K-means是最流行的聚類算法之一,由于它的速度以及穩定性廣受歡迎。其中K代表的是K類,也就是聚成幾類,Means代表的是中心。這個算法的本質就是确定K類的中心點,當你找到了這些中心點,也就是完成了聚類
K-means原理
k-means的原理非常簡單,具體步驟如下:
- 選取k個點作為初始類的中心(圖心),點是随機抽取的,sklearn可選取最優點
- 将每個點配置設定到離它最近的圖心,形成k個類群,然後重新計算每個類的圖心
- 重複第二步,直到類不發生變化,或者設定最大疊代次數,當疊代次數一到就停止疊代
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=2的地方,當K>2時,平均離差逐漸平緩,是以可以确定K值為2。
在本次的球隊資料集中,同樣畫出圖
由于資料不像構造的資料一樣分割明顯,但是還是可以選則K=4作為最優參數,因為當K>4是,圖像下降變慢。
K-means的優缺點
優點
- 原理容易了解,可解釋性
- 易于實作
- 穩定性高
缺點
- 在大資料集上收斂速度慢
- 對異常值敏感
- K值的不确定性
- 資料集大的時候,計算時間影響較大
- 對初始值選取敏感
K-means與KNN的差別
- K-means是無監督學習,且為聚類算法,KNN是有監督學習,分類算法
- K-means的K代表的是K個簇,KNN代表的是K個鄰居