1. 程式人生 > >十一、用scikit-learn做聚類分析

十一、用scikit-learn做聚類分析


線性迴歸和邏輯迴歸都是監督學習方法,聚類分析是非監督學習的一種,可以從一批資料集中探索資訊,比如在社交網路資料中可以識別社群,在一堆菜譜中識別出菜系。本節介紹K-means聚類演算法

K-means

k是一個超引數,表示要聚類成多少類。K-means計算方法是重複移動類的重心,以實現成本函式最小化,成本函式為:

其中μk是第k類的重心位置

試驗

構造一些樣本使用者試驗,如下:

# coding:utf-8

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

import matplotlib.pyplot as plt
import
numpy as np # 生成2*10的矩陣,且值均勻分佈的隨機數 cluster1 = np.random.uniform(0.5, 1.5, (2, 10)) cluster2 = np.random.uniform(3.5, 4.5, (2, 10)) # 順序連線兩個矩陣,形成一個新矩陣,所以生成了一個2*20的矩陣,T做轉置後變成20*2的矩陣,剛好是一堆(x,y)的座標點 X = np.hstack((cluster1, cluster2)).T plt.figure() plt.axis([0, 5, 0, 5]) plt.grid(True) plt.plot(X[:,0],X[:,1
],'k.') plt.show()

影象如下:

通過k-means做聚類,輸出重心點,增加如下程式碼:

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)
plt.plot(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1], 'ro')

輸出影象:

可以看到找到了兩個重心點

肘部法則

現實情況是多個點並不像上面這麼聚類清晰,很可能是這樣的:

你說不清它應該聚類成2、3、4個點,因此我們需要通過分別計算k=(2,3,4)的聚類結果,並比較他們的成本函式值,隨著k的增大,成本函式值會不斷降低,只有快速降低的那個k值才是最合適的k值,如下:

# coding:utf-8

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist

# 生成2*10的矩陣,且值均勻分佈的隨機數
cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
cluster2 = np.random.uniform(1.5, 2.5, (2, 10))
cluster3 = np.random.uniform(1.5, 3.5, (2, 10))
cluster4 = np.random.uniform(3.5, 4.5, (2, 10))

# 順序連線兩個矩陣,形成一個新矩陣,所以生成了一個2*20的矩陣,T做轉置後變成20*2的矩陣,剛好是一堆(x,y)的座標點
X1 = np.hstack((cluster1, cluster2))
X2 = np.hstack((cluster3, cluster4))
X = np.hstack((X1, X2)).T

K = range(1, 10)
meandistortions = []
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    # 求kmeans的成本函式值
    meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])

plt.figure()
plt.grid(True)
plt1 = plt.subplot(2,1,1)
# 畫樣本點
plt1.plot(X[:,0],X[:,1],'k.');
plt2 = plt.subplot(2,1,2)
# 畫成本函式值曲線
plt2.plot(K, meandistortions, 'bx-')
plt.show()

影象如下:

從曲線上可以看到,隨著k的增加,成本函式值在降低,但降低的變化幅度不斷在減小,因此急速降低才是最合適的,這裡面也許3是比較合適的,你也許會有不同看法

通過這種方法來判斷最佳K值的方法叫做肘部法則,你看影象像不像一個人的胳膊肘?