1.聚類分析
1.1概念
聚類分析,也稱為分割分析或分類分析,可將樣本數(shù)據(jù)分成一個個組(即簇)。同一簇中的對象是相似的,不同簇中的對象則明顯不同。
Statistics and Machine Learning Toolbox? 提供了幾種聚類方法和相似性度量(也稱為距離度量)來創(chuàng)建簇。此外,簇計算可以按照不同的計算標準確定數(shù)據(jù)的最佳簇數(shù)。
1.2 K 均值和層次聚類
K 均值聚類是一種分區(qū)方法,它將數(shù)據(jù)中的觀測值視為具有位置和相互間距離的對象。它將對象劃分為 K 個互斥簇,使每個簇中的對象盡可能彼此靠近,并盡可能遠離其他簇中的對象。每個簇的特性由其質(zhì)心或中心點決定。當然,聚類中使用的距離通常不代表空間距離。
層次聚類是通過創(chuàng)建聚類樹,同時在多個距離尺度內(nèi)調(diào)查數(shù)據(jù)分組的一種方法。與 K-均值法不同,樹并不是一組簇的簡單組合,而是一個多級層次結(jié)構,較低級別的簇在相鄰的更高級別合并成新的簇。使用這種方法,可以選擇最適合您的應用場景的聚類尺度或級別。
Fisher 鳶尾花數(shù)據(jù)的聚類分析:
https://ww2.mathworks.cn/help/stats/cluster-analysis-example.html
2. 聚類分析的度量
度量指標對聚類結(jié)果進行評判;
- 外部指標:以事先指定的聚類模型為參考;
- 內(nèi)部指標:參與聚類的樣本;
2.1 外部指標
對含有n個樣本的數(shù)據(jù)集S,其中兩個樣本點x1,x2,假定通過聚類給出的簇劃分結(jié)果為C,外部參考模型給出的結(jié)果為P;對于x1,x2存在四種關系:
- SS:x1、x2在C和P中屬于相同的簇;
- SD:在C中相同,P中不同;
- DS:C中不同,P中相同;
- DD:x1、x2在C和P中屬于不同的簇;
a,b,c,d分別表示上述關系對應的關系數(shù)目,x1和x2存在且唯一存在上四種關系之一;
a+b+c+d = n(n-1)/2;
外部度量指標:
- Rand統(tǒng)計量
-
F值(F-measure)
//P表示準確率;
//R表示召回率 -
Jaccard 系數(shù)
-
FM指數(shù)
- 以上四個度量結(jié)果越大,表明聚類結(jié)果和參考模型的劃分結(jié)果越吻合;
2.2 內(nèi)部度量
2.2.1 樣本點和聚類中心的距離度量
-
歐氏距離
計算歐氏空間兩個點之間的距離
-
曼哈頓距離
也稱城市街區(qū)距離度量,相當于沿著兩個街道行駛的距離(實際行駛距離)
- 切比雪夫距離
向量空間距離的度量,相當于象棋盤移動格子之間的距離
- 可明夫斯基距離
歐氏和曼哈頓的推廣
聚類性能度量
- 緊密性
指每個樣本到聚類中心的平均距離
- 分隔度
是個簇的簇心之間的平均距離。分割度值越大說明簇間間隔越遠,分類效果越好,即簇間相似度越低。
- 戴維森保丁指數(shù)
衡量任意兩個簇的簇內(nèi)距離之后與簇間距離之比。該指標越小表示簇內(nèi)距離越小,簇內(nèi)相似度越高,簇間距離越大,簇間相似度低。
- 鄧恩指數(shù)
任意兩個簇的樣本點的最短距離與任意簇中樣本點的最大距離之商。該值越大,聚類效果越好。
- 輪廓系數(shù)
對于一個樣本集合,它的輪廓系數(shù)是所有樣本輪廓系數(shù)的平均值。輪廓系數(shù)的取值范圍是[-1,1],同類別樣本距離越相近不同類別樣本距離越遠,分數(shù)越高。
3.K-means概念
k-means算法 :又名k均值算法,是基于劃分的聚類,K-means算法中的k表示的是聚類為k個簇,means代表取每一個聚類中數(shù)據(jù)值的均值作為該簇的中心,或者稱為質(zhì)心,即用每一個的類的質(zhì)心對該簇進行描述。
算法思想:先從樣本集中隨機選取 k個樣本作為簇中心,并計算所有樣本與這 k個“簇中心”的距離,對于每一個樣本,將其劃分到與其距離最近的“簇中心”所在的簇中,對于新的簇計算各個簇的新的“簇中心”。
-
四個要點:
?? (1)簇個數(shù) k 的選擇
?? (2)各個樣本點到“簇中心”的距離
?? (3)根據(jù)新劃分的簇,更新“簇中心”
?? (4)重復上述2、3過程,直至"簇中心"沒有移動
?
優(yōu)點:
計算速度快、易于理解;
4.K-means算法步驟
- K值的選擇: 選取K個簇類的質(zhì)心(通常為隨機);
- 距離度量: 計算剩余樣本到各質(zhì)心的距離(一般為歐氏距離),歸類到相互距離最小的質(zhì)心所在的簇;
- 新質(zhì)心計算: 剩余點歸類完畢后計算新質(zhì)心,然后再重新計算各樣本到質(zhì)心的距離;
- 停止條件: 迭代計算完畢所有的樣本點的距離,當樣本的距離劃分情況基本不變時,說明已經(jīng)到最優(yōu)解,返回結(jié)果;
5.K-means案例1(python代碼)
參考鏈接: https://blog.csdn.net/qq_43741312/article/details/97128745
代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-841021.html
import random
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 計算歐拉距離
def calcDis(dataSet, centroids, k):
clalist = []
for data in dataSet:
diff = np.tile(data, (k,
1)) - centroids # 相減 (np.tile(a,(2,1))就是把a先沿x軸復制1倍,即沒有復制,仍然是 [0,1,2]。 再把結(jié)果沿y方向復制2倍得到array([[0,1,2],[0,1,2]]))
squaredDiff = diff ** 2 # 平方
squaredDist = np.sum(squaredDiff, axis=1) # 和 (axis=1表示行)
distance = squaredDist ** 0.5 # 開根號
clalist.append(distance)
clalist = np.array(clalist) # 返回一個每個點到質(zhì)點的距離len(dateSet)*k的數(shù)組
return clalist
# 計算質(zhì)心
def classify(dataSet, centroids, k):
# 計算樣本到質(zhì)心的距離
clalist = calcDis(dataSet, centroids, k)
# 分組并計算新的質(zhì)心
minDistIndices = np.argmin(clalist, axis=1) # axis=1 表示求出每行的最小值的下標
newCentroids = pd.DataFrame(dataSet).groupby(
minDistIndices).mean() # DataFramte(dataSet)對DataSet分組,groupby(min)按照min進行統(tǒng)計分類,mean()對分類結(jié)果求均值
newCentroids = newCentroids.values
# 計算變化量
changed = newCentroids - centroids
return changed, newCentroids
# 使用k-means分類
def kmeans(dataSet, k):
# 隨機取質(zhì)心
centroids = random.sample(dataSet, k)
# 更新質(zhì)心 直到變化量全為0
changed, newCentroids = classify(dataSet, centroids, k)
while np.any(changed != 0):
changed, newCentroids = classify(dataSet, newCentroids, k)
centroids = sorted(newCentroids.tolist()) # tolist()將矩陣轉(zhuǎn)換成列表 sorted()排序
# 根據(jù)質(zhì)心計算每個集群
cluster = []
clalist = calcDis(dataSet, centroids, k) # 調(diào)用歐拉距離
minDistIndices = np.argmin(clalist, axis=1)
for i in range(k):
cluster.append([])
for i, j in enumerate(minDistIndices): # enymerate()可同時遍歷索引和遍歷元素
cluster[j].append(dataSet[i])
return centroids, cluster
# 創(chuàng)建數(shù)據(jù)集
def createDataSet():
return [[1, 1], [1, 2], [2, 1], [6, 4], [6, 3], [5, 4]]
if __name__ == '__main__':
dataset = createDataSet()
centroids, cluster = kmeans(dataset, 2)
#print("數(shù)據(jù)集為:%s"%dataset)
print('質(zhì)心為:%s' % centroids)
print('集群為:%s' % cluster)
for i in range(len(dataset)):
plt.scatter(dataset[i][0], dataset[i][1], marker='o', color='green', s=40, label='原始點')
# 記號形狀 顏色 點的大小 設置標簽
for j in range(len(centroids)):
plt.scatter(centroids[j][0], centroids[j][1], marker='x', color='red', s=50, label='質(zhì)心')
#plt.show()
plt.show()
E:\PythonStudy\venv\Scripts\python.exe E:/PythonStudy/DeepLeraring/K_means_demo.py
質(zhì)心為:[[1.3333333333333333, 1.3333333333333333], [5.666666666666667, 3.6666666666666665]]
集群為:[[[1, 1], [1, 2], [2, 1]], [[6, 4], [6, 3], [5, 4]]]
Process finished with exit code 0
//綠色表示數(shù)據(jù)集對應的散點
//紅色叉號表示簇新文章來源地址http://www.zghlxwxcb.cn/news/detail-841021.html
到了這里,關于K-means聚類算法原理及實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!