機器學習_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演算法完成後續工作
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()
沒有留言:
張貼留言