2017年9月3日 星期日

機器學習-ML-k-means

機器學習_ML_K_MEANS

K_MEANS取的是虛擬點,依你所挑的k個值心開始,由虛擬點開始一直迭代計算中心值。
離群值本身對中心點影響性大,適用於大資料集!
本身所採用的是歐幾理德距離,就是我們國高中學的,x1-x2的平方加上y1-y2的平方然後開根號!
  • 從樣本點中隨機挑選k個質心(centroid:連續值的平均)作為初始集群中心
  • 指定每個樣本到它最近的質心
  • 移動質心到被分配給它的樣本點的中心
  • 重複2,3步直到群集分配不再改變,或是達到使用者定義的可容語誤差,或是最大迭代次數。
虛擬點所指為,該點非資料集本身。
相較於init由亂數(random)來決定,另一種方式為k-means++
  • 初始化一個空的集合M來儲存被選取的質心
  • 從輸入樣本中隨機選取第一個質心且指派給M
  • 對於每一個不在M中的樣本計算出對M中所有質心的最小距離平方
  • 使用加權機率分配來隨機選取下一個質心
  • 重覆2,3直到選取了k個質心
  • 以古典k-means演算法完成後續工作
這邊我們發現一個不同是,從輸入樣本中隨機選擇第一個質心M集合, 這代表著k-means++是取實際點。
k-means的一個特性,集群不會重疊,也不具階層性。
In practice, the k-means algorithm is very fast (one of the fastest clustering algorithms available), but it falls in local minima. That’s why it can be useful to restart it several times.
作者提到,多計算幾次是有用的!!

IMPORT

from sklearn.cluster import KMeans

CLASS

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

default 8
集群數目
需事先指定集群數目是k-means限制之一

init

default k-means++ {random, k-means++}
初始質心的選擇方式

n_init

default 10
以隨機選取的質心來執行k-means演算法次數,並以最低SSE的模型來做最後的模型

max_iter

default 300
每次執行的最大迭代次數,在k-means中,如果執行結果收斂的話,是有可能提前中止,而不會執行到最大迭代次數。

tol

default 0.0001
控制集群內誤差平方和的可容許誤差,設定較大的值可有效收斂!

precompute_distances

default auto {‘auto’, ‘True’, ‘False’}
預先計算距離,更快,但需要更大的記憶體空間
auto:不預先計算,當n_samples * n_clusters > 12 million.(1200萬)

verbose

default 0
過程是否顯示

random_state

亂數種子

copy_x

default True
待理解

n_jobs

default 1
使用多少CPU核心數
-1代表火力全開

algorithm

default auto {‘auto’, ‘full’, ‘elkan’}
距離計算的演算法,作法上是建議讓演算法去自動判斷資料的稀疏程度自己選即可。
elkan利用了兩邊之和大於等於第三邊,以及兩邊之差小於第三邊的三角形性質,來減少距離的計算
這部份相關的細節如果有興趣的話,可以再查文獻。

方法

fit(X[, y])

適合(訓練)模型

fit_predict(X[, y])

適合(訓練)模型+預測模型聚類索引

fit_transform(X[, y])

適合(訓練)模型+轉換為聚類距離空間
有transform就可以配合pipeline!!

get_params([deep])

取得模型參數

predict(X)

預測模型聚類索引

score(X[, y])

不是很理解,x與k-means相對值?

set_params(**params)

設置模型參數

transform(X)

轉換為聚類距離空間

屬性

cluster_centers_

計算之後的質心位置

inertia_

集群內誤差平方和
可用來做轉折判斷法的依據

labels_

每個點的標籤

範例

#  載入scikit-learn資料集範例資料
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=150,
                  n_features=2,
                  centers=3,
                  cluster_std=0.5,
                  shuffle=True,
                  random_state=0)
                  
#  實作
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3,
            init='random',
            n_init=10,
            max_iter=300,
            tol=1e-04,
            random_state=0)
y_km = km.fit_predict(X)

#  圖形化
plt.scatter(X[y_km == 0, 0],
            X[y_km == 0, 1],
            s=50,
            c='lightgreen',
            marker='s',
            label='cluster 1')
            
plt.scatter(X[y_km == 1, 0],
            X[y_km == 1, 1],
            s=50,
            c='orange',
            marker='o',
            label='cluster 2')
            
plt.scatter(X[y_km == 2, 0],
            X[y_km == 2, 1],
            s=50,
            c='lightblue',
            marker='v',
            label='cluster 3')
#  質心的點            
plt.scatter(km.cluster_centers_[:, 0],
            km.cluster_centers_[:, 1],
            s=250,
            marker='*',
            c='red',
            label='centroids')
plt.legend()
plt.grid()
plt.show()

沒有留言:

張貼留言