1. 程式人生 > >利用sklearn.cluster實現k均值聚類

利用sklearn.cluster實現k均值聚類

一、k-mean演算法介紹
1.主要思想:在給定聚類簇數(K值)【n_clusters】和K個初始類簇中心(通常從資料集中隨機選取k個數據)的情況下,歷遍資料集中的每個資料點,而資料點距離哪個類簇中心(cluster centers)最近,就把該資料點分配到這個類簇中心點所代表的類簇中;所有資料點分配完畢之後,根據類簇內的所有點重新計算每個類簇的中心點(計算簇中的所用點的均值並將均值作為新的簇質心),然後再迭代的進行分配點和更新類簇中心點的步驟,直至類簇中心點的變化很小,或者達到指定的迭代次數【max_iter】。
注意:簇中心=簇質心
2.演算法使用說明:


優點:容易實現
缺點:可能收斂到區域性最小值(受到初始簇中心的影響),在大規模資料集上收斂較慢(每次迭代均需要歷遍資料集中的每一個數據樣本,且迭代次數預設值為300)
使用資料型別:數值型資料
二、sklearn庫的使用:
關於如何使用sklearn.cluster.KMeans的官方文件:
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans

   在scikit-learn中,包括兩個K-Means的演算法,一個是傳統的K-Means演算法,對應的類是KMeans。
   另一個是基於取樣的Mini Batch K-Means演算法,對應的類是MiniBatchKMeans。

1.1 KMeans類主要引數
sklearn.cluster.KMeans()
這裡寫圖片描述
引數說明:
1.輸入引數
n_clusters:資料集將被劃分成 n_clusters個‘簇’即k值以及(int, optional, default: 8)。一般需要選取多個k值進行運算,並用評估標準判斷所選k值的好壞,以獲得較好的聚類效果。
max_iter : 最大迭代次數( int, default: 300)一般如果是凸資料集的話可以不管這個值,如果資料集不是凸的,可能很難收斂,此時可以指定最大的迭代次數讓演算法可以及時退出迴圈。(較難理解待解決中)
init: 簇中心初始值的選擇方式 {‘k-means++’, ‘random’ or an ndarray} defaults to ‘k-means++’

:random:從資料集中隨機選取k個樣本;an ndarray:人為選定
random_state:隨機狀態。integer or numpy 預設是None.任意填寫一個整數值或numpy,每次產生的隨機數都相同(If an integer is given, it fixes the seed,也就是匹配隨機種子:保留了當前獲取隨機數的原始資訊,當你想產生和該次獲取隨機數的效果一樣的時候,你可以申明一下隨機種子,也就是拿可以長出相同型別植物的種子,進行培養以得到你希望得到的植物,這是一種形象的命名,當時要注意取值,取值相當於告訴你這顆種子最終會長出的植物型別),這樣你每次執行程式的時候,獲得的資料都是一樣的。
參考:https://www.zhihu.com/question/56315846
2.屬性
cluster_centers_ : 每個簇中心的座標 array, [n_clusters, n_features]
labels_ :每個樣本的標籤
inertia_ : float Sum of distances of samples to their closest cluster center.
3.方法
fit(X[, y]) Compute k-means clustering. 執行k均值聚類
fit_predict(X[, y]) Compute cluster centers and predict cluster index for each sample.
計算簇的中心並且預測每個樣本對應的簇類別,相當於先呼叫fit(X)再呼叫predict(X),提倡這種方法
三、程式:

#-*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
plt.figure()
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.2, 0.2, 0.2], random_state =9) #生成測試資料
for index,k in enumerate((2,3,4,5)):
    plt.subplot(2,2,index+1)
    y_pred = KMeans(n_clusters=k, random_state=9).fit_predict(X) #預測值
    score=metrics.calinski_harabaz_score(X, y_pred)
    plt.scatter(X[:, 0], X[:, 1], c=y_pred,s=10,edgecolor='k') 
    plt.text(.99, .01, ('k=%d, score: %.2f' % (k,score)), #文字註釋,標註關鍵資訊
            transform=plt.gca().transAxes, size=10,horizontalalignment='right')
plt.show()

效果圖:
這裡寫圖片描述
程式設計大致框架:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
#載入資料
dataMat=np.mat(loadDataSet("testSet.txt"))
#k均值聚類
y_pred=KMeans(n_clusters=4,random_state=9).fit_predict(dataMat)
plt.scatter(dataMat[:, 0], dataMat[:, 1], c=y_pred,s=10,edgecolor='k')
plt.show()

四.程式說明
4.1 sklearn.datasets.make_blobs 聚類資料生產器
作用:用來生成聚類演算法的測試資料
引數說明:
1.輸入引數
n_samples:待生成的樣本的總數 int, optional (default=100)
n_features:每個樣本的特徵數 int, optional (default=2)
centers: :簇質心的數目int(此時質心的位置隨機分配)或者其位置 array of shape [n_centers, n_features], optional (default=3)
cluster_std:每個簇的標準差,衡量某簇資料點的分散程度(見效果圖) float or sequence of floats, optional (default=1.0)
random_state:
2.輸出:
X : 生成的樣本資料集 array of shape [n_samples, n_features]
y : 每個樣本的整數型簇標籤 array of shape [n_samples]
centers=4的情況:
這裡寫圖片描述