二十三、聚类算法
1. 聚類算法
聚類:數據對象的集合
-
在同一個聚類中的對象彼此相似
-
不同聚類中的對象則差別較大
聚類分析 -
將物理或抽象對象的集合分組成為由類似的對象組成的多個類的過程
-
聚類是一種無指導的學習:沒有預定義的類別,觀察式學習
聚類分析的典型應用 -
在GIS系統中,對相似區域進行聚類,產生主題地圖
-
檢測空間聚類,并給出它們在空間數據挖掘中的解釋
-
圖像處理
-
商務應用中,幫市場分析人員發現不同的顧客群
-
對WEB日志的數據進行聚類,以發現相同的用戶訪問模式
常見的聚類算法
- 基于劃分的方法:K-means算法
- 基于層次的方法:CURE算法
- 基于密度的方法:DBSCAN算法
2. k-means聚類算法
簡介
-
K-means聚類算法就是基于距離的聚類算法(cluster algorithm)主要通過不斷地取離種子點最近均值的算法
k-means聚類算的原理 -
一、指定需要劃分的簇的個數k值;
-
二、隨機地選擇k個初始數據對象點作為初始的聚類中心;
-
三、計算其余的各個數據對象到這k個初始聚類中心的距離,把數據對
-
劃歸到距離它最近的那個中心所處在的簇類中;
-
四、調整新類并且重新計算出新類的中心。
-
五、計算聚類準則函數E,若E不滿足收斂條件。重復二、三、四,
-
六、結束
距離的計算 -
我們都是以歐拉距離來計算與種子點的距離。但是,還有幾種可以用于k-means的距離計算方法。閔可夫斯基距離——λ可以隨意取值,可以是負數,也可以是正數,或是無窮大。
-
歐拉公式——也就是第一個公式λ=2的情況
-
曼哈頓距離——也就是第一個公式λ=1的情況
k-means距離算法的特點及應用
- 優點:
- 算法簡單、快速
- 對處理大數據集,該算法是相對可伸縮的和高效率的。
- 算法嘗試找出使平方誤差函數值最小的k個劃分。
- 缺點
- K-means聚類算法只有在簇的平均值被定義的情況下才能使用。
- 要求用戶必須事先給出要生成的簇的數目k。
- 對初值敏感。
- 不適合于發現非凸面形狀的簇,或者大小差別很大的簇。
- 對于“噪聲”和孤立點數據敏感
k-means聚類算法的核心代碼
2.1 完整代碼
實戰代碼
import numpy as np import matplotlib.pyplot as plt# 加載數據 def loadDataSet(fileName):data = np.loadtxt(fileName, delimiter='\t')return data# 歐氏距離計算 def distEclud(x, y):return np.sqrt(np.sum((x - y) ** 2)) # 計算歐氏距離# 為給定數據集構建一個包含K個隨機質心的集合 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] # 行的數目# 第一列存樣本屬于哪一簇# 第二列存樣本的到簇的中心點的誤差clusterAssment = np.mat(np.zeros((m, 2)))clusterChange = True# 第1步 初始化centroidscentroids = randCent(dataSet, k)while clusterChange:clusterChange = False# 遍歷所有的樣本(行數)for i in range(m):minDist = 100000.0minIndex = -1# 遍歷所有的質心# 第2步 找出最近的質心for j in range(k):# 計算該樣本到質心的歐式距離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 步:更新質心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("數據不是二維的")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']# 繪制質心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)總結
- 上一篇: 二十二、分类与预测
- 下一篇: 二十四、数据挖掘时序模式