前言
聚類算法又叫做”無監督分類“,目標是通過對無標記訓練樣本來揭示數據的內在性質及 規律,為進一步的數據分析提供基礎。
Kmeans
作為聚類算法的典型代表,Kmeans可以說是最簡單的聚類算法,沒有之一,那她是怎么完成聚類的呢?
- 算法接受參數k
- 給定樣本集 D = { x 1 , x 2 , . . . , x n } D=\{x_1,x_2,...,x_n\} D={x1?,x2?,...,xn?}
- 隨機選點k個中心(質心)
- 遍歷樣本集,先取距離最近的質心,從而根據質心分解樣本集D簇劃分 C = { C 1 , C 2 , . . . , C k } C=\{C_1,C_2,...,C_k\} C={C1?,C2?,...,Ck?}
- 最小化平方誤差
- 利用簇中均值等方法更新該簇類的中心k個;
- 重覆4-6的步驟,直至E不再更新
Kmeans中用的是歐式距離
kmeans的計算過程
- 現在有4組數據,每組數據有2個維度,對其進行聚類分為2類,將其可視化一下。
- 通過比較,將其進行歸類。并使用平均法更新中心位置。
- 再次計算每個點與更新后的位置中心的距離,直到上一次的類別標記無變化,即可停止
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs## 創建數據集
X, _ = make_blobs(n_samples=10000, centers=2, random_state=0)## kmeans超參數值列表
n_clusters_list = [4, 8, 16]# 圖的框架
fig, axs = plt.subplots(1, len(n_clusters_list), figsize=(12, 5)
)
axs = axs.T
for j, n_clusters in enumerate(n_clusters_list):## 創建模型algo = KMeans(n_clusters=n_clusters, random_state=random_state, n_init=3)algo.fit(X)centers = algo.cluster_centers_axs[j].scatter(X[:, 0], X[:, 1], s=10, c=algo.labels_)## 畫質心axs[j].scatter(centers[:, 0], centers[:, 1], c="r", s=20)axs[j].set_title(f"{n_clusters} clusters")
for ax in axs.flat:ax.label_outer()ax.set_xticks([])ax.set_yticks([])
plt.show()
聚類算法用于降維
K-Means聚類最重要的應用之一是非結構數據(圖像,聲音)上的矢量量化(VQ)。非結構化數據往往占用比較多的儲存空間,文件本身也會比較大,運算非常緩慢,我們希望能夠在保證數據質量的前提下,盡量地縮小非結構化數據的大小,或者簡化非結構化數據的結構。
- 一組40個樣本的數據,分別含有40組不同的信息(x1,x2)。
- 將代表所有樣本點聚成4類,找出四個質心.這些點和他們所屬的質心非常相似,因此他們所承載的信息就約等于他們所在的簇的質心所承載的信息。
- 使用每個樣本所在的簇的質心來覆蓋原有的樣本,有點類似四舍五入的感覺,類似于用1來代替0.9和0.8。
這樣,40個樣本帶有的40種取值,就被我們壓縮了4組取值,雖然樣本量還是40個,但是這40個樣本所帶的取值其實只有4個,就是分出來的四個簇的質心。查看官方用例
主要參考
《機器學習理論(十三)Kmeans聚類》