聚類是將資料集中的樣本劃分為若干個不相交的子集,,每個子集稱為乙個"簇",通過這樣的劃分可能對應於一些潛在的類別。,聚類即能作為乙個單獨過程,用於尋找資料內在的分布結構,也可作為分類等學習任務的前驅過程。
聚類的過程通常會把一些具有相似特徵或者潛在聯絡的樣本劃分為乙個簇,那麼應該怎樣劃分簇呢,k-means演算法是一種常用的劃分簇的方法。
k均值演算法常用於劃分原型聚類。
假設有樣本集d
=d=\\}
d=共m個樣本。
首先任意選取k個樣本作為均值向量,
μ1,μ2
,..
.,μk
}即以它們作為簇劃分的中心點。μ
i\bm \mu_i
μi表示第i個簇的樣本中心點。每個均值向量對應乙個集合cj,
1<=j
<=k
c_j,1<=j<=k
cj,
1<=j
<=k
,初始化集合為空集。
遍歷集合d中的樣本值,根據歐式距離或其他衡量距離的方法計算該樣本到各個均值向量的距離。從中選擇乙個距離最小的均值向量,將其劃入該均值向量對應的簇c
jc_j
cj。
由步驟2,可將所有的樣本劃入不同的集合(簇),然後更新集合的均值向量,即對每個集合內部的樣本求均值,得到新的均值向量μ
j\bm \mu_j
μj。
然後重複步驟2,得到新的劃分集合,再重複步驟3,得到新的均值向量;
直到均值向量不再改變,停止更新,得到最終的劃分集合,即簇。
具體過程如下:
舉例:西瓜資料集:
k均值聚類中的類別k通常需要預先指定,在實際過程中 最優的k值是不知道的,可能需要嘗試不同的k值聚類,檢驗各自得到聚類結果的質量,推測最優的k值,可以使用常用的聚類衡量指標dbi指數,di指數等。
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.shape
centroids = 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步 初始化centroids
centroids = randcent(dataset,k)
while clusterchange:
clusterchange = false
# 遍歷所有的樣本(行數)
for i in range(m):
mindist = 100000.0
minindex = -1
# 遍歷所有的質心
#第2步 找出最近的質心
for j in range(k):
# 計算該樣本到質心的歐式距離
distance = disteclud(centroids[j,:],dataset[i,:])
if distance < mindist:
mindist = distance
minindex = j
# 第 3 步:更新每一行樣本所屬的簇
if clusterassment[i,0] != minindex:
clusterchange = true
clusterassment[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,clusterassment
#視覺化
def showcluster(dataset,k,centroids,clusterassment):
m,n = dataset.shape
if n != 2:
print("資料不是二維的")
return 1
mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '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', '層次聚類不需要事先決定分為幾個簇,可以在層次構建完成後,在進行劃分。類似於哈夫曼的建樹過程,兩兩計算相似度。,然後將相似度大或者是距離較小的合併起來,試圖在不同層次對資料集進行劃分,從而得到樹形的聚類結構,資料集的劃分採用自底向上的聚類策略,然後採用自頂向下的分拆策略。
k均值聚類演算法
輸入 簇的數目k和包含n個物件的資料庫。輸出 k個簇,使平方誤差準則最小。演算法步驟 1.為每個聚類確定乙個初始聚類中心,這樣就有k 個初始聚類中心。2.將樣本集中的樣本按照最小距離原則分配到最鄰近聚類 3.使用每個聚類中的樣本均值作為新的聚類中心。4.重複步驟2.3直到聚類中心不再變化。5.結束,...
K 均值聚類演算法
from numpy import 建立元組 dataset 與我們所熟悉的矩陣類似,最終我們將獲得n 2的矩陣,filein open home zengxl pycharmprojects test3 機器學習實戰 ch10 testset.txt 是正斜槓 for line in filein...
K 均值聚類演算法
k means演算法是最簡單的一種聚類演算法。演算法的目的是使各個樣本與所在類均值的誤差平方和達到最小 這也是評價k means演算法最後聚類效果的評價標準 k means聚類演算法的一般步驟 初始化。輸入基因表達矩陣作為物件集x,輸入指定聚類類數n,並在x中隨機選取n個物件作為初始聚類中心。設定迭...