K-means演算法

1. 歸類:

聚類(clustering) 屬於非監督學習 (unsupervised learning)

無類別標記(class label)

2. 舉例:

3. K-means 演算法:

3.1 Clustering 中的經典演算法,數據挖掘十大經典演算法之一

3.2 演算法接受參數 k ;然後將事先輸入的n個數據對象劃分為 k個聚類以便使得所獲得的聚類滿足:同一聚類中的對象相似度較高;而不同聚類中的對象相似度較小。

3.3 演算法思想:

以空間中k個點為中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果

3.4 演算法描述:

(1)適當選擇c個類的初始中心;

(2)在第k次迭代中,對任意一個樣本,求其到c各中心的距離,將該樣本歸到距離最短的中心所在的類;

(3)利用均值等方法更新該類的中心值;

(4)對於所有的c個聚類中心,如果利用(2)(3)的迭代法更新後,值保持不變,則迭代結束,否則繼續迭代。

3.5 演算法流程:

輸入:k, data[n];

(1) 選擇k個初始中心點,例如c[0]=data[0],…c[k-1]=data[k-1];

(2) 對於data[0]….data[n], 分別與c[0]…c[k-1]比較,假定與c[i]差值最少,就標記為i;

(3) 對於所有標記為i點,重新計算c[i]={ 所有標記為i的data[j]之和}/標記為i的個數;

(4) 重複(2)(3),直到所有c[i]值的變化小於給定閾值。

4. 舉例:

5.演算法優缺

優點:速度快,簡單

缺點:最終結果跟初始點選擇相關,容易陷入局部最優,需直到k值

6.代碼實現如下

import numpy as npnndef kmeans(x,k,maxIt):n numPoints,numDim=x.shapenn dataSet=np.zeros((numPoints,numDim+1))n dataSet[:,:-1]=xnn centroids=dataSet[np.random.randint(numPoints,size=k),:]n # centroids=dataSet[0:2,:]nn centroids[:,-1]=range(1,k+1)nn iterations=0n oldCentroids=Nonenn while not shouldStop(oldCentroids,centroids,iterations,maxIt):n print("iteration:n",iterations)n print("dataSet:n",dataSet)n print("centroids:n",centroids)nn oldCentroids=np.copy(centroids)n iterations+=1nn updatelabels(dataSet,centroids)nn centroids=getCentroids(dataSet,k)n n return dataSetnndef shouldStop(oldCentroids,centroids,iterations,maxIt):n if iterations>maxIt:n return Truen return np.array_equal(oldCentroids,centroids)nndef updatelabels(dataSet,centroids):n numPoints,numDim=dataSet.shapen for i in range(0,numPoints):n dataSet[i,-1]=getLabelFromCloseCentroid(dataSet[i,:-1],centroids)nndef getLabelFromCloseCentroid(dataSetRow,centroids):n label=centroids[0,-1];n minDist=np.linalg.norm(dataSetRow-centroids[0,:-1])n for i in range(1,centroids.shape[0]):n dist=np.linalg.norm(dataSetRow-centroids[i,:-1])n if dist < minDist:n minDist=distn label=centroids[i,-1]n n print("minDist:",minDist)n return labelnndef getCentroids(dataSet,k):n result=np.zeros((k,dataSet.shape[1]))n for i in range(1,k+1):n oneCluster=dataSet[dataSet[:,-1]==i,:-1]n result[i-1,:-1]=np.mean(oneCluster,axis=0)n result[i-1,-1]=in return resultnnx1=np.array([1,1])nx2=np.array([2,1])nx3=np.array([4,3])nx4=np.array([5,4])ntestX=np.vstack((x1,x2,x3,x4))nnresult=kmeans(testX,2,10)nprint("result:n" ,result) n

推薦閱讀:

想學習「機器學習」,需要學習哪些先導課程?
處理不均衡數據 (機器學習)
應用機器學習演算法的一些具體建議
[讀論文]fast-and-provably-good-seedings-for-k-means

TAG:机器学习 | 人工智能 | Python |