機器學習實戰 K 均值學習筆記

2021-09-13 03:46:07 字數 4497 閱讀 4680

k-均值:

因為可以發現k個不同的簇,且每個簇的中心採用簇中所含的均值計算而成。

聚類和分類的區別:

最大的區別在於,分類的目標事先已知,而聚類的不一樣,其產生的結果和分類相同,但是類別沒有預先定義,因此聚類有時候也被稱為無監督分類

**如下:

from numpy import *

def loaddataset(filename):

datamat =

fr = open(filename)

for line in fr.readlines():

curline = line.strip().split('\t')

fltline = map(float, curline) #python2中源**

fltline = list(map(float, curline)) #python3中修改後的**

return datamat

# 計算兩個向量之間的歐式距離(也可以使用其他的距離函式)

def disteclud(veca, vecb):

return sqrt(sum(power(veca - vecb, 2)))

# 該函式為給定的資料集構建乙個包含k個隨機質心的幾何

def randcent(dataset, k):

n = shape(dataset)[1]

centroids = mat(zeros((k, n)))

for j in range(n):

minj = min(dataset[:, j])

rangej = float(max(dataset[:, j]) - minj)

centroids[:, j] = minj + rangej * random.rand(k, 1)

return centroids

k-均值聚類演算法:

def kmeans(dataset, k, distmeas=disteclud, createcent=randcent):

m = shape(dataset)[0]

clusterassment = mat(zeros((m, 2)))

# 建立k個初識的質心向量

centroids = createcent(dataset, k)

# 聚類結果是否發生變化的布林型別

clusterchanged = true

# 如果聚類結果發生了變化,就一直執行聚類演算法,直到所有的資料點聚類結果不再發生變化

while clusterchanged:

clusterchanged = false

for i in range(m):

mindist = inf

minindex = -1

for j in range(k):

# 計算資料集中的點到每乙個質心的距離

distji = distmeas(centroids[j, :], dataset[i, :])

if distji < mindist:

# 如果當前距離小於最小距離,則更新當前距離為最小距離

mindist = distji

# 當前的質心索引為最小質心索引

minindex = j

# 當聚類結果中的第i個樣本發生變化時,布林型別變為真,繼續聚類演算法

if clusterassment[i, 0] != minindex:

clusterchanged = true

# 更新當前變化的聚類樣本的質心索引和平方誤差

clusterassment[i, :] = minindex, mindist**2

print(centroids)

for cent in range(k):

ptsinclust = dataset[nonzero(clusterassment[:, 0].a == cent)[0]]

centroids[cent, :] = mean(ptsinclust, axis=0)

return centroids, clusterassment

提高聚類效能:有時候k-均值收斂但是聚類的較差,主要原因是k-均值演算法收斂到了區域性最小值,而非全域性最小值(區域性最小值指結果還可以但是並非是最好結果,全域性最小值可能是最好結果)

一種用於度量聚類效果的指標是sse(誤差平均和),sse值越小表示資料點越接近它們的質心,聚類效果也越好。

聚類的目標是在保持簇數目不變的情況下提高簇的質量。

改進方法:

1、合併最近的質心 或者 合併兩個使得sse增幅最小的質心

2、合併兩個簇然後計算總的sse,遍歷所有可能的兩個簇,找到最佳的兩個簇。

二分k-均值演算法

為了克服k-均值演算法收斂於區域性最小值的問題,有人提出了另乙個稱為二分k-均值的演算法。該演算法首先將所有點作為乙個簇,然後將該簇一分為二。之後選擇其中乙個簇繼續進行劃分,選擇哪乙個簇進行劃分取決於其劃分是否可以最大程度降低sse的值。不斷重複上述的基於sse的劃分過程,直到得到指定的簇數目為止。

def bikmeans(dataset, k, distmeas=disteclud):

m = shape(dataset)[0]

# 初始化,簇點都為0

clusterassment = mat(zeros((m, 2)))

# 起始的第乙個聚類點,即所有點的質心

centroid0 = mean(dataset, axis=0).tolist()[0] # axis=0:壓縮行,對各列求均值,返回乙個1*n的矩陣

centlist = [centroid0]

for j in range(m):

# 計算當前聚為一類時各個資料點距離質心的平方距離

clusterassment[j, 1] = distmeas(mat(centroid0), dataset[j, :])**2

while (len(centlist) < k):

# 將當前的最小誤差設定為正無窮

lowestsse = inf

for i in range(len(centlist)):

# 通過陣列過濾篩選出屬於第i簇的資料集合

ptsincurrcluster = dataset[nonzero(clusterassment[:, 0].a == i)[0], :]

# 對於該簇利用二分k-均值演算法進行劃分,返回劃分後的結果及誤差

centroidmat, splitclusterass = kmeans(ptsincurrcluster, 2, distmeas)

# 計算該簇劃分為的兩個簇的誤差平方的和

ssesplit = sum(splitclusterass[:, 1])

# 計算未劃分的的簇中資料的誤差平方的和

ssenotsplit = sum(clusterassment[nonzero(clusterassment[:, 0].a != i)[0], 1])

print("ssesplit, and notsplot: ", ssesplit, ssenotsplit)

# 遍歷當前簇後劃分後找到最佳的劃分簇,更新

if (ssesplit + ssenotsplit) < lowestsse:

bestcenttosplit = i

bestnewcents = centroidmat

bestclustass = splitclusterass.copy()

lowestsse = ssesplit + ssenotsplit

# 對決定要劃分的簇中所有點的簇分配結果進行修改

bestclustass[nonzero(bestclustass[:, 0].a == 1)[0], 0] = len(centlist)

bestclustass[nonzero(bestclustass[:, 0].a == 0)[0], 0] = bestcenttosplit

print('the bestcenttosplit is:', bestcenttosplit)

print('the len of bestclustass is: ', len(bestclustass))

# 新的簇的分配結果更新,新的質心新增到centlist中

centlist[bestcenttosplit] = bestnewcents[0, :]

clusterassment[nonzero(clusterassment[:, 0].a == bestcenttosplit)[0], :] = bestclustass

return mat(centlist), clusterassment #python2中的源**

return centlist, clusterassment #python3中修改

機器學習實戰 K均值聚類

1.概述 聚類是一種無監督學習,它將相似的物件歸到同乙個簇中。聚類方法幾乎可以應用於所有物件,簇內的物件越相似,聚類的效果越好。k 均值聚類之所以稱為是因為它可以發現k個不同的簇,且每個簇的中心採用簇中所含值的均值計算而成。2.簇識別 cluster identification 簇識別給出聚類結果...

機器學習演算法(六) K 均值

一 介紹 1 k means屬於無監督學習,主要解決聚類問題。2 k means需要提前設定引數k,這個值最終要生成k個簇,也就是聚類生成的類別的數量。使用k means演算法將乙個資料歸入到k個集群中。3 k means演算法適用於數值型資料,在資料探勘領域中有廣泛的應用。二 原理 隨機確定k個初...

機器學習實戰筆記(k鄰近演算法)

1.k鄰近演算法原理 k鄰近演算法通過計算不同特徵值間的距離進行分類 存在乙個樣本資料集合,也稱為訓練樣本集,樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將輸入資料中的每個特徵值和訓練樣本集進行比較,然後選出特徵最相似的資料集的標籤作為輸入資料集標籤。一般來說我們選取訓練樣本集中前k個相似資...