二十三、聚类算法
1. 聚類算法
聚類:數(shù)據(jù)對象的集合
-
在同一個聚類中的對象彼此相似
-
不同聚類中的對象則差別較大
聚類分析 -
將物理或抽象對象的集合分組成為由類似的對象組成的多個類的過程
-
聚類是一種無指導(dǎo)的學(xué)習(xí):沒有預(yù)定義的類別,觀察式學(xué)習(xí)
聚類分析的典型應(yīng)用 -
在GIS系統(tǒng)中,對相似區(qū)域進行聚類,產(chǎn)生主題地圖
-
檢測空間聚類,并給出它們在空間數(shù)據(jù)挖掘中的解釋
-
圖像處理
-
商務(wù)應(yīng)用中,幫市場分析人員發(fā)現(xiàn)不同的顧客群
-
對WEB日志的數(shù)據(jù)進行聚類,以發(fā)現(xiàn)相同的用戶訪問模式
常見的聚類算法
- 基于劃分的方法:K-means算法
- 基于層次的方法:CURE算法
- 基于密度的方法:DBSCAN算法
2. k-means聚類算法
簡介
-
K-means聚類算法就是基于距離的聚類算法(cluster algorithm)主要通過不斷地取離種子點最近均值的算法
k-means聚類算的原理 -
一、指定需要劃分的簇的個數(shù)k值;
-
二、隨機地選擇k個初始數(shù)據(jù)對象點作為初始的聚類中心;
-
三、計算其余的各個數(shù)據(jù)對象到這k個初始聚類中心的距離,把數(shù)據(jù)對
-
劃歸到距離它最近的那個中心所處在的簇類中;
-
四、調(diào)整新類并且重新計算出新類的中心。
-
五、計算聚類準(zhǔn)則函數(shù)E,若E不滿足收斂條件。重復(fù)二、三、四,
-
六、結(jié)束
距離的計算 -
我們都是以歐拉距離來計算與種子點的距離。但是,還有幾種可以用于k-means的距離計算方法。閔可夫斯基距離——λ可以隨意取值,可以是負數(shù),也可以是正數(shù),或是無窮大。
-
歐拉公式——也就是第一個公式λ=2的情況
-
曼哈頓距離——也就是第一個公式λ=1的情況
k-means距離算法的特點及應(yīng)用
- 優(yōu)點:
- 算法簡單、快速
- 對處理大數(shù)據(jù)集,該算法是相對可伸縮的和高效率的。
- 算法嘗試找出使平方誤差函數(shù)值最小的k個劃分。
- 缺點
- K-means聚類算法只有在簇的平均值被定義的情況下才能使用。
- 要求用戶必須事先給出要生成的簇的數(shù)目k。
- 對初值敏感。
- 不適合于發(fā)現(xiàn)非凸面形狀的簇,或者大小差別很大的簇。
- 對于“噪聲”和孤立點數(shù)據(jù)敏感
k-means聚類算法的核心代碼
2.1 完整代碼
實戰(zhàn)代碼
import numpy as np import matplotlib.pyplot as plt# 加載數(shù)據(jù) def loadDataSet(fileName):data = np.loadtxt(fileName, delimiter='\t')return data# 歐氏距離計算 def distEclud(x, y):return np.sqrt(np.sum((x - y) ** 2)) # 計算歐氏距離# 為給定數(shù)據(jù)集構(gòu)建一個包含K個隨機質(zhì)心的集合 def randCent(dataSet, k):m, n = dataSet.shapecentroids = np.zeros((k, n))for i in range(k):index = int(np.random.uniform(0, m)) #centroids[i, :] = dataSet[index, :]return centroids# k均值聚類 def KMeans(dataSet, k):m = np.shape(dataSet)[0] # 行的數(shù)目# 第一列存樣本屬于哪一簇# 第二列存樣本的到簇的中心點的誤差clusterAssment = np.mat(np.zeros((m, 2)))clusterChange = True# 第1步 初始化centroidscentroids = randCent(dataSet, k)while clusterChange:clusterChange = False# 遍歷所有的樣本(行數(shù))for i in range(m):minDist = 100000.0minIndex = -1# 遍歷所有的質(zhì)心# 第2步 找出最近的質(zhì)心for j in range(k):# 計算該樣本到質(zhì)心的歐式距離distance = distEclud(centroids[j, :], dataSet[i, :])if distance < minDist:minDist = distanceminIndex = j# 第 3 步:更新每一行樣本所屬的簇if clusterAssment[i, 0] != minIndex:clusterChange = TrueclusterAssment[i, :] = minIndex, minDist ** 2# 第 4 步:更新質(zhì)心for j in range(k):pointsInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A == j)[0]] # 獲取簇類所有的點centroids[j, :] = np.mean(pointsInCluster, axis=0) # 對矩陣的行求均值print("Congratulations,cluster complete!")return centroids, clusterAssmentdef showCluster(dataSet, k, centroids, clusterAssment):m, n = dataSet.shapeif n != 2:print("數(shù)據(jù)不是二維的")return 1mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']if k > len(mark):print("k值太大了")return 1# 繪制所有的樣本for i in range(m):markIndex = int(clusterAssment[i, 0])plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']# 繪制質(zhì)心for i in range(k):plt.plot(centroids[i, 0], centroids[i, 1], mark[i])plt.show()dataSet = loadDataSet("test.txt") k = 4 centroids, clusterAssment = KMeans(dataSet, k) showCluster(dataSet, k, centroids, clusterAssment)plt.show()dataSet = loadDataSet("test.txt") k = 4 centroids, clusterAssment = KMeans(dataSet, k) showCluster(dataSet, k, centroids, clusterAssment)總結(jié)
- 上一篇: 二十二、分类与预测
- 下一篇: 二十四、数据挖掘时序模式