基于K-Means聚類算法演示及可視化展示
K-Means聚類算法演示及可視化展示
#導(dǎo)入包 from sklearn.cluster import KMeans X = [[0.0888, 0.5885], [0.1399, 0.8291], [0.0747, 0.4974], [0.0983, 0.5772], [0.1276, 0.5703], [0.1671, 0.5835], [0.1906, 0.5276], [0.1061, 0.5523], [0.2446, 0.4007], [0.167, 0.477], [0.2485, 0.4313], [0.1227, 0.4909], [0.124, 0.5668], [0.1461, 0.5113], [0.2315, 0.3788], [0.0494, 0.559], [0.1107, 0.4799], [0.2521, 0.5735], [0.1007, 0.6318], [0.1067, 0.4326], [0.1956, 0.428]] # 輸出數(shù)據(jù)集 print(X)
""" KMeans聚類 clf = KMeans(n_clusters=3) 表示類簇?cái)?shù)為3,聚成3類數(shù)據(jù),clf即賦值為KMeans y_pred = clf.fit_predict(X) 載入數(shù)據(jù)集X,并且將聚類的結(jié)果賦值給y_pred """ clf = KMeans(n_clusters=3) y_pred = clf.fit_predict(X) # 輸出聚類預(yù)測(cè)結(jié)果,20行數(shù)據(jù),每個(gè)y_pred對(duì)應(yīng)X一行,聚成3類,類標(biāo)為0、1、2 print(y_pred)
#可視化繪圖 import matplotlib.pyplot as plt # 獲取第一列和第二列數(shù)據(jù) 使用for循環(huán)獲取 n[0]表示X第一列 x = [n[0] for n in X] print(x) y = [n[1] for n in X] print(y) # 繪制散點(diǎn)圖 參數(shù):x橫軸 y縱軸 c=y_pred聚類預(yù)測(cè)結(jié)果 marker類型 o表示圓點(diǎn) *表示星型 x表示x plt.scatter(x, y, c=y_pred, marker='o') # 繪制標(biāo)題 plt.title("Kmeans-Basketball Data") # 繪制x軸和y軸坐標(biāo) plt.xlabel("assists_per_minute") plt.ylabel("points_per_minute") plt.legend([0,1,2]) # 顯示圖形 plt.show()
5分鐘帶你弄懂K-Means聚類
聚類與分類的區(qū)別
- 分類:類別是已知的,通過對(duì)已知分類的數(shù)據(jù)進(jìn)行訓(xùn)練和學(xué)習(xí),找到這些不同類的特征,再對(duì)未分類的數(shù)據(jù)進(jìn)行分類。屬于監(jiān)督學(xué)習(xí)。
- 聚類:事先不知道數(shù)據(jù)會(huì)分為幾類,通過聚類分析將數(shù)據(jù)聚合成幾個(gè)群體。聚類不需要對(duì)數(shù)據(jù)進(jìn)行訓(xùn)練和學(xué)習(xí)。屬于無監(jiān)督學(xué)習(xí)。
關(guān)于監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí),這里給一個(gè)簡(jiǎn)單的介紹:是否有監(jiān)督,就看輸入數(shù)據(jù)是否有標(biāo)簽,輸入數(shù)據(jù)有標(biāo)簽,則為有監(jiān)督學(xué)習(xí),否則為無監(jiān)督學(xué)習(xí)。更詳盡的解釋會(huì)在后續(xù)博文更新,這里不細(xì)說。
k-means 聚類
聚類算法有很多種,K-Means 是聚類算法中的最常用的一種,算法最大的特點(diǎn)是簡(jiǎn)單,好理解,運(yùn)算速度快,但是只能應(yīng)用于連續(xù)型的數(shù)據(jù),并且一定要在聚類前需要手工指定要分成幾類。
K-Means 聚類算法的大致意思就是“物以類聚,人以群分”:
- 首先輸入 k 的值,即我們指定希望通過聚類得到 k 個(gè)分組;
- 從數(shù)據(jù)集中隨機(jī)選取 k 個(gè)數(shù)據(jù)點(diǎn)作為初始大佬(質(zhì)心);
- 對(duì)集合中每一個(gè)小弟,計(jì)算與每一個(gè)大佬的距離,離哪個(gè)大佬距離近,就跟定哪個(gè)大佬。
- 這時(shí)每一個(gè)大佬手下都聚集了一票小弟,這時(shí)候召開選舉大會(huì),每一群選出新的大佬(即通過算法選出新的質(zhì)心)。
- 如果新大佬和老大佬之間的距離小于某一個(gè)設(shè)置的閾值(表示重新計(jì)算的質(zhì)心的位置變化不大,趨于穩(wěn)定,或者說收斂),可以認(rèn)為我們進(jìn)行的聚類已經(jīng)達(dá)到期望的結(jié)果,算法終止。
- 如果新大佬和老大佬距離變化很大,需要迭代3~5步驟。
說了這么多,估計(jì)還是有點(diǎn)糊涂,下面舉個(gè)非常形象簡(jiǎn)單的例子:
有6個(gè)點(diǎn),從圖上看應(yīng)該可以分成兩堆,前三個(gè)點(diǎn)一堆,后三個(gè)點(diǎn)另一堆?,F(xiàn)在我手工地把 k-means 計(jì)算過程演示一下,同時(shí)檢驗(yàn)是不是和預(yù)期一致:
1.設(shè)定 k 值為2
2.選擇初始大佬(就選 P1 和 P2)
3.計(jì)算小弟與大佬的距離:
從上圖可以看出,所有的小弟都離 P2 更近,所以次站隊(duì)的結(jié)果是:
A 組:P1
B 組:P2、P3、P4、P5、P6
4.召開選舉大會(huì):
A 組沒什么可選的,大佬就是自己
B 組有5個(gè)人,需要重新選大佬,這里要注意選大佬的方法是每個(gè)人 X 坐標(biāo)的平均值和 Y 坐標(biāo)的平均值組成的新的點(diǎn),為新大佬,也就是說這個(gè)大佬是“虛擬的”。因此,B 組選出新大哥的坐標(biāo)為:P 哥((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)。
綜合兩組,新大哥為 P1(0,0),P哥(6.2,5.6),而P2-P6重新成為小弟。
5.再次計(jì)算小弟到大佬的距離:
這時(shí)可以看到P2、P3離P1更近,P4、P5、P6離P哥更近,所以第二次站隊(duì)的結(jié)果是:
A 組:P1、P2、P3
B 組:P4、P5、P6(虛擬大哥這時(shí)候消失)
6.第二屆選舉大會(huì):
同樣的方法選出新的虛擬大佬:P哥1(1.33,1),P哥2(9,8.33),P1-P6都成為小弟。
7.第三次計(jì)算小弟到大佬的距離:
這時(shí)可以看到 P1、P2、P3 離 P哥1 更近,P4、P5、P6離 P哥2 更近,所以第二次站隊(duì)的結(jié)果是:
A 組:P1、P2、P3
B 組:P4、P5、P6
我們可以發(fā)現(xiàn),這次站隊(duì)的結(jié)果和上次沒有任何變化了,說明已經(jīng)收斂,聚類結(jié)束,聚類結(jié)果和我們最開始設(shè)想的結(jié)果完全一致。
K-Means 聚類 MATLAB 實(shí)現(xiàn)
關(guān)于 K-Means 的算法具體代碼,網(wǎng)上有各種版本,這里也不贅述了,下面結(jié)合 MATLAB 中的一些函數(shù)給出一個(gè)較為簡(jiǎn)潔的版本:
X2 = zscore(X); % zscore方法標(biāo)準(zhǔn)化數(shù)據(jù) Y2 = pdist(X2); % 計(jì)算距離(默認(rèn)歐式距離) Z2 = linkage(Y2); % 定義變量之間的連接,用指定的算法計(jì)算系統(tǒng)聚類樹 T = cluster(Z2,6); % 創(chuàng)建聚類 H = dendrogram(Z2); %作出系譜圖
最終聚類系譜圖如下所示:
當(dāng)然,MATLAB 也提供了 kmeans() 函數(shù)可供直接聚類使用,詳情可參與其文檔。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 信息同時(shí)輸出到控制臺(tái)與文件的實(shí)例講解
今天小編就為大家分享一篇python 信息同時(shí)輸出到控制臺(tái)與文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05numpy中實(shí)現(xiàn)二維數(shù)組按照某列、某行排序的方法
下面小編就為大家分享一篇numpy中實(shí)現(xiàn)二維數(shù)組按照某列、某行排序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04pytorch建立mobilenetV3-ssd網(wǎng)絡(luò)并進(jìn)行訓(xùn)練與預(yù)測(cè)方式
這篇文章主要介紹了pytorch建立mobilenetV3-ssd網(wǎng)絡(luò)并進(jìn)行訓(xùn)練與預(yù)測(cè)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python 字符串操作(string替換、刪除、截取、復(fù)制、連接、比較、查找、包含、大小寫轉(zhuǎn)換、分割等)
這篇文章主要介紹了Python 字符串操作(string替換、刪除、截取、復(fù)制、連接、比較、查找、包含、大小寫轉(zhuǎn)換、分割等),需要的朋友可以參考下2018-03-03基于Python編寫一個(gè)圖片識(shí)別系統(tǒng)
本項(xiàng)目將使用python3去識(shí)別圖片是否為色情圖片,會(huì)使用到PIL這個(gè)圖像處理庫(kù),并且編寫算法來劃分圖像的皮膚區(qū)域,感興趣的可以了解一下2022-06-06python基礎(chǔ)知識(shí)小結(jié)之集合
本文給大家小結(jié)了一下Python中集合的基礎(chǔ)知識(shí),非常的簡(jiǎn)單易懂,有需要的小伙伴可以參考下。2015-11-11