《機器學習實戰》二分-kMeans演算法(二分K均值聚類)
=====================================================================
《機器學習實戰》系列部落格是博主閱讀《機器學習實戰》這本書的筆記也包含一些其他python實現的機器學習演算法
演算法實現均採用python
github 原始碼同步:https://github.com/Thinkgamer/Machine-Learning-With-Python
=====================================================================
Scikit-learn 實現的K-Means 演算法請參考 :點選閱讀
K-Means 均值演算法請參考:點選閱讀
首先二分-K均值是為了解決k-均值的使用者自定義輸入簇值k所延伸出來的自己判斷k數目,其基本思路是:
為了得到k個簇,將所有點的集合分裂成兩個簇,從這些簇中選取一個繼續分裂,如此下去,直到產生k個簇。
虛擬碼:
初始化簇表,使之包含由所有的點組成的簇。
repeat
從簇表中取出一個簇。
{對選定的簇進行多次二分試驗}
for i=1 to 試驗次數 do
使用基本k均值,二分選定的簇。
endfor
從二分試驗中選擇具有最小誤差的兩個簇。
將這兩個簇新增到簇表中。
until 簇表中包含k個簇
比如要分成5個組,第一次分裂產生2個組,然後從這2個組中選一個目標函式產生的誤差比較大的,分裂這個組產生2個,這樣加上開始那1個就有3個組了,然後再從這3個組裡選一個分裂,產生4個組,重複此過程,產生5個組。這算是一中基本求精的思想。二分k均值不太受初始化的困擾,因為它執行了多次二分試驗並選取具有最小誤差的試驗結果,還因為每步只有兩個質心。優點與缺點
k均值簡單並且可以用於各種資料型別,它相當有效,儘管常常多次執行。然後k均值並不適合所有的資料型別。它不能處理非球形簇,不同尺寸和不同密度的簇。對包含離群點(噪聲點)的資料進行聚類時,k均值也有問題。
其實現的Python程式碼如下:
#encoding:utf-8
from numpy import *
def loadDataSet(filename):
dataMat = [] #建立元祖
fr = open(filename)
for line in fr.readlines():
curLine = line.strip().split("\t")
fltLine = map(float,curLine) #使用map函式將curLine裡的數全部轉換為float型
dataMat.append(fltLine)
return dataMat
def distEclud(vecA,vecB): #計算兩個向量的歐式距離
return sqrt(sum(power(vecA-vecB,2)))
def randCent(dataSet,k): #位給定資料集構建一個包含k個隨機質心的集合
n = shape(dataSet)[1] #shape函式此時返回的是dataSet元祖的列數
centroids = mat(zeros((k,n))) #mat函式建立k行n列的矩陣,centroids存放簇中心
for j in range(n):
minJ = min(dataSet[:,j]) #第j列的最小值
rangeJ = float(max(dataSet[:,j]) - minJ)
centroids[:,j] = minJ + rangeJ * random.rand(k,1) #random.rand(k,1)產生shape(k,1)的矩陣
return centroids
def kMeans(dataSet,k,disMeas = distEclud,createCent = randCent):
m = shape(dataSet)[0] #shape函式此時返回的是dataSet元祖的行數
clusterAssment = mat(zeros((m,2))) #建立一個m行2列的矩陣,第一列存放索引值,第二列存放誤差,誤差用來評價聚類效果
centroids = createCent(dataSet,k) #建立k個質心,呼叫createCent()函式
clusterChanged =True #標誌變數,若為true則繼續迭代
print "質心位置更新過程變化:"
while clusterChanged:
clusterChanged = False
for i in range(m):
minDist = inf #inf為正無窮大
minIndex = -1 #建立索引
for j in range(k):
#尋找最近的質心
disJI = disMeas(centroids[j,:],dataSet[i,:]) #計算每個點到質心的歐氏距離
if disJI(array([0, 0, 1]), array([0, 2, 0]))
#print array(nonzero(b2))
#=>[[0, 0, 1],[0, 2, 0]]
centroids[cent,:] = mean(ptsInClust,axis=0) #計算所有點的均值,選項axis=0表示沿矩陣的列方向進行均值計算
return centroids,clusterAssment #返回所有的類質心與點分配結果
def bikMeans(dataSet,k,disMeas = distEclud):
m = shape(dataSet)[0] #shape函式此時返回的是dataSet元祖的行數
clusterAssment = mat(zeros((m,2))) #建立一個m行2列的矩陣,第一列存放索引值,第二列存放誤差,誤差用來評價聚類效果
#建立一個初始簇
centroid0 = mean(dataSet,axis=0).tolist()[0]
centList = [centroid0]
print centList
print len(centList)
for j in range(m):
clusterAssment[j,1] = disMeas(mat(centroid0),dataSet[j,:])**2 #計算所有點的均值,選項axis=0表示沿矩陣的列方向進行均值計算
while (len(centList)<k):
lowestSSE = inf #inf正無窮大
for i in range(len(centList)):
#嘗試劃分每一簇
ptsInCurrCluster = dataSet[nonzero(clusterAssment[:,0].A==i)[0],:]
centroidMat,splitClustAss = kMeans(ptsInCurrCluster,2,disMeas)
sseSplit = sum(splitClustAss[:,1])
sseNotSplit = sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1])
print "sseSplit and notSplit:",sseSplit,sseNotSplit
if (sseSplit + sseNotSplit)<lowestSSE:
bestCentToSplit = i
bestNewCents = centroidMat
bestClustAss = splitClustAss.copy()
lowestSSE = sseSplit + sseNotSplit
#更新簇的分配結果
bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] = len(centList)
bestClustAss[nonzero(bestClustAss[:,0].A == 0)[0],0] = bestCentToSplit
print "the bestCentToSplit is :",bestCentToSplit
print "the len of bestClustAss is:",len(bestClustAss)
centList[bestCentToSplit] = bestNewCents[0,:]
centList.append(bestNewCents[1,:])
clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:] =bestClustAss
return centList,clusterAssment
#return mat(centList),clusterAssment
datMat = mat(loadDataSet('data.txt'))
myCentList,myNewAssment = bikMeans(datMat,2)
print "最終質心:\n",myCentList
print "索引值和均值:\n",myNewAssment
相關文章
- 《機器學習實戰》kMeans演算法(K均值聚類演算法)機器學習演算法聚類
- 第十篇:K均值聚類(KMeans)聚類
- 【機器學習】:Kmeans均值聚類演算法原理(附帶Python程式碼實現)機器學習聚類演算法Python
- 聚類之K均值聚類和EM演算法聚類演算法
- 【Python機器學習實戰】聚類演算法(1)——K-Means聚類Python機器學習聚類演算法
- 機器學習實戰ByMatlab(4):二分K-means演算法機器學習Matlab演算法
- K-均值聚類分析聚類
- k-均值聚類簡介聚類
- 演算法雜貨鋪:k均值聚類(K-means)演算法聚類
- kmeans聚類演算法matlab實現聚類演算法Matlab
- kmeans實現文字聚類聚類
- 機器學習經典聚類演算法 —— k-均值演算法(附python實現程式碼及資料集)機器學習聚類演算法Python
- Python k-均值聚類演算法二維例項Python聚類演算法
- 演算法金 | K-均值、層次、DBSCAN聚類方法解析演算法聚類
- 【Python機器學習實戰】聚類演算法(2)——層次聚類(HAC)和DBSCANPython機器學習聚類演算法
- 102、聚類Kmeans演算法聚類演算法
- mahout之聚類演算法——KMeans分析聚類演算法
- 演算法金 | 一文讀懂K均值(K-Means)聚類演算法演算法聚類
- 機器學習之k-means聚類演算法(python實現)機器學習聚類演算法Python
- KMeans演算法與GMM混合高斯聚類演算法聚類
- Mahout學習之聚類演算法Kmeans聚類演算法
- 9.1.6 DBSCAN聚類演算法————機器學習實戰第二版聚類演算法機器學習
- 【機器學習】K-means聚類分析機器學習聚類
- 用K-均值聚類來探索顧客細分聚類
- 利用python的KMeans和PCA包實現聚類演算法PythonPCA聚類演算法
- C均值聚類 C實現 Python實現聚類Python
- 機器學習—聚類5-1(K-Means演算法+瑞士捲)機器學習聚類演算法
- pycharm 二分類PyCharm
- 機器學習(三):理解邏輯迴歸及二分類、多分類程式碼實踐機器學習邏輯迴歸
- 《資料分析實戰-托馬茲.卓巴斯》讀書筆記第4章-聚類技巧(K均值、BIRCH、DBSCAN)筆記聚類
- K均值演算法演算法
- 聚類演算法與K-means實現聚類演算法
- 【火爐煉AI】機器學習022-使用均值漂移聚類演算法構建模型AI機器學習聚類演算法模型
- Kmeans如何初始化聚類中心聚類
- 聚類kmeans演算法在yolov3中的應用聚類演算法YOLO
- ML.NET技術研究系列-2聚類演算法KMeans聚類演算法
- 機器學習Sklearn系列:(五)聚類演算法機器學習聚類演算法
- K-means聚類演算法聚類演算法