自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

機(jī)器學(xué)習(xí)K-means算法在Python中的實(shí)現(xiàn)

人工智能 機(jī)器學(xué)習(xí) 算法
K-means是機(jī)器學(xué)習(xí)中一個(gè)比較常用的算法,屬于無監(jiān)督學(xué)習(xí)算法,其常被用于數(shù)據(jù)的聚類,只需為它指定簇的數(shù)量即可自動(dòng)將數(shù)據(jù)聚合到多類中,相同簇中的數(shù)據(jù)相似度較高,不同簇中數(shù)據(jù)相似度較低。

K-means算法簡介

K-means是機(jī)器學(xué)習(xí)中一個(gè)比較常用的算法,屬于無監(jiān)督學(xué)習(xí)算法,其常被用于數(shù)據(jù)的聚類,只需為它指定簇的數(shù)量即可自動(dòng)將數(shù)據(jù)聚合到多類中,相同簇中的數(shù)據(jù)相似度較高,不同簇中數(shù)據(jù)相似度較低。

K-menas的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

  • 原理簡單
  • 速度快
  • 對大數(shù)據(jù)集有比較好的伸縮性

缺點(diǎn):

  • 需要指定聚類 數(shù)量K
  • 對異常值敏感
  • 對初始值敏感

K-means的聚類過程

其聚類過程類似于梯度下降算法,建立代價(jià)函數(shù)并通過迭代使得代價(jià)函數(shù)值越來越小

  • 適當(dāng)選擇c個(gè)類的初始中心;
  • 在第k次迭代中,對任意一個(gè)樣本,求其到c個(gè)中心的距離,將該樣本歸到距離最短的中心所在的類;
  • 利用均值等方法更新該類的中心值;
  • 對于所有的c個(gè)聚類中心,如果利用(2)(3)的迭代法更新后,值保持不變,則迭代結(jié)束,否則繼續(xù)迭代。

 

該算法的***優(yōu)勢在于簡潔和快速。算法的關(guān)鍵在于初始中心的選擇和距離公式。

K-means 實(shí)例展示

python中km的一些參數(shù):

  1. sklearn.cluster.KMeans( 
  2.  
  3.     n_clusters=8, 
  4.  
  5.     init='k-means++'
  6.  
  7.     n_init=10, 
  8.  
  9.     max_iter=300, 
  10.  
  11.     tol=0.0001, 
  12.  
  13.     precompute_distances='auto'
  14.  
  15.     verbose=0, 
  16.  
  17.     random_state=None, 
  18.  
  19.     copy_x=True
  20.  
  21.     n_jobs=1, 
  22.  
  23.     algorithm='auto' 
  24.  
  25.     )  
  • n_clusters: 簇的個(gè)數(shù),即你想聚成幾類
  • init: 初始簇中心的獲取方法
  • n_init: 獲取初始簇中心的更迭次數(shù),為了彌補(bǔ)初始質(zhì)心的影響,算法默認(rèn)會初始10個(gè)質(zhì)心,實(shí)現(xiàn)算法,然后返回***的結(jié)果。
  • max_iter: ***迭代次數(shù)(因?yàn)閗means算法的實(shí)現(xiàn)需要迭代)
  • tol: 容忍度,即kmeans運(yùn)行準(zhǔn)則收斂的條件
  • precompute_distances:是否需要提前計(jì)算距離,這個(gè)參數(shù)會在空間和時(shí)間之間做權(quán)衡,如果是True 會把整個(gè)距離矩陣都放到內(nèi)存中,auto 會默認(rèn)在數(shù)據(jù)樣本大于featurs*samples 的數(shù)量大于12e6 的時(shí)候False,False 時(shí)核心實(shí)現(xiàn)的方法是利用Cpython 來實(shí)現(xiàn)的
  • verbose: 冗長模式(不太懂是啥意思,反正一般不去改默認(rèn)值)
  • random_state: 隨機(jī)生成簇中心的狀態(tài)條件。
  • copy_x: 對是否修改數(shù)據(jù)的一個(gè)標(biāo)記,如果True,即復(fù)制了就不會修改數(shù)據(jù)。bool 在scikit-learn 很多接口中都會有這個(gè)參數(shù)的,就是是否對輸入數(shù)據(jù)繼續(xù)copy 操作,以便不修改用戶的輸入數(shù)據(jù)。這個(gè)要理解Python 的內(nèi)存機(jī)制才會比較清楚。
  • n_jobs: 并行設(shè)置
  • algorithm: kmeans的實(shí)現(xiàn)算法,有:’auto’, ‘full’, ‘elkan’, 其中 ‘full’表示用EM方式實(shí)現(xiàn)

雖然有很多參數(shù),但是都已經(jīng)給出了默認(rèn)值。所以我們一般不需要去傳入這些參數(shù),參數(shù)的。可以根據(jù)實(shí)際需要來調(diào)用。

下面展示一個(gè)代碼例子 

  1. from sklearn.cluster import KMeans 
  2.  
  3. from sklearn.externals import joblib 
  4.  
  5. from sklearn import cluster 
  6.  
  7. import numpy as np  
  8.   
  9.  
  10. # 生成10*3的矩陣 
  11.  
  12. data = np.random.rand(10,3) 
  13.  
  14. print data 
  15.  
  16. # 聚類為4類 
  17.  
  18. estimator=KMeans(n_clusters=4) 
  19.  
  20. # fit_predict表示擬合+預(yù)測,也可以分開寫 
  21.  
  22. res=estimator.fit_predict(data) 
  23.  
  24. # 預(yù)測類別標(biāo)簽結(jié)果 
  25.  
  26. lable_pred=estimator.labels_ 
  27.  
  28. # 各個(gè)類別的聚類中心值 
  29.  
  30. centroids=estimator.cluster_centers_ 
  31.  
  32. # 聚類中心均值向量的總和 
  33.  
  34. inertia=estimator.inertia_  
  35.   
  36.  
  37. print lable_pred 
  38.  
  39. print centroids 
  40.  
  41. print inertia  
  42.   
  43.  
  44. 代碼執(zhí)行結(jié)果 
  45.  
  46. [0 2 1 0 2 2 0 3 2 0]  
  47.   
  48.  
  49. [[ 0.3028348   0.25183096  0.62493622] 
  50.  
  51. [ 0.88481287  0.70891813  0.79463764] 
  52.  
  53. [ 0.66821961  0.54817207  0.30197415] 
  54.  
  55. [ 0.11629904  0.85684903  0.7088385 ]] 
  56.  
  57. 0.570794546829  

為了更直觀的描述,這次在圖上做一個(gè)展示,由于圖像上繪制二維比較直觀,所以數(shù)據(jù)調(diào)整到了二維,選取100個(gè)點(diǎn)繪制,聚類類別為3類 

  1. from sklearn.cluster import KMeans 
  2.  
  3. from sklearn.externals import joblib 
  4.  
  5. from sklearn import cluster 
  6.  
  7. import numpy as np 
  8.  
  9. import matplotlib.pyplot as plt  
  10.   
  11.  
  12. data = np.random.rand(100,2) 
  13.  
  14. estimator=KMeans(n_clusters=3) 
  15.  
  16. res=estimator.fit_predict(data) 
  17.  
  18. lable_pred=estimator.labels_ 
  19.  
  20. centroids=estimator.cluster_centers_ 
  21.  
  22. inertia=estimator.inertia_ 
  23.  
  24. #print res 
  25.  
  26. print lable_pred 
  27.  
  28. print centroids 
  29.  
  30. print inertia  
  31.   
  32.  
  33. for i in range(len(data)): 
  34.  
  35.     if int(lable_pred[i])==0: 
  36.  
  37.         plt.scatter(data[i][0],data[i][1],color='red'
  38.  
  39.     if int(lable_pred[i])==1: 
  40.  
  41.         plt.scatter(data[i][0],data[i][1],color='black'
  42.  
  43.     if int(lable_pred[i])==2: 
  44.  
  45.         plt.scatter(data[i][0],data[i][1],color='blue'
  46.  
  47. plt.show() 

 

可以看到聚類效果還是不錯(cuò)的,對k-means的聚類效率進(jìn)行了一個(gè)測試,將維度擴(kuò)寬到50維

 

對于***的數(shù)據(jù),擬合時(shí)間還是能夠接受的,可見效率還是不錯(cuò),對模型的保存與其它的機(jī)器學(xué)習(xí)算法模型保存類似

  1. from sklearn.externals import joblib  
  2. joblib.dump(km,"model/km_model.m")   
責(zé)任編輯:龐桂玉 來源: Python開發(fā)者
相關(guān)推薦

2024-04-18 15:44:20

2012-08-09 09:57:54

K-means

2012-05-08 16:29:32

K-meansJava算法

2021-03-03 10:08:40

數(shù)據(jù)算法技術(shù)

2019-06-06 08:52:00

2024-10-14 16:37:25

2012-06-14 09:46:55

數(shù)據(jù)分析

2024-05-27 00:05:00

2018-04-25 08:10:50

算法k-means代碼

2021-07-21 11:25:17

機(jī)器學(xué)習(xí)?AI人工智能

2020-12-16 15:56:26

機(jī)器學(xué)習(xí)人工智能Python

2022-02-15 23:38:22

Python機(jī)器學(xué)習(xí)算法

2020-07-13 14:50:51

機(jī)器學(xué)習(xí)模型算法

2019-11-25 14:24:24

機(jī)器學(xué)習(xí)算法數(shù)據(jù)

2018-04-16 08:56:40

2023-02-17 08:10:58

2017-04-14 08:33:47

2022-03-18 17:53:14

機(jī)器學(xué)習(xí)物聯(lián)網(wǎng)工業(yè)物聯(lián)網(wǎng)

2022-04-18 11:36:43

機(jī)器學(xué)習(xí)制造業(yè)人工智能

2024-10-12 17:13:53

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號