天天看點

SKlearn——聚類算法1.聚類2.聚類算法2.1KMeans2.2Birch2.3DBSCAN2.4層次聚類2.5.譜聚類3.評價标準4.sklearn中的聚類算法

SKlearn——聚類算法

  • 1.聚類
  • 2.聚類算法
  • 2.1KMeans
  • 2.2Birch
  • 2.3DBSCAN
  • 2.4層次聚類
  • 2.5.譜聚類
  • 3.評價标準
  • 4.sklearn中的聚類算法

1.聚類

在無監督學習中,訓練樣本的标記資訊是未知的,目标是通過對無标記訓練樣本來揭示資料的内在性質及 規律,為進一步的資料分析提供基礎。此類學習任務中研究最多、應用最廣的是‘聚類’。聚類試圖将資料集中的樣本劃分為若幹個通常是不相交的子集,每個子集稱之為一個‘簇’。

簡而言之,聚類就是僅根據資料本身,對大量的資料及進行分類标記,把資料化分為幾類。其思想和前面的分類相似,隻不過之前的分類任務我們是知道需要根據什麼來進行分類,每一類應該是怎樣的。而聚類則是僅僅提供資料,假設這些資料是可以分類的,讓計算機來“探索”資料的分類特征。

2.聚類算法

聚類算法有KMeans,Birch,DBSCAN,層次聚類以及譜聚類等。

2.1KMeans

KMeans聚類算法又被稱為K均值算法,他的思想是初始随機從資料點鐘找出K個點作為初始簇中心,然後周遊每個資料點,距離哪個“中心”最近就歸為哪一類,然後再從每個簇中随機選點進行疊代,直到達到最大疊代次數為止。

2.2Birch

Birch使用了一個樹的結構來進行聚類,建立CF樹結構并進行疊代輸出結點。

2.3DBSCAN

西瓜書上給出了密度可達關系,DBSCAN算法就是基于密度可達關系的,嘗試在樣本點中找出若幹個最大密度相連的簇,即為得到的聚類結果。

2.4層次聚類

層次聚類通過不斷比較資料點之間的相似程度,進行合并并以此疊代的方法,最終建立一棵樹形聚類結構.

2.5.譜聚類

譜聚類的思想即把資料點看作帶權無向圖,資料點之間的距離與權重成負相關,譜聚類的核心思想即嘗試将圖分割為若幹子圖,使得子圖内的權值和盡可能大,子圖間的權重盡可能小。

3.評價标準

本案例中使用經典的評價标準:calinski-harabasz名額(CH名額)來進行聚類結果的評價,其公式為:

SKlearn——聚類算法1.聚類2.聚類算法2.1KMeans2.2Birch2.3DBSCAN2.4層次聚類2.5.譜聚類3.評價标準4.sklearn中的聚類算法

其中,n表示聚類的數目 ,k 表示目前的類, trB(k)表示類間離差矩陣的迹, trW(k) 表示類内離差矩陣的迹。對于同一類聚類算法的不同參結果,CH名額的值越大代表聚類的結果相對越好。

4.sklearn中的聚類算法

import matplotlib.pyplot as plt
from sklearn import cluster
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# make_blobs:生成聚類的資料集
# n_samples:生成的樣本點個數,n_features:樣本特征數,centers:樣本中心數
# cluster_std:聚類标準差,shuffle:是否打亂資料,random_state:随機種子
X, y = make_blobs(n_samples=150, n_features=2, centers=3,cluster_std=0.5,shuffle=True, random_state=0)

#散點圖
#c:點得顔色,maker:點的形狀,edgecolor:點邊緣的形狀,s:點的大小
plt.scatter(X[:,0], X[:,1], c='white', marker = 'o', edgecolors='black', s=50)
plt.show()
           
SKlearn——聚類算法1.聚類2.聚類算法2.1KMeans2.2Birch2.3DBSCAN2.4層次聚類2.5.譜聚類3.評價标準4.sklearn中的聚類算法
#定義模型
# 定義模型
# n_clusters:要形成的簇數,即k均值的k,init:初始化方式,tot:Frobenius 範數收斂的門檻值
model = KMeans(n_clusters=3, init='random', n_init= 10, max_iter=300, tol=1e-04, random_state=0)
# 訓練加預測
y_pred = model.fit_predict(X)

# 畫出預測的三個簇類
plt.scatter(
    X[y_pred == 0,0],X[y_pred == 0,1],
    s = 50, c = 'orange',
    marker= 'o', edgecolors='black',
    label = 'cluster 1'
)

plt.scatter(
    X[y_pred == 1,0],X[y_pred == 1,1],
    s = 50, c = 'orange',
    marker= 'o', edgecolors='black',
    label = 'cluster 1'
)

plt.scatter(
    X[y_pred == 2, 0], X[y_pred == 2, 1],
    s=50, c='lightblue',
    marker='v', edgecolor='black',
    label='cluster 3'
)

#畫出聚類中心
plt.scatter(
    model.cluster_centers_[:, 0], model.cluster_centers_[:, 1],
    s = 250, marker= '*',
    c = 'red', edgecolors='black',
    label = 'centroids'
)
plt.legend(scatterpoints=1)
plt.grid()
plt.show()
           
SKlearn——聚類算法1.聚類2.聚類算法2.1KMeans2.2Birch2.3DBSCAN2.4層次聚類2.5.譜聚類3.評價标準4.sklearn中的聚類算法
# 計算inertia随着k變化的情況
distortions = []
for i in range(1, 10):
    model = KMeans(
        n_clusters=i, init = 'random',
        n_init=10, max_iter=300,
        tol=1e-04,random_state=0
    )
    model.fit(X)
    distortions.append(model.inertia_)

# 畫圖可以看出k越大inertia越小,追求k越大對應用無益處
plt.plot(range(1, 10), distortions, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
plt.show()
           
SKlearn——聚類算法1.聚類2.聚類算法2.1KMeans2.2Birch2.3DBSCAN2.4層次聚類2.5.譜聚類3.評價标準4.sklearn中的聚類算法

https://github.com/datawhalechina/machine-learning-toy-code/tree/main/ml-with-sklearn/K-means

https://blog.csdn.net/baidu_38406307/article/details/103879731?spm=1001.2014.3001.5501

繼續閱讀