詳解K-means算法在Python中的實(shí)現(xiàn)
K-means算法簡(jiǎn)介
K-means是機(jī)器學(xué)習(xí)中一個(gè)比較常用的算法,屬于無(wú)監(jiān)督學(xué)習(xí)算法,其常被用于數(shù)據(jù)的聚類(lèi),只需為它指定簇的數(shù)量即可自動(dòng)將數(shù)據(jù)聚合到多類(lèi)中,相同簇中的數(shù)據(jù)相似度較高,不同簇中數(shù)據(jù)相似度較低。
K-MEANS算法是輸入聚類(lèi)個(gè)數(shù)k,以及包含 n個(gè)數(shù)據(jù)對(duì)象的數(shù)據(jù)庫(kù),輸出滿(mǎn)足方差最小標(biāo)準(zhǔn)k個(gè)聚類(lèi)的一種算法。k-means 算法接受輸入量 k ;然后將n個(gè)數(shù)據(jù)對(duì)象劃分為 k個(gè)聚類(lèi)以便使得所獲得的聚類(lèi)滿(mǎn)足:同一聚類(lèi)中的對(duì)象相似度較高;而不同聚類(lèi)中的對(duì)象相似度較小。
核心思想
通過(guò)迭代尋找k個(gè)類(lèi)簇的一種劃分方案,使得用這k個(gè)類(lèi)簇的均值來(lái)代表相應(yīng)各類(lèi)樣本時(shí)所得的總體誤差最小。
k個(gè)聚類(lèi)具有以下特點(diǎn):各聚類(lèi)本身盡可能的緊湊,而各聚類(lèi)之間盡可能的分開(kāi)。
k-means算法的基礎(chǔ)是最小誤差平方和準(zhǔn)則,K-menas的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
原理簡(jiǎn)單
速度快
對(duì)大數(shù)據(jù)集有比較好的伸縮性
缺點(diǎn):
需要指定聚類(lèi) 數(shù)量K
對(duì)異常值敏感
對(duì)初始值敏感
K-means的聚類(lèi)過(guò)程
其聚類(lèi)過(guò)程類(lèi)似于梯度下降算法,建立代價(jià)函數(shù)并通過(guò)迭代使得代價(jià)函數(shù)值越來(lái)越小
適當(dāng)選擇c個(gè)類(lèi)的初始中心;
在第k次迭代中,對(duì)任意一個(gè)樣本,求其到c個(gè)中心的距離,將該樣本歸到距離最短的中心所在的類(lèi);
利用均值等方法更新該類(lèi)的中心值;
對(duì)于所有的c個(gè)聚類(lèi)中心,如果利用(2)(3)的迭代法更新后,值保持不變,則迭代結(jié)束,否則繼續(xù)迭代。
該算法的最大優(yōu)勢(shì)在于簡(jiǎn)潔和快速。算法的關(guān)鍵在于初始中心的選擇和距離公式。
K-means 實(shí)例展示
python中km的一些參數(shù):
sklearn.cluster.KMeans( n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto' ) n_clusters: 簇的個(gè)數(shù),即你想聚成幾類(lèi) init: 初始簇中心的獲取方法 n_init: 獲取初始簇中心的更迭次數(shù),為了彌補(bǔ)初始質(zhì)心的影響,算法默認(rèn)會(huì)初始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ù)會(huì)在空間和時(shí)間之間做權(quán)衡,如果是True 會(huì)把整個(gè)距離矩陣都放到內(nèi)存中,auto 會(huì)默認(rèn)在數(shù)據(jù)樣本大于featurs*samples 的數(shù)量大于12e6 的時(shí)候False,False 時(shí)核心實(shí)現(xiàn)的方法是利用Cpython 來(lái)實(shí)現(xiàn)的 verbose: 冗長(zhǎng)模式(不太懂是啥意思,反正一般不去改默認(rèn)值) random_state: 隨機(jī)生成簇中心的狀態(tài)條件。 copy_x: 對(duì)是否修改數(shù)據(jù)的一個(gè)標(biāo)記,如果True,即復(fù)制了就不會(huì)修改數(shù)據(jù)。bool 在scikit-learn 很多接口中都會(huì)有這個(gè)參數(shù)的,就是是否對(duì)輸入數(shù)據(jù)繼續(xù)copy 操作,以便不修改用戶(hù)的輸入數(shù)據(jù)。這個(gè)要理解Python 的內(nèi)存機(jī)制才會(huì)比較清楚。 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í)際需要來(lái)調(diào)用。
下面展示一個(gè)代碼例子
from sklearn.cluster import KMeans from sklearn.externals import joblib from sklearn import cluster import numpy as np # 生成10*3的矩陣 data = np.random.rand(10,3) print data # 聚類(lèi)為4類(lèi) estimator=KMeans(n_clusters=4) # fit_predict表示擬合+預(yù)測(cè),也可以分開(kāi)寫(xiě) res=estimator.fit_predict(data) # 預(yù)測(cè)類(lèi)別標(biāo)簽結(jié)果 lable_pred=estimator.labels_ # 各個(gè)類(lèi)別的聚類(lèi)中心值 centroids=estimator.cluster_centers_ # 聚類(lèi)中心均值向量的總和 inertia=estimator.inertia_ print lable_pred print centroids print inertia 代碼執(zhí)行結(jié)果 [0 2 1 0 2 2 0 3 2 0] [[ 0.3028348 0.25183096 0.62493622] [ 0.88481287 0.70891813 0.79463764] [ 0.66821961 0.54817207 0.30197415] [ 0.11629904 0.85684903 0.7088385 ]] 0.570794546829
為了更直觀的描述,這次在圖上做一個(gè)展示,由于圖像上繪制二維比較直觀,所以數(shù)據(jù)調(diào)整到了二維,選取100個(gè)點(diǎn)繪制,聚類(lèi)類(lèi)別為3類(lèi)
from sklearn.cluster import KMeans from sklearn.externals import joblib from sklearn import cluster import numpy as np import matplotlib.pyplot as plt data = np.random.rand(100,2) estimator=KMeans(n_clusters=3) res=estimator.fit_predict(data) lable_pred=estimator.labels_ centroids=estimator.cluster_centers_ inertia=estimator.inertia_ #print res print lable_pred print centroids print inertia for i in range(len(data)): if int(lable_pred[i])==0: plt.scatter(data[i][0],data[i][1],color='red') if int(lable_pred[i])==1: plt.scatter(data[i][0],data[i][1],color='black') if int(lable_pred[i])==2: plt.scatter(data[i][0],data[i][1],color='blue') plt.show()
可以看到聚類(lèi)效果還是不錯(cuò)的,對(duì)k-means的聚類(lèi)效率進(jìn)行了一個(gè)測(cè)試,將維度擴(kuò)寬到50維
數(shù)據(jù)規(guī)模 | 消耗時(shí)間 | 數(shù)據(jù)維度 |
---|---|---|
10000條 | 4s | 50維 |
100000條 | 30s | 50維 |
1000000條 | 4'13s | 50維 |
對(duì)于百萬(wàn)級(jí)的數(shù)據(jù),擬合時(shí)間還是能夠接受的,可見(jiàn)效率還是不錯(cuò),對(duì)模型的保存與其它的機(jī)器學(xué)習(xí)算法模型保存類(lèi)似
from sklearn.externals import joblib joblib.dump(km,"model/km_model.m")
總結(jié)
以上就是本文關(guān)于詳解K-means算法在Python中的實(shí)現(xiàn)的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
Python實(shí)現(xiàn)調(diào)度算法代碼詳解
Python算法輸出1-9數(shù)組形成的結(jié)果為100的所有運(yùn)算式
如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
python實(shí)現(xiàn)簡(jiǎn)易名片管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易名片管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04pytorch下大型數(shù)據(jù)集(大型圖片)的導(dǎo)入方式
今天小編就為大家分享一篇pytorch下大型數(shù)據(jù)集(大型圖片)的導(dǎo)入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01完美解決Python 2.7不能正常使用pip install的問(wèn)題
今天小編就為大家分享一篇完美解決Python 2.7不能正常使用pip install的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06python+Splinter實(shí)現(xiàn)12306搶票功能
這篇文章主要為大家詳細(xì)介紹了python+Splinter實(shí)現(xiàn)12306搶票功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09Python?pycryptodome庫(kù)實(shí)現(xiàn)RSA加密解密消息
本文為大家介紹了如何在?Python?中使用?RSA?公鑰加密技術(shù)來(lái)加密和解密消息,并使用?pycryptodome?庫(kù)進(jìn)行實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助2024-02-02Python 寫(xiě)小游戲吃金幣+打乒乓+滑雪(附源碼)
這篇文章主要給大家分享的是利用Python 寫(xiě)小游戲吃金幣、打乒乓、滑雪并附上源碼,具有一的知識(shí)性參考價(jià)值,需要的小伙伴可以參考一下2022-03-03python實(shí)現(xiàn)感知機(jī)模型的示例
這篇文章主要介紹了python實(shí)現(xiàn)感知機(jī)模型的示例,幫助大家更好的理解和學(xué)習(xí)python 機(jī)器學(xué)習(xí)的相關(guān)知識(shí),感興趣的朋友可以了解下2020-09-09Python selenium如何打包靜態(tài)網(wǎng)頁(yè)并下載
這篇文章主要介紹了Python selenium如何打包靜態(tài)網(wǎng)頁(yè)并下載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08