一、概述
當前人工智慧技術實現的一種主要手段是機器學習,而機器學習能夠解決的問題主要有三種:分類、聚類、迴歸,有監督的是分類,無監督的是聚類。所謂聚類,就是以一定的方法將一堆樣本依它們本身的資料特性劃分成不同的簇類,以達成不同的技術目的,k-means就是這樣一種基礎聚類演算法。
二、演算法原理
對給定的樣本集,k-means基於迭代的思想,由聚集中心點劃定簇集,簇集反過來確定新的聚集中心點,週而復始,最終獲得最佳劃分的簇集。k-means中的k即想要劃定的簇數,它是一個超引數,需由人工事先指定。樣本的簇集劃歸由它與各個聚集中心點的距離來確定,劃歸到距離最近的那一個,其中距離的計算一般採用歐氏距離;新劃定的簇集則進一步計算質心作為新的聚集中心,質心即樣本向量的均值 \(c=\left( \bar{x^{(1)}},\bar{x^{(2)}},...,\bar{x^{(n)}} \right)\)
演算法描述
輸入:樣本集 \(T=\left\{ x_1,x_2,...,x_N \right\}\),簇數k.
輸出:質心集合 \(C=\left\{ c_1,c_2,...,c_k \right\}\),劃分樣本集\(D=\left\{ D_1,D_2,...,D_k \right\}\).
(1) 任意選定k個樣本作為初始聚集中心.
(2) 劃分簇類
1)對T中資料,計算與各個聚集中心的距離.樣本x與聚集中心c的距離為
2)將樣本劃歸到離得最近的聚集中心,形成簇類。
(3)計算質心作為聚集中心
對簇S,質心
其中
\(c^{(i)}=\frac{1}{M}\sum_{s=1}^{M}{x_{s}^{(i)}}\),\(M=\left| S \right|\).
(4)重複(2)-(3)步,直至質心不發生偏移或達到指定的迭代次數.
三、python實現
'''
由sklearn實現kmeans聚類。
'''
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
#初始化資料集
d1 = np.random.rand(18,2)
d2 = 1.5 + np.random.rand(17,2)
d3 = 3 + np.random.rand(20,2)
data = np.concatenate((d1,d2,d3),axis=0)
#定義kmeans模型,n_clusters為指定的簇數k
kmr = KMeans(n_clusters=3)
#資料計算
fit_kmr = kmr.fit(data)
#獲取標籤結果
rs_labels = fit_kmr.labels_
#獲取每個簇類的中心點
rs_center_ids = fit_kmr.cluster_centers_
#繪圖
#繪製資料點
plt.scatter(data[:,0],data[:,1],c=rs_labels,alpha=0.5)
#繪製質心
plt.scatter(rs_center_ids[:,0],rs_center_ids[:,1],c='red')
plt.show()
執行結果:
End.