机器学习-Kmeans聚类
Kmeans聚類
簡介
之前提到的算法大多數(shù)都是監(jiān)督學(xué)習(xí)算法,主要代表是分類和回歸問題,但是很多時(shí)候想要從數(shù)據(jù)中發(fā)現(xiàn)一些潛在的規(guī)律,而數(shù)據(jù)是沒有指標(biāo)驅(qū)動(dòng)的,即沒有標(biāo)簽,這種自學(xué)習(xí)算法稱為非監(jiān)督學(xué)習(xí)(Unsupervised Learning)。非監(jiān)督學(xué)習(xí)算法的典型代表是聚類(Clustering),分類問題是給定x和y,要求找到一種假設(shè)擬合數(shù)據(jù)的分布,將不同的類別區(qū)分開,而聚類問題則是只有x,從中發(fā)現(xiàn)一些規(guī)律將樣本分成區(qū)別較大的多個(gè)簇。聚類的應(yīng)用較分類在業(yè)界更為廣泛,因?yàn)闃?biāo)注成本大且易錯(cuò),最為典型的聚類算法是Kmeans算法。
原理
K-means是一種給定聚類數(shù)目k的聚類算法,它通過迭代不斷調(diào)整聚類中心達(dá)到聚類的目的,由于聚類中心的調(diào)整是基于當(dāng)前簇的均值決定的,故叫做k均值聚類算法。下面以樣本都是二維特征的數(shù)據(jù)為例(方便可視化),詳述算法思路。
上述的Kmeans算法存在一些問題,如k個(gè)聚類中心的初始化,一旦出現(xiàn)極端情況將很難更新(所有樣本離某個(gè)中心都是最近,其他中心無法形成簇)。
首先來看Kmeans的優(yōu)化目標(biāo),記c(i)c^{(i)}c(i)為第i個(gè)樣本的所屬簇(類別)的編號,μk\mu_kμk?表示第k個(gè)簇的聚類中心。那么優(yōu)化的目標(biāo)函數(shù)就如下式所示。
J(c(1),…,c(m),μ1,…,μK)=1m∑i=1m∥x(i)?μc(i)∥2J\left(c^{(1)}, \ldots, c^{(m)}, \mu_{1}, \ldots, \mu_{K}\right)=\frac{1}{m} \sum_{i=1}^{m}\left\|x^{(i)}-\mu_{c^{(i)}}\right\|^{2} J(c(1),…,c(m),μ1?,…,μK?)=m1?i=1∑m?∥∥∥?x(i)?μc(i)?∥∥∥?2
優(yōu)化函數(shù)即為如下,只要找到使得J最小的ccc和μ\muμ即找到了最優(yōu)解。
min?c(1),…,c(m)μ(1),…,μ(m)J(c(1),…,c(m),μ1,…,μK)\min _{c^{(1)}, \ldots, c^{(m)} \\ \mu^{(1)}, \ldots, \mu^{(m)}} J\left(c^{(1)}, \ldots, c^{(m)}, \mu_{1}, \ldots, \mu_{K}\right) c(1),…,c(m)μ(1),…,μ(m)min?J(c(1),…,c(m),μ1?,…,μK?)
算法優(yōu)化
上述的算法原理其實(shí)并不是很復(fù)雜,但是該算法的應(yīng)用會(huì)出現(xiàn)很多問題,如之前提到的聚類中心初始化,不合適的初始化很容易使得算法收斂到局部最優(yōu)解,這不是我們希望看到的。
比較常用且有效的聚類中心初始化方法是隨機(jī)挑選k個(gè)訓(xùn)練樣本作為聚類初始中心,這種方法叫做隨機(jī)初始化(random initialization)。
當(dāng)然,即使隨機(jī)初始化也可能陷入局部最優(yōu),因此多次嘗試隨機(jī)初始化,綜合多次聚類結(jié)果會(huì)是不錯(cuò)的選擇,綜合的方法一般是選擇使得代價(jià)函數(shù)J最小的聚類參數(shù)。
還有一個(gè)比較值得研究的問題就是如何確定聚類的簇?cái)?shù)目K,這引起了較多的研究也產(chǎn)生了一些方法,但是最實(shí)用的其實(shí)還是人工選擇。這是因?yàn)?#xff0c;當(dāng)數(shù)據(jù)的特征維度較大時(shí),一方面可視化困難,另一方面不同的人對數(shù)據(jù)的理解不同,所以設(shè)計(jì)一個(gè)自動(dòng)選擇k值的算法是非常困難的。
曾今,肘部法則被使用過,它的思路是繪制代價(jià)函數(shù)值J關(guān)于K的函數(shù),會(huì)出現(xiàn)一個(gè)明顯的拐點(diǎn),這個(gè)點(diǎn)對應(yīng)的K值就是選擇的K值(下圖左)。但是,很多時(shí)候并不會(huì)出現(xiàn)這個(gè)拐點(diǎn),因此難以選出合適的K。所以更加常用的實(shí)際上是任務(wù)驅(qū)動(dòng)的選擇,怎樣的K對Kmeans下游任務(wù)更加有效,就選這個(gè)K。
聚類實(shí)戰(zhàn)
實(shí)戰(zhàn)基于鳶尾花數(shù)據(jù)集,其中的標(biāo)簽列不作為訓(xùn)練數(shù)據(jù),且選擇兩列作為特征,方便二維可視化。
數(shù)據(jù)集的真實(shí)分布如下圖,可以感受到,由于數(shù)據(jù)的確實(shí),二維特征區(qū)分度不明顯,聚類還是比較難的。
實(shí)戰(zhàn)的源碼如下。
""" Author: Zhou Chen Date: 2019/12/9 Desc: 簡單實(shí)現(xiàn)Kmeans聚類算法 """ import numpy as np from matplotlib import pyplot as plt import random from sklearn.datasets import load_iris plt.style.use('fivethirtyeight')def load_data():data, target = load_iris()['data'], load_iris()['target']# 選取前兩列特征,方便可視化return data[:, :2], targetdef plot_data(x, y):plt.scatter(x[:, 0], x[:, 1], c=y)plt.savefig('rst.png')plt.show()def rand_centroids(data, k):m = data.shape[0]# 隨機(jī)選擇k個(gè)樣本作為初始化的聚類中心sample_index = random.sample(list(range(m)), k)centroids = data[sample_index]# 循環(huán)遍歷特征值return centroidsdef compute_dist(vecA, vecB):return np.linalg.norm(vecA - vecB)def kMeans(data, k):m, n = np.shape(data) # 樣本量和特征量labels = np.array(np.zeros((m, 2)))centroids = rand_centroids(data, k)cluster_changed = True # 是否已經(jīng)收斂while cluster_changed:cluster_changed = Falsefor i in range(m):min_dist = np.infmin_index = -1for j in range(k):distJI = compute_dist(centroids[j, :], data[i, :])if distJI < min_dist:min_dist = distJImin_index = jif labels[i, 0] != min_index:cluster_changed = Truelabels[i, :] = min_index, min_dist ** 2for cent in range(k):ptsInClust = data[np.nonzero(labels[:, 0] == cent)[0]]centroids[cent, :] = np.mean(ptsInClust, axis=0)# 返回所有的類質(zhì)心與點(diǎn)分配結(jié)果即類別return centroids, labelsif __name__ == '__main__':data, target = load_data()# plot_data(data, target)_, label = kMeans(data, 3)plot_data(data, label[:, 0])最終的聚類效果如下圖,可以看出,和原來的類別比較,聚類效果較為不錯(cuò)。
補(bǔ)充說明
本文簡單敘述了Kmeans這一聚類模型的簡單思想,思路參照吳恩達(dá)的機(jī)器學(xué)習(xí)課程(Coursera),除此以外后來產(chǎn)生了很多更為優(yōu)秀的聚類算法,后續(xù)會(huì)介紹。
- 本系列相關(guān)的博文和代碼開放于Github,歡迎訪問項(xiàng)目。同時(shí)博客也同步在我的個(gè)人博客網(wǎng)站,歡迎訪問查看其他文章。
- 由于能力和時(shí)間有限,如有錯(cuò)誤,歡迎評論指正。
總結(jié)
以上是生活随笔為你收集整理的机器学习-Kmeans聚类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xmanager远程桌面教程
- 下一篇: Numpy实现BP神经网络(包含Drop