機器學習之K均值聚類


K均值聚類思想

  聚類的核心概念是相似度或距離,有很多相似度或距離的方法,比如歐式距離、馬氏距離、相關系數、余弦定理、層次聚類和K均值聚類等

  K均值聚類的基本思想是,通過迭代的方法尋找K個簇的一種划分方案,使得聚類結果對應的代價函數最小,特別地,代價函數可以定義為各個樣本距離所屬簇中心點的誤差平方和$$J(c,\sigma) = \sum_{i=1}^M{||x_i - \sigma_{c_i}||}^2$$

其中\(x_i\)代表第i個樣本點,\(c_i\)\(x_i\)所屬於的簇,\(\sigma_{c_i}\)代表簇對應的中心點,M是樣本總數

K-Mean_Cluster算法實現

使用'/datasets/kmeansTestSet.txt'數據集測試K均值聚類算法

def loadDataset(file):
    dataset = []
    with open(file,'r') as pf:
        for line in pf:
            dataset.append([float(x) for x in line.strip().split('\t')])
    return dataset
#加載數據
dataset = loadDataset('./datasets/kmeansTestSet.txt')
print(len(dataset))
print(dataset[:5])
80
[[1.658985, 4.285136], [-3.453687, 3.424321], [4.838138, -1.151539], [-5.379713, -3.362104], [0.972564, 2.924086]]
import numpy as np
#對數據進行歸一化處理
def normalize(dataset):
    dataMat = np.mat(dataset)
    mean = np.mean(dataMat)
    var = np.var(dataMat)
    meanDataMat = (dataMat - mean) / var #將數據進行歸一化處理
    return meanDataMat
import matplotlib.pyplot as plt
import pandas as pd

#以圖形方式展現數據
def plotDataset(meanDataMat,pointCenter = False,centerPointerMat=None):
    dataFrame = pd.DataFrame(meanDataMat) #轉換為DataFrame,方便查看數據屬性
    print(dataFrame.describe())
    #plt.axis([0,1,0,1])
    plt.plot(meanDataMat[:,0],meanDataMat[:,1],'r*')
    if pointCenter:
        plt.plot(centerPointerMat[:,0],centerPointerMat[:,1],'b*')
    plt.show()
meanDataMat = normalize(dataset)
plotDataset(meanDataMat)
               0          1
count  80.000000  80.000000
mean   -0.008614   0.008614
std     0.331392   0.333145
min    -0.584224  -0.459075
25%    -0.306803  -0.325977
50%     0.005867   0.019362
75%     0.290189   0.323504
max     0.530519   0.568950

def distance(vectA,vectB):
    Power = np.power((vectA - vectB),2)
    Sum = np.sum(Power,axis = 1)
    return float(np.sqrt(Sum)) 
import random
def kcluster(meanDataMat,k=4):
    row,col = meanDataMat.shape
    print(row,col)
    featureRange = []
    for i in range(col):
        Min = np.min(meanDataMat[:,i])
        Max = np.max(meanDataMat[:,i])
        featureRange.append((Min,Max))
    centerPoints = []  #中心點
    classPoints = []   #聚類數據點
    classLabels = np.mat(np.zeros((row,2)))
    for i in range(k):
        centerPoints.append([random.uniform(r[0],r[1]) for r in featureRange])
        classPoints.append([])
    centerPointsMat = np.mat(centerPoints)
    clusterChanged = True
    while(clusterChanged):
        clusterChanged = False
        for i in range(row):
            minDis = np.inf
            bestK = -1
            for j in range(k):
                dis = distance(meanDataMat[i,:],centerPointsMat[j,:])
                if dis < minDis:
                    minDis = dis
                    bestK = j
            if classLabels[i,0] != bestK:
                clusterChanged = True
            classLabels[i,:] = bestK,minDis
        for center in range(k):
            ptsInClust = meanDataMat[np.nonzero(classLabels[:,0] == center)[0]]  #該步驟需要特別注意,精妙
            centerPointsMat[center,:] = np.mean(ptsInClust,axis=0)
    print('已完成聚類')
    return centerPointsMat,classLabels
centerPointsMat,classLabels = kcluster(meanDataMat)
80 2
已完成聚類
plotDataset(meanDataMat,pointCenter=True,centerPointerMat = centerPointsMat)
               0          1
count  80.000000  80.000000
mean   -0.008614   0.008614
std     0.331392   0.333145
min    -0.584224  -0.459075
25%    -0.306803  -0.325977
50%     0.005867   0.019362
75%     0.290189   0.323504
max     0.530519   0.568950

K均值算法的缺點

(1)需要人工預先確定初始值K值,且該值和真實的數據分布未必吻合

(2)K均值只能收斂到局部最優,效果受到初始值的影響

(3)易受噪點和離群點的影響

(4)樣本點只能被划分到單一的類中

K均值聚類算法改進模型

K-means++算法

K均值的改進算法種,對初始值選擇的改進種是很重要的一部分,而這類算法中,最具影響力的當屬K-means++算法,原始K均值算法最開始隨機的選取K個中心點,而K-means++按照如下的思想選取K個聚類中心:

假設已經選取了n個初始聚類中心(0<n<k),則在選取第n+1個聚類中心時,距離當前n個聚類中心越遠的點會有更高的概率被選為第n+1個聚類中心點。聚類中心點當然是相互離的越遠越好。當選擇完初始點后K-means++后續的執行和經典K均值算法相同

ISODATA算法

在K均值算法種,聚類個數K的值需要預先認為確定,並且在整個算法過程種無法改變,而當遇到高維度、海量的數據集時,人們往往很難准確地估計出K的大小,ISODATA的全稱為迭代自組織數據分析法,就是針對這個問題進行了改進,它的思想很直觀,主要通過迭代的方法對分類進行拆分和合並,這需要制定3個閾值:

(1)每個類所要求的最少樣本數目\(N_min\),如果分裂后會導致某個子類別所包含樣本數目小於該閾值,就不會對該類別進行分裂操作

(2)最大方差Sigma,用於控制某個類別中樣本的分散程度,當樣本的分散程度超過某個閾值時,進行分裂操作

(3)兩個聚類中心之間所允許的最小距離\(D_min\),如果兩個類考的非常近(即這兩個類別對應聚類中心之間距離非常小),小於該閾值時,則對這兩個類進行合並操作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM