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個相似資...