天天看點

kmeans算法python源碼_詳解K-means算法在Python中的實作

K-means算法簡介

K-means是機器學習中一個比較常用的算法,屬于無監督學習算法,其常被用于資料的聚類,隻需為它指定簇的數量即可自動将資料聚合到多類中,相同簇中的資料相似度較高,不同簇中資料相似度較低。

K-MEANS算法是輸入聚類個數k,以及包含 n個資料對象的資料庫,輸出滿足方差最小标準k個聚類的一種算法。k-means 算法接受輸入量 k ;然後将n個資料對象劃分為 k個聚類以便使得所獲得的聚類滿足:同一聚類中的對象相似度較高;而不同聚類中的對象相似度較小。

核心思想

通過疊代尋找k個類簇的一種劃分方案,使得用這k個類簇的均值來代表相應各類樣本時所得的總體誤差最小。

k個聚類具有以下特點:各聚類本身盡可能的緊湊,而各聚類之間盡可能的分開。

k-means算法的基礎是最小誤差平方和準則,K-menas的優缺點:

優點:

原理簡單

速度快

對大資料集有比較好的伸縮性

缺點:

需要指定聚類 數量K

對異常值敏感

對初始值敏感

K-means的聚類過程

其聚類過程類似于梯度下降算法,建立代價函數并通過疊代使得代價函數值越來越小

适當選擇c個類的初始中心;

在第k次疊代中,對任意一個樣本,求其到c個中心的距離,将該樣本歸到距離最短的中心所在的類;

利用均值等方法更新該類的中心值;

對于所有的c個聚類中心,如果利用(2)(3)的疊代法更新後,值保持不變,則疊代結束,否則繼續疊代。

kmeans算法python源碼_詳解K-means算法在Python中的實作

該算法的最大優勢在于簡潔和快速。算法的關鍵在于初始中心的選擇和距離公式。

K-means 執行個體展示

python中km的一些參數:

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: 簇的個數,即你想聚成幾類

init: 初始簇中心的擷取方法

n_init: 擷取初始簇中心的更疊次數,為了彌補初始質心的影響,算法預設會初始10個質心,實作算法,然後傳回最好的結果。

max_iter: 最大疊代次數(因為kmeans算法的實作需要疊代)

tol: 容忍度,即kmeans運作準則收斂的條件

precompute_distances:是否需要提前計算距離,這個參數會在空間和時間之間做權衡,如果是True 會把整個距離矩陣都放到記憶體中,auto 會預設在資料樣本大于featurs*samples 的數量大于12e6 的時候False,False 時核心實作的方法是利用Cpython 來實作的

verbose: 冗長模式(不太懂是啥意思,反正一般不去改預設值)

random_state: 随機生成簇中心的狀态條件。

copy_x: 對是否修改資料的一個标記,如果True,即複制了就不會修改資料。bool 在scikit-learn 很多接口中都會有這個參數的,就是是否對輸入資料繼續copy 操作,以便不修改使用者的輸入資料。這個要了解Python 的記憶體機制才會比較清楚。

n_jobs: 并行設定

algorithm: kmeans的實作算法,有:'auto', ‘full', ‘elkan', 其中 ‘full'表示用EM方式實作

雖然有很多參數,但是都已經給出了預設值。是以我們一般不需要去傳入這些參數,參數的。可以根據實際需要來調用。

下面展示一個代碼例子

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

# 聚類為4類

estimator=KMeans(n_clusters=4)

# fit_predict表示拟合+預測,也可以分開寫

res=estimator.fit_predict(data)

# 預測類别标簽結果

lable_pred=estimator.labels_

# 各個類别的聚類中心值

centroids=estimator.cluster_centers_

# 聚類中心均值向量的總和

inertia=estimator.inertia_

print lable_pred

print centroids

print inertia

代碼執行結果

[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

為了更直覺的描述,這次在圖上做一個展示,由于圖像上繪制二維比較直覺,是以資料調整到了二維,選取100個點繪制,聚類類别為3類

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()

kmeans算法python源碼_詳解K-means算法在Python中的實作

可以看到聚類效果還是不錯的,對k-means的聚類效率進行了一個測試,将次元擴寬到50維

資料規模

消耗時間

資料次元

10000條

4s

50維

100000條

30s

50維

1000000條

4'13s

50維

對于百萬級的資料,拟合時間還是能夠接受的,可見效率還是不錯,對模型的儲存與其它的機器學習算法模型儲存類似

from sklearn.externals import joblib

joblib.dump(km,"model/km_model.m")

總結

以上就是本文關于詳解K-means算法在Python中的實作的全部内容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站:

Python實作排程算法代碼詳解

Python算法輸出1-9數組形成的結果為100的所有運算式

Python程式設計實作蟻群算法詳解

如有不足之處,歡迎留言指出。感謝朋友們對本站的支援!

本文标題: 詳解K-means算法在Python中的實作

本文位址: http://www.cppcns.com/jiaoben/python/213220.html