Python sklearn中的K-Means聚類使用方法淺析
初步認(rèn)識(shí)
k-means翻譯過來就是K均值聚類算法,其目的是將樣本分割為k個(gè)簇,而這個(gè)k
則是KMeans
中最重要的參數(shù):n_clusters
,默認(rèn)為8。
下面做一個(gè)最簡單的聚類
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
是聚類結(jié)果,其數(shù)值表示對應(yīng)位置X
所屬類號(hào)。
效果如圖所示,對于下面這組數(shù)據(jù)來說,顯然最好是分為兩類,但如果KMeans
的n_clusters
設(shè)為3,那就會(huì)聚成3類。
上面調(diào)用的KMeans
是一個(gè)類,sklearn
中同樣提供了函數(shù)形式的調(diào)用,其使用方法如下
from sklearn.cluster import k_means cen, y, interia = k_means(X, 3)
其中,cen
表示聚類后,每一類的質(zhì)心;y
為聚類后的標(biāo)簽;interia
表示均方誤差之和。
初值選取
在KMeans
最重要的概念是簇,也就是被分割后的數(shù)據(jù)種類;而每個(gè)簇都有一個(gè)非常重要的點(diǎn),就是質(zhì)心。在設(shè)定好簇的個(gè)數(shù)之后,也就相當(dāng)于確定了質(zhì)心的個(gè)數(shù),而KMeans
算法的基本流程是
- 選擇k個(gè)點(diǎn)作為k個(gè)簇的初始質(zhì)心
- 計(jì)算樣本到這k個(gè)質(zhì)心(簇)的距離,并將其劃入距離最近的簇中
- 計(jì)算每個(gè)簇的均值,并使用該均值更新簇的質(zhì)心
重復(fù)上述2-3的操作,直到質(zhì)心區(qū)域穩(wěn)定或者達(dá)到最大迭代次數(shù)。
從這個(gè)流程可以看出來,KMeans
算法至少有兩個(gè)細(xì)節(jié)需要考慮,一個(gè)是初始化方案,另一個(gè)則是質(zhì)心更新的方案。
在KMeans
類或者k_means
函數(shù)中,提供了兩種初始化質(zhì)心方案,通過參數(shù)init
來控制
'random'
:表示隨機(jī)生成k個(gè)質(zhì)心'k-means++'
:此為默認(rèn)值,通過kMeans++
方法來初始化質(zhì)心。
kMeans++
初始化質(zhì)心的流程如下
- 隨機(jī)選擇1個(gè)點(diǎn)作為初始質(zhì)心 x 0
- ?計(jì)算其他點(diǎn)到最近質(zhì)心的距離
- 假定現(xiàn)有 n n n個(gè)質(zhì)心了,那么選擇距離當(dāng)前質(zhì)心較遠(yuǎn)的點(diǎn)作為下一個(gè)質(zhì)心 x n x_n xn?
重復(fù)步驟2和3,直到質(zhì)心個(gè)數(shù)達(dá)到 k k k個(gè)。
若希望直接調(diào)用kMeans++
函數(shù),則可使用kmeans_plusplus
。
小批
sklearn
提供了KMeans
的一個(gè)變種MiniBatchKMeans
,可在每次訓(xùn)練迭代中隨機(jī)抽樣,這種小批量的訓(xùn)練過程大大減少了運(yùn)算時(shí)間。
當(dāng)樣本量非常巨大時(shí),小批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("耗時(shí)", time.time()-t) test(km.fit_predict, X) # 耗時(shí) 3.2028110027313232 test(mbk.fit_predict, X) # 耗時(shí) 0.2590029239654541
可見效果非常明顯,其中fit_predict
和predict
相似,但并沒有返回值,km.fit_predict(X)
運(yùn)行之后,會(huì)更改km
中的labels_
屬性,此即分類結(jié)果
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算法從結(jié)果上來看區(qū)別不大。
到此這篇關(guān)于Python sklearn中的K-Means聚類使用方法淺析的文章就介紹到這了,更多相關(guān)Python K-Means聚類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中使用sklearn進(jìn)行特征降維的方法
- Python sklearn CountVectorizer使用詳解
- Python?sklearn?中的?make_blobs()?函數(shù)示例詳解
- Python?sklearn預(yù)測評(píng)估指標(biāo)混淆矩陣計(jì)算示例詳解
- Python+Sklearn實(shí)現(xiàn)異常檢測
- python?sklearn與pandas實(shí)現(xiàn)缺失值數(shù)據(jù)預(yù)處理流程詳解
- Python sklearn分類決策樹方法詳解
- Python sklearn對文本數(shù)據(jù)進(jìn)行特征化提取
相關(guān)文章
Python中關(guān)于面向?qū)ο蟾拍畹脑敿?xì)講解
要了解面向?qū)ο笪覀兛隙ㄐ枰戎缹ο蟮降资鞘裁赐嬉鈨骸jP(guān)于對象的理解很簡單,在我們的身邊,每一種事物的存在都是一種對象??偨Y(jié)為一句話也就是:對象就是事物存在的實(shí)體2021-10-10Python數(shù)字圖像處理代數(shù)之加減乘運(yùn)算
這篇文章主要介紹了Python數(shù)字圖像處理代數(shù)運(yùn)算,對其中的加、減、乘運(yùn)算分別作了詳細(xì)的講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09