k-means 聚類(lèi)算法與Python實(shí)現(xiàn)代碼
k-means 聚類(lèi)算法思想先隨機(jī)選擇k個(gè)聚類(lèi)中心,把集合里的元素與最近的聚類(lèi)中心聚為一類(lèi),得到一次聚類(lèi),再把每一個(gè)類(lèi)的均值作為新的聚類(lèi)中心重新聚類(lèi),迭代n次得到最終結(jié)果分步解析
一、初始化聚類(lèi)中心
首先隨機(jī)選擇集合里的一個(gè)元素作為第一個(gè)聚類(lèi)中心放入容器,選擇距離第一個(gè)聚類(lèi)中心最遠(yuǎn)的一個(gè)元素作為第二個(gè)聚類(lèi)中心放入容器,第三、四、、、N個(gè)同理,為了優(yōu)化可以選擇距離開(kāi)方做為評(píng)判標(biāo)準(zhǔn)
二、迭代聚類(lèi)
依次把集合里的元素與距離最近的聚類(lèi)中心分為一類(lèi),放到對(duì)應(yīng)該聚類(lèi)中心的新的容器,一次聚類(lèi)完成后求出新容器里個(gè)類(lèi)的均值,對(duì)該類(lèi)對(duì)應(yīng)的聚類(lèi)中心進(jìn)行更新,再次進(jìn)行聚類(lèi)操作,迭代n次得到理想的結(jié)果
三、可視化展示
利用 python 第三方庫(kù)中的可視化工具 matplotlib.pyplot 對(duì)聚類(lèi)后的元素顯示(散點(diǎn)圖),方便查看結(jié)果
python代碼實(shí)現(xiàn)
import numpy as np import matplotlib.pyplot as plt # 兩點(diǎn)距離 def distance(e1, e2): return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2) # 集合中心 def means(arr): return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])]) # arr中距離a最遠(yuǎn)的元素,用于初始化聚類(lèi)中心 def farthest(k_arr, arr): f = [0, 0] max_d = 0 for e in arr: d = 0 for i in range(k_arr.__len__()): d = d + np.sqrt(distance(k_arr[i], e)) if d > max_d: max_d = d f = e return f # arr中距離a最近的元素,用于聚類(lèi) def closest(a, arr): c = arr[1] min_d = distance(a, arr[1]) arr = arr[1:] for e in arr: d = distance(a, e) if d < min_d: min_d = d c = e return c if __name__=="__main__": ## 生成二維隨機(jī)坐標(biāo)(如果有數(shù)據(jù)集就更好) arr = np.random.randint(100, size=(100, 1, 2))[:, 0, :] ## 初始化聚類(lèi)中心和聚類(lèi)容器 m = 5 r = np.random.randint(arr.__len__() - 1) k_arr = np.array([arr[r]]) cla_arr = [[]] for i in range(m-1): k = farthest(k_arr, arr) k_arr = np.concatenate([k_arr, np.array([k])]) cla_arr.append([]) ## 迭代聚類(lèi) n = 20 cla_temp = cla_arr for i in range(n): # 迭代n次 for e in arr: # 把集合里每一個(gè)元素聚到最近的類(lèi) ki = 0 # 假定距離第一個(gè)中心最近 min_d = distance(e, k_arr[ki]) for j in range(1, k_arr.__len__()): if distance(e, k_arr[j]) < min_d: # 找到更近的聚類(lèi)中心 min_d = distance(e, k_arr[j]) ki = j cla_temp[ki].append(e) # 迭代更新聚類(lèi)中心 for k in range(k_arr.__len__()): if n - 1 == i: break k_arr[k] = means(cla_temp[k]) cla_temp[k] = [] ## 可視化展示 col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon'] for i in range(m): plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i]) plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i]) plt.show()
結(jié)果展示
總結(jié)
到此這篇關(guān)于k-means 聚類(lèi)算法與Python實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)k-means 聚類(lèi)算法python內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python中實(shí)現(xiàn)k-means聚類(lèi)算法詳解
- python實(shí)現(xiàn)鳶尾花三種聚類(lèi)算法(K-means,AGNES,DBScan)
- Python機(jī)器學(xué)習(xí)之K-Means聚類(lèi)實(shí)現(xiàn)詳解
- Python機(jī)器學(xué)習(xí)算法之k均值聚類(lèi)(k-means)
- 利用Python如何實(shí)現(xiàn)K-means聚類(lèi)算法
- python實(shí)現(xiàn)k-means聚類(lèi)算法
- Python如何通過(guò)手肘法實(shí)現(xiàn)k_means聚類(lèi)詳解
相關(guān)文章
PyTorch梯度裁剪避免訓(xùn)練loss nan的操作
這篇文章主要介紹了PyTorch梯度裁剪避免訓(xùn)練loss nan的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05Pycharm搭建一個(gè)Django項(xiàng)目的方法步驟
本文主要介紹了Pycharm搭建一個(gè)Django項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02詳解TensorFlow2實(shí)現(xiàn)線(xiàn)性回歸
這篇文章主要介紹了TensorFlow2實(shí)現(xiàn)線(xiàn)性回歸的詳細(xì)解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09python 利用PyAutoGUI快速構(gòu)建自動(dòng)化操作腳本
我們經(jīng)常遇到需要進(jìn)行大量重復(fù)操作的時(shí)候,比如:網(wǎng)頁(yè)上填表,對(duì) web 版本 OA 進(jìn)行操作,自動(dòng)化測(cè)試或者給新系統(tǒng)首次添加數(shù)據(jù)等,今天就利用PyAutoGUI構(gòu)建自動(dòng)化操作腳本完成這些重復(fù)的需求2021-05-05關(guān)于opencv讀取和寫(xiě)入路徑有漢字的處理方式
這篇文章主要介紹了關(guān)于opencv讀取和寫(xiě)入路徑有漢字的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Python3使用tesserocr識(shí)別字母數(shù)字驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了Python3使用tesserocr識(shí)別字母數(shù)字驗(yàn)證碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01