【机器学习基础】通俗易懂无监督学习K-Means聚类算法及代码实践
K-Means是一種無監督學習方法,用于將無標簽的數據集進行聚類。其中K指集群的數量,Means表示尋找集群中心點的手段。
一、 無監督學習 K-Means
貼標簽是需要花錢的。
所以人們研究處理無標簽數據集的方法。(筆者狹隘了)
面對無標簽的數據集,我們期望從數據中找出一定的規律。一種最簡單也最快速的聚類算法應運而生---K-Means。
它的核心思想很簡單:物以類聚。
用直白的話簡單解釋它的算法執行過程如下:
隨便選擇K個中心點(大哥)。
把距離它足夠近的數據(小弟)吸納為成員,聚成K個集群(組織)。
各集群(組織)內部重新選擇中心點(大哥),選擇標準是按照距離取均值作為中心點(大哥)。
重復2、3步驟直到收斂(組織成員相對穩定)。
這就是黑澀會形成聚類的過程。
二、 K-Means代碼實踐
2.1 鳶尾花數據集
import?numpy?as?np import?pandas?as?pd import?seaborn?as?sns import?matplotlib.pyplot?as?plt#?大家不用在意這個域名 df?=?pd.read_csv('https://blog.caiyongji.com/assets/iris.csv') sns.scatterplot(x='petal_length',y='petal_width',data=df,hue='species')我們得到帶標簽的數據如下:
2.2 K-Means訓練數據
我們移除數據標簽,僅使用花瓣長、寬作為數據輸入,并使用無監督學習方法K-Means進行訓練。
X?=?df[['petal_length','petal_width']].to_numpy()?from?sklearn.cluster?import?KMeans k?=?2 kmeans?=?KMeans(n_clusters=k,?random_state=42) y_pred?=?kmeans.fit_predict(X) plt.plot(X[y_pred==1,?0],?X[y_pred==1,?1],?"ro",?label="group?1") plt.plot(X[y_pred==0,?0],?X[y_pred==0,?1],?"bo",?label="group?0") #?plt.legend(loc=2) plt.show()得到分類數據如下,我們并不知道下方數據類別分別代表什么意義。
我們將K分別取1-6的值,可得到如下圖所示分類結果:
那么K值的選擇有什么意義呢?我們如何選擇?
三、K的選擇
3.1 慣性指標(inertia)
K-Means的慣性計算方式是,每個樣本與最接近的集群中心點的均方距離的總和。
kmeans_per_k?=?[KMeans(n_clusters=k,?random_state=42).fit(X)for?k?in?range(1,?10)]inertias?=?[model.inertia_?for?model?in?kmeans_per_k] plt.figure(figsize=(8,?3.5)) plt.plot(range(1,?10),?inertias,?"bo-") plt.xlabel("$k$",?fontsize=14) plt.ylabel("Inertia",?fontsize=14) plt.annotate('Elbow',xy=(2,?inertias[2]),xytext=(0.55,?0.55),textcoords='figure?fraction',fontsize=16,arrowprops=dict(facecolor='black',?shrink=0.1)) plt.axis([1,?8.5,?0,?1300]) plt.show()以上代碼中model.inertia_即K-Means方法中的慣性指標。
一般地,慣性越小模型越好,但伴隨K值的增大,慣性下降的速度變的很慢,因此我們選擇“肘部”的K值,作為最優的K值選擇。
3.2 輪廓系數指標(silhouette)
K-Means的輪廓系數計算方式是,與集群內其他樣本的平均距離記為a,與外部集群樣本的平均距離記為b,輪廓系數(b-a)/max(a,b)。
from?sklearn.metrics?import?silhouette_score silhouette_scores?=?[silhouette_score(X,?model.labels_)for?model?in?kmeans_per_k[1:]] plt.figure(figsize=(8,?3)) plt.plot(range(2,?10),?silhouette_scores,?"bo-") plt.xlabel("$k$",?fontsize=14) plt.ylabel("Silhouette?score",?fontsize=14) plt.axis([1.8,?8.5,?0.55,?0.8]) plt.show()以上代碼中silhouette_score方法可取得K-Means的輪廓系數值。
一般地,輪廓系數指標越大越好,我們可以看到當K為2、3時均可取得不錯的聚類效果。
四、自動選擇K值(拓展)
4.1 簡單理解貝葉斯定理
白話解釋貝葉斯:當有新的證據出現時,不確定的事情更加確信了。 這里的“確信”是指對不確定的事情的信心程度。
公式(可忽略):
其中,P(A) 表示事件A發生的概率,P(A|B)表示事件B發生時事件A發生的概率。上面的公式中B就是所謂的證據。這里要注意的是,P(B)的出現讓P(A|B)變的更確定了,并不是說概率變高了或者變低了。概率的高或者低都是一種確定。它是一種信心程度的體現。
4.2 貝葉斯高斯混合模型
我們使用BayesianGaussianMixture方法,而無需指定明確的K值。
from?sklearn.mixture?import?BayesianGaussianMixture bgm?=?BayesianGaussianMixture(n_components=10,?n_init=10,?random_state=42) y_pred?=?bgm.fit_predict(X) np.round(bgm.weights_,?2)輸出:?array([0.4 , 0.33, 0.27, 0. , 0. , 0. , 0. , 0. , 0. , 0. ])
以上代碼的執行邏輯是,初始化10個集群,不斷調整有關集群數貝葉斯先驗知識,來將不必要的集群權重設為0(或接近0),來確定最終K值。
五、總結(系列完結)
5.1 機器學習系列完結
我相信,截至到目前,大家對機器學習已經有了一個基本的認識。最重要的是,大家親手實踐了機器學習的代碼。無論你對機器學習有多么模糊的認識,都能近距離的接觸到機器學習,這一點很重要。
當初,我發現市面上大部分的教程都對數學有強依賴,讓很多人敬而遠之。我覺得,無論頂尖的科學研究還是普羅大眾的教育科普都有其不可替代的巨大價值。流于表面的廣泛未必沒有其意義,因此我選擇了舍棄嚴謹,貼近通俗。
當然,想要深耕于AI領域,數學是充分且必要的條件。如果付得起時間和機會成本,請認真且努力,絕不會辜負你。
5.2 深度學習系列開始
深度學習是一臺結構復雜的機器,但它的操作卻相對簡單。甚至,會給你比傳統機器學習算法更簡單的感受。
我們拭目以待!感謝大家!
往期文章:
機器學習(五):通俗易懂決策樹與隨機森林及代碼實踐
機器學習(四):通俗理解支持向量機SVM及代碼實踐
機器學習(三):理解邏輯回歸及二分類、多分類代碼實踐
機器學習(二):理解線性回歸與梯度下降并做簡單預測
機器學習(一):5分鐘理解機器學習并上手實踐
前置機器學習(五):30分鐘掌握常用Matplotlib用法
前置機器學習(四):一文掌握Pandas用法
前置機器學習(三):30分鐘掌握常用NumPy用法
前置機器學習(二):30分鐘掌握常用Jupyter Notebook用法
前置機器學習(一):數學符號及希臘字母
總結
以上是生活随笔為你收集整理的【机器学习基础】通俗易懂无监督学习K-Means聚类算法及代码实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ浏览器如何查看网站保存的密码
- 下一篇: 【机器学习基础】相当全面的时间序列基础教