聚類分析是什么
相對于分類购披,聚類是一種不清楚類別的種類胞得,或類別不清楚的情況下捧书,通過計算數(shù)據(jù)之間的相似度(其中用得最多的是距離)來進行小組劃分的一種數(shù)據(jù)挖掘方法苛吱。其特點是組中數(shù)據(jù)的相似度很高酪术,而不同組別之間的相似度卻很低。
聚類分析有哪些
根據(jù)不同的劃分方式,聚類可分為K-Means聚類绘雁、K-中心點聚類橡疼、系統(tǒng)聚類等。其中最常用以及應(yīng)用范圍最廣的是K-Means聚類庐舟,下面著重介紹K-Means聚類欣除。
K-Means聚類
K-Means聚類是很典型的基于距離的聚類算法,以組內(nèi)元素的均值作為每個組的中心挪略,采用距離作為相似性的指標历帚,即認為兩個對象距離近,則相似杠娱,否則挽牢,不相似。該算法認為組內(nèi)元素是由距離相近的元素組成的摊求,因此禽拔,組間元素的距離相近,不同組的距離則較遠室叉。
算法步驟:
- 隨機選取K個對象作為聚類中心
- while 聚類中心發(fā)生變化
- 計算數(shù)據(jù)集中各個對象到K個聚類中心的距離睹栖,并將距離相近的對象歸為同一個聚類
- 重新計算聚類中心(即重新計算組內(nèi)均值)
算法實踐:
我們以常用的分類數(shù)據(jù)集Iris作為我們的原始數(shù)據(jù)
iris = datasets.load_iris()
x,y = iris.data,iris.target
data = x[:, [1, 3]] #只取兩個維度便于可視化
f = plt.scatter(data[:, 0], data[:, 1])
歐幾里得距離:
我們采用歐幾里得距離來計算點與點之間的距離
def distance(p1, p2):
"""
返回兩個點之間的歐幾里得距離
"""
tmp = np.sum((p1-p2)**2)
return np.sqrt(tmp)
聚類中心的初始化:
def _rand_center(data, k):
"""
隨機挑選K個初始點
"""
n = data.shape[1] #數(shù)據(jù)集包含的特征數(shù)
centroids = np.zeros((k, n)) #初始化一個K行n列的0矩陣
for i in range(n):
dmin, dmax = np.min(data[:, i]), np.max(data[:, i])
centroids[:, i] = dmin + (dmax - dmin) * np.random.rand(k)
# 這里產(chǎn)生的是介于極小值和極大值之間的數(shù),產(chǎn)生的數(shù)有可能不是數(shù)據(jù)集的數(shù)據(jù)
return centroids
K均值聚類:
該算法中太惠,當聚類中心不再改變的時候磨淌,迭代停止,返回聚類中心凿渊,各點歸屬于哪一聚類和他們之間距離的和梁只。
注意到K-Means有可能陷于局部最小值,我們采用多次計算取最小值來解決此問題埃脏,當然也可以用二分K均值來解決此問題搪锣。
n = data.shape[0] #數(shù)據(jù)集的行數(shù)
centroids = _rand_center(data, k)
label = np.zeros(n, dtype=np.int) #用于標記最近的聚類中心
assessment = np.zeros(n) #用于對模型的評估
converged = False
while not converged:
old_centroids = np.copy(centroids)
for i in range(n): #決定最相近的聚類中心并記錄在label中
min_dist, min_index = np.inf, -1
for j in range(k):
dist = distance(data[i], centroids[j])
if dist < min_dist:
min_dist, min_index = dist, j
label[i] = j
assessment[i] = distance(data[i], centroids[j])
for m in range(k): #更新聚類中心
centroids[m] = np.mean(data[label == m], axis=0)
converged = _converged(old_centroids, centroids)
return centroids, label, np.sum(assessment)
最后經(jīng)過多次計算之后顯示的結(jié)果如下圖:
從圖可以看出,聚類的效果還不錯彩掐。