Python sklearn中的K-Means聚類使用方法淺析
初步認識
k-means翻譯過來就是K均值聚類算法,其目的是將樣本分割為k個簇,而這個k則是KMeans中最重要的參數:n_clusters,默認為8。
下面做一個最簡單的聚類
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
X, y = make_blobs(1500)
fig = plt.figure()
for i in range(2):
ax = fig.add_subplot(1,2,i+1)
y = KMeans(i+2).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()其中,y是聚類結果,其數值表示對應位置X所屬類號。
效果如圖所示,對于下面這組數據來說,顯然最好是分為兩類,但如果KMeans的n_clusters設為3,那就會聚成3類。

上面調用的KMeans是一個類,sklearn中同樣提供了函數形式的調用,其使用方法如下
from sklearn.cluster import k_means cen, y, interia = k_means(X, 3)
其中,cen表示聚類后,每一類的質心;y為聚類后的標簽;interia表示均方誤差之和。
初值選取
在KMeans最重要的概念是簇,也就是被分割后的數據種類;而每個簇都有一個非常重要的點,就是質心。在設定好簇的個數之后,也就相當于確定了質心的個數,而KMeans算法的基本流程是
- 選擇k個點作為k個簇的初始質心
- 計算樣本到這k個質心(簇)的距離,并將其劃入距離最近的簇中
- 計算每個簇的均值,并使用該均值更新簇的質心
重復上述2-3的操作,直到質心區(qū)域穩(wěn)定或者達到最大迭代次數。
從這個流程可以看出來,KMeans算法至少有兩個細節(jié)需要考慮,一個是初始化方案,另一個則是質心更新的方案。
在KMeans類或者k_means函數中,提供了兩種初始化質心方案,通過參數init來控制
'random':表示隨機生成k個質心'k-means++':此為默認值,通過kMeans++方法來初始化質心。
kMeans++初始化質心的流程如下
- 隨機選擇1個點作為初始質心 x 0
- ?計算其他點到最近質心的距離
- 假定現有 n n n個質心了,那么選擇距離當前質心較遠的點作為下一個質心 x n x_n xn?
重復步驟2和3,直到質心個數達到 k k k個。
若希望直接調用kMeans++函數,則可使用kmeans_plusplus。
小批
sklearn提供了KMeans的一個變種MiniBatchKMeans,可在每次訓練迭代中隨機抽樣,這種小批量的訓練過程大大減少了運算時間。
當樣本量非常巨大時,小批KMeans的優(yōu)勢是非常明顯的
from sklearn.cluster import MiniBatchKMeans
import time
ys, xs = np.indices([4,4])*6
cens = list(zip(xs.reshape(-1), ys.reshape(-1)))
X, y = make_blobs(100000,centers=cens)
km = KMeans(16)
mbk = MiniBatchKMeans(16)
def test(func, value):
t = time.time()
func(value)
print("耗時", time.time()-t)
test(km.fit_predict, X)
# 耗時 3.2028110027313232
test(mbk.fit_predict, X)
# 耗時 0.2590029239654541
可見效果非常明顯,其中fit_predict和predict相似,但并沒有返回值,km.fit_predict(X)運行之后,會更改km中的labels_屬性,此即分類結果
fig = plt.figure()
ax = fig.add_subplot(1,2,1)
ax.scatter(X[:,0], X[:,1], c=km.labels_,
marker='.', alpha=0.5)
ax = fig.add_subplot(1,2,2)
ax.scatter(X[:,0], X[:,1], c=mbk.labels_,
marker='.', alpha=0.5)
plt.show()
效果如圖所示,可見小批的KMeans算法和KMeans算法從結果上來看區(qū)別不大。

到此這篇關于Python sklearn中的K-Means聚類使用方法淺析的文章就介紹到這了,更多相關Python K-Means聚類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python+splinter實現12306網站刷票并自動購票流程
這篇文章主要為大家詳細介紹了python+splinter實現12306網站刷票并自動購票流程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
wx.CheckBox創(chuàng)建復選框控件并響應鼠標點擊事件
這篇文章主要為大家詳細介紹了wx.CheckBox創(chuàng)建復選框控件并響應鼠標點擊事件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04
Python字典創(chuàng)建 遍歷 添加等實用基礎操作技巧
字段是Python是字典中唯一的鍵-值類型,本文講述了Python中字典如何創(chuàng)建 遍歷 添加等實用基礎操作技巧,內容非常基礎但非常重要,一定要熟練掌握2018-09-09

