k-Means算法(Machine Learning in Action)基于python3.6
生活随笔
收集整理的這篇文章主要介紹了
k-Means算法(Machine Learning in Action)基于python3.6
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
K-均值算法首先隨機確定k個初始點作為質心,為每個點找距其最近的質心,并將分配給質心所對應的簇,然后每個簇的質心更新為該簇所有點的平均值。
優點:容易實現
缺點:可能收斂到局部最小值,在大規模數據集上收斂較慢
適用數據類型:數值型數據
1 ''' 2 創建k個點作為起始質心(經常是隨機選擇) 3 當任意一個點的簇分配結果發生改變時 4 對數據集中的每個數據點 5 對每個質心 6 計算質心與數據點之間的距離 7 將數據點分配到距其最近的簇 8 對每一個簇,計算簇中所有點的均值并將均值作為質心 9 ''' 10 from numpy import * 11 #讀取文本文件到一個列表中 12 def loadDataSet(filename): 13 dataMat=[] 14 fr = open(filename) 15 for line in fr.readlines(): 16 curline = line.strip().split('\t') 17 fltline = list(map(float,curline)) 18 dataMat.append(fltline) 19 return dataMat 20 21 #求歐式距離 22 def distEclud(vecA, vecB): 23 return sqrt(sum(power(vecA - vecB, 2))) 24 25 #構建簇質心 26 def randCent(dataSet, k): 27 n = shape(dataSet)[1]#列表列數 28 centroids = mat(zeros((k,n))) 29 for j in range(n): 30 minJ = min(dataSet[:,j])#第j列的最小值 31 maxJ = max(dataSet[:,j])#第j列的最大值 32 rangeJ = float(maxJ - minJ)#第j列的變化范圍 33 centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1))#生成在邊界內的隨機數 34 return centroids 35 36 datMat = mat(loadDataSet('testSet.txt')) 37 ''' test---------------------------------------- 38 print(min(datMat[:,0])) 39 print(min(datMat[:,1])) 40 print(max(datMat[:,0])) 41 print(max(datMat[:,1])) 42 print(randCent(datMat, 2)) 43 print(distEclud(datMat[0], datMat[1])) 44 45 ''' 46 ''' 47 core code: 48 計算質心-分配-重新計算 49 ''' 50 #分別是數據集,聚類類數,距離函數,創建初始質心函數) 51 def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent): 52 m = shape(dataSet)[0]#行數 53 result = mat(zeros((m,2)))#結果矩陣,一列記錄簇索引值,一列記錄存儲誤差(當前點到簇質心的距離) 54 centroids = createCent(dataSet, k)#簇質心 55 changed = True#標志變量,如果為True,繼續迭代,若任一點簇分配結果發生變化,更新changed 56 while changed: 57 changed = False 58 for i in range(m): 59 minDist = inf#正負無窮 60 minIndex = -1 61 #尋找最近的質心 62 for j in range(k): 63 distJI = distMeas(centroids[j,:],dataSet[i,:])#算點到每一個質心的距離 64 if distJI < minDist: 65 minDist = distJI; minIndex = j 66 if result[i,0] != minIndex: changed = True#如果更新后的結果矩陣簇索引值與原來的不同,標志位置為True 67 result[i,:] = minIndex,minDist ** 2#結果矩陣此時這一行第一列為點到質心距離最小的那一個質心,第二列為距離的平方 68 #更新質心的位置 69 print(centroids) 70 for cent in range(k): 71 ptsInClust = dataSet[nonzero(result[:,0].A == cent)[0]]#.A變成數組,獲取給定簇的所有點 72 centroids[cent,:] = mean(ptsInClust, axis = 0)#按列方向求均值 73 return centroids, result 74 75 # test------------------------------------------------ 76 myCentroids, result = kMeans(datMat,4) 77 print(myCentroids) 78 print('\n') 79 print(result)?
?
轉載于:https://www.cnblogs.com/bigstrawberrywakaka/p/8946211.html
總結
以上是生活随笔為你收集整理的k-Means算法(Machine Learning in Action)基于python3.6的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 熄灯问题——全代码
- 下一篇: $_POST[] name